mercoledì 28 febbraio 2018

L298N Driver Motori con Arduino








Oggi mi e' capitato sotto mano una scheda driver motore basata sull'integrato L298N.

In questo post faccio la prova della scheda e la interfaccio ad Arduino.


Scheda Motori L298N


La schedina e' un controller/driver per 2 motori DC che si può' interfacciare ad Arduino e ESP8266 e ovviamente a moltissimi altri micro o schede di sviluppo.

Questa scheda può' essere usata anche per controllare dei motori passo passo ma non e' oggetto di questo post.











La scheda si basa sull'integrato L298N che e' un doppio H-Bridge e può' controllare 2 motori DC per un totale di 4A.



Scheda L298N Piedinatura


In foto vediamo i pin ed i connettori disponibili sulla scheda




I due connettori laterali sono dedicati alla connessione dei due motori DC. L'ordine di connessione dei fili non e' importante.

Il connettore frontale serve per l'alimentazione:

  • +12V: alimentazione fino a 12V
  • GND
  • +5V: questo pin e' un uscita e fornisce 5 Volt. L'uscita e' attiva solo se il relativo ponticello (+5V Enable) e' presente

Il successivo connettore e' formato da 2 ponticelli e 4 pin:

  • Enable Output A: abilita il motore A
  • IN1 - IN2: controllo rotazione motore A
  • IN3 - IN4: controllo rotazione motore B
  • Enable Output B: abilita motore B


E' importante notare come i pin di Enable Output A/B permettano di controllare la velocità' di rotazione dei due motore.










Rotazione senza controllo di velocità


Vediamo ora l'utilizzo di questa scheda driver con Arduino.

Nell'esempio sotto riportato vediamo come effettuare il circuito su breadboard per controllare la rotazione in senso orario e antiorario di un motore DC.






Qui la realizzazione su breadboard






Come si può' osservare in questo case ho lasciato il ponticello su Enable Output A.

Vediamo ora un semplice codice di controllo




Come si vede ci sono tre stati per i GPIO 7 e 8:


  1. GPIO 7 = HIGH - GPIO 8 = LOW --> il motore ruota in senso orario
  2. GPIO 7 = LOW - GPIO 8 = HIGH --> il motore ruota in senso antiorario
  3. GPIO 7 = LOW - GPIO 8 = LOW --> il motore e' fermo

Quindi questa scheda ci permette di controllare la rotazione di uno o due motori DC in maniera semplicissima utilizzando solamente 2 GPIO per motore.

I motori ovviamente sono controllabili indipendentemente l'uno dall'altro. 

Questo per esempio e' molto utile nei classici progetti di RobotCar o simili














Rotazione con controllo di velocità'


Nell'esempio sotto riportato vediamo come effettuare il circuito su breadboard per controllare la rotazione in senso orario e antiorario di un motore DC con controllo di velocità'.

Nello sketch vedremo come e' possibile anche variare la velocità' di rotazione del motore permettendo di accelerare e decelerare (io lo faccio vedere con accelerazione costante per semplicità').





Come si vede l'unica differenza con lo schema precedente e' che ho rimosso il ponticello Enable Output A ed ho collegato il pin and un GPIO PWM (#9) di Arduino.

E' importante che sia connesso ad un GPIO con uscita PWM, solo cosi' potremo controllare la velocità' proporzionalmente al valore in uscita sul pin PWM.


Qui la realizzazione su breadboard






Vediamo ora un semplice codice di controllo




Come si vede la gestione dei GPIO 7 e 8 e' uguale al caso precedente.

Nella funzione motor_accel ho aggiunto il controllo della velocità' accelerando in modo uniforme da zero alla massima velocità' e analogamente decelerando fino a zero prima di cambiare senso di rotazione.

Nella funzione si vede chiaramente che il controllo della velocità' di rotazione e' determinato dalla scrittura sul GPIO 9 di un valore tra 0 (fermo) e 255 (massima velocità').












6 commenti:

  1. e se volessi utilizzare un joystic proporzionale tipo PS2 per la bidirezionalità? ovvero avanti-dietro. dx e sx?

    RispondiElimina
  2. ciao,
    in questo articolo spiego come controllare la rotazione e velocità del motore. pertanto solo orario (avanti) ed antiorario (indietro)

    con un joystick analogico potresti usare la direzione per controllare il verso, e la proporzionalità per controllare la velocità.

    Quindi immaginiamo che usi l'asse Y per controllare.
    Se i valori sono da 512 A 1023 significa motore avanti con velocità proporzionale a valore letto
    se i valori sono da 0 a 512 significa motore indietro con velocità proporzionale a valore letto

    RispondiElimina
  3. La descrizione è molto comprensibile ed accurata. La prima prova senza controllo velocità e con il ponticello inserito va benissimo, ma la seconda dopo aver tolto il ponticello enable output A ed inserito il collegamento nel PWM (#9) di Arduino rimane tutto fermo. Ho letto i valori PWM in uscita e sono superiori a 300. Certamente sbaglio qualche cosa.
    Ho provato anche con analogWrite(MOTOR1_SPEED, 100); ma senza risultato

    RispondiElimina
    Risposte
    1. analogWrite accetta valori tra 0 e 255.

      https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

      esegui i collegamenti esattamente come nelle figure ed esegui esattamente lo stesso codice che ho usato io. non vedo un motivo per cui non debba fuinzionare

      ovviamente do per scontato che usi la stessa versione e modello di arduino.
      modelli diversi hanno pin PWM diversi.

      se usi un modello differente cambia il pin MOTOR_SPEED inserendo il numnero di pin che sulla tua scheda è configurato come uscita PWM

      Elimina
    2. Ringrazio per la sollecita risposta. Ora è tutto a posto. Era un banale errore. Il filo che collegava la massa di Arduino all'alimentazione era interrotto inoltre. Potrò cosi agevolmente gestire il traffico dei miei treni elettrici, una passione che coltivo ancora nonostante gli 89 anni.
      Complimenti ancora per la qualità dei progetti presentati. Buon Natale

      Elimina
    3. complimenti a lei per aver risolto il suo problema e per essere un esempio di persona attiva e curiosa, nonostante la sua non più giovane età

      contraccambio gli auguri

      Elimina