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 ...
Dans la suite je présenterai le cas particulier du moteur pas à pas unipolaire.
Définition : Principe 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.
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.
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éfinition : Driver
Pour simplifier le branchement du moteur, il est généralement accompagné d'une carte de pilotage (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.
Définition : Stepper.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
const int pasParTour = 2038; // nombre de pas par tour
const int tourParMinute = 15; // pour notre moteur vitesse entre 0 et 17 rpm (tours par minute)
// initialisation avec le nombre de pas
// et la séquence spécifique à notre moteur IN1-IN3-IN2-IN4
Stepper moteur(pasParTour, 8, 10, 9, 11);
void setup() {
// vitesse de rotation
moteur.setSpeed(tourParMinute);
}
void loop() {
// tourne d'un tour dans un sens:
moteur.step(pasParTour);
delay(500);
// tourne d'un tour dans l'autre sens:
moteur.step(-pasParTour);
delay(500);
}
Cette bibliothèque nous demande de spécifier le nombre de pas de notre moteur ainsi que le cycle des broches.
Stepper moteur(pasParTour, 8, 10, 9, 11);
On peut fixer la vitesse en nombre de tours par minute.
moteur.setSpeed(tourParMinute);
On fait tourner d'un certain nombre de pas avec la méthode step :
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éfinition : AccelStepper.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.
const int pasParTour = 2038; // nombre de pas par tour
int vitesse = 500; // vitesse désirée en pas par seconde
// initialisation avec le type de moteur
// et la séquence spécifique à notre moteur IN1-IN3-IN2-IN4
AccelStepper moteur(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
void setup()
{
moteur.setMaxSpeed(1000); // vitesse max en pas par seconde
moteur.setSpeed(vitesse); // vitesse en pas par seconde
}
void loop()
{
//Change de sens après un tour
if (moteur.currentPosition() >= pasParTour)
{
moteur.setSpeed(-vitesse);
}
if (moteur.currentPosition() <= 0)
{
moteur.setSpeed(vitesse);
}
moteur.runSpeed();
}
Cette bibliothèque nous demande de spécifier le type de moteur ainsi que le cycle des broches.
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.
moteur.setMaxSpeed(1000);
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.
moteur.runSpeed();
On peut récupérer le nombre de pas effectué depuis le lancement. Une vitesse négative diminue ce nombre.
moteur.currentPosition();
Cette information permet par exemple de changer le sens de rotation en fonction d'une condition.
Définition : AccelStepper.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.
const int pasParTour = 2038; // nombre de pas par tour
int vitesse = 500; // nombre pas par seconde
int distance = 1500; // nombre de pas à parcourir
AccelStepper moteur(AccelStepper::FULL4WIRE, 8, 10, 9, 11);
void setup()
{
moteur.setMaxSpeed(1000);
moteur.setAcceleration(100); // accélération en pas par seconde au carre
moteur.setSpeed(vitesse);
moteur.move(distance); // nombre de pas de déplacement
}
void loop()
{
//Change de sens quand la distance est parcourue
if (moteur.distanceToGo() == 0)
{
distance = -distance;
moteur.move(distance);
}
moteur.run();
}
En plus de la vitesse max et de la vitesse de déplacement, on défini l'accélération.
moteur.setAcceleration(100);
On fixe le nombre de pas que l'on souhaite réaliser
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.
moteur.run();
On peut récupérer le nombre de pas qu'il reste à effectuer.
moteur.distanceToGo();
Cette information permet par exemple de changer le sens de rotation en fonction d'une condition.