demandeinfos Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 Bonjour, J'utilise le code ci-dessous avec le matériel suivant : TB6600 + carte Arduino UNO + 1 moteur Nema 17+ 1 mini interrupteur + 1 mini potentiomètre le tout relié sur une breadboard. #include <AccelStepper.h> #define INTERUPTEURPIN 10 #define ANALOGPIN A0 AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF void setup() { pinMode(INTERUPTEURPIN,INPUT); stepper.setMaxSpeed(10000); } void loop() { if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(ANALOGPIN)); else stepper.setSpeed(0); stepper.runSpeed(); } Tout fonctionne, mais j'ai du mal à obtenir la régulation de la vitesse par le potentiomètre : après avoir mis l'alimentation, quand je tourne la vis après parfois plusieurs tours, dès fois il ne se passe rien, puis à un certain moment la vitesse change un peu mais pas trop, puis plus rien. Mon problème est du coup que je n'arrive pas à avoir une régulation correcte sur à peine quelques tours de vis du potentiomètre. Comment peut-on gérer cet aspect ? Merci d'avance pour vos conseils. Bonne journée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Locouarn Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 hysteresis ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 6, 2018 Auteur Partager Posté(e) Octobre 6, 2018 Désolé, je ne comprends pas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jmarie3D Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 Tu dois faire une conversion entre la tension donnée par le potentiomètre (qui retourne une valeur entre 0 et 1023 sur la pin analogique) vers une valeur en pas par seconde à fournir à la fonction setSpeed() Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 6, 2018 Auteur Partager Posté(e) Octobre 6, 2018 (modifié) Merci beaucoup pour cette info claire, n'étant pas du domaine, je comprends. Alors en m'aidant du web, j'avais essayé ça (ci-dessous) car on m'avait dit "faut multiplier la valeur du potentiomètre), mais ça ne fonctionne pas mieux #include <AccelStepper.h> #define INTERUPTEURPIN 10 #define ANALOGPIN A0 int val = 0; // variable de type int pour stocker la valeur de la mesure AccelStepper stepper(1, 4, 7); void setup() { pinMode(INTERUPTEURPIN,INPUT); stepper.setMaxSpeed(10000); } void loop() { // lire la valeur de la tension analogique présente sur la broche val = analogRead(ANALOGPIN); // multiplier la valeur de l'entrée analogique par 10 val *=10 ; if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val); else stepper.setSpeed(0); stepper.runSpeed(); } Pourriez-vous me donner une info ? Merci. Modifié (le) Octobre 6, 2018 par demandeinfos Lien vers le commentaire Partager sur d’autres sites More sharing options...
jmarie3D Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 Non, je ne me suis jamais penché sur le fonctionnement des moteurs pas-à-pas sur Arduino. À ta place, j'essaierais d'abord d'envoyer quelques valeurs fixes pour voir comment le moteur réagit. Regarde aussi les fichiers exemples fournis avec la bibliothèque. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Djam Posté(e) Octobre 6, 2018 Partager Posté(e) Octobre 6, 2018 (modifié) Salut, pas besoin de donner une valeur au int val (sa valeur va être donné dans le loop à chaque lecture...et y'en a assez pour lire ce bout de code autant de fois que tu vas tourner le potentiomètre dans un sens ou dans l'autre! ) : int val; Le max speed me semble un peu haut, essaye de descendre un peu plus bas pour voir si il y a du mieux, genre 1000, puis si ça fonctionne comme tu le veux incrémente de 1000 en 1000, puis regarde si ça va toujours, jusqu'au point trop haut que ton moteur ne pourra supporte, et peaufine en descendant de 100 en 100..... et tu as oublié l'accélération (moi j'ai 3000 pour un petit moteur à toi de voir pour le tient...) : stepper.setAcceleration(3000); Pour éviter de multiplier ta valeur val par 10 fait une map, comme ça tu monteras proportionnellement la vitesse en rapport à la lecture de ton potentiomètre (tout en mettant une limite à chaque valeur...): Speed =analogRead(Pin_Pot); Speed = map(Speed, 0, 1015, 9, 195); en gros à 0 en lecture du potentiomètre le moteur fait 9 rotation/sec et à 1015 en lecture il fait 195 rot/sec, les valeurs lu entre 0 et 1015 monteront proportionnellement la vitesse du moteur... C'est des bouts de code à moi donc pas les bonnes déclarations.... Et pour ma part je vois pas l’intérêt de l'interrupt dans ton bout de code, se sera plus tard si tu comptes ajouter certaine chose, et encore ça dépend... https://pastebin.com/YJM19uZj > code valable une semaine ^^ Modifié (le) Octobre 6, 2018 par Djam Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 7, 2018 Auteur Partager Posté(e) Octobre 7, 2018 Bonjour, Pour le potentiomètre, j'utilise celui-ci. J'ai testé ce code, mais je n'ai pas vu de changement (un seul en passan de 10000 à 1000 le moteur tourne moins vite) : #include <AccelStepper.h> #define INTERUPTEURPIN 10 #define ANALOGPIN A0 #define Speed int val ; 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); stepper.setMaxSpeed(100); } void loop() { val = analogRead(ANALOGPIN); val *=10 ; Serial.print("Valeur lue : "); Serial.println(val); // affiche la valeur du potentiomètre delay(0); // affiche 1 fois par seconde if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(val)) ; if( digitalRead(INTERUPTEURPIN) ) stepper.setAcceleration(3000) ; else stepper.setSpeed(0); stepper.runSpeed(); } Je n'ai pas réussi à placer (messag d'erreur). Speed =analogRead(Pin_Pot); Speed = map(Speed, 0, 1015, 9, 195); il apparaît des messages d'erreur. Merci pour la page web de code, je suis dessus ;). Bonne journée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 (modifié) Il est normal que tu ai une erreur puisque la variable Pin_Pot n'existe pas dans ton code (pas de déclaration). il y a une heure, demandeinfos a dit : if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(val)) ; 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 ; il y a une heure, demandeinfos a dit : if( digitalRead(INTERUPTEURPIN) ) stepper.setAcceleration(3000) ; Cette instruction doit être installer dans le setup comme le fait Djam... (sans la condition évidemment ) Modifié (le) Octobre 7, 2018 par Zlika Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 7, 2018 Auteur Partager Posté(e) Octobre 7, 2018 Merci pour les infos. Voilà le code (Prog1) corrigé : #include <AccelStepper.h> #define INTERUPTEURPIN 10 #define ANALOGPIN A0 int val=0 ; 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); stepper.setMaxSpeed(1000); stepper.setAcceleration(3000); } void loop() { val = analogRead(ANALOGPIN); val = map(val,0,1023,0,1000); Serial.print("Valeur lue : "); Serial.println(val); // affiche la valeur du potentiomètre delay(0); // affiche 1 fois par seconde if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val) ; else stepper.setSpeed(0); stepper.runSpeed(); } par contre j'ai toujours le même souci, quand je lance le programme ci-dessous (prog2) : #include <AccelStepper.h> #define INTERUPTEURPIN 10 AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF void setup() { pinMode(INTERUPTEURPIN,INPUT); stepper.setMaxSpeed(10000); stepper.setAcceleration(3000); } void loop() { if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(3000); else stepper.setSpeed(0); stepper.runSpeed(); } je m'aperçois que le moteur tourne beaucoup plus vite qu'avec le Prog1 (avec lequel le moteur plafonne à une faible vitesse, quel que soit le réglage du potentiomètre) auriez-vous une piste ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 7, 2018 Auteur Partager Posté(e) Octobre 7, 2018 Je suis tout à fait d'accord, j'essaye de faire mon max pour ne pas diffuser de programme avec des fautes (je ne suis pas à l'abri, et à je débuté). C'est vrai que j'ai diffusé un programme avec stepper.setMaxSpeed(1000) mais si je mets stepper.setMaxSpeed(10000) j'obtiens exactement les mêmes résultats, le moteur plafonne à une vitesse faible même au max du potentiomètre, et je n'arrive pas à atteindre les vitesses du "Prog2". Je comprends depuis peu avec mes débuts que le signal analogique de 0 à 1023 doit être multiplier par un valeur X pour obtenir un plus grand nombre de pas envoyé au moteur (si j'ai bien compris). Mais dans tous mes essais avec le potentiomètre, j'ai beau essayé de multiplier la valeur, d'utiliser du mappage, j'arrive toujours pas aux vitesses que j'obtiens avec le "Prog2". Je me disais donc que soit je me trompre dans le code (c'est tout à fait possible :)) ) soit je n'ai pas bien compris la façon dont on multiplie le signal analogique et ou on place la variable multipliée dans le programme. Merci d'avance pour vos retour. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 (modifié) J'avais bien compris que tu débutais en programmation d'où ma démarche plus pédagogique . On est tous passé par là. il y a une heure, demandeinfos a dit : val = map(val,0,1023,0,1000); 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. Modifié (le) Octobre 7, 2018 par Zlika Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 7, 2018 Auteur Partager Posté(e) Octobre 7, 2018 j'avais déjà essayé j'avais même essayé val = map(val,0,1023,-6000,6000); pour voir mais il se passe toujours la même chose, avec le Prog1 le moteur plafonne à une vitesse faible même au max du potentiomètre, e quelle que soit la valeur affichée dans le moniteur et du mappage (que je mette, 5, 1000 ou 6000), et je n'arrive pas à atteindre des vitesses importantes comme je le fais "à la main" dans le "Prog2". Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 7, 2018 Auteur Partager Posté(e) Octobre 7, 2018 ci-dessous mon dernier code avec toujours le même résultat d'un moteur qui plafonne à basse vitesse : #include <AccelStepper.h> #define INTERUPTEURPIN 10 #define ANALOGPIN A0 int val=0 ; int valInter=0 ; 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); stepper.setMaxSpeed(10000); stepper.setAcceleration(3000); } void loop() { val = analogRead(ANALOGPIN); valInter = map(val,0,1023,0,3000); Serial.print("Valeur lue : "); Serial.println(valInter); // affiche la valeur du potentiomètre delay(0); // affiche 1 fois par seconde if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(valInter) ; else stepper.setSpeed(0); stepper.runSpeed(); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 (modifié) 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 Modifié (le) Octobre 7, 2018 par Zlika Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 (modifié) 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 Modifié (le) Octobre 7, 2018 par Zlika Lien vers le commentaire Partager sur d’autres sites More sharing options...
.AleX. Posté(e) Octobre 7, 2018 Partager Posté(e) Octobre 7, 2018 Je proposerais aussi pour test de remplacer le valInter lu par un une boucle for de 100 en 100 toutes les secondes pour vérifier comment se comporte le stepper et être sur qu'il n'y ait pas de problème 'externe' pouvant limiter la vitesse. Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 8, 2018 Auteur Partager Posté(e) Octobre 8, 2018 Bonjour, Merci pour vos retours, je fais une pause sur le post car il faut que je comprenne un peu les histoires de temps comme vous me l'avez envoyé. J'ai trouvé aussi ce lien. Je vais faire quelques essais et si jamais je ne m'en sortais pas, je vous tiendrai au courant. Bonne journée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Djam Posté(e) Octobre 8, 2018 Partager Posté(e) Octobre 8, 2018 (modifié) Salut fait vite fait donc peut étre des erreurs: #include <AccelStepper.h> int INTERUPTEURPIN = 10 ; int Pin_Pot = 0 ; int val_Pot ; int Speed ; unsigned long Val_Read; unsigned long Old_Read; const long Interval = 1000; // interval de lecture valeur Potentiométre 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(10000); stepper.setAcceleration(3000); } void loop() { val_Pot = analogRead(Pin_Pot); Speed = map(val_Pot,0,1023,0,3000); Val_Read = millis(); if (Val_Read - Old_Read >= Interval){ //Lecture potentiométre tout les "Interval" Serial.print("Valeur Pot : "); Serial.println(val_Pot); // affiche la valeur du potentiomètre Serial.print("Vitesse : "); Serial.println(Speed); // affiche la vitesse Old_Read = Val_Read; } if( digitalRead(INTERUPTEURPIN) == true ) stepper.setSpeed(Speed) ; else stepper.setSpeed(0); stepper.runSpeed(); } Modifié (le) Octobre 8, 2018 par Djam Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 8, 2018 Partager Posté(e) Octobre 8, 2018 (modifié) 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. Citation The fastest motor speed that can be reliably supported is about 4000 steps per second at a clock frequency of 16 MHz on Arduino such as Uno etc. Faster processors can support faster stepping speeds. 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. Modifié (le) Octobre 8, 2018 par Zlika Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 15, 2018 Auteur Partager Posté(e) Octobre 15, 2018 Bonsoir, Merci pour ce retour, je n'ai pas encore eu le temps de tester, j'essaye de faire l'essai dans la semaine et je vous tiens au courant. Bonne soirée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
demandeinfos Posté(e) Octobre 28, 2018 Auteur Partager Posté(e) Octobre 28, 2018 Bonsoir, Désolé pour le retour tardif. Le code de Djam fonctionne très bien : j'en avais déjà un mais celui de Djam donne une plage de vitesse assez large de faibles à hautes. Par contre celui Zlika, je ne comprends pas ce qu'il se passe : une fois le code téléversé, rien de ne se passe, et quand je tourne le potentiomètre, le moteur va se mettre à tourner doucement à un moment donné puis décélère (sans toucher au potentiomètre), si je tourne de nouveau le potentiomètre ceci peut encore se reproduire. Merci pour vos retours, je vais poursuivre mes essais et reviendrai sur le post si besoin. Bonne soirée. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Zlika Posté(e) Octobre 29, 2018 Partager Posté(e) Octobre 29, 2018 Le 08/10/2018 at 21:08, Zlika a dit : 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 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... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant