Article

Contrôler un moteur DC avec Raspberry Pi et module L298N

Le tutoriel complet pour piloter un moteur DC depuis un Raspberry Pi avec un module L298N : pont en H, cablage GPIO, code Python gpiozero et RPi.GPIO, diagnostic des pannes, alternatives DRV8833.

Par Rémi Favreau — 24 avril 2026

Schéma de câblage Raspberry Pi vers L298N vers moteur DC : GPIO 17 27 12 22 23 13 vers IN1-IN4 ENA ENB, masse commune Pi GND vers L298N GND, batterie séparée pour les moteurs
Schéma de câblage complet : les deux circuits (Pi et batterie moteurs) partagent uniquement la masse (GND).

Point critique : la masse commune. Le GND du Pi et le GND de la batterie moteurs doivent être connectés ensemble. Sans ça, les signaux logiques envoyés par le Pi aux broches IN1-IN4 ne sont pas référencés correctement, et le L298N reçoit du bruit au lieu de commandes. J’ai passé une heure en atelier à chercher pourquoi un robot ne répondait pas aux commandes avant de réaliser que le fil de masse n’était pas branché.

Code Python avec gpiozero

from gpiozero import Motor
from time import sleep

# Moteur A (gauche)
moteur_g = Motor(forward=17, backward=27, enable=12)

# Moteur B (droit)
moteur_d = Motor(forward=22, backward=23, enable=13)

# Avancer à 70% de vitesse pendant 2 secondes
moteur_g.forward(0.7)
moteur_d.forward(0.7)
sleep(2)

# Tourner à droite (gauche avance, droite recule)
moteur_g.forward(0.5)
moteur_d.backward(0.5)
sleep(0.5)

# Stop
moteur_g.stop()
moteur_d.stop()

print("Séquence terminée.")

La classe Motor de gpiozero encapsule tout le fonctionnement du pont en H. forward(0.7) met IN1 à HIGH, IN2 à LOW, et ENA en PWM à 70%. backward(0.7) fait l’inverse. stop() coupe tout. Pas besoin de gérer les broches manuellement.

⚠️ Important pour les utilisateurs de Raspberry Pi 5 : RPi.GPIO n’est plus maintenu et ne fonctionne pas nativement sur Pi 5 (à cause du chip I/O RP1 qui a remplacé l’accès GPIO direct). Sur Pi 5, utilise soit gpiozero (code ci-dessus, fonctionne sur toutes les générations), soit rpi-lgpio (drop-in replacement compatible avec l’API RPi.GPIO). Le code RPi.GPIO ci-dessous ne marche que sur Pi 4 et antérieurs.

Si tu veux comprendre ce qui se passe sous le capot sur un Pi 4, voilà l’équivalent en RPi.GPIO brut :

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

# Configuration des broches
GPIO.setup(17, GPIO.OUT)  # IN1
GPIO.setup(27, GPIO.OUT)  # IN2
GPIO.setup(12, GPIO.OUT)  # ENA

# PWM sur ENA à 1000 Hz
pwm = GPIO.PWM(12, 1000)  # 1 kHz : OK mais sifflement audible, 20 kHz = inaudible
pwm.start(0)

# Avancer à 70%
GPIO.output(17, GPIO.HIGH)
GPIO.output(27, GPIO.LOW)
pwm.ChangeDutyCycle(70)
sleep(2)

# Stop
pwm.ChangeDutyCycle(0)
GPIO.output(17, GPIO.LOW)
GPIO.output(27, GPIO.LOW)

GPIO.cleanup()

Le code RPi.GPIO est plus long, mais il montre clairement les quatre états d’un pont en H : IN1=HIGH+IN2=LOW = avancer, IN1=LOW+IN2=HIGH = reculer, les deux à LOW = roue libre, les deux à HIGH = frein actif. C’est cette compréhension qui te permettra plus tard de déboguer un moteur qui ne répond pas comme prévu.

Les pannes classiques

Le moteur ne tourne pas du tout. Vérifier dans l’ordre : la batterie est chargée, le jumper ENA/ENB est en place (ou le GPIO PWM envoie bien un signal), les fils OUT1/OUT2 sont connectés au moteur, la LED du module L298N est allumée (alim présente). Si la LED est éteinte, le problème est sur l’alimentation.

Le moteur tourne dans le mauvais sens. Inverse les deux fils du moteur sur les bornes OUT du L298N. Ou permute forward et backward dans le code. Pas besoin de démonter quoi que ce soit.

Le Pi reboot quand le moteur démarre. Le pic de courant au démarrage du moteur crée une chute de tension qui fait descendre le 5V du Pi sous le seuil critique (environ 4,6V). Solution : ajouter un condensateur électrolytique de 1000 µF (coût : 0,30 euros) entre VIN et GND du L298N. Il absorbe le pic. Et bien sûr, vérifier que l’alimentation du Pi et des moteurs sont séparées.

Questions fréquentes

Le L298N chauffe beaucoup, est-ce normal ?

Oui, c’est son principal défaut. La chute de tension de 2V par pont dissipe 2 à 4W en chaleur sous charge. Le petit dissipateur vissé sur l’IC est indispensable : sans lui, le L298N peut atteindre 80 °C et déclencher sa protection thermique. Si le tien n’a pas de dissipateur, ajoute-en un (1 € sur AliExpress). Pour un robot qui tourne longtemps sous charge, bascule sur DRV8833 ou TB6612FNG qui chauffent 10 fois moins.

Quelle fréquence PWM choisir pour un moteur DC ?

Entre 500 Hz et 20 kHz. À 1 kHz (valeur courante des tutos), le moteur émet un sifflement audible caractéristique (le « whistle » du moteur). À 20 kHz, on passe au-dessus du seuil audible humain : le moteur est silencieux. Le compromis typique : 20 kHz pour un projet soigné, 1 kHz si tu bricoles en atelier et que le bruit ne te dérange pas.

Puis-je utiliser le L298N avec un Raspberry Pi Zero ?

Oui, côté logique aucun problème (3,3V GPIO suffit à piloter les entrées IN1-IN4). Côté mécanique, le Zero 2 W est livré sans broches GPIO soudées par défaut — il faut soit souder des headers soi-même, soit acheter la version « WH » avec headers pré-soudés (3 € de plus). Puissance-wise, le Zero 2 W est largement suffisant pour piloter 2 moteurs via L298N.

Quelle différence entre DRV8833 et TB6612FNG ?

Très similaires : les deux sont des drivers MOSFET dual H-bridge modernes avec ~0,1-0,3V de chute, efficacité 97-98%. Le DRV8833 (Texas Instruments) supporte 2,7 à 10,8V et 1,2A continu par canal. Le TB6612FNG (Toshiba) supporte 4,5 à 13,5V et 1,2A continu. Pour 3-6V (moteurs de kit robot), les deux sont équivalents. Le TB6612FNG accepte 12V, le DRV8833 non. Prix : ~2-4€ chacun en module.

Le moteur démarre mais s’arrête aussitôt — que faire ?

Trois causes dans l’ordre de fréquence : (1) la batterie est faible — les piles AA alcalines chutent rapidement sous charge ; teste avec des piles neuves ou une LiPo chargée, (2) pic de courant au démarrage qui fait crasher le Pi si les deux alimentations ne sont pas séparées — ajoute un condensateur 1000 µF entre VIN et GND du L298N, (3) câble fin qui ne supporte pas le courant — utilise des fils de 0,5 mm² minimum pour le circuit puissance.

Au-delà du L298N

Le L298N, conçu à la fin des années 1980, a 35 ans. Il fonctionne, mais sa chute de tension de 2V est un problème quand on alimente en 6V (piles AA) : il ne reste que 4V pour le moteur. Le DRV8833 de Texas Instruments (2 euros) est une alternative moderne : chute de tension de 0,3V, rendement 90%, format plus compact, compatible 3,3V en logique. Le TB6612FNG de Toshiba (3 euros) offre des performances similaires.

Pour le tutoriel robot 2 roues on a gardé le L298N parce qu’il est le plus répandu, le mieux documenté, et le plus facile à trouver en stock. Quand tu seras à l’aise avec le principe du pont en H, basculer vers un driver plus moderne est un changement de 5 minutes. Le guide complet robotique DIY couvre les trois familles de moteurs (DC, pas-à-pas, servo) et leurs drivers associés.

Le premier moteur que j’ai fait tourner depuis un microcontrôleur, c’était en 2009 sur un Arduino Duemilanove. Un vieux moteur récupéré dans un lecteur CD, branché directement sur une broche digitale. Résultat : vingt secondes de rotation poussive puis plus rien, la broche grillée. Seize ans plus tard, j’en ris encore, et c’est précisément cette erreur que le L298N est censé t’éviter.

Pourquoi un driver moteur est obligatoire

Le GPIO d’un Raspberry Pi délivre 3,3V et un maximum de 16 mA par broche, avec un total de 50 mA pour l’ensemble des GPIO. Un moteur DC de kit robotique, même petit, tire entre 200 mA à vide et plus d’un ampère au démarrage ou sous charge. Si tu branches le moteur directement sur le GPIO, tu dépasses la capacité de la broche d’un facteur 10 à 50. Le résultat va de « rien ne se passe » (protection interne) à « la broche meurt » (pas de protection suffisante).

Le driver moteur joue le rôle d’intermédiaire : le Pi envoie des signaux de commande à faible courant (3,3V, quelques mA), et le driver commute le courant fort d’une source d’alimentation séparée vers le moteur. C’est un amplificateur de puissance, rien de plus.

Le L298N : anatomie d’un module

Le L298N est un circuit intégré conçu par SGS-Thomson (devenu STMicroelectronics en 1998) à la fin des années 1980. Il équipe encore aujourd’hui la majorité des modules breakout hobbyistes. Le module breakout board qu’on achète à 3-5 euros en intègre un sur un PCB avec bornier à vis, régulateur de tension 5V intégré, dissipateur thermique et LED de statut.

Caractéristiques clés du module :

  • Deux ponts en H intégrés : pilote deux moteurs DC indépendamment
  • Tension d’entrée moteurs : 4,5V à 46V (bornier VIN / GND)
  • Courant continu par canal : 2A (pic 3A)
  • Chute de tension interne : environ 2V par pont H (c’est la principale faiblesse du L298N)
  • 6 entrées logiques : IN1, IN2 (moteur A), IN3, IN4 (moteur B), ENA, ENB (vitesse via PWM)

Un jumper sur le module connecte ENA (ou ENB) au 5V interne du module, ce qui maintient le pont en H activé en permanence. Dans cet état, la vitesse n’est plus modulable : le moteur tourne à pleine vitesse quand IN1 et IN2 sont à des niveaux opposés (un haut, un bas), et s’arrête (frein ou roue libre) quand IN1 et IN2 sont au même niveau. Pour un contrôle de vitesse par PWM, on retire le jumper et on connecte ENA à un GPIO PWM du Pi. Pour un robot, le contrôle de vitesse est quasi indispensable.

Câblage complet Pi vers L298N vers moteur

Broche L298NConnexionRôle
VIN (12V)Borne + batterie (6V-12V)Alimentation puissance moteurs
GNDBorne – batterie + GND du PiMasse commune (obligatoire)
5V (sortie)Non connecté (ou alim 5V Pi si besoin)Régulateur 5V interne du module
IN1GPIO 17Direction moteur A (sens 1)
IN2GPIO 27Direction moteur A (sens 2)
ENAGPIO 12 (PWM hardware)Vitesse moteur A
OUT1, OUT2Moteur A (2 fils)Sortie puissance
IN3GPIO 22Direction moteur B
IN4GPIO 23Direction moteur B
ENBGPIO 13 (PWM hardware)Vitesse moteur B
OUT3, OUT4Moteur B (2 fils)Sortie puissance

GPIO 12 et GPIO 13 sont des broches PWM matérielles. Sur Pi 4 (BCM2711), ce sont les canaux PWM0_0 et PWM0_1 (deux canaux du même bloc PWM0, alt5). Sur Pi 5, le PWM est géré par le chip RP1 (dédié aux I/O) avec une numérotation différente mais un résultat équivalent côté utilisateur via gpiozero. Ce choix est intentionnel : le PWM hardware est plus stable et consomme moins de CPU que le PWM logiciel. Pour le contrôle moteur, la différence n’est pas visible à l’œil nu, mais elle se sent dans la fluidité de la rotation à basse vitesse.

Schéma de câblage Raspberry Pi vers L298N vers moteur DC : GPIO 17 27 12 22 23 13 vers IN1-IN4 ENA ENB, masse commune Pi GND vers L298N GND, batterie séparée pour les moteurs
Schéma de câblage complet : les deux circuits (Pi et batterie moteurs) partagent uniquement la masse (GND).

Point critique : la masse commune. Le GND du Pi et le GND de la batterie moteurs doivent être connectés ensemble. Sans ça, les signaux logiques envoyés par le Pi aux broches IN1-IN4 ne sont pas référencés correctement, et le L298N reçoit du bruit au lieu de commandes. J’ai passé une heure en atelier à chercher pourquoi un robot ne répondait pas aux commandes avant de réaliser que le fil de masse n’était pas branché.

Code Python avec gpiozero

from gpiozero import Motor
from time import sleep

# Moteur A (gauche)
moteur_g = Motor(forward=17, backward=27, enable=12)

# Moteur B (droit)
moteur_d = Motor(forward=22, backward=23, enable=13)

# Avancer à 70% de vitesse pendant 2 secondes
moteur_g.forward(0.7)
moteur_d.forward(0.7)
sleep(2)

# Tourner à droite (gauche avance, droite recule)
moteur_g.forward(0.5)
moteur_d.backward(0.5)
sleep(0.5)

# Stop
moteur_g.stop()
moteur_d.stop()

print("Séquence terminée.")

La classe Motor de gpiozero encapsule tout le fonctionnement du pont en H. forward(0.7) met IN1 à HIGH, IN2 à LOW, et ENA en PWM à 70%. backward(0.7) fait l’inverse. stop() coupe tout. Pas besoin de gérer les broches manuellement.

⚠️ Important pour les utilisateurs de Raspberry Pi 5 : RPi.GPIO n’est plus maintenu et ne fonctionne pas nativement sur Pi 5 (à cause du chip I/O RP1 qui a remplacé l’accès GPIO direct). Sur Pi 5, utilise soit gpiozero (code ci-dessus, fonctionne sur toutes les générations), soit rpi-lgpio (drop-in replacement compatible avec l’API RPi.GPIO). Le code RPi.GPIO ci-dessous ne marche que sur Pi 4 et antérieurs.

Si tu veux comprendre ce qui se passe sous le capot sur un Pi 4, voilà l’équivalent en RPi.GPIO brut :

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

# Configuration des broches
GPIO.setup(17, GPIO.OUT)  # IN1
GPIO.setup(27, GPIO.OUT)  # IN2
GPIO.setup(12, GPIO.OUT)  # ENA

# PWM sur ENA à 1000 Hz
pwm = GPIO.PWM(12, 1000)  # 1 kHz : OK mais sifflement audible, 20 kHz = inaudible
pwm.start(0)

# Avancer à 70%
GPIO.output(17, GPIO.HIGH)
GPIO.output(27, GPIO.LOW)
pwm.ChangeDutyCycle(70)
sleep(2)

# Stop
pwm.ChangeDutyCycle(0)
GPIO.output(17, GPIO.LOW)
GPIO.output(27, GPIO.LOW)

GPIO.cleanup()

Le code RPi.GPIO est plus long, mais il montre clairement les quatre états d’un pont en H : IN1=HIGH+IN2=LOW = avancer, IN1=LOW+IN2=HIGH = reculer, les deux à LOW = roue libre, les deux à HIGH = frein actif. C’est cette compréhension qui te permettra plus tard de déboguer un moteur qui ne répond pas comme prévu.

Les pannes classiques

Le moteur ne tourne pas du tout. Vérifier dans l’ordre : la batterie est chargée, le jumper ENA/ENB est en place (ou le GPIO PWM envoie bien un signal), les fils OUT1/OUT2 sont connectés au moteur, la LED du module L298N est allumée (alim présente). Si la LED est éteinte, le problème est sur l’alimentation.

Le moteur tourne dans le mauvais sens. Inverse les deux fils du moteur sur les bornes OUT du L298N. Ou permute forward et backward dans le code. Pas besoin de démonter quoi que ce soit.

Le Pi reboot quand le moteur démarre. Le pic de courant au démarrage du moteur crée une chute de tension qui fait descendre le 5V du Pi sous le seuil critique (environ 4,6V). Solution : ajouter un condensateur électrolytique de 1000 µF (coût : 0,30 euros) entre VIN et GND du L298N. Il absorbe le pic. Et bien sûr, vérifier que l’alimentation du Pi et des moteurs sont séparées.

Questions fréquentes

Le L298N chauffe beaucoup, est-ce normal ?

Oui, c’est son principal défaut. La chute de tension de 2V par pont dissipe 2 à 4W en chaleur sous charge. Le petit dissipateur vissé sur l’IC est indispensable : sans lui, le L298N peut atteindre 80 °C et déclencher sa protection thermique. Si le tien n’a pas de dissipateur, ajoute-en un (1 € sur AliExpress). Pour un robot qui tourne longtemps sous charge, bascule sur DRV8833 ou TB6612FNG qui chauffent 10 fois moins.

Quelle fréquence PWM choisir pour un moteur DC ?

Entre 500 Hz et 20 kHz. À 1 kHz (valeur courante des tutos), le moteur émet un sifflement audible caractéristique (le « whistle » du moteur). À 20 kHz, on passe au-dessus du seuil audible humain : le moteur est silencieux. Le compromis typique : 20 kHz pour un projet soigné, 1 kHz si tu bricoles en atelier et que le bruit ne te dérange pas.

Puis-je utiliser le L298N avec un Raspberry Pi Zero ?

Oui, côté logique aucun problème (3,3V GPIO suffit à piloter les entrées IN1-IN4). Côté mécanique, le Zero 2 W est livré sans broches GPIO soudées par défaut — il faut soit souder des headers soi-même, soit acheter la version « WH » avec headers pré-soudés (3 € de plus). Puissance-wise, le Zero 2 W est largement suffisant pour piloter 2 moteurs via L298N.

Quelle différence entre DRV8833 et TB6612FNG ?

Très similaires : les deux sont des drivers MOSFET dual H-bridge modernes avec ~0,1-0,3V de chute, efficacité 97-98%. Le DRV8833 (Texas Instruments) supporte 2,7 à 10,8V et 1,2A continu par canal. Le TB6612FNG (Toshiba) supporte 4,5 à 13,5V et 1,2A continu. Pour 3-6V (moteurs de kit robot), les deux sont équivalents. Le TB6612FNG accepte 12V, le DRV8833 non. Prix : ~2-4€ chacun en module.

Le moteur démarre mais s’arrête aussitôt — que faire ?

Trois causes dans l’ordre de fréquence : (1) la batterie est faible — les piles AA alcalines chutent rapidement sous charge ; teste avec des piles neuves ou une LiPo chargée, (2) pic de courant au démarrage qui fait crasher le Pi si les deux alimentations ne sont pas séparées — ajoute un condensateur 1000 µF entre VIN et GND du L298N, (3) câble fin qui ne supporte pas le courant — utilise des fils de 0,5 mm² minimum pour le circuit puissance.

Au-delà du L298N

Le L298N, conçu à la fin des années 1980, a 35 ans. Il fonctionne, mais sa chute de tension de 2V est un problème quand on alimente en 6V (piles AA) : il ne reste que 4V pour le moteur. Le DRV8833 de Texas Instruments (2 euros) est une alternative moderne : chute de tension de 0,3V, rendement 90%, format plus compact, compatible 3,3V en logique. Le TB6612FNG de Toshiba (3 euros) offre des performances similaires.

Pour le tutoriel robot 2 roues on a gardé le L298N parce qu’il est le plus répandu, le mieux documenté, et le plus facile à trouver en stock. Quand tu seras à l’aise avec le principe du pont en H, basculer vers un driver plus moderne est un changement de 5 minutes. Le guide complet robotique DIY couvre les trois familles de moteurs (DC, pas-à-pas, servo) et leurs drivers associés.

Ne manquez rien

Recevez nos meilleurs articles directement dans votre boite mail.

S'abonner

Articles connexes

Article

Construire son premier robot DIY : le guide complet

Les six briques d'un robot DIY (cerveau, moteurs, capteurs, chassis, alimentation, code), le choix Pi vs Arduino vs ESP32, les trois familles de moteurs, et la progression recommandee de la LED au robot mobile.