Componenti · 5 min di lettura

Controllo di motori DC con l'L298N: velocità e verso di rotazione con Arduino

Come funziona il driver per motori L298N? Il ponte H, i pin ENA, IN1 e IN2, il ponticello 5V e l'alimentazione, la velocità con il PWM, il cambio di verso, il codice di un'auto robot a due motori e l'uso con ESP32 e Pico.

I motori DC sono i più diffusi: fanno girare ventole, ruote dei robot, pompe dell'acqua e macchinine giocattolo. Però non puoi collegare un motore direttamente a un pin di Arduino: assorbe molta più corrente di quella che il pin può fornire e, per cambiare il verso di rotazione, bisogna invertirne la polarità. Il driver per motori L298N risolve entrambi i problemi: fa girare due motori DC avanti e indietro in modo indipendente e ne regola la velocità con il PWM. Lo trovi in quasi tutti i progetti di auto robot.

Modulo driver doppio per motori L298N
Driver per motori L298N: sotto il dissipatore nero c'è il chip L298N con due ponti H; ai lati i morsetti dei motori, davanti i pin di alimentazione e di controllo.

Come funziona un motore DC e perché serve un driver?

Se applichi una tensione ai due terminali di un motore DC, gira; se inverti la polarità, gira al contrario; se abbassi la tensione, rallenta. Anche un piccolo motore giocattolo assorbe centinaia di milliampere in funzione e oltre 1 ampere all'avvio o quando si blocca. Inoltre, essendo una bobina, quando si spegne genera picchi di tensione inversa. Un pin di Arduino fornisce al massimo 20–40 mA e non è protetto da questi picchi: collegare direttamente il motore distrugge il pin e può danneggiare anche la scheda.

Cos'è un ponte H?

Per far girare un motore nei due versi si usa un ponte H: quattro interruttori elettronici disposti intorno al motore a forma di lettera "H". Quando si chiudono due interruttori in diagonale, la corrente attraversa il motore in un verso; quando si chiude l'altra coppia diagonale, nel verso opposto. Il chip L298N contiene due ponti H, quindi controlla due motori in modo indipendente. Ogni motore usa due pin di verso (IN1 e IN2) e un pin di velocità (ENA):

IN1IN2ENACosa fa il motore
HIGHLOWHIGH o PWMGira in avanti
LOWHIGHHIGH o PWMGira all'indietro
HIGHHIGHHIGHFrena e si ferma rapidamente
QualsiasiQualsiasiLOWGira a vuoto e rallenta da solo

Caratteristiche tecniche dell'L298N

CaratteristicaValore
Tensione dei motori5–35 V (max 12 V con il ponticello 5V inserito)
Corrente per canale2 A continui, 3 A di picco
Tensione logica5 V (gli ingressi riconoscono anche i 3,3 V)
Caduta di tensioneCirca 1,5–3 V (il motore riceve tanto di meno)
Motori pilotabili2 motori DC o 1 motore passo-passo bipolare
ProtezioneDiodi di ricircolo sulla scheda
Motore DC con riduttore e ruota
Il motore DC giallo con riduttore e ruota delle auto robot: il riduttore abbassa la velocità e aumenta la coppia; funziona a 3–6 V.

Pin e alimentazione dell'L298N

Pin o morsettoFunzione
OUT1, OUT2I due terminali del motore A
OUT3, OUT4I due terminali del motore B
12V (VS)Alimentazione dei motori: positivo della batteria o dell'alimentatore
GNDMassa comune: qui arrivano il negativo della batteria e il GND di Arduino
5VUscita a 5 V con il ponticello 5V inserito, ingresso dell'alimentazione logica se tolto
ENA, ENBIngressi di velocità (PWM); con i ponticelli inseriti il motore va sempre al massimo
IN1, IN2, IN3, IN4Ingressi di verso
Il negativo della batteria, il GND dell'L298N e il GND di Arduino devono essere collegati insieme; senza una massa comune i segnali di controllo non hanno senso. Se l'alimentazione dei motori supera i 12 V, togli il ponticello 5V dalla scheda e fornisci 5 V separati al pin 5V. Non alimentare mai i motori dal pin 5V di Arduino.

Far girare un motore avanti, indietro e a velocità diverse

Per prima cosa togli il ponticello da ENA e collega ENA al pin D9 di Arduino, IN1 al D8 e IN2 al D7. Collega il motore a OUT1 e OUT2 e un pacco da 2 batterie 18650 (7,4 V) o da 4–6 pile AA ai morsetti 12V e GND; porta GND anche al GND di Arduino. La funzione motor() qui sotto riceve un valore da -255 a 255: positivo vuol dire avanti, negativo indietro e zero frenata. Il principio della regolazione di velocità è in Cos'è il 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 maggior parte dei motori ronza invece di girare con valori PWM bassi; di solito per partire serve un valore intorno a 80–120. Fermare brevemente il motore prima di cambiare verso e aumentare la velocità gradualmente, non di colpo, riduce i picchi di corrente e protegge gli ingranaggi.

Auto robot a due motori: avanti, indietro, sinistra e destra

Le auto robot non hanno sterzo: girano facendo ruotare le due ruote a velocità o in versi diversi. Se entrambi i motori vanno avanti l'auto procede dritta; se il sinistro va indietro e il destro avanti, l'auto ruota su se stessa verso sinistra. La funzione drive() qui sotto riceve separatamente la velocità di ciascun motore, da -255 a 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}

Aggiungendo un sensore di distanza davanti all'auto ottieni un robot che si ferma e gira quando vede un ostacolo; per il sensore vedi Sensore di distanza HC-SR04. Se userai la libreria Servo su un Uno, attenzione: disattiva il PWM dei pin 9 e 10, quindi sposta ENA ed ENB sui pin 5 e 6.

L298N con ESP32 e Raspberry Pi Pico

Gli ingressi dell'L298N considerano HIGH tutto ciò che supera circa 2,3 V, quindi funzionano direttamente con i segnali a 3,3 V di ESP32 e Pico; l'alimentazione logica del modulo deve comunque restare a 5 V. Sull'ESP32 puoi usare lo stesso codice Arduino con pin capaci di PWM per ENA ed ENB (per esempio GPIO 25 e 26); i pin 34–39 non possono fare da uscita. Sul Pico con MicroPython, il controllo di un motore è così:

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 o MOSFET?

DriverPregiDifettiIdeale per
L298NEconomico, robusto, 2 A per canalePerde circa 2 V, scalda, ingombranteRobot hobbistici, motori 6–12 V
TB6612FNGPiccolo, efficiente (MOSFET), compatibile con 3,3 V1,2 A continui, max 13,5 VPiccoli robot a batteria
L9110SMolto piccolo ed economicoCirca 800 mA per canaleMinimotori
MOSFET singolo (come l'IRLZ44N)Molto efficiente, alta correnteUn solo versoVentole, pompe, strisce LED

Se devi solo accendere e spegnere un motore basta un relè, ma non regola la velocità; li abbiamo confrontati in Cos'è un modulo relè? Per scegliere un transistor o un MOSFET adatto, dai un'occhiata allo strumento Transistor.

Idee di progetti con l'L298N

  • Robot che evita gli ostacoli: un'auto che vede gli ostacoli con un HC-SR04 e cambia direzione.
  • Auto comandata via Bluetooth: un robot guidato tramite un HC-05 con un'app sul telefono.
  • Auto con joystick: trasforma i due assi di un joystick nelle velocità di due motori; dettagli in Come usare un modulo joystick.
  • Robot inseguitore di linea: un'auto che segue una linea nera sul pavimento con sensori a infrarossi.
  • Tenda automatica: un sistema motorizzato che apre la tenda quando arriva la luce al mattino e la chiude la sera.
  • Nastro trasportatore: un piccolo nastro con la velocità regolata da un potenziometro.

Errori comuni e come risolverli

  • Il LED del modulo è acceso ma il motore non gira: le masse non sono collegate, il ponticello di ENA è stato tolto senza collegare il pin, oppure il valore PWM è troppo basso.
  • Arduino si riavvia quando parte il motore: motore e Arduino condividono una sorgente debole; alimentali separatamente e salda un condensatore da 100 nF ai terminali del motore.
  • Il motore è lentissimo e senza forza: l'L298N si mangia circa 2 V; aumenta la tensione della batteria (per esempio 2 × 18650) o usa un driver più efficiente.
  • Il motore gira in un solo verso: uno dei pin IN non è collegato, oppure il codice scrive gli stessi valori per entrambi i versi.
  • L'L298N scalda molto: il motore assorbe troppa corrente; assicurati che il dissipatore sia libero e, se serve, scegli un driver più potente.
  • Usare una batteria da 9 V: non eroga abbastanza corrente e si scarica presto; usa un pacco ricaricabile di 18650 o di pile AA.

Una volta imparato il controllo dei motori con l'L298N, si apre il mondo dei robot. Nell'app BlueGrays trovi progetti con l'L298N – un'auto comandata via Bluetooth e un robot che evita gli ostacoli – passo passo con schemi e codice.

Domande frequenti

Quanti motori può pilotare l'L298N?

Poiché l'L298N contiene due ponti H, può pilotare due motori DC in modo indipendente, avanti e indietro e a velocità diverse. Usando insieme i due canali può pilotare anche un motore passo-passo bipolare.

A cosa serve il ponticello 5V dell'L298N?

Con il ponticello inserito, il regolatore della scheda ricava 5 V dall'alimentazione dei motori per alimentare il chip; puoi usare quei 5 V anche per alimentare Arduino. Se l'alimentazione dei motori supera i 12 V il regolatore può surriscaldarsi, quindi togli il ponticello e fornisci 5 V separati al pin 5V.

Che batteria collego all'L298N?

Per piccoli motori da 6–9 V vanno bene 2 batterie al litio 18650 (7,4 V) o 6 pile AA (9 V). Poiché l'L298N perde circa 2 V, scegli una sorgente un po' sopra la tensione nominale del motore. Le batterie da 9 V non forniscono abbastanza corrente per i motori.

Perché si toglie il ponticello di ENA?

Con il ponticello su ENA inserito il motore gira sempre alla massima velocità. Per regolare la velocità togli il ponticello e collega ENA a un pin PWM di Arduino; così potrai impostare la velocità da 0 a 255 con analogWrite.

Perché il mio motore non gira a bassa velocità?

Un motore ha bisogno di una tensione minima per vincere l'attrito e partire, e la caduta di tensione dell'L298N complica ancora di più le cose. Di solito, quando il valore PWM scende sotto 80–120, il motore si limita a ronzare. Imposta una velocità minima nel codice o usa una sorgente a tensione più alta.

L'L298N funziona con ESP32 e Raspberry Pi Pico?

Sì. Gli ingressi dell'L298N riconoscono un segnale a 3,3 V come HIGH, quindi si può collegare direttamente a ESP32 e Pico. La parte logica del modulo va comunque alimentata a 5 V e tutte le masse devono essere collegate.

Vedi tutti i progetti
Auto controllata via Bluetooth con L298N
#80Avanzato
Premium

Auto controllata via Bluetooth con L298N

Progetto di auto robot 2WD (due motori, quattro ruote) che può essere controllata dal telefono con Arduino e il modulo HC-05 Bluetooth. Un totale di quattro ruote sono azionate simultaneamente collega

5.0(38)
64
Robot che evita gli ostacoli
#81Avanzato
Premium

Robot che evita gli ostacoli

Che ne dite di costruire un veicolo intelligente che trova la propria strada? L'Obstacle Avoiding Robot scruta costantemente l'ambiente circostante grazie al sensore a ultrasuoni posto davanti a lui.

5.0(38)
49
Servocomando con joystick
#60Intermedio
Premium

Servocomando con joystick

Progetto di pan-tilt che controlla in modo indipendente due servomotori sugli assi X e Y con un modulo joystick. Insegna la logica dell'integrazione joystick-servo e l'inseguimento della posizione.

4.7(42)
58
Servomotore ESP32 (controllo tramite potenziometro)
#118Intermedio
Premium

Servomotore ESP32 (controllo tramite potenziometro)

In questo progetto controlliamo un servomotore SG90 tramite un potenziometro. Regoliamo l'angolo del servomotore mappando il valore analogico letto dal potenziometro su un intervallo compreso tra 0 e 180 gradi. Grazie alla libreria ESP32Servo, qualsiasi GPIO dell'ESP32 può generare un segnale PWM. Si tratta di un metodo di controllo fondamentale per bracci robotici, gimbal per telecamere e meccanismi di porte automatiche.

4.3(29)
42
Controllo a led con joystick
#59Intermedio
Premium

Controllo a led con joystick

Progetto di controllo che illumina i LED in 4 direzioni diverse in base ai valori degli assi X e Y del modulo joystick. Insegna la lettura analogica del joystick e la logica di rilevamento della direz

4.7(50)
66
ESP32 HC-SR04 Misuratore di distanza a ultrasuoni
#116Intermedio
Premium

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni

Il sensore a ultrasuoni HC-SR04 calcola la distanza misurando il tempo di volo (Time of Flight) dell'onda sonora che emette dopo aver colpito un oggetto e essere rimbalzata indietro. In questo progetto invieremo un impulso di 10 microsecondi al pin TRIG dell'ESP32 e leggeremo il tempo di eco proveniente dal pin ECHO con `pulseIn()`. Stampiamo la distanza calcolata in cm sul Serial Monitor. Poiché l'HC-SR04 funziona a 5V, è necessario un **divisore di tensione** sul pin ECHO — altrimenti il GPIO

4.9(27)
43
Sensore di parcheggio ESP32 (HC-SR04 + barra a 5 LED + cicalino + OLED)
#142Avanzato
Premium

Sensore di parcheggio ESP32 (HC-SR04 + barra a 5 LED + cicalino + OLED)

La versione ESP32 del sensore di parcheggio per auto! Grazie al sensore a ultrasuoni HC-SR04 misuriamo la distanza dall'oggetto davanti al veicolo. Man mano che la distanza diminuisce, la barra composta da 5 LED si riempie (da verde → giallo → rosso) e l'intervallo tra i bip del cicalino si accorcia. Quando ci si avvicina troppo (meno di 10 cm), l'allarme suona ininterrottamente e tutti i LED si accendono. Sul display OLED SSD1306 vengono visualizzati in caratteri grandi il valore istantaneo in

0.0(0)
14
HC-SR04 Misura della distanza (display seriale)
#27Principiante

HC-SR04 Misura della distanza (display seriale)

Il sensore a ultrasuoni HC-SR04 misura la distanza e visualizza il risultato in cm sul monitor seriale. Insegna il principio del calcolo della distanza con l'onda sonora.

4.6(44)
65

Impara perché un motore DC non si collega direttamente ad Arduino, come funziona un ponte H, i pin e l'alimentazione dell'L298N, il controllo di velocità e verso con il PWM e un'auto robot a due motori passo passo.

Controllo di motori DC con l'L298N: velocità e verso di rotazione con Arduino | BlueGrays