Piloter 2 moteurs pas à pas avec chacun une vitesse et un nombre de tours défini avec un Arduino
Description :
Projet permettant de piloter deux moteurs pas à pas 28BYJ-48 avec un Arduino, chacun contrôlé via son driver ULN2003.
Chaque moteur peut être configuré indépendamment pour définir sa vitesse et le nombre de tours à effectuer.
Cette configuration est idéale pour des projets nécessitant des mouvements synchronisés ou précis, comme des bras robotisés, convoyeurs ou systèmes mécaniques automatisés, tout en offrant un contrôle simple et flexible des paramètres de rotation.
Prérequis :
- 1 x Carte Arduino Uno
- 2 x 28BYJ-48
- 2 x ULN2003
- 1 x Alimentation 12V
- 1 x Bouton
- 1 x Breadboard
- Fils de connexion
Vidéo de démonstration :
Schéma de câblage :


Code :
const int Bouton = 2;
int NbTourMoteur1 = 1; //Nb de tours que va faire le moteur 1
int NbTourMoteur2 = 1; //Nb de tours que va faire le moteur 2
int VitMoteur1 = 1; //Défini la vitesse du moteur1 (1 = Max)
int VitMoteur2 = 4; //Défini la vitesse du moteur2 (1 = Max)
// Déclaration des broches de contrôle du moteur 1
const int M1IN1 = 4;
const int M1IN2 = 5;
const int M1IN3 = 6;
const int M1IN4 = 7;
// Déclaration des broches de contrôle du moteur 2
const int M2IN1 = 8;
const int M2IN2 = 9;
const int M2IN3 = 10;
const int M2IN4 = 11;
//Variables utilisées pour le moteur 1
long CptStepM1 = 0;
int M1EtapeStep = 0;
int TopStepMoteur1 = 0;
int CptNbTourMoteur1 = 0;
//Variables utilisées pour le moteur 2
long CptStepM2 = 0;
int M2EtapeStep = 0;
int TopStepMoteur2 = 0;
int CptNbTourMoteur2 = 0;
int EtatBouton;
unsigned long previousMillis = 0;
void setup() {
// Définition des broches de sortie pour les broches de contrôle des moteurs
pinMode(M1IN1, OUTPUT);
pinMode(M1IN2, OUTPUT);
pinMode(M1IN3, OUTPUT);
pinMode(M1IN4, OUTPUT);
pinMode(M2IN1, OUTPUT);
pinMode(M2IN2, OUTPUT);
pinMode(M2IN3, OUTPUT);
pinMode(M2IN4, OUTPUT);
pinMode(Bouton, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = micros();
int EtatBouton = digitalRead(Bouton);
//2500
if (currentMillis - previousMillis >= 1500) {
previousMillis = currentMillis;
TopStepMoteur1++;
TopStepMoteur2++;
}
if (CptNbTourMoteur1 > 0 && CptStepM1 < 0) {
CptNbTourMoteur1--;
CptStepM1 = 2048 * 2;
}
if (CptStepM1 >= 0 && TopStepMoteur1 == VitMoteur1) {
StepMoteur1();
TopStepMoteur1 = 0;
CptStepM1--;
}
if (CptNbTourMoteur1 == 0 && CptStepM1 < 0) {
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, LOW);
TopStepMoteur1 = 0;
}
if (CptNbTourMoteur2 > 0 && CptStepM2 < 0) {
CptNbTourMoteur2--;
CptStepM2 = 2048 * 2;
}
if (CptStepM2 >= 0 && TopStepMoteur2 == VitMoteur2) {
StepMoteur2();
TopStepMoteur2 = 0;
CptStepM2--;
}
if (CptNbTourMoteur2 == 0 && CptStepM2 < 0) {
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, LOW);
TopStepMoteur2 = 0;
}
if (CptStepM1 < 0 && CptStepM2 < 0 && EtatBouton == LOW) {
CptNbTourMoteur1 = NbTourMoteur1;
CptNbTourMoteur2 = NbTourMoteur2;
}
}
void StepMoteur1() {
switch (M1EtapeStep) {
case 0:
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, HIGH);
break;
case 1:
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, HIGH);
digitalWrite(M1IN4, HIGH);
break;
case 2:
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, HIGH);
digitalWrite(M1IN4, LOW);
break;
case 3:
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, HIGH);
digitalWrite(M1IN3, HIGH);
digitalWrite(M1IN4, LOW);
break;
case 4:
digitalWrite(M1IN1, LOW);
digitalWrite(M1IN2, HIGH);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, LOW);
break;
case 5:
digitalWrite(M1IN1, HIGH);
digitalWrite(M1IN2, HIGH);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, LOW);
break;
case 6:
digitalWrite(M1IN1, HIGH);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, LOW);
break;
case 7:
digitalWrite(M1IN1, HIGH);
digitalWrite(M1IN2, LOW);
digitalWrite(M1IN3, LOW);
digitalWrite(M1IN4, HIGH);
break;
}
M1EtapeStep++;
if (M1EtapeStep > 7) {
M1EtapeStep = 0;
}
}
void StepMoteur2() {
switch (M2EtapeStep) {
case 0:
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, HIGH);
break;
case 1:
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, HIGH);
digitalWrite(M2IN4, HIGH);
break;
case 2:
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, HIGH);
digitalWrite(M2IN4, LOW);
break;
case 3:
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, HIGH);
digitalWrite(M2IN3, HIGH);
digitalWrite(M2IN4, LOW);
break;
case 4:
digitalWrite(M2IN1, LOW);
digitalWrite(M2IN2, HIGH);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, LOW);
break;
case 5:
digitalWrite(M2IN1, HIGH);
digitalWrite(M2IN2, HIGH);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, LOW);
break;
case 6:
digitalWrite(M2IN1, HIGH);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, LOW);
break;
case 7:
digitalWrite(M2IN1, HIGH);
digitalWrite(M2IN2, LOW);
digitalWrite(M2IN3, LOW);
digitalWrite(M2IN4, HIGH);
break;
}
M2EtapeStep++;
if (M2EtapeStep > 7) {
M2EtapeStep = 0;
}
}
