Composants · 18 min de lecture

Shield L293D Arduino : AFMotor, 4 moteurs CC, pas à pas et servo

Utiliser le shield moteur L293D : AFMotor, cavalier PWR, broches libres, voiture 4WD, pas à pas, servos, limite de 0,6 A et moteurs qui ne tournent pas.

Le shield moteur L293D (L293D motor shield) est une carte de pilotage de moteurs qui s'enfiche directement sur un Arduino Uno et te permet de commander 4 moteurs à courant continu, 2 moteurs pas à pas et 2 servos depuis une seule carte. Ses deux puces L293D fournissent le courant dont les moteurs ont besoin, inversent leur sens de rotation et règlent leur vitesse en PWM : tu peux donc piloter tous les moteurs d'une voiture robot à quatre roues sans un seul fil de liaison. Presque toutes les cartes du marché sont des copies de l'ancien Motor Shield V1 d'Adafruit et se programment avec la même bibliothèque : AFMotor.

Dans ce guide, tu vas découvrir ce qu'il y a sur le shield, quelles broches de l'Arduino il occupe et lesquelles restent libres pour les capteurs, comment fonctionne le fameux cavalier PWR dans trois montages d'alimentation, les commandes de la bibliothèque AFMotor et le code complet d'une voiture robot à quatre roues pilotée depuis ton téléphone. Les dernières sections traitent de la limite de courant de 0,6 A, de l'échauffement de la puce, de la comparaison avec le L298N et de toutes les causes connues du problème « mes moteurs ne tournent pas », réunies dans un seul tableau.

Shield moteur L293D vu de dessus : borniers M1–M4, connecteurs de servo et cavalier d'alimentation
Shield moteur L293D (conception Adafruit V1) : le 74HC595 au centre et un L293D de chaque côté ; borniers M1–M2 à gauche, M3–M4 à droite, deux connecteurs de servo en haut à gauche et, en bas, le bornier d'alimentation externe et le cavalier PWR.

Qu'est-ce que le shield moteur L293D et comment fonctionne-t-il ?

Pour faire tourner un moteur à courant continu dans les deux sens, il faut un circuit à quatre interrupteurs appelé pont en H ; nous expliquons le principe en détail dans Commander un moteur à courant continu avec le L298N. La puce L293D contient deux ponts en H et, comme le shield en porte deux, tu disposes de quatre canaux moteur au total. Le « D » du nom indique que les diodes de protection, qui absorbent les pics de tension inverse produits par un moteur à la coupure, sont intégrées à la puce. Le L293D coupe aussi ses sorties tout seul en cas de surchauffe.

La vraie astuce du shield, c'est le registre à décalage 74HC595 au centre. Chacun des quatre moteurs a besoin de deux signaux de sens et d'un signal de vitesse, soit 12 broches de l'Arduino au total. Le shield envoie les huit signaux de sens en série au 74HC595 et n'y consacre que 4 broches (D4, D7, D8, D12), plus 4 broches PWM pour la vitesse (D3, D5, D6, D11). Cette conception économise des broches, mais elle a un prix : tu ne peux pas piloter les moteurs directement avec digitalWrite, il faut une bibliothèque qui envoie les bits de sens dans le registre. Cette bibliothèque, c'est AFMotor.

CaractéristiqueValeur
Puces de commande2 × L293D (4 ponts en H au total)
Commande du sensRegistre à décalage 74HC595 (D4, D7, D8, D12)
Tension des moteurs4,5–25 V (bornier d'alimentation externe)
Courant par canal0,6 A en continu, 1,2 A en pointe très brève
Réglage de vitessePWM 8 bits, setSpeed(0–255)
Moteurs pilotables4 moteurs CC, 2 pas à pas ou 2 CC + 1 pas à pas
Servos2, alimentés par la ligne 5 V de l'Arduino (D9 et D10)
ProtectionDiodes intégrées, coupure en cas de surchauffe
Cartes compatiblesArduino Uno R3 et Mega 2560 (Uno R4 et Leonardo non pris en charge)

Que trouve-t-on sur la carte ? Borniers, connecteurs et cavalier

ÉlémentRôle
Bornier M1 et M2 (gauche)Moteurs CC 1 et 2 ; la vis GND au milieu sert au fil commun d'un moteur pas à pas unipolaire
Bornier M3 et M4 (droite)Moteurs CC 3 et 4, ou port pas à pas 2
EXT_PWR (+M et GND)Entrée d'alimentation des moteurs : piles, accus ou adaptateur
Cavalier PWREn place, il relie l'alimentation des moteurs à la ligne Vin de l'Arduino
SER1 et SERVO_2Deux connecteurs de servo (−, +, S) ; D10 et D9
LED PWRIndique si l'alimentation moteur est présente ; éteinte, les moteurs ne tournent pas
Bouton RESETCopie du bouton de réinitialisation de l'Arduino sur le shield
Rangée A0–A5Broches analogiques libres ; la plupart des cartes ont aussi des rangées +5V et GND à côté

Quelles broches le shield utilise-t-il et lesquelles restent libres ?

Broche ArduinoRôle sur le shieldQuand est-elle occupée ?
D3Vitesse de M2 (PWM, Timer2)Quand M2 ou le pas à pas 1 est utilisé
D4Horloge du 74HC595 (CLK)Quand un moteur CC ou pas à pas est utilisé
D5Vitesse de M4 (PWM, Timer0)Quand M4 ou le pas à pas 2 est utilisé
D6Vitesse de M3 (PWM, Timer0)Quand M3 ou le pas à pas 2 est utilisé
D7Validation des sorties du 74HC595 (EN)Dès qu'un moteur est utilisé
D8Entrée de données du 74HC595 (DATA)Dès qu'un moteur est utilisé
D9Signal de SERVO_2 (Timer1)Seulement si ce servo est utilisé
D10Signal de SER1 (Timer1)Seulement si ce servo est utilisé
D11Vitesse de M1 (PWM, Timer2)Quand M1 ou le pas à pas 1 est utilisé
D12Verrou du 74HC595 (LATCH)Dès qu'un moteur est utilisé
D0, D1Non utilisées (liaison série USB)Pendant le téléversement et quand le moniteur série est ouvert
D2Non utilisée ; un petit point de soudure est prévu sur la carteJamais
D13Non utilisée, mais pas accessible sur le dessus du shieldJamais
A0–A5 (D14–D19)Non utilisées ; sorties en rangée sur le bordJamais

Les six broches analogiques libres suffisent largement pour les capteurs, car A0–A5 de l'Uno fonctionnent aussi comme broches numériques 14–19 au besoin. Une répartition pratique pourrait être : un capteur de distance HC-SR04 ou un module Bluetooth en SoftwareSerial sur A0 et A1, des capteurs de ligne ou d'obstacles sur A2 et A3, et le bus I2C (OLED, LCD, MPU6050) sur A4 et A5. Pour un encodeur de roue ou un bouton qui utilise attachInterrupt(), la seule broche libre est D2 ; l'autre broche d'interruption de l'Uno, D3, est la broche de vitesse de M2. Si tu n'utilises pas de servos, D9 et D10 sont libres aussi. Tu peux voir le brochage de ta carte dans l'outil Pinout et le rôle de chaque broche dans Brochage Arduino Uno.

Tant que le shield est en place, n'utilise pas D3–D8, D11 ni D12 pour autre chose dans ton code. Si tu branches par exemple la broche trig du HC-SR04 sur D7 ou une LED sur D12, les données envoyées au 74HC595 sont corrompues et les moteurs changent de sens au hasard. De plus, le signal de vitesse de M1 et M2 vient du Timer2 : la fonction tone() et la bibliothèque IRremote utilisent elles aussi le Timer2 sur l'Uno, donc pendant qu'elles tournent, le réglage de vitesse de M1 et M2 ne fonctionne plus.

Alimentation et cavalier PWR : trois montages corrects

Le bornier à deux vis EXT_PWR, sur le bord inférieur de la carte, est l'entrée d'alimentation des moteurs ; le pôle positif est généralement marqué « +M » ou « + », le négatif « GND ». Le cavalier PWR juste à côté relie cette ligne moteur à la broche Vin de l'Arduino. Cavalier en place, les deux cartes sont alimentées par une seule source : la tension appliquée sur EXT_PWR alimente aussi l'Arduino via Vin, ou un adaptateur branché sur la prise jack de l'Arduino alimente aussi les moteurs. Cavalier retiré, les deux lignes sont complètement séparées. La LED PWR de la carte ne s'allume que si l'alimentation moteur est présente ; c'est la première chose à vérifier avant de t'attaquer aux moteurs.

MontageAlimentation de l'ArduinoAlimentation des moteursCavalier PWR
Source unique (piles ou adaptateur 7–12 V)La même source, via VinEXT_PWR ou la prise jack de l'ArduinoEn place
Arduino sur USB, moteurs sur pilesCâble USBEXT_PWRRetiré
Deux sources séparées (le plus sûr)Prise jack ou USBEXT_PWRRetiré

Sur les voitures robots, le plus courant est la source unique : tu branches un pack de deux accus 18650 sur EXT_PWR, tu mets le cavalier, et l'Arduino comme les moteurs fonctionnent sur la même batterie. C'est simple, mais quand les moteurs démarrent et tirent beaucoup de courant, la tension de la batterie peut chuter un instant et l'Arduino redémarrer. Si cela t'arrive, retirer le cavalier et alimenter l'Arduino par une autre source (batterie externe, USB ou adaptateur 9 V) règle le problème pour de bon. Pour les essais sur table, le deuxième montage est le plus pratique : l'Arduino reste branché à l'ordinateur, les moteurs tournent sur piles et le cavalier est retiré.

Le bornier EXT_PWR n'a pas de diode de protection contre l'inversion de polarité ; brancher la batterie à l'envers détruit instantanément le shield et très probablement l'Arduino. Cavalier en place, ne branche jamais deux sources séparées à la fois sur la prise jack et sur EXT_PWR, tu mettrais les deux alimentations en court-circuit. Et n'envoie jamais l'alimentation des moteurs sur la broche 5V de l'Arduino.

Quelle batterie choisir ? Selon le courant, les transistors de sortie du L293D avalent environ 1,5–2,6 V : le moteur reçoit donc d'autant moins que la tension de la batterie. Pour les moteurs TT jaunes de 3–6 V des kits robotiques, deux accus lithium 18650 (7,4 V nominal, 8,4 V à pleine charge) sont idéaux : les moteurs reçoivent environ 5,5–6 V et, cavalier en place, le régulateur de l'Arduino travaille à l'aise. Quatre piles AA (6 V) ne laissent qu'environ 4 V aux moteurs et ne suffisent pas pour alimenter l'Arduino par Vin. Une pile 9 V ne fournit guère plus de quelques centaines de milliampères : les moteurs ne tournent pas du tout ou la pile est vide en quelques minutes. Tu peux estimer l'autonomie avec le calculateur d'autonomie de batterie et lire toutes les options d'alimentation dans Alimenter un Arduino avec une pile.

Installer la bibliothèque AFMotor

  1. Ouvre le gestionnaire de bibliothèques de l'Arduino IDE (Outils > Gérer les bibliothèques ou Ctrl+Maj+I).
  2. Tape Adafruit Motor Shield dans la recherche. Deux résultats apparaissent : Adafruit Motor Shield library, dont la description indique « V1 firmware », et Adafruit Motor Shield V2 Library.
  3. Pour le shield L293D, installe la version V1. La bibliothèque V2 sert à une carte complètement différente qui communique en I2C et utilise des puces TB6612.
  4. Ajoute la ligne #include <AFMotor.h> en haut de ton croquis.
  5. Si tu veux, ouvre Fichier > Exemples > Adafruit Motor Shield library > MotorTest et teste la carte avec un moteur sur M1.
Si tu obtiens AFMotor.h: No such file or directory à la compilation, soit la bibliothèque n'est pas installée du tout, soit tu as installé la V2 par erreur ; le fichier d'en-tête de la V2 s'appelle Adafruit_MotorShield.h et ne fonctionne pas avec la carte L293D. Pour les autres problèmes d'installation, consulte Installer une bibliothèque Arduino.

Premier programme : faire tourner un moteur CC en avant, en arrière et à différentes vitesses

Visse les deux fils du moteur sur les deux vis extérieures du bornier M1 et laisse libre la vis GND du milieu. Branche le pack de piles sur EXT_PWR, relie l'Arduino à l'ordinateur en USB et retire le cavalier PWR (le deuxième montage ci-dessus). Si la LED PWR est allumée, téléverse le code ci-dessous : le moteur accélère puis ralentit doucement, tourne ensuite en arrière pendant deux secondes et s'arrête.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
CommandeCe qu'elle fait
AF_DCMotor motor(1);Crée le moteur du bornier M1 ; accepte un numéro de 1 à 4
AF_DCMotor motor(1, MOTOR12_64KHZ);Choisit aussi la fréquence PWM de M1 et M2
motor.setSpeed(200);Règle la vitesse de 0 à 255 (0 à l'arrêt, 255 à fond)
motor.run(FORWARD);Tourne en avant
motor.run(BACKWARD);Tourne en arrière
motor.run(RELEASE);Cesse de piloter le moteur ; le moteur s'arrête
motor.run(BRAKE);Défini dans la bibliothèque, mais sans effet en V1

La vitesse se règle en coupant et rétablissant l'alimentation du moteur des milliers de fois par seconde ; les détails sont dans Qu'est-ce que le PWM ?. Comme M1 et M2 utilisent le Timer2, tu peux choisir leur fréquence : MOTOR12_64KHZ, MOTOR12_8KHZ (par défaut), MOTOR12_2KHZ et MOTOR12_1KHZ. À 64 kHz, le sifflement du moteur devient inaudible, mais le L293D chauffe davantage. M3 et M4 dépendent en revanche du Timer0 ; comme ce timer fait aussi tourner millis() et delay(), la bibliothèque ne touche pas à sa fréquence et ces deux canaux fonctionnent toujours à environ 1 kHz.

L'erreur la plus fréquente est d'oublier setSpeed(). La bibliothèque met la vitesse à 0 en créant le moteur : même avec run(FORWARD), le moteur ne bouge pas sans vitesse. De plus, la plupart des moteurs TT bourdonnent sans tourner en dessous de 80–100, alors démarre-les à 100–120 ou plus.

Code de la voiture robot à quatre roues (4WD)

Moteur CC TT à réducteur avec roue
Le moteur TT jaune à réducteur des kits robotiques : fonctionne en 3–6 V, consomme environ 150 mA à vide et plus de 1 A lorsqu'il est bloqué.

L'usage préféré du shield moteur L293D est la voiture robot à quatre roues, car chacun des quatre moteurs a son propre bornier et il n'y a pas de fouillis de fils. Ces voitures n'ont pas de direction ; elles tournent comme un char : si les deux roues de gauche tournent dans un sens et les deux de droite dans l'autre, la voiture pivote sur place. C'est pourquoi le code ne pilote pas les moteurs un par un, mais en deux groupes : côté gauche et côté droit. Pour piloter depuis le téléphone, on branche un module Bluetooth HC-05 sur les broches libres A0 et A1 avec SoftwareSerial ; le module est détaillé dans Module Bluetooth HC-05.

ÉlémentBranchement
Moteur avant gaucheM1
Moteur arrière gaucheM2
Moteur arrière droitM3
Moteur avant droitM4
HC-05 TXDA0 (RX de SoftwareSerial)
HC-05 RXDA1, via un pont diviseur 1 kΩ + 2 kΩ (5 V → 3,3 V)
HC-05 VCC et GNDLa rangée +5V et GND du shield
2 accus 18650 (7,4 V)EXT_PWR (+M et GND), cavalier PWR en place
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-right
45    case 'S': drive(0, 0);                break;   // dur / stop
46    case 'q': speed = 255;                break;   // tam hız / full speed
47    default:
48      if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240);   // hız kademesi / speed step
49  }
50}

Le cœur du code est la fonction drive(gauche, droite) : elle prend une valeur de -255 à 255 pour chaque côté ; positif signifie en avant, négatif en arrière et zéro à l'arrêt. setSide() donne la même vitesse et le même sens aux deux moteurs d'un côté. Les commandes sont les lettres envoyées par les applis de type « Arduino Bluetooth RC Car » des magasins d'applications : F avant, B arrière, L et R rotation sur place, G et I virage en courbe, S arrêt. Le curseur de vitesse de l'appli envoie un chiffre de 0 à 9 ; le code le convertit en une valeur PWM entre 90 et 240 et, comme le minimum est de 90, les moteurs démarrent même au réglage le plus bas. Si une roue tourne à l'envers, ne touche pas au code : inverse les deux fils de ce moteur dans son bornier. Pour le montage du châssis et une version à deux moteurs, consulte Voiture robot Arduino.

La broche RXD du HC-05 fonctionne en 3,3 V ; n'y branche pas le signal TX 5 V de l'Arduino sans l'abaisser avec un pont diviseur de tension. Par ailleurs, si la liaison se coupe, la voiture continue avec la dernière commande ; avec millis(), tu peux facilement ajouter une règle de sécurité qui appelle drive(0, 0) dès qu'une seconde s'est écoulée depuis la dernière lettre.

Piloter des moteurs pas à pas : 28BYJ-48 et NEMA 17

Le shield peut piloter deux moteurs pas à pas en même temps : le port 1 utilise les borniers M1 et M2 et le port 2 utilise M3 et M4. Avec un moteur bipolaire (4 fils, comme un NEMA 17), tu branches une bobine sur M1 et l'autre sur M2. Avec un moteur unipolaire (5 ou 6 fils), les deux bobines vont aussi sur M1 et M2, et le fil commun va sur la vis GND au milieu du bornier. Pour le très répandu 28BYJ-48, le câblage est le suivant : fils bleu et jaune sur M1, fils rose et orange sur M2, fil commun rouge sur GND. L'utilisation de ce moteur avec la carte ULN2003 est expliquée dans Qu'est-ce qu'un moteur pas à pas ?.

Type de pasFonctionnementQuand l'utiliser ?
SINGLEUne seule bobine alimentée à la foisCourant le plus faible, couple le plus faible
DOUBLEDeux bobines alimentées en même tempsCouple plus élevé ; le choix le plus courant
INTERLEAVEAlterne une et deux bobines (demi-pas)Résolution doublée, rotation plus douce
MICROSTEPLes courants des bobines varient progressivement en PWM ; chaque pas entier est divisé en 16Rotation lente et silencieuse ; le couple baisse

Le 28BYJ-48 est un moteur 5 V ; pour cet essai, alimente les moteurs avec 4 piles AA (6 V), retire le cavalier et alimente l'Arduino en USB. À cause du réducteur intégré, un tour complet fait 2048 pas entiers :

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

setSpeed() fixe le nombre de tours par minute ; à cause de son réducteur, le 28BYJ-48 ne dépasse pas environ 10–15 tr/min. Attention : step() est bloquante ; tant que le moteur n'a pas fini les pas demandés, loop() ne fait rien d'autre. Si tu veux lire des capteurs ou piloter des moteurs CC pendant que le pas à pas tourne, utilise la fonction onestep() de la bibliothèque avec la bibliothèque AccelStepper ; l'exemple AFMotor_ConstantSpeed fourni avec la bibliothèque montre exactement cela. Appeler release() pendant les pauses coupe les bobines et évite l'échauffement, mais l'axe perd alors son couple de maintien.

La plupart des moteurs NEMA 17 consomment 1,5–2 A par bobine pour une résistance de bobine d'environ 1,5–3 Ω. Comme le L293D ne limite pas le courant, ces moteurs branchés en 12 V dépassent largement la limite du canal et la puce se coupe en quelques secondes. Avec le shield L293D, n'utilise que des moteurs pas à pas à forte résistance de bobine qui consomment moins de 0,4 A sous 12 V ; pour les NEMA 17 puissants, le driver A4988 est le bon choix.

Brancher des servos : les connecteurs SER1 et SERVO_2

Les deux connecteurs à trois broches dans le coin du shield sont destinés aux servos. D'après les marquages de la carte, les broches sont − (GND), + (5 V) et S (signal) : le fil marron du servo va sur −, le rouge sur + et l'orange sur S. D'après le schéma de la carte, SER1 est relié à D10 et SERVO_2 à D9 (certaines sources donnent les numéros dans l'autre sens ; si le servo ne bouge pas, essaie l'autre broche dans le code). Les servos se pilotent avec la bibliothèque standard Servo, et le Timer1 qu'elle utilise sur l'Uno n'entre pas en conflit avec les timers des moteurs : moteurs CC et servos fonctionnent donc ensemble sans problème.

Les servos ne sont pas alimentés par la batterie des moteurs, mais par la ligne 5 V de l'Arduino. Pour un SG90, aucun souci, mais les gros servos comme le MG996R peuvent tirer plus de 1 A en mouvement ; le régulateur de l'Arduino chauffe, la tension s'effondre et la carte redémarre. Avec un gros servo, branche seulement le fil de signal sur le connecteur, alimente le + et le − du servo par une source 5–6 V séparée et relie les masses. Les détails sont dans Servo MG996R avec Arduino et Qu'est-ce qu'un servomoteur ?. Le code ci-dessous fait balayer le servo de SER1 de gauche à droite pendant que le moteur de M3 tourne :

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Limite de courant (0,6 A) et échauffement

La ligne la plus importante de la fiche technique du L293D, c'est 0,6 A en continu et 1,2 A en pointe par canal. La valeur de pointe ne vaut que pour des impulsions très courtes ; si un moteur tire 1 A pendant plusieurs secondes, la puce souffre. Un calcul simple montre pourquoi elle chauffe : le L293D est un pilote ancien à transistors bipolaires et, à 0,6 A, il perd typiquement 1,4 V dans le transistor du haut et 1,2 V dans celui du bas. Quand un moteur consomme 0,6 A, la puce dissipe donc 0,6 A × 2,6 V ≈ 1,6 W ; deux moteurs sur la même puce produisent le double, environ 3 W. Une petite puce DIP sans dissipateur ne peut pas évacuer cette chaleur, sa température monte vite et la protection thermique finit par couper les sorties. Le symptôme est bien connu : les moteurs tournent un moment, s'arrêtent, puis repartent quand la puce a refroidi.

Les moteurs TT jaunes consomment environ 150 mA à vide et 200–300 mA en roulant au sol, ce qui reste dans les limites du shield. Le problème, ce sont les moments où une roue bute contre un obstacle ou où la voiture pivote sur place : un moteur TT bloqué peut tirer 1–1,5 A, et sur une voiture 4WD les quatre moteurs forcent en même temps pendant une rotation sur place. Pour connaître le courant réel de ton moteur, branche un multimètre en série avec lui et mesure en retenant brièvement la roue avec la main ; la méthode est expliquée dans Comment utiliser un multimètre. Pour garder le shield au frais :

  • Démarre en douceur : ne passe pas de 0 à 255 d'un coup ; augmente la vitesse progressivement sur 200–300 ms et le courant de démarrage baisse nettement.
  • Ne bloque pas le moteur : sur un robot éviteur d'obstacles, arrête la voiture avant qu'elle ne touche l'obstacle ; un moteur bloqué est celui qui chauffe le plus.
  • Colle des dissipateurs sur les puces : de petits dissipateurs en aluminium avec adhésif thermique abaissent un peu la température du L293D.
  • Soude un second L293D : Adafruit indique aussi qu'on peut souder un second L293D sur les puces existantes, patte sur patte, pour augmenter la capacité en courant ; les deux puces se partagent alors le courant.
  • Pas plus de tension que nécessaire : mettre 12 V sur des moteurs 6 V augmente le courant et la chaleur.
  • Passe au bon pilote : si ton moteur consomme en continu plus de 0,6 A, utilise un pilote à base de L298N ou de TB6612FNG.

Shield moteur L293D ou L298N ?

Module double pilote de moteur L298N
Module L298N : deux ponts en H dans une seule puce, un grand dissipateur et 2 A par canal ; il se câble avec des fils et convient donc à toutes les cartes.
CaractéristiqueShield moteur L293DModule L298N
Nombre de moteurs4 CC, ou 2 pas à pas + 2 servos2 CC ou 1 pas à pas
Courant par canal0,6 A en continu, 1,2 A en pointe2 A en continu, 3 A en pointe
Tension moteur4,5–25 V5–35 V
Chute de tensionEnviron 1,5–2,6 VEnviron 2–3 V
BranchementS'enfiche sur l'Uno, sans filsAvec des fils ; tu choisis les broches
Broches utilisées8 broches fixes + D9 et D10 pour les servos6 broches (ENA, IN1–IN4, ENB)
BibliothèqueAFMotor obligatoireInutile (digitalWrite, analogWrite)
ESP32 et PicoPas adaptéUtilisable directement
Idéal pourVoitures 4WD à moteurs TT, kits d'apprentissageMoteurs plus puissants, robots 2WD

En bref, si tu construis une voiture 4WD à moteurs TT sur un Arduino Uno, le shield L293D réduit le câblage au minimum et regroupe les quatre moteurs sur une seule carte. Si tes moteurs sont plus puissants, si ta carte est un ESP32 ou une Pico, ou si tu tiens à choisir les broches, le L298N est plus souple ; les détails sont dans Commander un moteur à courant continu avec le L298N. Si tu veux plus efficace que les deux, le TB6612FNG, à base de MOSFET, a une chute de tension très faible et prolonge l'autonomie des piles. Nous comparons quel type de moteur convient à quel usage dans Moteur CC, servomoteur et moteur pas à pas.

Fonctionne-t-il avec un ESP32, un Raspberry Pi Pico ou un Mega ?

Avec l'Arduino Mega 2560, il fonctionne sans problème : le shield s'enfiche sur les premières broches numériques et analogiques du Mega, et AFMotor connaît les timers du Mega. Avec l'Uno R4, le Leonardo, l'ESP32 et le Raspberry Pi Pico, en revanche, il ne fonctionne pas, car AFMotor écrit directement dans les registres de timer de l'ATmega328P et de l'ATmega2560. Avec un ESP32 sélectionné, la compilation s'arrête sur 'DC_MOTOR_PWM_RATE' was not declared in this scope, et avec un Leonardo sur #error "This chip is not supported!". Les cartes ESP32 au format Uno (comme l'ESPDuino-32) s'enfichent physiquement sur le shield, mais les numéros de broches et le niveau de signal de 3,3 V sont différents. Avec ces cartes, il est bien plus simple d'utiliser un L298N, un TB6612FNG ou une seule puce L293D à la place du shield. Les entrées du L293D considèrent comme HIGH tout ce qui dépasse 2,3 V ; elles fonctionnent donc directement avec des cartes en 3,3 V :

Broche du L293DRôleRaspberry Pi PicoESP32
1 (1,2EN)Vitesse (PWM)GP15GPIO 25
2 (1A)Sens 1GP14GPIO 26
7 (2A)Sens 2GP13GPIO 27
3 et 6 (1Y, 2Y)Bornes du moteurVers le moteurVers le moteur
4, 5, 12, 13GND (la chaleur s'évacue aussi par ces broches)GNDGND
16 (VCC1)Alimentation logique, 5 VVBUS (broche 40)5V (VIN)
8 (VCC2)Alimentation des moteursPôle + de la batteriePôle + de la batterie
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Les masses de la Pico et de la batterie doivent impérativement être reliées. Sur l'ESP32, tu construis la même logique en langage Arduino : le sens avec digitalWrite et la vitesse avec analogWrite sur les broches du tableau. Si ces cartes sont nouvelles pour toi, commence par Qu'est-ce que l'ESP32 ? et Qu'est-ce que le Raspberry Pi Pico ?.

Les moteurs ne tournent pas : erreurs fréquentes et solutions

SymptômeCause probableSolution
Aucun moteur ne tourne, la LED PWR est éteintePas d'alimentation moteur : EXT_PWR vide ou seulement l'USB branchéBranche une batterie de 6–12 V sur EXT_PWR ; tant que la LED est éteinte, les moteurs ne tournent pas
La LED est allumée, le code est téléversé, mais le moteur ne bouge pasPas de setSpeed() dans le code, ou numéro de moteur différent du bornierAjoute setSpeed(200) dans setup() ; vérifie que AF_DCMotor(1) correspond à M1
Le moteur bourdonne mais ne tourne pasValeur PWM trop basse ou batterie faibleDémarre au-dessus de 100 ; recharge la batterie ou utilise deux 18650
« AFMotor.h: No such file or directory »Bibliothèque absente ou V2 installéeInstalle la bibliothèque Adafruit Motor Shield library V1 depuis le gestionnaire de bibliothèques
Erreur « This chip is not supported! » ou « DC_MOTOR_PWM_RATE »Uno R4, Leonardo ou ESP32 sélectionné comme carteChoisis Uno ou Mega dans Outils > Type de carte
L'Arduino redémarre quand les moteurs démarrentLe courant de démarrage fait chuter la tension de la batterie (brownout)Retire le cavalier et alimente l'Arduino séparément ; soude un condensateur de 100 nF aux bornes du moteur
Le moteur tourne un moment puis s'arrête, la puce est brûlanteLa protection thermique du L293D s'est déclenchéeRéduis la charge, démarre en douceur, ajoute des dissipateurs ou passe au L298N
Les moteurs changent de sens au hasardD4, D7, D8 ou D12 servent à autre chose dans le codeDéplace tes capteurs sur A0–A5
La vitesse de M1 et M2 ne change pas, M3 et M4 sont normauxtone() ou IRremote utilisent le Timer2Passe ces moteurs sur M3 et M4 ou retire le code en conflit
Une roue tourne à l'enversFils du moteur inversés dans le bornierInverse les deux fils de ce moteur
La carte se comporte bizarrement avec le shieldLa prise USB de l'Uno touche des soudures sous le shield, ou une broche est tordueColle du ruban isolant sur la prise USB, redresse les broches et remets le shield
Le moyen le plus rapide de trouver le problème est de réduire le test au plus simple : mets de côté tout le code de la voiture, branche un seul moteur sur M1, vérifie que la LED PWR est allumée et téléverse le premier programme ci-dessus. Si cela fonctionne, le problème vient de ton code et non du shield ; sinon, commence par l'alimentation et la bibliothèque. Toutes les raisons pour lesquelles un Arduino redémarre sont réunies dans Arduino redémarre tout seul.

Idées de projets avec le shield moteur L293D

  • Voiture 4WD pilotée en Bluetooth : un robot à quatre roues motrices que tu conduis depuis ton téléphone avec le code ci-dessus.
  • Robot éviteur d'obstacles : une voiture qui scrute l'avant avec un HC-SR04 monté sur le servo de SER1 et tourne vers la direction la plus dégagée ; le guide complet est dans Robot éviteur d'obstacles Arduino.
  • Robot suiveur de ligne : suis une ligne noire au sol avec des capteurs infrarouges sur A0–A3 ; le réglage PID est expliqué dans Robot suiveur de ligne Arduino.
  • Slider pour caméra : fais glisser lentement une caméra sur un rail avec un moteur pas à pas pour filmer des timelapses.
  • Tourelle pan-tilt : branche deux servos sur les deux connecteurs de servo et oriente une caméra ou un laser sur deux axes ; pour plus de servos, vois Bras robotique Arduino.
  • Rideau automatique ou tapis roulant : ouvre et ferme un rideau avec un moteur CC selon la lumière, ou construis un petit convoyeur.

En résumé, pour bien utiliser le shield moteur L293D : installe la bibliothèque V1, vérifie la LED PWR, place le cavalier selon ton montage d'alimentation, n'oublie pas setSpeed(), branche les capteurs sur A0–A5 et garde tes moteurs sous la limite de 0,6 A. Avec ces règles, un petit shield porte à lui seul toute la force d'un robot à quatre moteurs. Dans l'application BlueGrays, tu trouveras la voiture pilotée en Bluetooth, le robot éviteur d'obstacles et des projets avec moteurs pas à pas et servos, étape par étape, avec schémas et code.

Questions fréquentes

Combien de moteurs le shield moteur L293D peut-il piloter ?

Le shield peut piloter 4 moteurs à courant continu en même temps, chacun indépendamment en avant, en arrière et à sa propre vitesse. À la place des moteurs CC, tu peux aussi brancher 2 moteurs pas à pas (les paires M1–M2 et M3–M4), ou 2 moteurs CC plus 1 pas à pas. Il y a en plus deux connecteurs de servo ; les servos sont pilotés par D9 et D10, indépendamment des moteurs.

À quoi sert le cavalier PWR du shield moteur L293D ?

Cavalier en place, l'alimentation moteur du shield est reliée à la ligne Vin de l'Arduino et les deux cartes fonctionnent sur une seule source. Si tu alimentes l'Arduino en USB et les moteurs par une batterie séparée, tu dois retirer le cavalier. Brancher des sources séparées sur la prise jack et sur EXT_PWR avec le cavalier en place met les deux alimentations en court-circuit.

Quelle batterie brancher sur le shield moteur L293D ?

Pour les voitures robots à moteurs TT, le meilleur choix est deux accus lithium 18650 (7,4 V) ; comme le L293D perd environ 2 V, les moteurs reçoivent 5,5–6 V. Quatre piles AA ne laissent qu'environ 4 V aux moteurs, et une pile 9 V ne fournit pas assez de courant pour les faire tourner. Fais attention à la polarité en branchant la batterie sur EXT_PWR, car le bornier n'a pas de protection contre l'inversion.

Comment corriger l'erreur « AFMotor.h: No such file or directory » ?

Cette erreur signifie que la bibliothèque AFMotor n'est pas installée. Cherche Adafruit Motor Shield dans le gestionnaire de bibliothèques et installe la Adafruit Motor Shield library dont la description mentionne la V1. La bibliothèque V2 est destinée à une autre carte et ne contient pas le fichier AFMotor.h.

Quel courant supporte le shield moteur L293D et pourquoi chauffe-t-il ?

Chaque canal fournit 0,6 A en continu et 1,2 A en pointes très brèves. Comme les transistors du L293D perdent environ 2,6 V à 0,6 A, près de 1,5 W de chaleur est produit par moteur ; voilà pourquoi la puce chauffe et se coupe si la limite est dépassée. Évite que les moteurs se bloquent et utilise un pilote plus puissant, comme le L298N, pour les moteurs qui consomment plus de 0,6 A en continu.

Vaut-il mieux un shield moteur L293D ou un L298N ?

Si tu construis une voiture 4WD à moteurs TT sur un Arduino Uno, le shield L293D est plus pratique, car il s'enfiche sans fils et offre quatre canaux moteur. Si tu utilises des moteurs plus puissants, un ESP32 ou une Pico, ou si tu veux choisir toi-même les broches, le L298N, avec 2 A par canal, convient mieux. Les deux perdent environ 2 V de la tension moteur.

Voir tous les projets
Voiture contrôlée par Bluetooth avec L298N
#80Avancé
Premium

Voiture contrôlée par Bluetooth avec L298N

Transforme ton téléphone en télécommande et pilote ta propre voiture robot. L'Arduino reçoit, via un module Bluetooth, les ordres d'une appli de télécommande sur ton téléphone et fait tourner les roue

5.0(38)
65
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
Utilisation du moteur pas à pas
#67Intermédiaire
Premium

Utilisation du moteur pas à pas

Un moteur qui tourne pas à pas, exactement autant que tu le veux, comme l'aiguille d'une horloge. Grâce à une carte de commande, l'Arduino fait faire à un petit moteur pas à pas un tour complet dans u

4.5(31)
42
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

Apprends à un moteur pas à pas ordinaire à aller à l'angle que tu veux, sur tout le tour. L'Arduino calcule combien de pas correspond à chaque angle ; le moteur va tour à tour à 0, 90, 45, 180, 135 et

4.5(22)
32
Utilisation du servomoteur
#35Débutant
Premium

Utilisation du servomoteur

Le bras d'un petit servomoteur tourne tour à tour vers trois positions : tout au début, pile au milieu et tout au bout, en attendant deux secondes à chaque arrêt. L'Arduino indique au moteur l'angle à

4.7(48)
67
Utilisation d'un servomoteur avec un potentiomètre
#36Débutant
Premium

Utilisation d'un servomoteur avec un potentiomètre

Quand tu tournes le bouton du potentiomètre, le bras du servomoteur tourne avec lui : un bout du bouton correspond à zéro degré, l'autre à un demi-tour. L'Arduino lit sans arrêt la position du bouton,

4.6(37)
52
Contrôler une LED depuis un téléphone via Bluetooth
#34Débutant
Premium

Contrôler une LED depuis un téléphone via Bluetooth

Une petite répétition pour allumer et éteindre les lumières de ta chambre depuis ton téléphone. Le module Bluetooth transmet à l'Arduino les lettres envoyées par ton téléphone ; une lettre allume la L

4.8(68)
89
TCRT5000 Détection de surface noire et blanche
#78Intermédiaire
Premium

TCRT5000 Détection de surface noire et blanche

Avec le petit capteur qui sert d'œil aux robots suiveurs de ligne, tu sais si le sol est noir ou blanc. Le TCRT5000 envoie une lumière invisible vers le sol et regarde combien revient ; sur du blanc l

4.7(40)
49