Skip to Content

Contrôler un moteur pas à pas avec un driver moteur L298N et Arduino

Contrôler un moteur pas à pas avec un driver moteur L298N et Arduino

Dans cet article, vous apprendrez comment contrôler un moteur pas à pas avec le L298N driver de moteur. Cette carte driver est généralement utilisée pour contrôler des moteurs DC, mais elle constitue aussi une alternative économique pour piloter des moteurs pas à pas ! Elle peut contrôler à la fois la vitesse et le sens de rotation de la plupart des moteurs pas à pas comme un NEMA 17.

J’ai inclus un schéma de câblage et de nombreux exemples de code. Dans le premier exemple, nous allons examiner la bibliothèque Stepper.h Arduino. Je vous recommande vivement de jeter aussi un œil aux exemples de code pour la bibliothèque AccelStepper à la fin de ce tutoriel. Cette bibliothèque est assez simple à utiliser et peut grandement améliorer les performances de votre matériel.

Après chaque exemple, j’explique en détail le fonctionnement du code, vous ne devriez donc avoir aucun problème à le modifier selon vos besoins.

Matériel nécessaire

Composants matériels

l298n-motor-driver-controller-boardL298N motor driver board× 1Amazon
Stepper MotorNEMA 17 stepper motor× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
12V power supply× 1Amazon
Jumper wires× 10Amazon
USB cable type A/B× 1Amazon

Logiciel

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Informations sur le driver moteur L298N

La carte driver de moteur L298N est basée sur le driver double pont en H L298 fabriqué par STMicroelectronics. Avec ce driver, vous pouvez contrôler des moteurs DC, des moteurs pas à pas, des relais et des solénoïdes. Elle dispose de deux canaux séparés, appelés A et B, que vous pouvez utiliser pour piloter 2 moteurs DC ou 1 moteur pas à pas lorsqu’ils sont combinés.

Le L298N est généralement monté sur une carte breakout (rouge), ce qui facilite grandement le câblage. Cette carte breakout inclut également un régulateur de tension 78M05 5 V.

Pourquoi mon moteur pas à pas chauffe-t-il ?

Il est très important de se rappeler que le L298n’offre pas de moyen simple pour limiter le courantcontrairement à d’autres drivers de moteurs pas à pas comme le A4988. Cela signifie que le courant consommé dépend de la relation entre l’inductance et la résistance (L/R) du moteur pas à pas que vous y connectez. Si le moteur tire trop de courant, vous risquez d’endommager le driver et le moteur chauffera !

Cela signifie que vous devez être prudent lors du choix du moteur pas à pas et de l’alimentation à utiliser avec ce driver.Tous les moteurs pas à pas ne fonctionneront pas !La tension de fonctionnement du L298N est comprise entre 4,8 et 46 volts (max 35 V lorsqu’il est monté sur la carte breakout). Comme le driver peut fournir uncourant maximal de 2 ampères par canal, vous devez choisir un moteur pas à pas compatible avec cette plage de tension et ne dépassant pas la limite de courant maximale.

Consultez la fiche technique de votre moteur pas à pas pour connaître la tension et le courant consommé. Si vous ne trouvez pas la fiche technique, vous pouvez mesurer la résistance d’une des bobines et utiliser la formule suivante pour estimer le courant :

I = U ÷ R ou Courant (A) = Tension d’alimentation (V) ÷ Résistance de la bobine (Ω)

Je vous conseille de choisir un moteur qui consomme moins de 2 A à la tension que vous souhaitez utiliser.

Le moteur que j’ai utilisé pour ce tutoriel consomme environ 1 A sous 5 V. J’ai aussi trouvé ce moteur pas à pas de Adafruit qui fonctionne très bien sous 12 V et ne consomme que 350 mA.

Si le moteur que vous souhaitez piloter ne fonctionne pas avec le driver L298N, il est préférable d’utiliser un driver à découpage. J’ai écrit des tutoriels pour les A4988DRV8825

Spécifications du driver moteur L298N

Tension de fonctionnement5 – 35 V
Tension logique4,5 – 7 V
Courant maximal2 A par canal ou 4 A max
Contrôleur moteurL298N, pilote 2 moteurs DC ou 1 moteur pas à pas
Régulateur de tension78M05
Dimensions du module43 x 43 x 28 mm
Dimensions des trous3,2 mm, espacement 37 mm
CoûtCheck price

Pour plus d’informations, vous pouvez consulter la fiche technique ci-dessous :

Brochage du L298N

Le L298 existe en plusieurs boîtiers, le brochage du L298N (Multiwatt15) est donné ci-dessous :

L298N-motor-driver-pinout
Brochage du L298N
N° de brocheNomFonction
1, 15Sense A, Sense BLa résistance de détection doit être connectée entre cette broche et la masse (non utilisée sur la carte breakout).
2, 3Out 1, Out 2Sorties du pont A ; le courant qui circule dans la charge connectée entre ces deux broches est mesuré à la broche 1.
4VsTension d’alimentation des étages de sortie de puissance
5, 7Input 1, Input 2Entrées compatibles TTL du pont A
6, 11Enable A, Enable BEntrée d’activation compatible TTL : l’état BAS désactive le pont A (enable A) et/ou le pont B (enable B).
8GNDMasse
9VSSTension d’alimentation des blocs logiques.
10, 12Input 3, Input 4Entrées compatibles TTL du pont B.
13, 14Out 3, Out 4Sorties du pont B ; le courant qui circule dans la charge connectée entre ces deux broches est mesuré à la broche 15.

Câblage – Connexion du L298N au moteur pas à pas et à l’Arduino

Le schéma de câblage ci-dessous montre comment connecter un moteur pas à pas, une alimentation et un Arduino à la carte breakout L298N.

l298n-motor-driver-with-stepper-motor-and-arduino-wiring-diagram-schematic-pinout
Schéma de câblage du driver L298N avec moteur pas à pas et Arduino.

Les connexions sont également indiquées dans le tableau ci-dessous :

Connexions L298N

L298NConnexion
+12VAlimentation 5 – 35 V
GNDMasse alimentation et Arduino
Jump +12 VRetirez-le si la tension moteur > 12 V !
5V+ (optionnel)5 V Arduino si le jumper 12 V est retiré
IN1Broche 8 Arduino
IN2Broche 9 Arduino
IN3Broche 10 Arduino
IN4Broche 11 Arduino
Jumpers ENA et ENBLaissez-les installés
OUT1 + OUT2Bobine A du moteur pas à pas
OUT3 + OUT4Bobine B du moteur pas à pas

Note importante : retirez le jumper +12V si vous utilisez une alimentation supérieure à 12 V.

Lorsque le jumper +12V est en place, le régulateur de tension intégré est activé et génère la tension logique 5 V. Si vous retirez le jumper, vous devez fournir 5 V à la carte depuis l’Arduino.

Vous devez également laisser les jumpers ENA et ENB en place pour que le moteur soit toujours activé.

Comment déterminer le câblage du moteur pas à pas ?

Si vous ne trouvez pas la fiche technique de votre moteur pas à pas, il peut être difficile de savoir comment le câbler correctement. J’utilise l’astuce suivante pour identifier les connexions d’un moteur pas à pas bipolaire à 4 fils :

Il suffit d’identifier les deux paires de fils correspondant aux deux bobines. Une bobine se connecte à OUT1 et OUT2, l’autre à OUT3 et OUT4, la polarité n’a pas d’importance.

Pour trouver les deux fils d’une bobine, procédez ainsi moteur déconnecté :

  1. Essayez de faire tourner l’axe du moteur à la main et notez la résistance au mouvement.
  2. Prenez ensuite une paire de fils au hasard et touchez leurs extrémités dénudées ensemble.
  3. Essayez à nouveau de faire tourner l’axe du moteur.
  4. Si vous ressentez une forte résistance, vous avez trouvé une paire de fils de la même bobine.Si l’axe tourne librement, essayez une autre paire de fils.

Connectez ensuite les deux bobines aux broches indiquées dans le schéma de câblage ci-dessus.

Exemple de code avec la bibliothèque Stepper.h pour driver L298N, moteur pas à pas et Arduino

Vous pouvez téléverser le code exemple suivant sur votre Arduino en utilisant la Arduino IDE.

Cet exemple utilise la bibliothèque Stepper.h qui est normalement préinstallée avec l’IDE Arduino. Vous pouvez la trouver via Sketch > Include Library > Stepper.

Ce sketch fait tourner le moteur pas à pas d’un tour dans un sens, fait une pause, puis d’un tour dans l’autre sens.

/* Example sketch to control a stepper motor with 
  L298N motor driver, Arduino UNO and Stepper.h library. 
  More info: https://www.makerguides.com */

// Include the Stepper library:
#include "Stepper.h"

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);
}

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Fonctionnement du code :

Le sketch commence par inclure la bibliothèque Stepper.h Arduino. Plus d’informations sur cette bibliothèque sont disponibles sur le Arduino website.

// Include the Stepper library:
#include "Stepper.h"

Ensuite, il faut définir le nombre de pas nécessaires pour faire tourner le moteur d’un tour complet. Dans cet exemple, nous utilisons le moteur en mode pas complet. Cela signifie qu’il faut 200 pas pour faire 360 degrés. Vous pouvez modifier cette valeur si vous utilisez un autre type de moteur pas à pas ou une autre configuration.

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

Puis, vous devez créer une instance de la classe Stepper, qui représente un moteur pas à pas connecté à l’Arduino. Pour cela, on utilise la fonction Stepper(steps, pin1, pin2, pin3, pin4) où steps est le nombre de pas par révolution et pin1 à pin4 sont les broches utilisées pour piloter le moteur. Ici, ce sont les broches 8, 9, 10 et 11.

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

J’ai nommé ce moteur ‘myStepper’ mais vous pouvez utiliser d’autres noms, comme ‘z_motor’ ou ‘liftmotor’, etc. Stepper liftmotor = Stepper(stepsPerRevolution, 8, 9, 10, 11);Le nom ‘myStepper’ sera utilisé pour régler la vitesse et le nombre de pas de ce moteur particulier. Notez que vous pouvez créer plusieurs objets stepper avec des noms différents si vous souhaitez contrôler plusieurs moteurs.

Dans le setup() on définit la vitesse du moteur. Vous pouvez régler la vitesse en RPM avec la fonction setSpeed(rpm). Je l’ai réglée à 100, ce qui correspond à environ 1,6 tours par seconde.

  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);

Dans la boucle loop, on appelle simplement la fonction step(steps) qui fait tourner le moteur d’un nombre précis de pas à la vitesse définie par la fonction setSpeed(rpm) . Passer un nombre négatif inverse le sens de rotation du moteur.

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Notez que la fonction step(steps) est bloquante, ce qui signifie qu’elle attend que le moteur ait fini de bouger avant de passer à la ligne suivante du sketch.

Installation de la bibliothèque AccelStepper

Dans les trois exemples suivants, je vous montre comment contrôler la vitesse, la direction et le nombre de pas du moteur pas à pas. Ici, j’utilise la bibliothèque AccelStepper .

La bibliothèque AccelStepper, écrite par Mike McCauley, est une excellente bibliothèque pour vos projets. Elle supporte l’accélération et la décélération, et offre beaucoup d’autres fonctions utiles.

Vous pouvez installer la bibliothèque en allant dans Tools > Manage Libraries…ou en tapant Ctrl + Shift + I sous Windows. Le gestionnaire de bibliothèques s’ouvre et met à jour la liste des bibliothèques installées.

Installing an Arduino library step 1 open Library Manager
Library Manager

Recherchez ‘accelstepper’ et trouvez la bibliothèque de Mike McCauley. Sélectionnez la dernière version puis cliquez sur Installer.

Installing an Arduino library step 2 AccelStepper
Installation de la bibliothèque AccelStepper

1. Exemple de code AccelStepper pour rotation continue

Le sketch suivant permet de faire tourner un ou plusieurs moteurs pas à pas en continu à vitesse constante (sans accélération ni décélération).

/* Example sketch to control a stepper motor with L298N motor driver, Arduino UNO and AccelStepper.h library. 
   Contiuous rotation. 
   https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
}

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

Fonctionnement du code :

La première étape est d’inclure la bibliothèque avec #include "AccelStepper.h« .

// Include the AccelStepper library:
#include "AccelStepper.h"

Ensuite, il faut définir le type d’interface moteur. Le type doit être réglé à 4 pour un moteur pas à pas 4 fils en mode pas complet (200 pas/tour). Vous pouvez trouver les autres types d’interface here.

L’instruction #define sert à donner un nom à une constante. Le compilateur remplacera toutes les références à cette constante par la valeur définie lors de la compilation. Ainsi, partout où vous mentionnez motorInterfaceType, le compilateur le remplacera par la valeur 4 lors de la compilation.

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

Ensuite, vous créez une instance de la classe AccelStepper avec le type d’interface moteur et les connexions appropriées.

J’ai nommé ce moteur ‘stepper’ mais vous pouvez utiliser d’autres noms, comme ‘z_motor’ ou ‘liftmotor’, etc. AccelStepper liftmotor = AccelStepper(motorInterfaceType, 8, 9, 10, 11);Comme dans l’exemple précédent, le nom donné au moteur sera utilisé pour régler la vitesse, la position et l’accélération. Vous pouvez créer plusieurs instances de la classe AccelStepper avec des noms et broches différents, ce qui permet de contrôler facilement 2 moteurs pas à pas ou plus en même temps.

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

Dans la setup() du code, on définit la vitesse maximale en pas/seconde. Des vitesses supérieures à 1000 pas par seconde peuvent être peu fiables, j’ai donc fixé cette limite. Notez que je spécifie le nom du moteur (‘stepper’) pour lequel je définis la vitesse maximale. Si vous avez plusieurs moteurs, vous pouvez définir une vitesse différente pour chacun :

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
  stepper2.setMaxSpeed(300);
}

Dans la loop() on définit d’abord la vitesse à laquelle on veut faire tourner le moteur, avec la fonction setSpeed(). (vous pouvez aussi placer cet appel dans la fonction setup).

stepper.runSpeed() interroge le moteur et exécute un pas quand c’est nécessaire, selon la vitesse définie et le temps écoulé depuis le dernier pas. Pour changer le sens de rotation, vous pouvez définir une vitesse négative : stepper.setSpeed(-400); fait tourner le moteur dans l’autre sens.

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

2. Exemple de code pour contrôler le nombre de pas ou de tours

Avec ce sketch, vous pouvez contrôler la vitesse, la direction et le nombre de pas/tours.

Ici, le moteur fait 2 tours dans le sens horaire à 200 pas/sec, puis 1 tour dans le sens antihoraire à 600 pas/sec, et enfin 3 tours dans le sens horaire à 400 pas/sec.

/* Example sketch to control a stepper motor with 
  L298N motor driver, Arduino UNO and AccelStepper.h library.  
  More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum steps per second:
  stepper.setMaxSpeed(1000);
}

void loop() {
  // Set the current position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
  while (stepper.currentPosition() != 400)  {
    stepper.setSpeed(200);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor backwards at 600 steps/second until the motor reaches -200 steps (1 revolution):
  while (stepper.currentPosition() != -200)   {
    stepper.setSpeed(-600);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (stepper.currentPosition() != 600)  {
    stepper.setSpeed(400);
    stepper.runSpeed();
  }

  delay(3000);
}

Explication du code :

La première partie du code jusqu’à la fonction loop() est identique à l’exemple précédent.

Dans la boucle, j’utilise une while loop avec la fonction currentPosition() . D’abord, je positionne la position actuelle du moteur à zéro avec stepper.setCurrentPosition(0).

  // Set the current position to 0:
  stepper.setCurrentPosition(0);

Ensuite, on utilise une boucle while. Une boucle while s’exécute en continu et indéfiniment tant que l’expression entre parenthèses () est vraie. Ici, je vérifie si la position actuelle du moteur n’est pas égale à 200 pas (!= signifie : n’est pas égal à). Tant que c’est vrai, on fait tourner le moteur à la vitesse définie par setSpeed().

  // Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
  while (stepper.currentPosition() != 400)  {
    stepper.setSpeed(200);
    stepper.runSpeed();
  }

Le reste de la boucle fait la même chose, mais avec une vitesse et une position cible différentes.

3. Exemple de code avec accélération et décélération

Dans cet exemple, nous allons voir l’un des principaux avantages de la bibliothèque AccelStepper.

Avec ce sketch, vous pouvez ajouter facilement accélération et décélération aux mouvements du moteur pas à pas, sans codage compliqué. La première partie du sketch est identique à l’exemple 1, mais le setup et la boucle sont différents.

Le moteur fera cinq tours aller-retour à une vitesse de 200 pas par seconde et une accélération de 50 pas/seconde2.

/* Example sketch to control a stepper motor with 
   L298N motor driver, Arduino UNO and AccelStepper.h library. 
   Acceleration and deceleration. 
   More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);

  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);
}

void loop() {
  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);

  // Move back to original position:
  stepper.moveTo(0);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);
}

Fonctionnement du code :

Dans le setup(), en plus de la vitesse maximale, on définit l’accélération/décélération avec la fonction setAcceleration().

  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);

  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);

Dans la boucle, j’utilise une autre méthode pour faire tourner le moteur d’un nombre défini de pas. D’abord, je fixe la position cible avec la fonction moveTo(). Ensuite, j’utilise la fonction runToPosition() pour faire tourner le moteur jusqu’à la position cible avec la vitesse et l’accélération définies. Le moteur décélère avant d’atteindre la position cible.

  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

Enfin, je remets la position cible à zéro pour revenir à l’origine.

Conclusion

Dans cet article, je vous ai montré comment contrôler un moteur pas à pas avec un driver L298N. Nous avons vu 4 exemples, utilisant les bibliothèques Stepper et AccelStepper.

Si vous souhaitez en savoir plus sur d’autres drivers pour moteurs pas à pas, les articles ci-dessous pourraient vous être utiles :

Notez que le Arduino Motor Shield Rev3utilise aussi un driver L298.

Si vous avez des questions, des suggestions, ou si vous pensez que des éléments manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.