Contrôle de moteur pas-à-pas par commande simplifiée

Le programme ci-dessous permet de contrôler un moteur pas-à-pas 28BYJ-48 avec un contrôleur ULN2003 de la manière la plus simple possible mais dans ce cas le moteur ne développera pas tout son couple :

1
int IN1 = 8;      // pin digital 8 relié à IN1
2
int IN2 = 9;      // pin digital 9 à IN2
3
int IN3 = 10;     // pin digital 10 à IN3
4
int IN4 = 11;     // pin digital 11 à IN4
5
int temps = 20;  // temps entre les pas, minimum 10 ms.
6
7
void setup(){
8
  // tous les pins se configurent comme sorties
9
  pinMode(IN1, OUTPUT);
10
  pinMode(IN2, OUTPUT);
11
  pinMode(IN3, OUTPUT);
12
  pinMode(IN4, OUTPUT);
13
}
14
15
void loop(){
16
  // 512*4 = 2048 pas pour un tour complet
17
  for (int i = 0; i < 512; i++) {
18
    digitalWrite(IN1, HIGH);  // pas 1 
19
    digitalWrite(IN2, LOW);
20
    digitalWrite(IN3, LOW);
21
    digitalWrite(IN4, LOW);
22
    delay(temps);
23
24
    digitalWrite(IN1, LOW);   // pas 2
25
    digitalWrite(IN2, HIGH);
26
    digitalWrite(IN3, LOW);
27
    digitalWrite(IN4, LOW);
28
    delay(temps);
29
30
    digitalWrite(IN1, LOW);   // pas 3
31
    digitalWrite(IN2, LOW);
32
    digitalWrite(IN3, HIGH);
33
    digitalWrite(IN4, LOW);
34
    delay(temps);
35
36
    digitalWrite(IN1, LOW);   // pas 4
37
    digitalWrite(IN2, LOW);
38
    digitalWrite(IN3, LOW);
39
    digitalWrite(IN4, HIGH);
40
    delay(temps);
41
  }
42
  // pause de 5 secondes
43
  digitalWrite(IN1, LOW);
44
  digitalWrite(IN2, LOW);
45
  digitalWrite(IN3, LOW);
46
  digitalWrite(IN4, LOW);
47
  delay(5000);
48
}

Ce programme peut être réduit en utilisant un tableau pour piloter les sorties du driver :

1
int IN1 = 8;      // pin digital 8 relié à IN1
2
int IN2 = 9;      // pin digital 9 à IN2
3
int IN3 = 10;     // pin digital 10 à IN3
4
int IN4 = 11;     // pin digital 11 à IN4
5
int temps = 20;  // temps entre les pas, minimun 10 ms.
6
7
// Tableau bidimensionnel avec la séquence des pas
8
int pas [4][4] = {
9
  {1, 0, 0, 0},
10
  {0, 1, 0, 0},
11
  {0, 0, 1, 0},
12
  {0, 0, 0, 1}
13
};
14
15
void setup(){
16
  // tous les pins se configurent comme sorties
17
  pinMode(IN1, OUTPUT);
18
  pinMode(IN2, OUTPUT);
19
  pinMode(IN3, OUTPUT);
20
  pinMode(IN4, OUTPUT);
21
}
22
23
void loop(){
24
  // 512 cycles * 4 pas par cycle = 2048 pas par tour d'axe en sortie de réducteur
25
  for (int i = 0; i < 512; i++){
26
    // boucle qui lit le tableau ligne par ligne
27
    for (int i = 0; i < 4; i++){
28
      digitalWrite(IN1, pas[i][0]);
29
      digitalWrite(IN2, pas[i][1]);
30
      digitalWrite(IN3, pas[i][2]);
31
      digitalWrite(IN4, pas[i][3]);
32
      delay(temps);
33
    }
34
  }
35
  // pause
36
  digitalWrite(IN1, LOW);
37
  digitalWrite(IN2, LOW);
38
  digitalWrite(IN3, LOW);
39
  digitalWrite(IN4, LOW);
40
  delay(temps);
41
}

Dans ce cas, les bobines sont pilotées ainsi :

Pour plus de détails : Commander un moteur pas-à-pas

Le montage à réaliser est le suivant :

Ce moteur nécessite en théorie une alimentation de 12V pour fonctionner correctement mais vous pouvez l'alimenter avec la carte Arduino si vous le faites tourner à vide. Si vous possédez une alimentation 12V, branchez le + sur le Vin du driver et reliez les masses de l'alimentation et de la carte Arduino pour éviter les phénomènes de masse flottante.

Question 1 : Réalisez le montage, téléversez le code et constatez son fonctionnement.

Question 2 : Modifiez le programme pour faire faire au moteur 3 tours dans un sens et 1 tour dans l'autre.