tressage avec 2 moteurs pas à pas
#1
Posté 13 janvier 2026 - 06:16
#2
Posté 13 janvier 2026 - 06:20
#include <AccelStepper.h> #include <LiquidCrystal.h> LiquidCrystal lcd(22, 23, 24, 25, 26, 27); AccelStepper stepper1 (1, 4, 5); // 1 pour dire DRIVER. 4 c'est le pul + sur l’arduino et 5 le dir + AccelStepper stepper2 (1, 7, 8); // 1 pour dire DRIVER. 7 c'est le pul + sur l’arduino et 8 le dir + const int BoutonArret = 29; const int BoutonReglageTourBobine = 34; const int BoutonMarcheAvantBobine = 38; const int BoutonMarcheArriereBobine = 42; const int BoutonReglageTorsade = 32; const int BoutonMarcheTorsadeHoraire = 36; const int BoutonMarcheTorsadeAntiHoraire = 40; const int PotVitesseMot = A0;
#3
Posté 13 janvier 2026 - 06:46
#include <AccelStepper.h>
AccelStepper stepper1 (1, 4, 5); // 1 pour dire driver. 4 c'est le pul + sur l’arduino et 5 le dir +
AccelStepper stepper2 (1, 7, 8); // 1 pour dire driver. 7 c'est le pul + sur l’arduino et 8 le dir +
#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
const int Boutonarret = 29; //arret de tout mouvement
const int BoutonReglageTourBobine = 34;//bonton de reglage qui donne le nombre de tour de la bobine sur le LCD (de 100,200 à 1000)puis retour à 100 en boucle .
const int Boutonmarcheavantbobine = 38;//Bouton de marche avant de la bobine
const int Boutonmarchearrierebobine = 42;//Bouton de marche arrière de la bobine
const int BoutonReglagetorsade = 32;// bonton de reglage qui donne le nombre de tour de la torsade sur le LCD (de 1,2 à 20)puis retour à 1 en boucle .
const int BoutonMarchetorsadeHoraire = 36;//Bouton marche torsade sens horaire
const int BoutonMarchetorsadeAntiHoraire = 40;//Bouton marche torsade sens anti-horaire
const int PotVitesseMot = A0;// Modifie la vitesse du moteur
void setup() {
Serial.begin(9600);
pinMode(Boutonarret, INPUT_PULLUP);
pinMode(BoutonReglageTourBobine, INPUT_PULLUP);
pinMode(Boutonmarchearrierebobine, INPUT_PULLUP);
pinMode(Boutonmarcheavantbobine, INPUT_PULLUP);
pinMode(BoutonReglagetorsade, INPUT_PULLUP);
pinMode(BoutonMarchetorsadeHoraire, INPUT_PULLUP);
pinMode(BoutonMarchetorsadeAntiHoraire, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.print("START PRESS INIT");
}
void loop() {
// put your main code here, to run repeatedly:
}
#4
Posté 19 janvier 2026 - 03:46
Est ce que ce code correspondrait à ton besoin ? :
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// ----- Initialisation des moteurs -----
AccelStepper stepper1(1, 4, 5); // DRIVER : pin Puls +, Dir +
AccelStepper stepper2(1, 7, 8); // DRIVER : pin Puls +, Dir +
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
// ----- Pins des boutons d'un côté connecté à la broche, de l'autre à la masse -----
const int BoutonArret = 29;
const int BoutonReglageTourBobine = 34;
const int BoutonMarcheAvantBobine = 38;
const int BoutonMarcheArriereBobine = 42;
const int BoutonReglageTorsade = 32;
const int BoutonMarcheTorsadeHoraire = 36;
const int BoutonMarcheTorsadeAntiHoraire = 40;
// ----- Potentiomètre pour la vitesse -----
const int PotVitesseMot = A0;
// ----- Variables -----
int toursBobine = 100; // de 100 à 1000
int toursTorsade = 1; // de 1 à 20
int vitesseMax = 500; // vitesse maximale par défaut
void setup() {
Serial.begin(9600);
// ----- Config des boutons -----
pinMode(BoutonArret, INPUT_PULLUP);
pinMode(BoutonReglageTourBobine, INPUT_PULLUP);
pinMode(BoutonMarcheAvantBobine, INPUT_PULLUP);
pinMode(BoutonMarcheArriereBobine, INPUT_PULLUP);
pinMode(BoutonReglageTorsade, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeHoraire, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeAntiHoraire, INPUT_PULLUP);
// ----- Config moteurs -----
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
// ----- Config LCD -----
lcd.begin(16, 2);
// ----- Affichage des valeurs de départ -----
afficherInformations();
}
void afficherInformations() {
// Affichage ligne 1
lcd.setCursor(0, 0);
lcd.print("Torsade: ");
lcd.print(toursTorsade);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
// Affichage ligne 2
lcd.setCursor(0, 1);
lcd.print("Bobine: ");
lcd.print(toursBobine);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
}
void loop() {
// ----- Lecture du potentiomètre -----
int potValue = analogRead(PotVitesseMot); // 0 à 1023
vitesseMax = map(potValue, 0, 1023, 50, 800); // Ajuster min et max si besoin
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
// ----- Réglage tours bobine -----
if (digitalRead(BoutonReglageTourBobine) == LOW) {
toursBobine += 100;
if (toursBobine > 1000) toursBobine = 100;
afficherInformations();
delay(300); // Anti-rebond
}
// ----- Réglage tours torsade -----
if (digitalRead(BoutonReglageTorsade) == LOW) {
toursTorsade++;
if (toursTorsade > 20) toursTorsade = 1;
afficherInformations();
delay(300);
}
// ----- Marche avant bobine -----
if (digitalRead(BoutonMarcheAvantBobine) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bobine Avant");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(true); // true = marche avant
afficherInformations();
}
// ----- Marche arrière bobine -----
if (digitalRead(BoutonMarcheArriereBobine) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bobine Arriere");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(false); // false = marche arrière
afficherInformations();
}
// ----- Torsade horaire -----
if (digitalRead(BoutonMarcheTorsadeHoraire) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Torsade H ");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(true); // true = horaire
afficherInformations();
}
// ----- Torsade anti-horaire -----
if (digitalRead(BoutonMarcheTorsadeAntiHoraire) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Torsade AH");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(false); // false = anti-horaire
afficherInformations();
}
}
// ----- Fonctions de mouvement -----
void tournerBobine(bool avant) {
long steps = toursBobine * 200; // 200 pas par tour pour un moteur 1.8°
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps); // Sens opposé pour le deuxième moteur
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) break; // arrêt d'urgence
}
}
void tournerTorsade(bool horaire) {
long steps = toursTorsade * 200;
if (!horaire) steps = -steps;
stepper1.move(steps);
stepper2.move(steps); // Même sens pour torsade
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) break;
}
}
Si mon commentaire vous a plus laissez nous un avis ! ![]()
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#5
Posté 20 janvier 2026 - 07:44
Eh bien je vais essayé tout ca ..........
#6
Posté 24 janvier 2026 - 09:35
Il y a deux endroit ou cela fonctionne pas bien .
a) Disons que j'appuis sur marche avant bobine suivi d' un arrêt par le bouton . Les moteurs s'arrêtent bien . Mais si je décide de changer de sens , dans un premier temps les moteurs continuent dans le même sens quelques tours avant de faire marche arrière . Quelque soit le choix du bouton si je fait un arrêt puis que je veux repartir dans l'autre sens il repart pas directement .
b ) j'ai réglé sur 800 le nombre de pas par tour . C'est mon driver qui est réglé comme ça . Pour la torsade les moteurs font bien 1 tour ou 15 selon le choix que je règle sur le Lcd . Mais pour la marche avant bobine , si je règle sur 100 tour à l'écran , les moteurs en font 18 . Ou 36 si je règle sur 200 . Pourquoi ?
#7
Posté 24 janvier 2026 - 09:41
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// ----- Initialisation des moteurs -----
AccelStepper stepper1(1, 5, 6); // DRIVER : pin Puls +, Dir +
AccelStepper stepper2(1, 8, 9); // DRIVER : pin Puls +, Dir +
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
// ----- Pins des boutons d'un côté connecté à la broche, de l'autre à la masse -----
const int BoutonArret = 29;
const int BoutonReglageTourBobine = 34;
const int BoutonMarcheAvantBobine = 38;
const int BoutonMarcheArriereBobine = 42;
const int BoutonReglageTorsade = 33;
const int BoutonMarcheTorsadeHoraire = 36;
const int BoutonMarcheTorsadeAntiHoraire = 40;
// ----- Potentiomètre pour la vitesse -----
const int PotVitesseMot = A6;
// ----- Variables -----
int toursBobine = 100; // de 100 à 1000
int toursTorsade = 1; // de 1 à 20
int vitesseMax = 5000; // vitesse maximale par défaut
void setup() {
Serial.begin(9600);
// ----- Config des boutons -----
pinMode(BoutonArret, INPUT_PULLUP);
pinMode(BoutonReglageTourBobine, INPUT_PULLUP);
pinMode(BoutonMarcheAvantBobine, INPUT_PULLUP);
pinMode(BoutonMarcheArriereBobine, INPUT_PULLUP);
pinMode(BoutonReglageTorsade, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeHoraire, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeAntiHoraire, INPUT_PULLUP);
// ----- Config moteurs -----
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
stepper1. setAcceleration (500 ) ;
stepper2. setAcceleration (500 ) ;
// ----- Config LCD -----
lcd.begin(16, 2);
// ----- Affichage des valeurs de départ -----
afficherInformations();
}
void afficherInformations() {
// Affichage ligne 1
lcd.setCursor(0, 0);
lcd.print("Torsade: ");
lcd.print(toursTorsade);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
// Affichage ligne 2
lcd.setCursor(0, 1);
lcd.print("Bobine: ");
lcd.print(toursBobine);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
}
void loop() {
// ----- Lecture du potentiomètre -----
int potValue = analogRead(PotVitesseMot); // 0 à 1023
vitesseMax = map(potValue, 0, 1023, 50, 5000); // Ajuster min et max si besoin
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
// ----- Réglage tours bobine -----
if (digitalRead(BoutonReglageTourBobine) == LOW) {
toursBobine += 100;
if (toursBobine > 1000) toursBobine = 100;
afficherInformations();
delay(100); // Anti-rebond
}
// ----- Réglage tours torsade -----
if (digitalRead(BoutonReglageTorsade) == LOW) {
toursTorsade++;
if (toursTorsade > 20) toursTorsade = 1;
afficherInformations();
delay(100);
}
// ----- Marche avant bobine -----
if (digitalRead(BoutonMarcheAvantBobine) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bobine Avant");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(true); // true = marche avant
afficherInformations();
}
// ----- Marche arrière bobine -----
if (digitalRead(BoutonMarcheArriereBobine) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bobine Arriere");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(false); // false = marche arrière
afficherInformations();
}
// ----- Torsade horaire -----
if (digitalRead(BoutonMarcheTorsadeHoraire) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Torsade H ");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(true); // true = horaire
afficherInformations();
}
// ----- Torsade anti-horaire -----
if (digitalRead(BoutonMarcheTorsadeAntiHoraire) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Torsade AH");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(false); // false = anti-horaire
afficherInformations();
}
}
// ----- Fonctions de mouvement -----
void tournerBobine(bool avant) {
long steps = toursBobine * 800; // info 200 pas par tour pour un moteur 1.8°
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps); // Sens opposé pour le deuxième moteur
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) break; // arrêt d'urgence
}
}
void tournerTorsade(bool horaire) {
long steps = toursTorsade * 800;
if (!horaire) steps = -steps;
stepper1.move(steps);
stepper2.move(steps); // Même sens pour torsade
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) break;
}
}
#8
Posté 25 janvier 2026 - 05:58
hello,
pour le a) mea culpa je suis allé un peu vite et comme je n'avais pas de quoi tester sous la main j'ai oublié d'ajouter des lignes importantes quand on arrête le système voir le commentaire // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
pour le b ) je ne suis pas sûr de bien comprendre le problème pour le moment et vu que j'ai pas de quoi tester ... si le problème persiste je peux essayer de te découper le déplacement en plusieurs déplacement...
En tout cas tu peux déjà tester ce code pour valider qu'à minima le a) est réglé. Si le b persiste je vais te refaire une version pour essayer de le corriger.
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// ----- Initialisation des moteurs -----
AccelStepper stepper1(1, 5, 6);
AccelStepper stepper2(1, 8, 9);
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
// ----- Pins des boutons -----
const int BoutonArret = 29;
const int BoutonReglageTourBobine = 34;
const int BoutonMarcheAvantBobine = 38;
const int BoutonMarcheArriereBobine = 42;
const int BoutonReglageTorsade = 33;
const int BoutonMarcheTorsadeHoraire = 36;
const int BoutonMarcheTorsadeAntiHoraire = 40;
// ----- Potentiomètre -----
const int PotVitesseMot = A6;
// ----- Variables -----
int toursBobine = 100;
int toursTorsade = 1;
int vitesseMax = 5000;
// -------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(BoutonArret, INPUT_PULLUP);
pinMode(BoutonReglageTourBobine, INPUT_PULLUP);
pinMode(BoutonMarcheAvantBobine, INPUT_PULLUP);
pinMode(BoutonMarcheArriereBobine, INPUT_PULLUP);
pinMode(BoutonReglageTorsade, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeHoraire, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeAntiHoraire, INPUT_PULLUP);
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
stepper1.setAcceleration(500);
stepper2.setAcceleration(500);
lcd.begin(16, 2);
afficherInformations();
}
// -------------------------------------------------
void afficherInformations() {
lcd.setCursor(0, 0);
lcd.print("Torsade: ");
lcd.print(toursTorsade);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Bobine: ");
lcd.print(toursBobine);
lcd.print(" ");
}
// -------------------------------------------------
void loop() {
int potValue = analogRead(PotVitesseMot);
vitesseMax = map(potValue, 0, 1023, 50, 5000);
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
if (digitalRead(BoutonReglageTourBobine) == LOW) {
toursBobine += 100;
if (toursBobine > 1000) toursBobine = 100;
afficherInformations();
delay(100);
}
if (digitalRead(BoutonReglageTorsade) == LOW) {
toursTorsade++;
if (toursTorsade > 20) toursTorsade = 1;
afficherInformations();
delay(100);
}
if (digitalRead(BoutonMarcheAvantBobine) == LOW) {
lcd.clear();
lcd.print("Bobine Avant");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(true);
afficherInformations();
}
if (digitalRead(BoutonMarcheArriereBobine) == LOW) {
lcd.clear();
lcd.print("Bobine Arriere");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(false);
afficherInformations();
}
if (digitalRead(BoutonMarcheTorsadeHoraire) == LOW) {
lcd.clear();
lcd.print("Torsade H");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(true);
afficherInformations();
}
if (digitalRead(BoutonMarcheTorsadeAntiHoraire) == LOW) {
lcd.clear();
lcd.print("Torsade AH");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(false);
afficherInformations();
}
}
// -------------------------------------------------
void tournerBobine(bool avant) {
long steps = toursBobine * 800;
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps);
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) { // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
break;
}
}
}
// -------------------------------------------------
void tournerTorsade(bool horaire) {
long steps = toursTorsade * 800;
if (!horaire) steps = -steps;
stepper1.move(steps);
stepper2.move(steps);
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) { // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
break;
}
}
}
Si mon commentaire vous a plus laissez nous un avis ! ![]()
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#9
Posté 27 janvier 2026 - 05:31
a ) le bouton arrêt fait bien son travail maintenant . A l'appuis , ils s'arrêtent net et repartent bien dans le sens désiré si je donne un ordre de mouvement . C'est top !
b ) Pour le nombre de tour que les moteurs devrai faire , y'a un soucis bizarre . Pour la torsade , si je règle sur 3 ou 4 tours , ils le font . Ok pour la torsade .
Mais pour la marche avant bobine , si je règle sur 100 tours à l'écran , les moteurs en font 18 alors qu'il devrai en faire cent . Si je règle sur 200 tours ils en font 36 . Toujours ce même multiple de 18. C'est pas logique ?
#10
Posté 27 janvier 2026 - 11:29
non ce n'est pas logique... J'ai l'impression qu'il y a une limite de la librairie.
Si tu remplace la fonction void tournerBobine(bool avant) par celle ci :
void tournerBobine(bool avant) {
const int TOURS_PAR_BLOC = 10;
const long PAS_PAR_TOUR = 800;
const long PAS_PAR_BLOC = TOURS_PAR_BLOC * PAS_PAR_TOUR;
int blocs = toursBobine / TOURS_PAR_BLOC; // nombre de blocs de 10 tours
for (int i = 0; i < blocs; i++) {
long steps = PAS_PAR_BLOC;
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps);
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) {
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
return; // sortie immédiate
}
}
}
}
Est ce que ça règle le soucis en te faisant des blocs de 10 tours ?
Si mon commentaire vous a plus laissez nous un avis ! ![]()
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#11
Posté 27 janvier 2026 - 11:35
Je penses que le problème vient du fait que sur Arduino, un int ne fait que 16 bits (et pas 32 ou 64 bits comme sur les ordinateurs).
Je penses que le problème vient de cette ligne :
long steps = toursTorsade * 800;
toursTorsade=100 (de type int)
800 = 800 (de type int)
100*800 = 80 000 >2^16 : donc ça ne rentre pas dans un int. Le résultat est donc 800 * 100 modulo 2^16 = 14 464 = 18.08 * 800, soit environ 18 tours
De même pour 200*800 modulo 2^16 = 28928 = 36.16 * 800, soit un petit peu plus de 36 tours
Le "problème" est qu'une opération entre 2 int est calculée en tant que int, et ce n'est qu'ensuite que le résultat est convertit en long (qui contient 32 bits, assez pour contenir le résultat).
Je vois donc 2 solutions.
Solution 1 : changer le type des variables :
Remplacer :
// ----- Variables ----- int toursBobine = 100; int toursTorsade = 1; int vitesseMax = 5000;
par :
// ----- Variables ----- long toursBobine = 100; long toursTorsade = 1; int vitesseMax = 5000;
Solution 2 : forcer le calcul à se faire en long :
Remplacer
long steps = toursTorsade * 800;
par
long steps = (long)toursTorsade * (long)800;
NB : il faut faire la même modif pour
long steps = toursBobine * 800;
EDIT :
@Mike : je ne sais pas si la librairie limite, mais en tout cas, tu as un dépassement de capacité (overflow) des int, qui ne font que 16 bits sur arduini
- Mike118 aime ceci
Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...
Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.
#12
Posté 27 janvier 2026 - 11:53
Je penses que le problème vient du fait que sur Arduino, un int ne fait que 16 bits (et pas 32 ou 64 bits comme sur les ordinateurs).
Je penses que le problème vient de cette ligne :long steps = toursTorsade * 800;toursTorsade=100 (de type int)
800 = 800 (de type int)
100*800 = 80 000 >2^16 : donc ça ne rentre pas dans un int. Le résultat est donc 800 * 100 modulo 2^16 = 14 464 = 18.08 * 800, soit environ 18 tours
De même pour 200*800 modulo 2^16 = 28928 = 36.16 * 800, soit un petit peu plus de 36 tours
Le "problème" est qu'une opération entre 2 int est calculée en tant que int, et ce n'est qu'ensuite que le résultat est convertit en long (qui contient 32 bits, assez pour contenir le résultat).
Je vois donc 2 solutions.
Solution 1 : changer le type des variables :
Remplacer :// ----- Variables ----- int toursBobine = 100; int toursTorsade = 1; int vitesseMax = 5000;par :
// ----- Variables ----- long toursBobine = 100; long toursTorsade = 1; int vitesseMax = 5000;Solution 2 : forcer le calcul à se faire en long :
Remplacerlong steps = toursTorsade * 800;par
long steps = (long)toursTorsade * (long)800;NB : il faut faire la même modif pour
long steps = toursBobine * 800;EDIT :
@Mike : je ne sais pas si la librairie limite, mais en tout cas, tu as un dépassement de capacité (overflow) des int, qui ne font que 16 bits sur arduini
Tu as peut être mis le doigt sur le truc
le long est bien sur 32 bits comme prévu mais il y a peut être un simple problème de cast là où tu l'as identifié ...
Dans ce cas là si c'est bien le problème tester juste :
void tournerBobine(bool avant) {
long steps = (long)toursBobine * 800;
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps);
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) { // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
break;
}
}
}
devrait régler le problème =)
Si mon commentaire vous a plus laissez nous un avis ! ![]()
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#13
Posté 28 janvier 2026 - 07:37
Alors , oui ,le code au dessus , règle le problème . Que ce soit 100 , 400 ou 1000 , les moteurs font tous les tours demandés . Nickel !!
Merci pour ce code .
Pour faire le retour sur cette modif là :
void tournerBobine(bool avant) {
const int TOURS_PAR_BLOC = 10;
const long PAS_PAR_TOUR = 800;
const long PAS_PAR_BLOC = TOURS_PAR_BLOC * PAS_PAR_TOUR;
Si je demande 100 tours , il y a un temps d'arrêt tous les 10 tours , pour arriver à 100 . Bon voila c'est pour l'info .
- Mike118 aime ceci
#14
Posté 29 janvier 2026 - 07:30
Le code complet
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// ----- Initialisation des moteurs -----
AccelStepper stepper1(1, 5, 6);
AccelStepper stepper2(1, 8, 9);
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
// ----- Pins des boutons -----
const int BoutonArret = 29;
const int BoutonReglageTourBobine = 34;
const int BoutonMarcheAvantBobine = 38;
const int BoutonMarcheArriereBobine = 42;
const int BoutonReglageTorsade = 33;
const int BoutonMarcheTorsadeHoraire = 36;
const int BoutonMarcheTorsadeAntiHoraire = 40;
// ----- Potentiomètre -----
const int PotVitesseMot = A6;
// ----- Variables -----
int toursBobine = 100;
int toursTorsade = 1; // de 1 à 20
int vitesseMax = 5000; // vitesse maximale par défaut
// -------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(BoutonArret, INPUT_PULLUP);
pinMode(BoutonReglageTourBobine, INPUT_PULLUP);
pinMode(BoutonMarcheAvantBobine, INPUT_PULLUP);
pinMode(BoutonMarcheArriereBobine, INPUT_PULLUP);
pinMode(BoutonReglageTorsade, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeHoraire, INPUT_PULLUP);
pinMode(BoutonMarcheTorsadeAntiHoraire, INPUT_PULLUP);
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
stepper1.setAcceleration(500);
stepper2.setAcceleration(500);
lcd.begin(16, 2);
afficherInformations();
}
// -------------------------------------------------
void afficherInformations() {
lcd.setCursor(0, 0);
lcd.print("Torsade: ");
lcd.print(toursTorsade);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
lcd.setCursor(0, 1);
lcd.print("Bobine: ");
lcd.print(toursBobine);
lcd.print(" "); // efface les restes si le chiffre précédent était plus grand
}
// -------------------------------------------------
void loop() {
int potValue = analogRead(PotVitesseMot); // 0 à 1023
vitesseMax = map(potValue, 0, 1023, 50, 5000); // Ajuster min (50) et max (5000)si besoin
stepper1.setMaxSpeed(vitesseMax);
stepper2.setMaxSpeed(vitesseMax);
if (digitalRead(BoutonReglageTourBobine) == LOW) {
toursBobine += 100;
if (toursBobine > 1000) toursBobine = 100;
afficherInformations();
delay(200);
}
if (digitalRead(BoutonReglageTorsade) == LOW) {
toursTorsade++;
if (toursTorsade > 20) toursTorsade = 1;
afficherInformations();
delay(200);
}
if (digitalRead(BoutonMarcheAvantBobine) == LOW) {
lcd.clear();
lcd.print("Bobine Avant");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(true); // true = marche avant
afficherInformations();
}
if (digitalRead(BoutonMarcheArriereBobine) == LOW) {
lcd.clear();
lcd.print("Bobine Arriere");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerBobine(false); // false = marche arrière
afficherInformations();
}
if (digitalRead(BoutonMarcheTorsadeHoraire) == LOW) {
lcd.clear();
lcd.print("Torsade H");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(true); // true = horaire
afficherInformations();
}
if (digitalRead(BoutonMarcheTorsadeAntiHoraire) == LOW) {
lcd.clear();
lcd.print("Torsade AH");
lcd.setCursor(0, 1);
lcd.print("en cours...");
tournerTorsade(false); // false = anti-horaire
afficherInformations();
}
}
// ----- Fonctions de mouvement -----
void tournerBobine(bool avant) {
long steps = (long)toursBobine * 800; // info 200 pas par tour pour un moteur 1.8°
if (!avant) steps = -steps;
stepper1.move(steps);
stepper2.move(-steps); // Sens opposé pour le deuxième moteur
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) { // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
break;
}
}
}
// ----- Fonctions de mouvement -----
void tournerTorsade(bool horaire) {
long steps = toursTorsade * 800; // info 200 pas par tour pour un moteur 1.8°
if (!horaire) steps = -steps;
stepper1.move(steps);
stepper2.move(steps);
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
stepper1.run();
stepper2.run();
if (digitalRead(BoutonArret) == LOW) { // Modification pour arrêter proprement le système en cas d'appuis sur le bouton stop
stepper1.stop();
stepper2.stop();
stepper1.setCurrentPosition(stepper1.currentPosition());
stepper2.setCurrentPosition(stepper2.currentPosition());
break;
}
}
}
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users













