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.
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:
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:
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 ):
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:
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:
- 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:
19 commenti
Vai al modulo dei commenti
Buongiorno, complimenti, mi piace
Autore
Grazie Ennio !!!
Buon giorno.
Interessanti e ben illustrati….FOSSE POSSIBILE ALLEGARE I RELATIVI SCHEMI ELETTICI???O PERLOMENO QUELLI A BLOCCHI? Grazie .
Autore
Ciao Raffaele,
lo schema elettrico di questi driver lo torvi sul sito del produttore.
Mauro
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?
Autore
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
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?
Autore
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
Grazie mille!
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.
Autore
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.
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)??
Autore
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.
grazie mille della risposta.. quindi basta inserire un’altro potenziometro e nella riga 37 cambiare vel con Vel2 del secondo potenziometro.. giusto?
Autore
Ciao Alessandro,
se ho compreso bene quello che desideri fare la risposta è positiva.
Salve, quante schede di controllo seriate si possono collegare contemporaneamente ad arduino uno. Grazie
Autore
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.
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
Autore
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.