Aller au contenu

Le moteur pas-à-pas

Alt text


Introduction

Votre kit contient un moteur pas-à-pas (stepper motor) 28BYJ-48 avec un module de pilotage ULN2003.

Utilisation

On retrouve les moteurs pas-à-pas dans plusieurs applications comme les lecteurs de disques, les disques durs, les imprimantes, les robots, etc.

IMAGE ALT TEXT HERE

Zone le fun : Jetez un coup d'œil sur ce site pour trouver des projets amusants avec le moteur pas-à-pas de votre kit.

Fonctionnement d'un moteur pas-à-pas

Les moteurs pas-à-pas utilisent une roue dentée et des électroaimants pour faire avancer la roue d'un "pas" à la fois.

Chaque impulsion haute envoyée alimente la bobine, attirant les dents les plus proches de la roue dentée et faisant tourner le moteur par incréments d'angle précis et fixes appelés pas.

Le nombre de pas que le moteur pas-à-pas effectue pour une rotation complète de 360 degrés correspond en réalité au nombre de dents sur la roue dentée.

Alt text

La manière dont vous impulsez ces bobines détermine le fonctionnement du moteur.

  • La séquence des impulsions détermine le sens de rotation du moteur.
  • La fréquence des impulsions détermine la vitesse du moteur.
  • Le nombre d'impulsions détermine la distance que le moteur parcourra.

En alimentant les bobines dans la séquence correcte, le moteur est mis en rotation.

Note : L'objectif du cours n'étant pas de comprendre le fonctionnement du moteur, nous allons nous concentrer sur la façon de le contrôler.

Cet article explique en détail le fonctionnement du moteur pas-à-pas et comment le contrôler avec un Arduino.

Le moteur pas-à-pas 28BYJ-48

Le 28BYJ-48 est un moteur pas-à-pas unipolaire à 5 fils qui fonctionne sous 5V. Il est parfait pour les projets qui nécessitent un positionnement précis, comme l'ouverture et la fermeture d'une ventilation.

Étant donné que le moteur n'utilise pas de balais de contact, il a un mouvement relativement précis et est assez fiable.

Malgré sa petite taille, le moteur fournit un couple décent de 34,3 mN·m (349 g·cm) à une vitesse d'environ 15 RPM. Il offre un bon couple même à l'arrêt et le maintient tant que le moteur reçoit de l'énergie.

Le seul inconvénient est qu'il consomme relativement beaucoup d'énergie, même lorsqu'il est à l'arrêt.

Le câblage

Le moteur pas-à-pas 28BYJ-48 possède cinq fils. Les broches sont les suivantes:

Alt text

Le 28BYJ-48 a deux bobines, chacune ayant une prise centrale. Ces deux prises centrales sont connectées en interne et sorties comme le 5e fil (fil rouge).

Ensemble, une extrémité de la bobine et la prise centrale forment une phase. Ainsi, le 28BYJ-48 a un total de quatre phases.

Alt text

Le fil rouge est toujours tiré vers le haut (HIGH), donc lorsque l'autre fil est tiré vers le bas (LOW), la phase est alimentée.

Le moteur pas-à-pas ne tourne que lorsque les phases sont alimentées dans une séquence logique connue sous le nom de séquence de pas.

Rapport de réduction de l'engrenage

Selon la fiche technique, lorsque le moteur 28BYJ-48 est utilisé en mode pas complet, chaque pas correspond à une rotation de 11,25°. Cela signifie qu'il y a 32 pas par tour (360°/11,25° = 32).

Alt text

De plus, le moteur dispose d'un ensemble de réduction d'engrenage de 1/64 (en réalité, il s'agit de 1/63,68395, mais 1/64 est une approximation suffisamment précise pour la plupart des applications).

Cela signifie qu'en réalité, il y a 2038 pas (32*63,68395 pas par tour = 2037,8864 environ 2038 pas).


Le module de contrôle ULN2003

Étant donné que le moteur pas-à-pas 28BYJ-48 consomme une quantité importante de puissance, il ne peut pas être contrôlé directement par un microcontrôleur tel que l'Arduino. Pour contrôler le moteur, un circuit intégré de commande tel que l'ULN2003 est nécessaire ; par conséquent, ce moteur est généralement livré avec une carte de commande basée sur l'ULN2003.

L'ULN2003, connu pour sa capacité de courant élevé et sa capacité de tension élevée, fournit un gain de courant plus élevé qu'un simple transistor et permet à une sortie de faible tension et faible courant d'un microcontrôleur de piloter un moteur pas-à-pas de courant élevé.

Alt text

La carte possède quatre entrées de contrôle et une connexion d'alimentation électrique.

De plus, il y a un connecteur Molex compatible avec celui du moteur, vous permettant de brancher directement le moteur dessus.

La carte comprend quatre LED qui indiquent l'activité sur les quatre lignes d'entrée de contrôle. Elles fournissent une bonne indication visuelle pendant le mouvement par pas.

Il y a un cavalier ON/OFF sur la carte pour désactiver le moteur pas-à-pas si nécessaire.

Alt text

Branchement

Connectons le moteur à notre Arduino!

Les connexions sont simples. Commencez par connecter une source d'alimentation externe de 5V au driver ULN2003.

Attention:

Le moteur pas-à-pas peut être alimenté directement depuis l'Arduino, mais cela n'est pas recommandé car le moteur peut générer du bruit électrique sur ses lignes d'alimentation, ce qui peut endommager l'Arduino.

Dans ce cours, nous utilisons des Arduino Mega 2560. Connectez les entrées IN1, IN2, IN3 et IN4 de la carte de commande aux broches numériques 31, 33, 35 et 37 de l'Arduino, respectivement. Ensuite, connectez le moteur pas-à-pas au driver ULN2003.

Enfin, assurez-vous que votre circuit et votre Arduino ont une masse commune.

Le diagramme suivant montre le branchement typique d'un montage.

alt text

Exemple de code avec la librairie AccelStepper

La librairie AccelStepper est une librairie permettant de contrôler les moteurs pas-à-pas. Elle est plus rapide et plus flexible que la librairie Stepper qui vient par défaut. Surtout, elle n'est pas bloquante, ce qui signifie que vous pouvez exécuter d'autres tâches pendant le mouvement du moteur.

La première étape sera d'installer la librairie AccelStepper depuis le gestionnaire de bibliothèques Arduino.

  • Recherchez 'AccelStepper' dans le gestionnaire de bibliothèques Arduino. Assurez-vous que ce soit la version réalisée par Mike McCauley.

Alt text

Voici un code de base pour faire tourner le moteur dans une direction, puis dans l'autre (brochage Mega 2560).

#include <AccelStepper.h>

// Définir le type de moteur, les broches IN1-IN3-IN2-IN4
#define MOTOR_INTERFACE_TYPE 4

#define IN_1 31
#define IN_2 33
#define IN_3 35
#define IN_4 37

// Crée une instance
// Attention : L’ordre des broches (IN1, IN3, IN2, IN4) est spécifique au 28BYJ-48.
AccelStepper myStepper(MOTOR_INTERFACE_TYPE, IN_1, IN_3, IN_2, IN_4);

void setup() {
// Définir la vitesse maximale, le facteur d'accélération,
// la vitesse initiale et la position cible
    myStepper.setMaxSpeed(500);  // Vitesse max en pas/seconde
    myStepper.setAcceleration(100); // Accélération en pas/seconde²
    myStepper.setSpeed(200); // Vitesse constante en pas/seconde
    myStepper.moveTo(2038); // Position cible
}

void loop() {
    // Changer de direction une fois que le moteur atteint la position cible
    if (myStepper.distanceToGo() == 0) 
        myStepper.moveTo(-myStepper.currentPosition());

    // Faire tourner le moteur d'un pas
  // Il faut appeler cette fonction dans le loop sinon le moteur ne tourne pas
    myStepper.run();
}

Explication du code

MOTOR_INTERFACE_TYPE est une constante qui définit le type de moteur utilisé en mode full-step.

#define MOTOR_INTERFACE_TYPE 4

Ensuite, on crée une instance de la classe AccelStepper en indiquant le type de moteur, les broches IN1-IN3-IN2-IN4.

AccelStepper myStepper(MOTOR_INTERFACE_TYPE, IN_1, IN_3, IN_2, IN_4);

Dans la fonction setup, la vitesse maximale autorisée du moteur est réglée sur 500 (le moteur accélérera jusqu'à cette vitesse lors de l'exécution). Le taux d'accélération/freinage est ensuite défini pour ajouter de l'accélération et du freinage aux mouvements du moteur pas-à-pas.

La vitesse constante est réglée sur 200. Et, comme le 28BYJ-48 effectue 2038 pas par tour, la position cible est également réglée sur 2038.

1
2
3
4
    myStepper.setMaxSpeed(500);  // Vitesse max en pas/seconde
    myStepper.setAcceleration(100); // Accélération en pas/seconde²
    myStepper.setSpeed(200); // Vitesse constante en pas/seconde
    myStepper.moveTo(2038); // Position cible

Dans la fonction loop, une instruction if est utilisée pour déterminer la distance que le moteur doit parcourir (en lisant la propriété distanceToGo) avant d'atteindre la position cible (définie par moveTo). Lorsque la distanceToGo atteint zéro, le moteur est tourné dans la direction opposée en définissant la position moveTo comme étant le négatif de sa position actuelle.

En bas de la boucle, vous remarquerez que la fonction run() est appelée. C'est la fonction la plus importante, car le moteur pas-à-pas ne se déplacera pas s'il n'est pas exécuté.

1
2
3
4
5
6
7
8
9
void loop() {
    // Changer de direction une fois que le moteur atteint la position cible
    if (myStepper.distanceToGo() == 0) 
        myStepper.moveTo(-myStepper.currentPosition());

    // Faire tourner le moteur d'un pas
  // Il faut appeler cette fonction dans le loop sinon le moteur ne tourne pas
    myStepper.run();
}

Exercices

  1. Tester différents paramètres de vitesse et accélération
  2. Modifiez setMaxSpeed() et setAcceleration() pour observer les effets sur le mouvement.
  3. Faire tourner le moteur à l’infini dans un seul sens
  4. Remplacez moveTo() par myStepper.setSpeed() et utilisez runSpeed().
  5. Contrôler la direction avec un bouton
  6. Ajoutez un bouton sur la broche 2 pour changer la direction du moteur.
  7. Utiliser un potentiomètre pour ajuster la vitesse
  8. Branchez un potentiomètre sur A0 et utilisez analogRead(A0) pour modifier setMaxSpeed().

Références