Moteur pas à pas unipolaire

Un moteur pas à pas est un moteur qui tourne d'un certain angle à chaque fois qu'on lui demande. Si pour faire un tour on lui demande 32 fois, on dira que c'est un moteur 32 pas par tour. Le pas étant l'angle qu'il effectue à chaque demande. C'est à dire 360 / 32 = 11,25°.

L'avantage des moteurs pas à pas est que si l'on connaît le nombre de pas par tour, on peut lui demander de tourner d'un certain angle avec précision. De plus, selon la commande on pourra effectuer la rotation dans un sen ou dans l'autre.

Ces moteurs sont utilisés pour les déplacements demandant de la précision, comme dans les scanners, les imprimantes 3D ...

Moteur pas à pas

Dans la suite je présenterai le cas particulier du moteur pas à pas unipolaire.

DéfinitionPrincipe du moteur pas à pas unipolaire

Le principe du moteur pas à pas est d'alimenter différentes bobines afin d'attirer les dents d'un axe afin de le faire tourner. A chaque cycle d'allumage des bobines le moteur avance d'un pas.

Moteur pas à pas - Principe

Nous voyons sur l'animation qu'il faudra que l'on alimente les unes à la suite des autres les différentes bobines. L'ordre dans lequel nous alimenterons les bobines permettra de faire tourner dans un sens ou dans l'autre.

La vitesse dépendra donc de la fréquence d'alimentation des bobines.

La vitesse et l'angle de rotation dépendront aussi du nombre de pas de notre moteur.

Moteur pas à pas - Réducteur

Afin d'augmenter ce pas certain moteurs contiennent un réducteur formé de plusieurs engrenages.

Le moteur 28BYJ-48 a comme produit des ratios (grand engrenage / petit engrenage) :

32/9 * 22/11 * 26/9 * 31/10 = 63,68

Ce qui signifie que le nombre de pas d'origine est multiplié par 63,68. Il faut donc 32 * 63,68 (≈2038) pas de l'axe principal pour faire tourner l'axe secondaire d'un tour.

Nous obtenons un moteur de 2038 pas, ce qui permet d'avoir une plus grande précision de déplacement. En contre partie la vitesse max est réduite d'autant.

DéfinitionDriver

Pour simplifier le branchement du moteur, il est généralement accompagné d'une carte de pilotage (driver).

Moteur pas à pas - Driver

Afin de séparer la commande du moteur, L'Arduino et la carte doivent être alimentés par des sources différentes. La masse (GND) doit être commune aux deux alimentations.

Moteur pas à pas

DéfinitionStepper.h

D'après la documentation, pour faire tourner d'un pas notre moteur, il faut envoyer un état haut successivement aux broches

IN1 - IN3 - IN2 - IN4 (attention à l'ordre).

Pour simplifier notre code nous incluons la bibliothèque Stepper.h

Moteur pas à pas
1
#include <Stepper.h>
2
3
const int pasParTour = 2038;   // nombre de pas par tour
4
const int tourParMinute = 15;  // pour notre moteur vitesse entre 0 et 17 rpm (tours par minute)
5
6
// initialisation avec le nombre de pas
7
// et la séquence spécifique à notre moteur IN1-IN3-IN2-IN4
8
Stepper moteur(pasParTour, 8, 10, 9, 11);
9
10
void setup() {
11
  // vitesse de rotation
12
  moteur.setSpeed(tourParMinute);
13
}
14
15
void loop() {  
16
  // tourne d'un tour dans un sens:
17
  moteur.step(pasParTour);
18
  delay(500);
19
20
  // tourne d'un tour dans l'autre sens:
21
  moteur.step(-pasParTour);
22
  delay(500);
23
}

Cette bibliothèque nous demande de spécifier le nombre de pas de notre moteur ainsi que le cycle des broches.

1
Stepper moteur(pasParTour, 8, 10, 9, 11);

On peut fixer la vitesse en nombre de tours par minute.

1
moteur.setSpeed(tourParMinute);

On fait tourner d'un certain nombre de pas avec la méthode step :

1
moteur.step(nbrDePas);

Un nombre de pas positif fait tourner dans un sens. Un nombre de pas négatif fait tourner dans l'autre sens.

DéfinitionAccelStepper.h

L'inconvénient de Stepper.h est qu'il utilise la fonction delay pour actionner le moteur. Ce qui signifie que l'on doit attendre la fin de la rotation de notre moteur pour envoyer une nouvelle commande. On dit que la méthode est bloquante. Comme on l'a vu précédemment, il vaudrait mieux utiliser les fonctionsmillis() et micros().

La bibliothèque AccelStepper.h n'est pas bloquante.

Moteur pas à pas
1
#include <AccelStepper.h>
2
3
const int pasParTour = 2038; // nombre de pas par tour
4
int vitesse = 500;           // vitesse désirée en pas par seconde
5
6
// initialisation avec le type de moteur
7
// et la séquence spécifique à notre moteur IN1-IN3-IN2-IN4
8
AccelStepper moteur(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
9
10
void setup()
11
{
12
  moteur.setMaxSpeed(1000);   // vitesse max en pas par seconde
13
  moteur.setSpeed(vitesse);   // vitesse en pas par seconde
14
}
15
16
void loop()
17
{
18
  //Change de sens après un tour
19
  if (moteur.currentPosition() >= pasParTour)
20
  {
21
    moteur.setSpeed(-vitesse);
22
  }
23
  if (moteur.currentPosition() <= 0)
24
  {
25
    moteur.setSpeed(vitesse);
26
  }
27
  moteur.runSpeed();
28
}

Cette bibliothèque nous demande de spécifier le type de moteur ainsi que le cycle des broches.

1
AccelStepper moteur(AccelStepper::FULL4WIRE, 8, 10, 9, 11);

Il faut spécifier la vitesse max et la vitesse de déplacement voulue. Une vitesse négative fait tourner dans le sens antihoraire.

1
moteur.setMaxSpeed(1000);
2
moteur.setSpeed(vitesse);

La méthode runSpeed() doit être lancée dans la fonction loop afin de calculer et effectuer les rotations à chaque tour de boucle.

1
moteur.runSpeed();

On peut récupérer le nombre de pas effectué depuis le lancement. Une vitesse négative diminue ce nombre.

1
moteur.currentPosition();

Cette information permet par exemple de changer le sens de rotation en fonction d'une condition.

DéfinitionAccelStepper.h avec position et accélération

Différentes méthodes et paramètres permettent d'effectuer le déplacement par accélération et décélération.

Le nombre de pas peut être fixé, quand il est atteint le moteur s’arrête.

1
#include <AccelStepper.h>
2
3
const int pasParTour = 2038; // nombre de pas par tour
4
int vitesse = 500;           // nombre pas par seconde
5
int distance = 1500;         // nombre de pas à parcourir
6
7
AccelStepper moteur(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
8
9
void setup()
10
{
11
  moteur.setMaxSpeed(1000); 
12
  moteur.setAcceleration(100); // accélération en pas par seconde au carre
13
  moteur.setSpeed(vitesse);
14
  moteur.move(distance);      // nombre de pas de déplacement
15
}
16
17
void loop()
18
{
19
  //Change de sens quand la distance est parcourue
20
  if (moteur.distanceToGo() == 0)
21
  {
22
    distance = -distance;
23
    moteur.move(distance);
24
  }
25
  
26
  moteur.run();
27
}

En plus de la vitesse max et de la vitesse de déplacement, on défini l'accélération.

1
moteur.setAcceleration(100);

On fixe le nombre de pas que l'on souhaite réaliser

1
moteur.move(distance);

La méthode run() doit être lancée dans la fonction loop afin de calculer et effectuer les rotations à chaque tour de boucle.

1
moteur.run();

On peut récupérer le nombre de pas qu'il reste à effectuer.

1
moteur.distanceToGo();

Cette information permet par exemple de changer le sens de rotation en fonction d'une condition.