Composants · 6 min de lecture

Commander un moteur à courant continu avec le L298N : vitesse et sens avec Arduino

Comment fonctionne le driver moteur L298N ? Principe du pont en H, broches ENA, IN1 et IN2, cavalier 5V et alimentation, vitesse en PWM, changement de sens, code de voiture robot à deux moteurs, ESP32 et Pico.

Les moteurs à courant continu sont les plus répandus : ils font tourner ventilateurs, roues de robots, pompes à eau et voitures jouets. Mais on ne peut pas brancher un moteur directement sur une broche d'Arduino : il consomme bien plus de courant que la broche ne peut en fournir, et pour changer de sens il faut inverser sa polarité. Le driver moteur L298N règle les deux problèmes d'un coup : il fait tourner deux moteurs indépendamment dans les deux sens et règle leur vitesse en PWM. On le retrouve dans presque tous les projets de voiture robot.

Module driver moteur double L298N
Driver moteur L298N : sous le dissipateur noir se trouve la puce L298N à deux ponts en H ; les borniers des moteurs sont sur les côtés, les broches d'alimentation et de commande à l'avant.

Comment fonctionne un moteur à courant continu, et pourquoi faut-il un driver ?

Applique une tension aux deux bornes d'un moteur à courant continu et il tourne ; inverse la polarité et il tourne dans l'autre sens ; baisse la tension et il ralentit. Même un petit moteur de jouet consomme des centaines de milliampères en marche, et plus d'un ampère au démarrage ou s'il est bloqué. Comme le moteur est une bobine, il produit aussi des pics de tension inverse quand on le coupe. Une broche d'Arduino ne fournit que 20 à 40 mA au maximum et n'est pas protégée contre ces pics : brancher le moteur directement détruit la broche, voire la carte.

Qu'est-ce qu'un pont en H ?

Pour faire tourner un moteur dans les deux sens, on utilise un pont en H : quatre interrupteurs électroniques disposés autour du moteur en forme de lettre « H ». Quand deux interrupteurs en diagonale se ferment, le courant traverse le moteur dans un sens ; quand l'autre paire diagonale se ferme, dans l'autre sens. La puce L298N contient deux ponts en H : elle commande donc deux moteurs indépendamment. Chaque moteur utilise deux broches de sens (IN1 et IN2) et une broche de vitesse (ENA) :

IN1IN2ENACe que fait le moteur
HIGHLOWHIGH ou PWMTourne en avant
LOWHIGHHIGH ou PWMTourne en arrière
HIGHHIGHHIGHFreine et s'arrête vite
Peu importePeu importeLOWRoue libre, ralentit tout seul

Caractéristiques techniques du L298N

CaractéristiqueValeur
Tension des moteurs5–35 V (12 V max avec le cavalier 5V en place)
Courant par canal2 A en continu, 3 A en pointe
Tension logique5 V (les entrées reconnaissent aussi le 3,3 V)
Chute de tensionEnviron 1,5 à 3 V (le moteur reçoit d'autant moins)
Moteurs pilotables2 moteurs à courant continu ou 1 moteur pas à pas bipolaire
ProtectionDiodes de roue libre sur la carte
Moteur à courant continu avec réducteur et roue
Le moteur jaune à réducteur et sa roue, typiques des voitures robots : le réducteur baisse la vitesse et augmente le couple ; il fonctionne en 3–6 V.

Broches et alimentation du L298N

Broche ou bornierRôle
OUT1, OUT2Les deux bornes du moteur A
OUT3, OUT4Les deux bornes du moteur B
12V (VS)Alimentation des moteurs : le + de la batterie ou de l'adaptateur
GNDMasse commune : le – de la batterie et le GND de l'Arduino arrivent ici
5VSortie 5 V avec le cavalier 5V en place, entrée d'alimentation logique s'il est retiré
ENA, ENBEntrées de vitesse (PWM) ; cavaliers en place, le moteur tourne toujours à fond
IN1, IN2, IN3, IN4Entrées de sens
Le – de la batterie, le GND du L298N et le GND de l'Arduino doivent impérativement être reliés ; sans masse commune, les signaux de commande n'ont aucun sens. Si l'alimentation des moteurs dépasse 12 V, retire le cavalier 5V de la carte et fournis un 5 V séparé sur la broche 5V. N'alimente jamais des moteurs par la broche 5V de l'Arduino.

Faire tourner un moteur dans les deux sens et à différentes vitesses

Retire d'abord le cavalier de ENA et relie ENA à la broche D9 de l'Arduino, IN1 à D8 et IN2 à D7. Branche le moteur sur OUT1 et OUT2, et un pack de 2 accus 18650 (7,4 V) ou de 4 à 6 piles AA sur les borniers 12V et GND ; relie aussi GND au GND de l'Arduino. La fonction motor() ci-dessous prend une valeur de -255 à 255 : positif pour avancer, négatif pour reculer, zéro pour freiner. Le principe du réglage de vitesse est expliqué dans Qu'est-ce que le PWM ?

Arduino (C++)
1const int ENA = 9;    // hız (PWM) / speed (PWM)
2const int IN1 = 8;
3const int IN2 = 7;
4
5void motor(int speed) {              // -255 … 255
6  if (speed == 0) {                  // fren / brake
7    digitalWrite(IN1, HIGH);
8    digitalWrite(IN2, HIGH);
9    analogWrite(ENA, 255);
10    return;
11  }
12  digitalWrite(IN1, speed > 0);      // ileri ya da geri / forward or backward
13  digitalWrite(IN2, speed < 0);
14  analogWrite(ENA, abs(speed));
15}
16
17void setup() {
18  pinMode(ENA, OUTPUT);
19  pinMode(IN1, OUTPUT);
20  pinMode(IN2, OUTPUT);
21}
22
23void loop() {
24  motor(200);   delay(2000);   // ileri / forward
25  motor(0);     delay(500);    // dur / stop
26  motor(-120);  delay(2000);   // yavaşça geri / slowly backward
27  motor(0);     delay(500);
28}
La plupart des moteurs bourdonnent au lieu de tourner avec de faibles valeurs PWM ; il leur faut généralement entre 80 et 120 pour démarrer. Arrêter brièvement le moteur avant de changer de sens et monter la vitesse progressivement plutôt que d'un coup réduisent les pics de courant et ménagent les engrenages.

Une voiture robot à deux moteurs : avant, arrière, gauche, droite

Les voitures robots n'ont pas de direction ; elles tournent en faisant tourner les deux roues à des vitesses ou dans des sens différents. Si les deux moteurs avancent, la voiture va tout droit ; si le moteur gauche recule et le droit avance, elle pivote sur place vers la gauche. La fonction drive() ci-dessous reçoit séparément la vitesse de chaque moteur, de -255 à 255 :

Arduino (C++)
1// Sol motor / left motor: ENA=9, IN1=8, IN2=7 — Sağ motor / right motor: ENB=10, IN3=5, IN4=4
2const int ENA = 9, IN1 = 8, IN2 = 7;
3const int ENB = 10, IN3 = 5, IN4 = 4;
4
5void drive(int left, int right) {            // her biri -255 … 255 / each -255 … 255
6  digitalWrite(IN1, left >= 0);  digitalWrite(IN2, left < 0);
7  digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
8  analogWrite(ENA, abs(left));
9  analogWrite(ENB, abs(right));
10}
11
12void setup() {
13  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
14  for (int p : pins) pinMode(p, OUTPUT);
15}
16
17void loop() {
18  drive(200, 200);   delay(1500);   // ileri / forward
19  drive(-200, 200);  delay(600);    // sola dön / turn left
20  drive(200, -200);  delay(600);    // sağa dön / turn right
21  drive(-180, -180); delay(1000);   // geri / backward
22  drive(0, 0);       delay(1000);   // dur / stop
23}

Ajoute un capteur de distance à l'avant et tu obtiens un robot qui s'arrête et tourne face à un obstacle ; pour le capteur, vois Capteur de distance HC-SR04. Si tu utilises la bibliothèque Servo sur un Uno, attention : elle désactive le PWM des broches 9 et 10 ; déplace alors ENA et ENB sur les broches 5 et 6.

Le L298N avec l'ESP32 et le Raspberry Pi Pico

Les entrées du L298N considèrent tout ce qui dépasse environ 2,3 V comme HIGH : elles fonctionnent donc directement avec les signaux 3,3 V de l'ESP32 et du Pico ; l'alimentation logique du module reste néanmoins en 5 V. Sur l'ESP32, le même code Arduino fonctionne avec des broches capables de PWM pour ENA et ENB (par exemple GPIO 25 et 26) ; les broches 34 à 39 ne peuvent pas servir de sortie. Sur le Pico en MicroPython, piloter un moteur donne ceci :

MicroPython
1from machine import Pin, PWM
2import time
3
4ena = PWM(Pin(15), freq=1000)
5in1 = Pin(14, Pin.OUT)
6in2 = Pin(13, Pin.OUT)
7
8def motor(speed):                   # -100 … 100
9    in1.value(speed > 0)
10    in2.value(speed < 0)
11    ena.duty_u16(int(abs(speed) * 655.35))
12
13while True:
14    motor(80);  time.sleep(2)       # ileri / forward
15    motor(0);   time.sleep(0.5)     # dur / stop
16    motor(-50); time.sleep(2)       # geri / backward

L298N, TB6612FNG ou MOSFET ?

DriverAtoutsInconvénientsIdéal pour
L298NBon marché, robuste, 2 A par canalEnviron 2 V perdus, chauffe, encombrantRobots de loisir, moteurs 6–12 V
TB6612FNGPetit, efficace (MOSFET), compatible 3,3 V1,2 A en continu, 13,5 V maxPetits robots sur batterie
L9110STrès petit et bon marchéEnviron 800 mA par canalMini-moteurs
MOSFET seul (comme l'IRLZ44N)Très efficace, fort courantUn seul sensVentilateurs, pompes, rubans LED

Si tu dois seulement allumer et éteindre un moteur, un relais suffit, mais il ne règle pas la vitesse ; nous les comparons dans Qu'est-ce qu'un module relais ? Pour choisir un transistor ou un MOSFET adapté, jette un œil à l'outil Transistors.

Idées de projets avec le L298N

  • Robot éviteur d'obstacles : une voiture qui repère les obstacles avec un HC-SR04 et change de direction.
  • Voiture pilotée en Bluetooth : un robot dirigé via un HC-05 avec une application sur ton téléphone.
  • Voiture pilotée au joystick : transforme les deux axes d'un joystick en vitesses de deux moteurs ; détails dans Utiliser un module joystick.
  • Robot suiveur de ligne : une voiture qui suit une ligne noire au sol grâce à des capteurs infrarouges.
  • Rideau automatique : un système motorisé qui ouvre le rideau quand la lumière arrive le matin et le ferme le soir.
  • Tapis roulant : un petit convoyeur dont tu règles la vitesse avec un potentiomètre.

Erreurs fréquentes et solutions

  • La LED du module s'allume mais le moteur ne tourne pas : les masses ne sont pas reliées, le cavalier ENA a été retiré sans brancher la broche, ou la valeur PWM est trop faible.
  • L'Arduino redémarre quand le moteur tourne : moteur et Arduino partagent une source trop faible ; alimente-les séparément et soude un condensateur de 100 nF aux bornes du moteur.
  • Le moteur est très lent et sans force : le L298N avale environ 2 V ; augmente la tension de la batterie (par exemple 2 × 18650) ou utilise un driver plus efficace.
  • Le moteur ne tourne que dans un sens : une des broches IN n'est pas branchée, ou le code écrit les mêmes valeurs pour les deux sens.
  • Le L298N chauffe beaucoup : le moteur consomme trop ; vérifie que le dissipateur est bien dégagé et choisis au besoin un driver plus costaud.
  • Utiliser une pile 9 V : elle ne fournit pas assez de courant et se vide vite ; utilise un pack rechargeable 18650 ou AA.

Une fois la commande de moteurs avec le L298N maîtrisée, le monde des robots s'ouvre à toi. Dans l'application BlueGrays, tu trouveras des projets L298N – voiture pilotée en Bluetooth et robot éviteur d'obstacles – pas à pas avec schémas et code.

Questions fréquentes

Combien de moteurs le L298N peut-il piloter ?

Comme le L298N contient deux ponts en H, il pilote deux moteurs à courant continu indépendamment, dans les deux sens et à des vitesses différentes. En combinant les deux canaux, il peut aussi piloter un moteur pas à pas bipolaire.

À quoi sert le cavalier 5V du L298N ?

Cavalier en place, le régulateur de la carte produit du 5 V à partir de l'alimentation des moteurs pour alimenter la puce ; ce 5 V peut aussi alimenter l'Arduino. Si l'alimentation des moteurs dépasse 12 V, le régulateur risque de surchauffer : retire alors le cavalier et fournis un 5 V séparé sur la broche 5V.

Quelle batterie brancher sur le L298N ?

Pour de petits moteurs 6–9 V, 2 accus lithium 18650 (7,4 V) ou 6 piles AA (9 V) sont un bon choix. Comme le L298N perd environ 2 V, choisis une source un peu au-dessus de la tension nominale du moteur. Les piles 9 V ne fournissent pas assez de courant pour des moteurs.

Pourquoi retirer le cavalier ENA ?

Avec le cavalier en place sur ENA, le moteur tourne toujours à pleine vitesse. Pour régler la vitesse, retire le cavalier et relie ENA à une broche PWM de l'Arduino ; tu règles alors la vitesse de 0 à 255 avec analogWrite.

Pourquoi mon moteur ne tourne-t-il pas à basse vitesse ?

Un moteur a besoin d'une tension minimale pour vaincre les frottements et démarrer, et la chute de tension du L298N complique encore les choses. En général, sous une valeur PWM de 80 à 120, le moteur se contente de bourdonner. Fixe une vitesse minimale dans le code ou utilise une alimentation plus élevée.

Le L298N fonctionne-t-il avec l'ESP32 et le Raspberry Pi Pico ?

Oui. Les entrées du L298N reconnaissent un signal 3,3 V comme HIGH : on peut donc le brancher directement sur l'ESP32 et le Pico. La partie logique du module doit cependant rester alimentée en 5 V, et toutes les masses doivent être reliées.

Voir tous les projets
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
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
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
ESP32 HC-SR04 Télémètre à ultrasons
#116Intermédiaire
Premium

ESP32 HC-SR04 Télémètre à ultrasons

Le capteur à ultrasons HC-SR04 calcule la distance en mesurant le temps de vol (Time of Flight) de l'onde sonore qu'il émet lorsqu'elle rebondit sur un objet. Dans ce projet, nous enverrons une impulsion de 10 microsecondes sur la broche TRIG de l'ESP32 et nous lirons le temps de réverbération provenant de la broche ECHO à l'aide de la fonction `pulseIn()`. Nous afficherons la distance calculée en cm sur le moniteur série. Le capteur HC-SR04 fonctionnant en 5 V, un **diviseur de tension** est in

4.9(27)
43
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
HC-SR04 Mesure de la distance (affichage en série)
#27Débutant

HC-SR04 Mesure de la distance (affichage en série)

Le capteur ultrasonique HC-SR04 permet de mesurer la distance et d'afficher le résultat en cm sur le moniteur série. Il enseigne le principe du calcul de la distance à l'aide d'une onde sonore.

4.6(44)
65

Apprends pourquoi un moteur à courant continu ne se branche pas directement sur l'Arduino, comment fonctionne un pont en H, les broches et l'alimentation du L298N, le contrôle de vitesse et de sens en PWM et une voiture robot à deux moteurs, pas à pas.

Commander un moteur à courant continu avec le L298N : vitesse et sens avec Arduino | BlueGrays