Aller au contenu

GO Print

Zlika

Membres
  • Compteur de contenus

    8
  • Inscrit(e) le

  • Dernière visite

Information

  • Genre
    Masculin
  • Lieu
    BESANÇON
  • Intérêts
    Électronique, informatique, nouvelles technologies...

Visiteurs récents du profil

Le bloc de visiteurs récents est désactivé et il n’est pas visible pour les autres utilisateurs.

Récompenses de Zlika

Rookie

Rookie (2/14)

  • First Post
  • Week One Done
  • One Month Later
  • One Year In

Badges récents

0

Réputation sur la communauté

  1. Oups petit mélange de language Peux-tu essayer en remplaçant le code au dessus par: if ((Switch_ON == false) || (Val_Read - Old_Read >= Interval)) { // si l'interrupteur moteur vient juste d'être positionné sur "Rotation" ou si "Interval" est dépassé => Lecture du potentiomètre et En espérant que cette fois ci ça fonctionne...
  2. Et pour finir une version avec quelques améliorations et qui passe à la compilation: #include <AccelStepper.h> int INTERUPTEURPIN = 10; int Pin_Pot = 0; int Val_Pot; int Speed; bool Switch_ON = false; // variable utilisée pour détecter un basculement unsigned long Val_Read; unsigned long Old_Read; const long Interval = 250; // interval de lecture valeur Potentiométre const int MaxSpeed = 3000; // vitesse maximale du moteur AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF void setup() { Serial.begin(115200); //Initialisation de la communication avec la console pinMode(INTERUPTEURPIN,INPUT); digitalWrite(INTERUPTEURPIN, HIGH); //Pullup interne activé stepper.setMaxSpeed(MaxSpeed); stepper.setAcceleration(3000); } void loop() { if( digitalRead(INTERUPTEURPIN) == true ) { // si l'interrupteur moteur est sur "Rotation" Val_Read = millis(); // lecture du temps pour comparaison if ((Switch_ON == false) or (Val_Read - Old_Read >= Interval)) { // si l'interrupteur moteur vient juste d'être positionné sur "Rotation" ou si "Interval" est dépassé => Lecture du potentiomètre et Val_Pot = analogRead(Pin_Pot); Speed = map(Val_Pot,0,1023,0,MaxSpeed); Serial.print("Valeur Pot : "); Serial.println(Val_Pot); // affiche la valeur du potentiomètre Serial.print("Vitesse : "); Serial.println(Speed); // affiche la vitesse stepper.setSpeed(Speed); // Assigne la consigne de vitesse Old_Read = Val_Read; // mémorise le temps comme réference pour la prochaine itération Switch_ON = true; // Mémorise la position de l'interrupteur du moteur } } else { // si l'interrupteur moteur n'est pas sur rotation if (Switch_ON == true) { // mais qu'il vient juste d'être basculé stepper.setSpeed(0); // on stoppe la rotation du moteur Switch_ON = false; // et on mémorise le nouvel état de l'interrupteur moteur } } stepper.run(); // utilisation de la procedure stepper.run() à la place de stepper.runSpeed() pour inclure les accélérations/décélérations } A noter dans la documentation de la librairie une limitation à prendre en compte. il est donc certain que l'utilisation d'une carte Uno ou équivalent en puissance limitera la vitesse du moteur. Mais vu la capacité de mémoire, il est de toute façon impossible de stocker un programme complexe. @demandeinfos La bibliothèque 'AccelStepper' possède de nombreuses procédures et propriétés qui seraient parfaites pour la gestion d'un déplacement sur un axe X/Y. Elle dispose, en plus de la gestion de l'accélération/décélération, d'une propriété qui 'compte' les pas, de procédures pour des déplacements en nombre de pas relatifs et absolus. Il serait vraiment dommage de ne pas l'intégrer dans ton projet car dans ce cas il te faudra réécrire des fonctions pour gérer les déplacements. tu peux trouver sa documentation en anglais dans le répertoire 'projets/libraries/AccelStepper/extras/doc' si tu as fait une installation classique de l'IDE ARDUINO.
  3. Voici un lien pour te permettre de comprendre le fonctionnement des conditions liés au temps: http://arlotto.univ-tln.fr/arduino/article/utilisez-correctement-la-fonction
  4. Le problème vient peut être du fait que tu attribues une valeur à setspeed a chaque passage dans la boucle. Il serait judicieux de faire une lecture du potentiomètre et la modification du paramètre setspeed toute les 50 ms. Pour vérifier, je te conseille de mettre cette partie de code dans une condition liée au temps où éventuellement à l'état d'une broche de l'arduino pour pouvoir le shunter
  5. J'avais bien compris que tu débutais en programmation d'où ma démarche plus pédagogique . On est tous passé par là. Quand tu dis avoir modifié le mappage, as tu bien pensé à changer le dernier paramètre 1000 par 3000 ? Cette donnée représente la valeur retournée pour une valeur de 1023 (troisième paramètre) provenant du convertisseur analogique. Logiquement tu dois voir ta valeur affichée qui varie de 0 à 3000.
  6. Dans le prog2, tu fixes ta vitesse de rotation à 3000 pour une limite maxi à 10000, alors que le prog1 a une limite maximale à 1000. Tu tournés donc 3 fois plus vite que la position du potentiomètre à son maximum. Prend bien le temps de relire tes lignes de code et de les comprendre. C'est essentiel si tu veux trouver rapidement un éventuel problème et n'hésite pas à afficher les variables sur l'écran si tu as un doute su leur valeur. Ça peut te faire gagner du temps.
  7. Il est normal que tu ai une erreur puisque la variable Pin_Pot n'existe pas dans ton code (pas de déclaration). Cela n'a pas de sens. Tu effectue une mesure que tu multiplies par 10 dans tes lignes précédantes et tu refais une lecture de ton potentiomètre pour initialiser ta variable setSpeed... Replace cette ligne par if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val) ; Tu peux faire un mappage comme indiqué par Djam et ajuster les valeurs par la suite pour optimiser (avec un max speed à 1000) val = map(val, 0, 1023, 0, 1000); à la place de: val *=10 ; Cette instruction doit être installer dans le setup comme le fait Djam... (sans la condition évidemment )
  8. Bonjour, Durant la période de test, je te conseil d'envoyer les donnés que tu veux vérifier sur l'interface série avec une instruction serial.println(val) pour obtenir visuellement la valeur. Vérifies que tu as bien une variation de 0 à 1023 qui s'affiche. Attention au type de potentiomètre que tu utilises. Si tu as un A derrière la valeur, c'est un potentiomètre linéaire donc bien adapté pour la commande du moteur. Par contre un B signifie que c'est un logarithmique et que ça va être difficile de gérer la vitesse de façon précise.
×
×
  • Créer...