⚙️ Arduino • Motore DC • Ponte H

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.

DifficoltàIntermedia
DriverL293D / SN754410
Controllo2 direzioni + stop
In poche parole: Arduino non deve alimentare direttamente un motore DC. Il ponte H lavora come stadio di potenza e permette di invertire la polarità applicata al motore, cambiandone così il senso di rotazione.

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.

Concetto chiave: Arduino decide la direzione tramite segnali logici; è il driver a gestire la corrente richiesta dal motore.

Materiale necessario

🔌 Arduino Uno
⚙️ L293D o SN754410
🔘 Pulsante / microinterruttore
〰️ Resistenza da 10 kΩ
🔄 Motore DC
🧩 Breadboard
🔗 Cavetti jumper
🔋 Alimentazione esterna adeguata

🧰 Kit Arduino consigliato

Per sperimentare con motori, pulsanti, LED, resistenze e breadboard può essere comodo partire da un kit completo.

👉 Guarda il kit Arduino consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Piedinatura del L293D

Piedinatura integrato ponte H L293D

Piedinatura del ponte H L293D utilizzata come riferimento nel progetto originale.

Come si controlla la direzione

Ingresso 1Ingresso 2Risultato
LOWHIGHRotazione in un senso
HIGHLOWRotazione nel senso opposto
LOWLOWMotore non pilotato in rotazione
HIGHHIGHMotore non pilotato in rotazione

Pin Arduino usati nel progetto

Pin ArduinoFunzione
D2Ingresso interruttore
D3Ingresso 1 del ponte H
D4Ingresso 2 del ponte H
D9Enable del ponte H
D13LED 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.

Importante: quando Arduino e il driver utilizzano alimentazioni separate, le masse del circuito devono avere un riferimento comune. Non collegare un motore ad Arduino senza verificare tensione, corrente di spunto e limiti del driver.
Arduino L293D motore con alimentazione esterna

Schema originale con alimentazione esterna del motore.

Simulazione Tinkercad – alimentazione esterna

▶️ Apri la simulazione

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.

Arduino ponte H L293D alimentazione dal circuito Arduino

Secondo schema originale del progetto.

Simulazione Tinkercad – seconda configurazione

▶️ Apri la simulazione

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.

Sketch originale – controllo con interruttore
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);
    }
  }
⬇️ Scarica sketch_ponte-h_interruttore.ino

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.

Sketch originale – controllo dal Monitor Seriale
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
    }

  }

}
⬇️ Scarica sketch_ponte-h_monitor_seriale.ino

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.

Errore comune: scegliere alimentatore e driver considerando soltanto la corrente del motore già in rotazione. Anche la corrente di avvio e di stallo è importante.

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.