Serial controller motor driver

Il Serial controller motor driver è il driver per il controllo dei motori DC della sparkfun che ti permette di controllare due motori in corrente continua ( DC o CC ) con un solo pin Arduino.

serial controller motor driver

Il Serial controller motor driver usa l’integrato L298 come ponte H in grado di erogare 2A max per ciascun motore con una potenza totale erogabile di 4A.

La particolarità di questa shield è la presenza di un Atmega328 integrato nella shield con un proprio firmware in grado di acquisire le informazioni seriali con un protocollo definito dal produttore di cui rilascia il manuale utente.

Il protocollo di comunicazione seriale per il controllo motori

Quando usi una comunicazione seriale riduci notevolmente il numero di cavi e di conseguenza di pin necessari per impartire comandi, in questo caso ai motori, ma hai bisogno di un protocollo di comunicazione seriale, in questo caso è una sequenza di caratteri comprensibile sia a chi invia il comando sia a chi riceve il comando e lo converte in azione.

Il Serial controller motor driver ha un suo protocollo che il costruttore della shield ha realizzato e riporta nel manuale:

Serial controller motor driver protocol

Da cui deduci che supponendo di voler attivare il primo motore in avanti alla massima potenze dovrai inviare una stringa simile a:

Serial.print("1f9\r");

dove:

  • 1 è il motore che vuoi attivare
  • f è la direzione
  • 9 è la velocità a cui ruotare
  • \r ( nel manuale c’è un errore il carattere corretto è \r e non /r ) è il valore di chiusura del comando

Le velocità che puoi impostare vanno da 0 a 9 e il loro significato è il seguente:

Serial controller motor driver velocità

I collegamenti del Serial controller motor driver

Collegare il Serial controller motor driver è alquanto semplice, ti basta un solo pin, io ho scelto il pin 2, e il pin di massa ( Gnd ):

Serial controller motor driver arduino

nelle foto avrai notato anche il collegamneto del pin 5v ( rosso ) tra il driver e arduino, il costruttore del driver riporta:

5V is only to be used as an output as it is from the output of a regulator on the board

questo significa che puoi alimentare arduino attraverso la connessione ai 5v del driver ma non il contrario, siccome nel progetto il pin +5v di arduino era già occupato dal potenziometro ho deciso di utilizzare il connettore ICSP:

arduino ICSp

che riporta tra gli altri collegamenti i pin +5v e Gnd di tutta la scheda arduino.

Seguendo l’indicazione del manuale e la serigrafia presente sul serial controller motor driver puoi collegare dall’alto:

serial controller motor driver connessioni

  • l’alimentazione da 5v a 16v per i motori e il driver seriale
  • il pin Rx da collegare al pin 2 arduino
  • i pin Gnd e +5v da collegare al connettore ICSP arduino
  • M2- M2+ M1+ M1- a cui sono collegati i due motori ( M1 ed M2 )

i collegamenti verso arduino sono tre per consentire l’alimentazione di arduino attraverso i 5v provenienti dal serial controller motor driver.

Lo sketch del Serial controller motor driver

Passiamo a scrivere lo sketch di test:

/*
 * Serial Motor control by Mauro Alfieri
 * With SoftwareSerial.l libraries
 *
 * Web: www.mauroalfieri.it
 * Tw:  @mauroalfieri
 *
 */

#include <SoftwareSerial.h>

SoftwareSerial driverMotorA(0, 2); // RX, TX

int pinPot = A0;

int valPot = 0;
int vel = 0;

void setup()  
{
  pinMode( pinPot,INPUT);
  driverMotorA.begin(115200);
}

void loop() {

  valPot = analogRead( pinPot );
  vel = (valPot/113);

  driverMotorA.print("1f");
  driverMotorA.print(vel);
  driverMotorA.print("\r");

  delay( 1 );

  driverMotorA.print("2f");
  driverMotorA.print(vel);
  driverMotorA.print("\r");

  delay( 1 );
}

come hai visto uso la libreria SoftwareSerial.h il cui scopo è definire due pin dell’arduino uno non dedicati alla comunicazione seriale ( come ad esempio il pin 0 ed 1 ) e consentirti di utilizzarli come pin seriali, simula attraverso il software presente nella libreria il funzionamento di una porta seriale Tx ed Rx.

Alla linea 10: includi la libreria SoftwareSerial.h;

linea 12: definisci un istanza della libreria denominata driverMotorA( Rx,Tx ) nell’esempio il pin Rx lato arduino non mi serve e posso impostarlo a 0 l’unico che utilizzerò è il pin Tx per trasmettere i comandi al driver;

linea 14: definisci il pin a cui colleghi il potenziometro;

linee 16-17: definisci due variabili di tipo integer in cui memorizzeremo valore letto sul potenziometro e velocità;

linea 21: imposta il pin a cui è collegato il potenziometro come pin di INPUT;

linea 22: imposta la velocità di comunicazione seriale tra arduino ed il driver seriale per il controllo dei motori, secondo il costruttore la velocità deve essere impostata a 115200 baud;

linea 27: leggi il valore del potenziometro;

linea 28: calcola il valore di velocità da imporre ai motori, ricorda che il driver accetta da 0 a 9 e il potenziometro legge da 0 a 1023 per cui una semplice divisione per 113 risolve il problema della conversione da 1023 a 9;

linee 30-32: invia al driver la sequenza di caratteri seriali attesi: “1f9\r” dove 9 è in realtà il valore in velocità calcolato alla linea 28;

linea 34: imposta un delay di 1 millisecondo per consentire alla seriale di inviare il messaggio;

linee 36-40: esegui le stesse operazioni viste alle linee 30-34 per il secondo motore.

Il video

Ho realizzato un video in cui puoi seguire i collegamenti del serial controller motor driver e vedere come funziona il controllo dei motori:

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/serial-controller-motor-driver.html

19 comments

Skip to comment form

    • Ennio Maresca on 4 febbraio 2014 at 06:37
    • Reply

    Buongiorno, complimenti, mi piace

    1. Grazie Ennio !!!

  1. Buon giorno.
    Interessanti e ben illustrati….FOSSE POSSIBILE ALLEGARE I RELATIVI SCHEMI ELETTICI???O PERLOMENO QUELLI A BLOCCHI? Grazie .

    1. Ciao Raffaele,
      lo schema elettrico di questi driver lo torvi sul sito del produttore.

      Mauro

    • Francesco on 3 aprile 2014 at 10:31
    • Reply

    Buongiorno!
    Premetto che sono un neofita di arduino e non so assolutamente nulla di elettronica ma vorrei avvicinarmi al mondo della robotica.
    L’hanno scorso ho comprato Arduino Uno rev3 e un kit base per iniziare a fare esperimenti con led e qualche sensore. Ora vorrei realizzare qualcosa che deambuli, per esempio un robotino che eviti gli ostacoli o qualcosa di simile. Cosa mi consiglia di comprare? Una motor shield? O forse è preferibile il controller di questo articolo?
    Altra domanda (la prego di perdonare la mia ignoranza): è possibile poter usare uno schermo lcd con una motor shield?

    1. Ciao Francesco,
      per iniziare ti consiglio il beginner kit che trovi recensito sul blog ed in vendita da robot-domestici.
      Avresti già: la base mobile, un driver motori, il sensore sharp per evitare fli ostacoli e tutti i miei articoli da seguire.
      Creto avresti 2 arduino, a me se vuoi davvero iniziare con la robotica 2 arduino prima o poi ti serviranno e quale migliore occasione questa per procurarteli.

      Con questo kit potrai realizzare tutte le evoluzioni che ho realizzato non solo io ma anche altri appassionati sul blog.

      Mauro

        • Francesco on 4 aprile 2014 at 14:59
        • Reply

        La ringrazio per la risposta.

        Mi scusi se la importuno ancora. Lei consiglia questo kit giusto?

        http://www.robot-domestici.it/joomla/component/virtuemart/Arduino/arduino-kit/robot-beginner-kit

        Se non sbaglio in questo non c’è arduino, però c’è tutto il necessario per costruire il robot, giusto?

        1. Ciao Francesco,
          si quel modello ha tutto tranne l’arduino, in alternativa puoi acquistare il kit completo: http://www.robot-domestici.it/joomla/component/virtuemart/Arduino/arduino-kit/robot-beginner-kit-arduino-uno

            • Francesco on 8 aprile 2014 at 13:51

            Grazie mille!

    • Anas on 9 gennaio 2015 at 23:36
    • Reply

    Ciao mauro,non sono molto pratico in questo campo ma la tua applicazione mi affascina parecchio.Io volevo fare un robottino che può andare avanti e indietro e che ruoti il senso di marcia appena c’è un ostacolo.Guardando il video però noto un problema di sincronismo fra i due motori..come potrei risolvere il problema?
    Grazie dell’aiuto.

    1. Ciao Anas,
      il problema che noti è reale e legato a molti fattori come la meccanica dei motori ed il sistema di trazione.
      Io consiglio di agire sul PWM se vuoi farlo con l’elettronica o agire sulla meccanica con dei rapporti adeguati.

    • Alessandro on 24 aprile 2015 at 15:27
    • Reply

    Ciao Maurlo davvero interessante il tuo progetto.. mi domandavo come potevo fare con questo driver controllare i due motori in modo indipendente… c’è bisogno di un’altro pin?

    è possibile far funzionare con questo driver 4 motori ( 2 a 2 sincronizzati)??

    1. Ciao Alessandro,
      se leggi l’articolo vedrai che i due motori possono essere controllati in seriale in modo indipendente.
      Se la somma dei 2 motori non supera la corrente massima supportata dal driver puoi collegare i motori a 2 a 2 in parallelo.

        • Alessandro on 24 aprile 2015 at 17:41
        • Reply

        grazie mille della risposta.. quindi basta inserire un’altro potenziometro e nella riga 37 cambiare vel con Vel2 del secondo potenziometro.. giusto?

        1. Ciao Alessandro,
          se ho compreso bene quello che desideri fare la risposta è positiva.

    • Antonio on 25 gennaio 2017 at 14:12
    • Reply

    Salve, quante schede di controllo seriate si possono collegare contemporaneamente ad arduino uno. Grazie

    1. Ciao Antonio,
      io ne ho provate 3 perchè il mio progetto prevedeva 6 motori, oltre dovresti chiedere al produttore se possibile.
      In ogni caso ricordati di alimentarle esternamente se più di una.

    • Maurizio on 16 maggio 2017 at 13:10
    • Reply

    Ciao a tutti, purtroppo per me sono appassionato di elettronica ma non abbastanza esperto…vorrei chiedervi se è possibile attuare il mio progetto e quale sketch usare. Io ho bisogno di muovere un motore DC 12v 250w di pochi centimetri in avanti e indietro, la rotazione deve essere comandata da un potenziometro che partendo da un punto morto (512) deve far salire una leva fino a fermarsi ad un certo valore (supponiamo 800), cosi anche per l’altro senso di marcia, in pratica quando muovo il potenziometro in un senso il motore dovrebbe muoversi in base a quanto ho variato il valore del potenziometro ,non deve assolutamente fare giri completi, al massimo 1\² giro. Si può fare? Ovviamente collegando un ponte H ad arduino

    1. Ciao Maurizio,
      si può fare certamente quello che desideri.
      La maggiore difficoltà che puoi incontrare riguarda la potenza del motore che vuoi controllare che supera quelle normalmente gestite da driver di tipo hobbystico.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.