Controllare un motore DC con Arduino e ponte H L293D / SN754410
Impariamo a far ruotare un motore in entrambi i sensi usando Arduino e un ponte H, con comando tramite interruttore oppure direttamente dal Monitor Seriale.
Cosa imparerai
- che cos’è un ponte H e perché serve;
- come collegare L293D o SN754410 ad Arduino;
- come invertire il senso di rotazione di un motore DC;
- come usare il pin Enable;
- come comandare il motore con un interruttore;
- come controllarlo dal Monitor Seriale;
- perché per il motore è preferibile un’alimentazione esterna.
Cos’è un ponte H
Un ponte H è un circuito che consente di applicare al motore una tensione con polarità in un verso oppure nell’altro. In questo modo lo stesso motore può ruotare in senso orario o antiorario senza dover invertire fisicamente i fili.
Gli integrati L293D e SN754410 racchiudono due canali di pilotaggio, perciò possono essere utilizzati anche per controllare due motori DC, nei limiti elettrici previsti dal componente.
Materiale necessario
🧰 Kit Arduino consigliato
Per sperimentare con motori, pulsanti, LED, resistenze e breadboard può essere comodo partire da un kit completo.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni progressive, schemi e progetti pratici pensati anche per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Piedinatura del L293D
Piedinatura del ponte H L293D utilizzata come riferimento nel progetto originale.
Come si controlla la direzione
| Ingresso 1 | Ingresso 2 | Risultato |
|---|---|---|
| LOW | HIGH | Rotazione in un senso |
| HIGH | LOW | Rotazione nel senso opposto |
| LOW | LOW | Motore non pilotato in rotazione |
| HIGH | HIGH | Motore non pilotato in rotazione |
Pin Arduino usati nel progetto
| Pin Arduino | Funzione |
|---|---|
| D2 | Ingresso interruttore |
| D3 | Ingresso 1 del ponte H |
| D4 | Ingresso 2 del ponte H |
| D9 | Enable del ponte H |
| D13 | LED di diagnostica nello sketch originale |
Alimentazione esterna del motore
Per un motore DC è generalmente preferibile usare una sorgente di alimentazione separata e dimensionata per la tensione e la corrente richieste dal motore. Arduino continua a fornire i segnali di controllo, mentre l’energia necessaria al motore arriva dall’alimentatore esterno.

Schema originale con alimentazione esterna del motore.
Simulazione Tinkercad – alimentazione esterna
Alimentazione dal circuito Arduino
La pagina storica mostra anche una configurazione alimentata dal lato Arduino. È utile come esempio didattico con piccoli carichi compatibili, ma non va considerata una soluzione universale: la scelta dell’alimentazione deve sempre partire dalle caratteristiche reali del motore.

Secondo schema originale del progetto.
Simulazione Tinkercad – seconda configurazione
Sketch 1: controllo con interruttore
Nel primo programma il pin 2 legge lo stato dell’interruttore. A seconda del livello logico, Arduino imposta i pin 3 e 4 in modo opposto e inverte la direzione del motore.
const int switchPin = 2; // switch input
const int motor1Pin = 3; // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4; // H-bridge leg 2 (pin 7, 2A)
const int enablePin = 9; // H-bridge enable pin
const int ledPin = 13; // LED
void setup() {
// set the switch as an input:
pinMode(switchPin, INPUT);
// set all the other pins you're using as outputs:
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(ledPin, OUTPUT);
// set enablePin high so that motor can turn on:
digitalWrite(enablePin, HIGH);
// blink the LED 3 times. This should happen only once.
// if you see the LED blink three times, it means that the module
// reset itself,. probably because the motor caused a brownout
// or a short.
blink(ledPin, 3, 100);
}
void loop() {
// if the switch is high, motor will turn on one direction:
if (digitalRead(switchPin) == HIGH) {
digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high
}
// if the switch is low, motor will turn in the other direction:
else {
digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge low
}
}
void blink(int whatPin, int howManyTimes, int milliSecs) {
int i = 0;
for ( i = 0; i < howManyTimes; i++) {
digitalWrite(whatPin, HIGH);
delay(milliSecs/2);
digitalWrite(whatPin, LOW);
delay(milliSecs/2);
}
}Sketch 2: controllo dal Monitor Seriale
Il secondo sketch permette di inviare caratteri dal Monitor Seriale a 9600 baud. Nel codice originale H avvia il motore in una direzione, J lo avvia nella direzione opposta e L disabilita il ponte H fermando il motore.
const int motor1Pin = 3; // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4; // H-bridge leg 2 (pin 7, 2A)
const int enablePin = 9; // H-bridge enable pin
const int ledPin = 13; // LED
int incomingByte; // a variable to read incoming serial data into
void setup() {
Serial.begin(9600); // open serial port to receive data
// set all the other pins you're using as outputs:
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(ledPin, OUTPUT);
// set enablePin high so that motor can turn on:
digitalWrite(enablePin, LOW);
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H') {
digitalWrite(enablePin, HIGH); // accende il motore
digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high
}
else if (incomingByte == 'J') {
digitalWrite(enablePin, HIGH); // accende il motore
digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge low
digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge high
}
else if (incomingByte == 'L') {
digitalWrite(enablePin, LOW); // spegne il motore
}
}
}Come funziona il pin Enable
Il pin Enable abilita o disabilita il canale del ponte H. Portandolo HIGH il driver può pilotare il motore; portandolo LOW l’uscita viene disabilitata. Poiché nel progetto è collegato al pin 9 di Arduino, in una variante più avanzata è possibile studiare anche il controllo PWM della velocità, verificando prima la configurazione elettrica e i limiti del driver.
Perché Arduino può resettarsi quando parte il motore?
All’avvio un motore può richiedere una corrente sensibilmente maggiore rispetto a quella assorbita durante la rotazione normale. Se l’alimentazione subisce un calo di tensione, Arduino può andare incontro a un reset. Lo sketch originale usa infatti tre lampeggi del LED all’avvio come semplice indicazione utile a riconoscere un eventuale riavvio.
Debug rapido
- verifica che il motore funzioni con una sorgente adatta;
- controlla la massa comune tra Arduino e alimentazione del driver;
- verifica i collegamenti dei pin di ingresso e del pin Enable;
- se il motore gira al contrario, scambia la logica dei due ingressi oppure i terminali del motore;
- se Arduino si resetta, controlla soprattutto alimentazione, cablaggio e assorbimento del motore;
- se usi il Monitor Seriale, imposta 9600 baud e invia i caratteri previsti dallo sketch.
Varianti del progetto
- regolazione della velocità tramite PWM;
- due motori per un piccolo robot;
- comando con joystick;
- controllo Bluetooth o Wi-Fi;
- finecorsa per un piccolo attuatore;
- comando con pulsanti separati avanti, indietro e stop.
Cosa devi ricordare
- Il ponte H permette di invertire la polarità sul motore.
- I due ingressi logici determinano il senso di rotazione.
- Il pin Enable abilita o disabilita il canale.
- Arduino non deve essere usato come stadio di potenza del motore.
- Per molti motori è preferibile un’alimentazione esterna adeguata.
- Con alimentazioni separate serve un riferimento di massa comune.
Domande frequenti
Posso controllare due motori?
L293D e SN754410 dispongono di due canali di pilotaggio; il cablaggio e l’alimentazione devono però rispettare i limiti del componente utilizzato.
Perché il motore gira solo in un senso?
Controlla i due ingressi del ponte H: per invertire la rotazione devono assumere stati logici opposti.
Posso regolare anche la velocità?
È possibile sviluppare una variante usando PWM sul controllo Enable, purché driver, frequenza, motore e alimentazione siano compatibili.
Perché è meglio un’alimentazione esterna?
Un motore può richiedere correnti elevate, soprattutto all’avvio o in stallo. Separare correttamente l’alimentazione del carico riduce il rischio di cali di tensione e reset di Arduino.

