Le moteur Pas à Pas 28BYJ-48 – 5V Stepper Motor
Ce moteur possède un réducteur 1/64 avec des engrenages. pour qu’il fasse un tour complet il faut 2048 pas.
L’amplificateur ou DRIVER ULN2003
On câble notre moteur avec le driver ULN2003
Pour donner plus d’énergie au bobines du moteur on utilise un ULN2003 (il peut être alimenté en +12V plus de pêche ! ou un 5 V externe) mais par souci de simplifier les manipulations on va utiliser le 5V fournit par l’USB , mais ça n’est pas recommandé dans un projet sérieux.
- 9 de l’arduino UNO sur IN1 (phase 1)
- 10 de l’arduino UNO sur IN2 (phase 2)
- 11 de l’arduino UNO sur IN3 (phase 3)
- 12 de l’arduino UNO sur IN4 (phase 4)
Version 1: simple Pas par Pas
Code pour faire tourner dans le sens des aiguilles d’une montre Pas par Pas
// Broches de l'Arduino connectées au driver ULN2003
#define IN1 9
#define IN2 10
#define IN3 11
#define IN4 12
// Séquence de pas pour faire tourner le moteur (mode "wave drive")
// Cette séquence active une bobine à la fois
int sequence[4][4] = {
{1, 0, 0, 0}, // Étape 1: Active la bobine 1
{0, 1, 0, 0}, // Étape 2: Active la bobine 2
{0, 0, 1, 0}, // Étape 3: Active la bobine 3
{0, 0, 0, 1} // Étape 4: Active la bobine 4
};
// Temps d'attente entre chaque pas (en millisecondes)
// Réduisez cette valeur pour augmenter la vitesse
int delai = 10;
void setup() {
// Configure les broches en sortie
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Initialise le port série pour le débogage
Serial.begin(9600);
Serial.println("Moteur pas à pas 28BYJ-48 - Rotation horaire");
}
void appliquerEtape(int etape) {
// Applique la configuration de l'étape courante aux broches
digitalWrite(IN1, sequence[etape][0]);
digitalWrite(IN2, sequence[etape][1]);
digitalWrite(IN3, sequence[etape][2]);
digitalWrite(IN4, sequence[etape][3]);
// Affiche l'étape en cours sur le moniteur série
Serial.print("Étape ");
Serial.println(etape + 1);
}
void loop() {
// Parcours les 4 étapes de la séquence dans l'ordre (sens horaire)
for(int etape = 0; etape < 4; etape++) {
appliquerEtape(etape);
delay(delai);
}
// Après 100 tours, on marque une pause pour voir ce qui se passe
static unsigned long compteurPas = 0;
compteurPas++;
if(compteurPas % 400 == 0) { // Environ 1/5 de tour
Serial.println("--- Pause de 2 secondes ---");
delay(2000);
}
}
Version 2: Mode Pas Complet (Full-Step) – Plus de couple
// Broches de l'Arduino connectées au driver ULN2003
#define IN1 9
#define IN2 10
#define IN3 11
#define IN4 12
// Séquence FULL-STEP (4 étapes) - Deux bobines activées simultanément
// Plus de couple, moins fluide
int sequenceFullStep[4][4] = {
{1, 1, 0, 0}, // Étape 1: Bobines 1 et 2 activées
{0, 1, 1, 0}, // Étape 2: Bobines 2 et 3 activées
{0, 0, 1, 1}, // Étape 3: Bobines 3 et 4 activées
{1, 0, 0, 1} // Étape 4: Bobines 4 et 1 activées
};
int delai = 10;
bool sensHoraire = true; // true = horaire, false = anti-horaire
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
Serial.println("Mode FULL-STEP - Deux bobines activées");
Serial.println("Plus de couple, moins fluide");
}
void appliquerEtape(int etape) {
digitalWrite(IN1, sequenceFullStep[etape][0]);
digitalWrite(IN2, sequenceFullStep[etape][1]);
digitalWrite(IN3, sequenceFullStep[etape][2]);
digitalWrite(IN4, sequenceFullStep[etape][3]);
Serial.print("Étape ");
Serial.print(etape + 1);
Serial.print(" : Bobines ");
if(sequenceFullStep[etape][0]) Serial.print("1 ");
if(sequenceFullStep[etape][1]) Serial.print("2 ");
if(sequenceFullStep[etape][2]) Serial.print("3 ");
if(sequenceFullStep[etape][3]) Serial.print("4 ");
Serial.println("actives");
}
void loop() {
if(sensHoraire) {
// Sens horaire
for(int etape = 0; etape < 4; etape++) {
appliquerEtape(etape);
delay(delai);
}
} else {
// Sens anti-horaire
for(int etape = 3; etape >= 0; etape--) {
appliquerEtape(etape);
delay(delai);
}
}
// Changement de sens après 100 cycles
static int compteur = 0;
compteur++;
if(compteur >= 100) {
compteur = 0;
sensHoraire = !sensHoraire;
Serial.println(sensHoraire ? "→ Sens HORAIRE" : "← Sens ANTI-HORAIRE");
delay(1000);
}
}
Version 3: Pas et demi Pas
Mode Demi-Pas (Half-Step) – Plus fluide
// Broches de l'Arduino connectées au driver ULN2003
#define IN1 9
#define IN2 10
#define IN3 11
#define IN4 12
// Séquence HALF-STEP (8 étapes) - Alternance 1 et 2 bobines
// Plus fluide, plus de précision (double la résolution)
int sequenceHalfStep[8][4] = {
{1, 0, 0, 0}, // Étape 1: Bobine 1 seule
{1, 1, 0, 0}, // Étape 2: Bobines 1 et 2
{0, 1, 0, 0}, // Étape 3: Bobine 2 seule
{0, 1, 1, 0}, // Étape 4: Bobines 2 et 3
{0, 0, 1, 0}, // Étape 5: Bobine 3 seule
{0, 0, 1, 1}, // Étape 6: Bobines 3 et 4
{0, 0, 0, 1}, // Étape 7: Bobine 4 seule
{1, 0, 0, 1} // Étape 8: Bobines 4 et 1
};
int delai = 10;
bool sensHoraire = true;
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
Serial.println("Mode HALF-STEP - 8 étapes par cycle");
Serial.println("Plus fluide, plus de précision");
}
void appliquerEtape(int etape) {
digitalWrite(IN1, sequenceHalfStep[etape][0]);
digitalWrite(IN2, sequenceHalfStep[etape][1]);
digitalWrite(IN3, sequenceHalfStep[etape][2]);
digitalWrite(IN4, sequenceHalfStep[etape][3]);
Serial.print("Étape ");
Serial.print(etape + 1);
Serial.print(" : ");
// Compte le nombre de bobines activées
int bobinesActives = 0;
if(sequenceHalfStep[etape][0]) bobinesActives++;
if(sequenceHalfStep[etape][1]) bobinesActives++;
if(sequenceHalfStep[etape][2]) bobinesActives++;
if(sequenceHalfStep[etape][3]) bobinesActives++;
Serial.print(bobinesActives);
Serial.println(" bobine(s) active(s)");
}
void loop() {
if(sensHoraire) {
// Sens horaire
for(int etape = 0; etape < 8; etape++) {
appliquerEtape(etape);
delay(delai);
}
} else {
// Sens anti-horaire
for(int etape = 7; etape >= 0; etape--) {
appliquerEtape(etape);
delay(delai);
}
}
// Changement de sens après 50 cycles
static int compteur = 0;
compteur++;
if(compteur >= 50) {
compteur = 0;
sensHoraire = !sensHoraire;
Serial.println(sensHoraire ? "→ Sens HORAIRE" : "← Sens ANTI-HORAIRE");
delay(1000);
}
}
Il existe une libraire Stepper.h disponible mais on ne sait pas comment cela fonctionne.
#include <Stepper.h>
// 32 pas par tour, reducteur de 1/64... Donc 32*64 pas pour 1 tour.
int NbPas = 2048;
//pour un moteur de 200 pas par tour et brancher sur les broches 6, 9, 10 et 11
Stepper moteur(NbPas, 9, 11, 10, 6);
void setup()
{
moteur.setSpeed(10);
}
void loop()
{
//Faire un tour = 2048 pas dans le sens 1
moteur.step(2048);
delay(2000);
//Faire un tour = 2048 pas dans le sens 2
moteur.step(-2048);
delay(2000);
}

