Composants · 6 min de lecture

Qu'est-ce qu'un moteur pas à pas ? Rotation précise avec le 28BYJ-48 et le ULN2003 sur Arduino

Comment fonctionne un moteur pas à pas ? Câblage du 28BYJ-48 et du driver ULN2003, pas par tour (2048), bibliothèques Stepper et AccelStepper, rotation à un angle donné, NEMA 17 avec A4988, ESP32 et Pico.

Un moteur pas à pas découpe sa rotation en petits pas égaux. À chaque commande, il tourne d'un angle fixe : tu sais donc exactement où il s'est arrêté, sans aucun capteur. Les imprimantes 3D, les machines CNC, les sliders de caméra et les rideaux automatiques utilisent des moteurs pas à pas pour cette précision. Le moyen le moins cher de débuter avec Arduino, c'est le moteur 28BYJ-48 et la carte driver ULN2003 vendue avec.

Moteur pas à pas 28BYJ-48 et carte driver ULN2003
Moteur pas à pas 28BYJ-48 et driver ULN2003 : la prise 5 fils du moteur s'enfiche sur la carte ; les quatre LED indiquent quelle bobine est active.

Comment fonctionne un moteur pas à pas ?

Un moteur pas à pas contient plusieurs bobines disposées autour d'un rotor aimanté et denté. Quand on alimente les bobines dans un ordre précis, le rotor est attiré à chaque fois vers la bobine la plus proche et avance d'un pas. Si la séquence défile vite, le moteur tourne vite ; lentement, il tourne lentement ; si tu l'inverses, il tourne dans l'autre sens. Comme le moteur compte chaque pas, sa position est connue, mais s'il est surchargé il peut sauter des pas sans s'en rendre compte.

Moteur pas à pas, servo ou moteur à courant continu ?

CaractéristiqueMoteur à courant continuServomoteurMoteur pas à pas
MouvementTourne en continuVa à un angle donné (souvent 0–180°)Tours illimités, pas à pas
Information de positionAucuneOui (asservissement interne)Connue en comptant les pas
VitesseTrès rapideMoyenneFaible à moyenne
Couple à basse vitesseFaibleMoyenÉlevé
Usage typiqueRoues, ventilateurs, pompesBras robot, serrures, directionImprimantes 3D, CNC, sliders, horloges

S'il suffit d'aller à un angle et de le tenir, un servo est plus simple ; tous les détails sont dans Qu'est-ce qu'un servomoteur ? Pour une rotation rapide et continue, un moteur à courant continu avec un driver L298N convient mieux. Pour les tâches qui demandent à la fois plusieurs tours et une position connue, le moteur pas à pas est imbattable.

Caractéristiques techniques du 28BYJ-48

CaractéristiqueValeur
TypeMoteur pas à pas unipolaire 4 phases
Tension de fonctionnement5 V DC
Réduction interneEnviron 1:64
Pas par tour2048 (pas entier), 4096 (demi-pas)
Angle de pasEnviron 0,18° (pas entier)
ConsommationEnviron 200–250 mA
Vitesse maximaleEnviron 10–15 tr/min
Fils5 (le rouge est le commun)

Câblage du driver ULN2003

La prise 5 fils du moteur ne s'enfiche sur la carte ULN2003 que dans un seul sens : impossible de se tromper. Relie les broches IN1–IN4 de la carte aux broches 8–11 de l'Arduino, et ses bornes + et – à une alimentation 5 V. Le ULN2003 est un réseau de transistors Darlington qui amplifie le petit signal de la broche Arduino jusqu'au courant dont la bobine a besoin ; les quatre LED de la carte montrent les bobines qui s'activent tour à tour.

Broche ULN2003Arduino Uno
IN1D8
IN2D9
IN3D10
IN4D11
+ (5–12 V)5 V externe (la broche 5V de l'Uno suffit pour un moteur)
– (GND)GND (commun avec l'Arduino)
Le 28BYJ-48 consomme environ 240 mA. Un Uno alimenté en USB peut faire tourner un moteur, mais avec deux moteurs ou d'autres charges, utilise une alimentation 5 V externe et relie les masses. Même à l'arrêt, le courant traverse les bobines, d'où l'échauffement ; si le moteur reste longtemps immobile, libère les bobines en mettant les quatre broches à LOW.

Premier tour avec la bibliothèque Stepper

La bibliothèque Stepper est fournie avec l'Arduino IDE, rien à installer. Le seul piège est l'ordre des broches : pour le 28BYJ-48, l'objet doit être déclaré dans l'ordre 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Si tu écris 8, 9, 10, 11, le moteur vibre sur place au lieu de tourner ; c'est l'erreur la plus fréquente.

Arduino (C++)
1#include <Stepper.h>
2
3const int STEPS_PER_REV = 2048;                  // 28BYJ-48 tam tur / full revolution
4Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);      // sıra: IN1, IN3, IN2, IN4 / order: IN1, IN3, IN2, IN4
5
6void setup() {
7  motor.setSpeed(10);                            // devir/dakika, en fazla ~15 / RPM, max ~15
8}
9
10void loop() {
11  motor.step(STEPS_PER_REV);        // bir yönde tam tur / one full turn
12  delay(1000);
13  motor.step(-STEPS_PER_REV / 2);   // ters yönde yarım tur / half a turn back
14  delay(1000);
15}
Pour convertir un angle en pas, utilise pas = angle × 2048 / 360. Par exemple, 90 degrés font 512 pas et 45 degrés, 256 pas.

Contrôle de position avec un potentiomètre

Si tu mémorises la position actuelle du moteur dans une variable, tu peux l'envoyer où tu veux. Le code ci-dessous convertit la position du potentiomètre en 0 à 2048 pas, et le moteur se place au même endroit, comme s'il suivait le bouton. Une tolérance de 10 pas ignore les petites fluctuations. Le branchement du potentiomètre est expliqué dans Qu'est-ce qu'un potentiomètre ?

Arduino (C++)
1#include <Stepper.h>
2
3Stepper motor(2048, 8, 10, 9, 11);
4int position = 0;                                    // şu anki adım / current step
5
6void setup() {
7  motor.setSpeed(12);
8}
9
10void loop() {
11  int target = map(analogRead(A0), 0, 1023, 0, 2048);  // potansiyometre → hedef / pot → target
12  if (abs(target - position) > 10) {                 // küçük titreşimleri yok say / ignore jitter
13    motor.step(target - position);
14    position = target;
15  }
16}

AccelStepper : accélération douce sans bloquer le programme

La commande step() de la bibliothèque Stepper bloque le programme jusqu'à la fin du mouvement ; pendant ce temps, impossible de lire un bouton ou de rafraîchir un écran. AccelStepper, à installer depuis le gestionnaire de bibliothèques, fait avancer le moteur pas à pas en arrière-plan et ajoute accélération et décélération pour éviter les démarrages brusques. Pour le 28BYJ-48, on utilise le mode demi-pas (HALF4WIRE), où un tour fait 4096 pas :

Arduino (C++)
1#include <AccelStepper.h>
2
3// 28BYJ-48 + ULN2003, yarım adım: tur başına 4096 / half-step: 4096 per turn
4AccelStepper motor(AccelStepper::HALF4WIRE, 8, 10, 9, 11);
5
6void setup() {
7  motor.setMaxSpeed(1000);      // adım/saniye / steps per second
8  motor.setAcceleration(400);   // adım/saniye² / steps per second²
9  motor.moveTo(4096);           // bir tur ileri / one turn forward
10}
11
12void loop() {
13  if (motor.distanceToGo() == 0) {
14    motor.moveTo(-motor.currentPosition());   // geri dön / go back
15  }
16  motor.run();                  // her döngüde çağır, bekletmez / call every loop, non-blocking
17}

Des moteurs plus puissants : NEMA 17 et A4988

Module driver de moteur pas à pas A4988
Driver A4988 : il se commande avec seulement les broches STEP et DIR ; son petit potentiomètre limite le courant du moteur.

Pour les tâches qui demandent de la force, comme les imprimantes 3D et les CNC, on utilise des moteurs pas à pas bipolaires comme le NEMA 17. Ils font 200 pas par tour (1,8°) et sont bien plus puissants que le 28BYJ-48. On les pilote avec des drivers comme l'A4988 ou le DRV8825 : à chaque impulsion sur STEP, le moteur avance d'un pas, et la broche DIR fixe le sens. Le driver s'alimente en 8–35 V et, grâce au micro-pas, divise chaque pas jusqu'à 16 fois pour un mouvement plus fluide.

Arduino (C++)
1const int STEP_PIN = 3;
2const int DIR_PIN = 4;
3
4void setup() {
5  pinMode(STEP_PIN, OUTPUT);
6  pinMode(DIR_PIN, OUTPUT);
7}
8
9void loop() {
10  digitalWrite(DIR_PIN, HIGH);          // yön / direction
11  for (int i = 0; i < 200; i++) {       // NEMA 17'de 200 adım = 1 tur / 200 steps = 1 turn
12    digitalWrite(STEP_PIN, HIGH);
13    delayMicroseconds(800);             // küçüldükçe hız artar / smaller = faster
14    digitalWrite(STEP_PIN, LOW);
15    delayMicroseconds(800);
16  }
17  delay(1000);
18}
Avant d'utiliser un A4988, règle la limite de courant avec son potentiomètre selon ton moteur, place un condensateur de 100 µF sur l'alimentation du moteur et ne débranche jamais les fils du moteur quand le driver est sous tension : il peut griller instantanément.

Moteur pas à pas avec l'ESP32 et le Raspberry Pi Pico

Les entrées du ULN2003 fonctionnent sans souci avec des signaux 3,3 V ; alimente quand même le moteur séparément en 5 V. Sur l'ESP32, la bibliothèque AccelStepper fonctionne telle quelle ; utilise des broches hors de 6–11 et 34–39, par exemple GPIO 19, 18, 5 et 17. Sur le Pico en MicroPython, tu fais tourner le moteur en écrivant tour à tour la séquence demi-pas sur les quatre broches :

MicroPython
1from machine import Pin
2import time
3
4pins = [Pin(n, Pin.OUT) for n in (2, 3, 4, 5)]      # IN1–IN4 → GP2–GP5
5SEQ = [[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,1,1,0],
6       [0,0,1,0],[0,0,1,1],[0,0,0,1],[1,0,0,1]]    # yarım adım dizisi / half-step sequence
7
8def rotate(steps, delay_ms=2):
9    direction = 1 if steps > 0 else -1
10    for i in range(abs(steps)):
11        for pin, value in zip(pins, SEQ[(i * direction) % 8]):
12            pin.value(value)
13        time.sleep_ms(delay_ms)
14    for pin in pins:
15        pin.value(0)                                   # bobinleri bırak / release coils
16
17rotate(4096)        # bir tur / one turn (half-step)
18rotate(-1024)       # çeyrek tur geri / quarter turn back

Idées de projets avec un moteur pas à pas

  • Horloge analogique : une horloge de bureau dont les aiguilles sont entraînées par des moteurs pas à pas.
  • Slider de caméra : un rail qui déplace la caméra très lentement pour des timelapses.
  • Distributeur de nourriture pour poissons : un mécanisme qui fait tourner sa trémie deux fois par jour pour libérer de la nourriture.
  • Panneau qui suit le soleil : oriente un panneau vers le côté le plus lumineux avec deux capteurs de lumière ; pour la partie lumière, vois Capteur de lumière LDR.
  • Plateau tournant : un plateau qui fait tourner un objet par angles égaux pour des photos produit ou un scan 3D.
  • Rideau automatique : un moteur qui ouvre et ferme le rideau en enroulant sa cordelette et mémorise sa position.

Erreurs fréquentes et solutions

  • Le moteur vibre mais ne tourne pas : l'ordre des broches dans la bibliothèque Stepper est faux ; écris 8, 10, 9, 11 au lieu de 8, 9, 10, 11.
  • Le moteur saute des pas : la vitesse est trop élevée ou la charge trop lourde ; reste sous 15 tr/min avec le 28BYJ-48 et ajoute une accélération avec AccelStepper.
  • L'Arduino redémarre : l'alimentation ne suffit pas ; alimente le moteur avec une source 5 V externe et relie les masses.
  • Le moteur chauffe à l'arrêt : les bobines restent alimentées ; mets les quatre broches à LOW une fois le mouvement terminé.
  • Le nombre de tours ne colle pas : il y a 2048 pas en pas entier et 4096 en demi-pas, contre 200 pour un NEMA 17. Ne confonds pas le mode et le moteur.
  • Le moteur ne tourne pas avec un A4988 : la limite de courant est trop basse, l'alimentation du moteur manque, ou les broches RESET et SLEEP ne sont pas reliées.

Le moteur pas à pas est le moyen le plus simple de dire « tourne exactement de tant », et il est à la base de machines comme les fraiseuses CNC et les imprimantes 3D. Dans l'application BlueGrays, tu trouveras des projets d'utilisation du 28BYJ-48 et de fabrication d'un servo 360 degrés à partir d'un moteur pas à pas, pas à pas avec schémas et code.

Questions fréquentes

Combien de pas le 28BYJ-48 fait-il par tour ?

Environ 2048 en mode pas entier et environ 4096 en demi-pas. Comme la réduction interne n'est pas exactement de 1:64, une petite dérive peut s'accumuler sur de très longs déplacements ; pour un travail précis, il est bon de remettre la position à zéro de temps en temps avec un capteur de fin de course.

Pourquoi mon moteur pas à pas vibre-t-il sans tourner ?

La cause la plus fréquente est un mauvais ordre d'alimentation des bobines. Dans la bibliothèque Stepper d'Arduino, les broches du 28BYJ-48 doivent être écrites dans l'ordre 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Le moteur peut aussi vibrer au lieu de tourner si la vitesse est trop élevée ou l'alimentation trop faible.

Puis-je alimenter le ULN2003 par la broche 5V de l'Arduino ?

Pour un seul 28BYJ-48, généralement oui ; le moteur consomme environ 240 mA et l'USB suit. Avec deux moteurs, des servos ou d'autres charges, le régulateur et le port USB de l'Arduino sont à la peine ; utilise alors une alimentation 5 V externe et relie les masses.

Comment un moteur pas à pas connaît-il sa position ?

Un moteur pas à pas ne mesure pas sa position : il la connaît en comptant les pas effectués. C'est pourquoi on l'amène au démarrage sur un point de référence (comme un capteur de fin de course) pour le mettre à zéro, et qu'on évite les pas sautés dus à une surcharge ou à une vitesse excessive.

Faut-il un moteur pas à pas ou un servomoteur ?

S'il suffit d'aller à un angle entre 0 et 180 degrés et de le tenir, un servo est plus simple et intègre son driver. Pour plusieurs tours, un fort couple à basse vitesse ou un positionnement très précis, choisis un moteur pas à pas.

Quelle différence entre le 28BYJ-48 et le NEMA 17 ?

Le 28BYJ-48 est un petit moteur 5 V bon marché qui, grâce à son réducteur, tourne lentement mais avec précision. Le NEMA 17 est un moteur bipolaire bien plus puissant et rapide, à 200 pas par tour ; il demande un driver comme l'A4988 et une alimentation de 12 à 24 V. Le 28BYJ-48 convient aux projets de loisir, le NEMA 17 aux machines comme les imprimantes 3D et les CNC.

Voir tous les projets
Utilisation du moteur pas à pas
#67Intermédiaire
Premium

Utilisation du moteur pas à pas

Projet de base qui fait tourner le moteur pas à pas 28BYJ-48 dans le sens des aiguilles d'une montre et dans le sens inverse des aiguilles d'une montre avec la carte de pilotage ULN2003A. Enseigne le

4.5(31)
41
Construction d'un servomoteur à 360 degrés à partir d'un moteur pas à pas
#68Intermédiaire
Premium

Construction d'un servomoteur à 360 degrés à partir d'un moteur pas à pas

Projet de contrôle de type servo qui peut positionner le moteur pas à pas à certains angles (0°-360°) et calculer les degrés par pas. Il enseigne le calcul précis des angles et la logique de suivi de

4.5(22)
30
Servocommande avec joystick
#60Intermédiaire
Premium

Servocommande avec joystick

Projet d'inclinaison panoramique qui contrôle indépendamment deux servomoteurs sur les axes X et Y à l'aide d'un module joystick. Enseigne la logique de l'intégration joystick-servo et le suivi de pos

4.7(42)
58
Servomoteur ESP32 (commande par potentiomètre)
#118Intermédiaire
Premium

Servomoteur ESP32 (commande par potentiomètre)

Dans ce projet, nous contrôlons un servomoteur SG90 à l'aide d'un potentiomètre. Nous réglons l'angle du servomoteur en mappant la valeur analogique lue par le potentiomètre sur une plage de 0 à 180 degrés. Grâce à la bibliothèque ESP32Servo, n'importe quel GPIO de l'ESP32 peut générer un signal PWM. Il s'agit d'une méthode de contrôle fondamentale pour les bras robotiques, les cardans de caméra et les mécanismes de portes automatiques.

4.3(29)
42
Voiture contrôlée par Bluetooth avec L298N
#80Avancé
Premium

Voiture contrôlée par Bluetooth avec L298N

Projet de voiture robot 2WD (deux moteurs, quatre roues) qui peut être contrôlée depuis le téléphone avec Arduino et le module Bluetooth HC-05. Un total de quatre roues est entraîné simultanément en c

5.0(38)
64
Robot évitant les obstacles
#81Avancé
Premium

Robot évitant les obstacles

Que diriez-vous de construire un véhicule intelligent qui trouve son propre chemin ? Le Robot Évitant les Obstacles scrute en permanence son environnement grâce au capteur ultrasonique situé devant lu

5.0(38)
49
Commande par Led avec Joystick
#59Intermédiaire
Premium

Commande par Led avec Joystick

Projet de contrôle qui allume des LED dans 4 directions différentes en fonction des valeurs des axes X et Y du module joystick. Enseigne la lecture analogique du joystick et la logique de détection de

4.7(50)
66
Capteur de stationnement ESP32 (HC-SR04 + barre à 5 LED + buzzer + écran OLED)
#142Avancé
Premium

Capteur de stationnement ESP32 (HC-SR04 + barre à 5 LED + buzzer + écran OLED)

La version ESP32 du capteur de stationnement pour voiture ! Grâce au capteur à ultrasons HC-SR04, nous mesurons la distance par rapport à l'objet situé devant. À mesure que la distance diminue, la barre composée de 5 LED se remplit (vert → jaune → rouge) et l'intervalle entre les bips du buzzer se raccourcit. Lorsque l'objet est très proche (moins de 10 cm), l'alarme retentit en continu et toutes les LED s'allument. L'écran OLED SSD1306 affiche en gros caractères la valeur instantanée en cm, un

0.0(0)
14

Apprends comment un moteur pas à pas tourne pas à pas, comment brancher le 28BYJ-48 sur un Arduino avec un ULN2003, l'amener à n'importe quel angle, accélérer en douceur avec AccelStepper et passer aux puissants moteurs NEMA 17.

Qu'est-ce qu'un moteur pas à pas ? Rotation précise avec le 28BYJ-48 et le ULN2003 sur Arduino | BlueGrays