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);
}