Per il controllo dei motori di molte delle mie sperimentazioni robotiche spesso utilizzato l’Arduino Motor Shields R3 che permette agevolmente di pilotare motori in corrente continua tra cui anche motorini passo passo. In questo breve articolo vi mostrerò un rapido utilizzo, che aggiungerà al percorso di robotica in cui propongo la costruzione di un robot didattico partendo dalla stampa 3D dello chassie per giungere alla programmazione del robot.
Il controllo motori in analisi è basato sull’integrato L298P prodotto da ST microelectronics, che come detto consente anche il controllo di motorini passo passo.
Specifiche tecniche
- Tensione di funzionamento: 5V a 12V
- Controller motori: L298P, controllo di 2 motori DC o 1 motore passo-passo
- Corrente massima: 2A per canale o 4A massima (con alimentazione esterna)
- Rilevamento di corrente: 1.65V / A
Come potete osservare nell’immagine i pin della shields si allineano perfettamente con la versione dell’Arduino UNO R3.
La Motor Shields è dotata di due canali con cui è possibile pilotare due motorini DC e 1 motore passo passo.
La scheda dispone inoltre di 6 ingressi/uscite per il collegamento dei dispositivi del Tinkerkit di cui però non parlerò in questo tutorial.
Con un’alimentazione esterna lo shield può fornire fino a 12V e 2A per canale motore o 4A su un singolo canale. L’obiettivo è quello di realizzare il “kit di robotica di base” e per contenere i costi farò uso, per questa prima versione, di comunissimi motorino DC, come quelli riportati nell’immagine che segue che possono essere acquistati a costi molto contenuti su qualsiasi store cinese on-line. Certamente non aspettatevi prestazioni elevate, ma sono sufficienti per incominciare.
Questi motorini hanno un assorbimento massimo di non più di 100 mA e tensione di alimentazione tra i 3 e i 6V.
Il collegamento dei motorini deve essere effettuato per ciascun motorino al canale A e B come riportato nell’immagine che segue.
Come potete notare esistono i due ingressi Vin e GND su cui potrete collegare un’alimentazione dedicata esclusivamente al funzionamento dei motori, ma se desiderate potete tranquillamente alimentare motori e scheda con la sola fonte di tensione con cui alimentate la scheda Arduino, però non è la soluzione che io preferisco, perché l’alimentazione separata permette di evitare che le batterie si scarichino velocemente in quanto si trovano costrette ad alimentare sia il controllo (Arduino), che la potenza (motori), inoltre evita che Arduino si possa danneggiare in quanto la quantità di potenza che il regolatore di tensione potrebbe sopportare rischierebbero di essere troppo elevate.
Per evitare quindi possibili danni alla scheda Arduino su cui è montato lo shield, vi consiglio di usare un alimentatore esterno che fornisce una tensione compresa tra 7 e 12V. Per effettuare questa operazione bisogna effettuare una piccola modifica alla scheda, prevista dalle specifiche di Arduino, che consiste nel tagliare il jumper “Vin Connect” posto sul lato posteriore dello shield così come riportato nell’immagine che segue. Il limite massimo per la Vin è di 18V.
Lo shield motori è dotato di pin che sono utilizzati esclusivamente da esso ed impiegati all’interno dei vostri sketch per comandare direzione (polarità) e velocità dei motori (PWM) ed ovviamente arrestare, avviare i motori e monitorare l’assorbimento di corrente su ogni canale.
La tabella che segue specifica come usare la scheda per pilotare i motori:
Funzione | Canale A | Canale B |
Direzione | pin digitale 12 | pin digitale 13 |
Velocità (PWM) | pin digitale 3 | pin digitale 11 |
Freno | pin digitale 9 | pin digitale 8 |
Assorbimento Corrente | pin analogico A0 | pin analogico A1 |
Dalla tabella si comprende quindi che il motore collegato al canale A sarà controllato dai pin 12, 3, 9 ed il il motore collegato al canale B sarà controllato dai pin 13, 11, 8.
I pin di “Direzione” impostano il senso di rotazione, un valore HIGH permetterà la rotazione in un senso, mentre un valore LOW permetterà la rotazione in senso opposto.
I pin “Velocità (PWM) consentono l’impostazione della velocità del motore, un valore pari a 0 ferma i motori, un valore pari a 255 permette la rotazione alla massima velocità. Trattandosi di un pin di tipo PWM valori intermedi tra 0 e 255 vi permetteranno di impostare velocità intermedie.
Sugli ingressi Analogici A0 e A1 sarà prese una tensione proporzionale alla corrente assorbita da ogni motore pari a 1.65V per ogni Ampere che viene assorbito.
Esempi
Dopo aver inserito il Motor Shields su Arduino, collegate Arduino mediante la porta USB al computer ed aprite l’IDE di programmazione.
Prima di incominciare è opportuno eseguire per ogni motore tre passi che permettono la mesa in moto del motore:
- Predisposizione della direzione di rotazione del motore (polarità dell’alimentazione) HIGH o LOW. Ricordo che i motorini in CC utilizzati non hanno un positivo e un negativo, invertendo la polarità i motori potranno girare in senso opposto.
- Portare a LOW il pin di brake della shield motori. Dovete immaginare il pin di brake come al freno a mano dell’automobile, per poter muovere l’auto bisogna disattivare il freno a mano, nel nostro caso disattivare corrisponde a LOW.
- Mettere in moto il motore impostando la velocità del motore mediante il PWM (comando analogWrite) sull’apposito pin.
Collegamento di 1 solo motore
Sul motor shield inserire i collegamenti del motore rispettivamente sul morsetto positivo (+) del canale A ed il morsetto negativo (-) del canale A.
Come indicato all’inizio di questo post l’alimentazione per il motorino, da collegarsi su Vin e GND, non è indispensabile, ma se utilizzata aumenta le performance del motorino, quindi il mio consiglio è quello di utilizzare una fonte di alimentazione esterna aggiuntiva e collegare il positivo della batteria su “Vin” ed il negativo su GND.
Potete ora effettuare l’upload del codice sulla scheda Arduino.
Esempio 1: controllo di 1 motore
/* Prof. Michele Maffucci 23.03.16 Controllo di un motore mediante l'Arduino Motor Shields R3 Avanti alla massima velocità Indietro a velocità 1/2 della velocità massima */ void setup() { // Impostazione canale A pinMode(12, OUTPUT); // Inizializzazione del pin direzione del motore collegato al canale A pinMode(9, OUTPUT); // Inizializzazione del pin brake del motore collegato al canale A } void loop() { // direzione in avanti alla massima velocità digitalWrite(12, HIGH); // Impostazione della direzione “avanti” del motore collegato al canale A digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A analogWrite(3, 255); // Massima velocità del motore collegato al canale A delay(3000); // tempo di rotazione in avanti digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A delay(1000); // tempo di stop del motore // direzione indietro con velocità metà della velocità massima digitalWrite(12, LOW); // Impostazione della direzione “indietro” del motore collegato al canale A digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A analogWrite(3, 127); // Metà della velocità massima del motore collegato al canale A delay(3000); // tempo di rotazione in avanti digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A delay(1000); // tempo di stop del motore }
Esempio 2: controllo di 2 motori
Collegate un secondo motore al canale B, ripetendo quanto avete già eseguito al passo precedente
L’unica differenza rispetto al codice precedente risiede nel fatto che bisogna aggiungere le linee di codice per comandare il motore collegato al canale B:
/* Prof. Michele Maffucci 23.03.16 Controllo di due motori mediante l'Arduino Motor Shields R3 Avanti alla massima velocità Indietro a velocità 1/2 della velocità massima */ void setup() { // Impostazione canale A pinMode(12, OUTPUT); // Inizializzazione del pin direzione del motore collegato al canale A pinMode(9, OUTPUT); // Inizializzazione del pin brake del motore collegato al canale A // Impostazione canale A pinMode(13, OUTPUT); // Inizializzazione del pin direzione del motore collegato al canale B pinMode(8, OUTPUT); // Inizializzazione del pin brake del motore collegato al canale B } void loop() { // Motore A - direzione in avanti alla massima velocità digitalWrite(12, HIGH); // Impostazione della direzione “avanti” del motore collegato al canale A digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A analogWrite(3, 255); // Massima velocità del motore collegato al canale A // Motore B - direzione indietro alla massima velocità digitalWrite(13, HIGH); // Impostazione della direzione “avanti” del motore collegato al canale B digitalWrite(8, LOW); // Disattivazione del brake del motore per il canale B analogWrite(11, 255); // Massima velocità del motore collegato al canale B delay(3000); // tempo di rotazione in avanti digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A digitalWrite(8, HIGH); // Attivazione del brake del motore per il canale B delay(1000); // tempo di stop del motorI // Motore A - direzione indietro a metà della velocità massima digitalWrite(12, LOW); // Impostazione della direzione “indietro” del motore collegato al canale A digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A analogWrite(3, 127); // Metà della velocità massima del motore collegato al canale A // Motore B - direzione indietro a metà della velocità massima digitalWrite(13, LOW); // Impostazione della direzione “indietro” del motore collegato al canale A digitalWrite(8, LOW); // Disattivazione del brake del motore per il canale A analogWrite(11, 127); // Metà della velocità massima del motore collegato al canale A delay(3000); // tempo di rotazione indietro digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A digitalWrite(8, HIGH); // Attivazione del brake del motore per il canale B delay(1000); // tempo di stop del motorI }
In un prossimo post mostrerò come effettuare il controllo per i motorini passo passo.
Buona sperimentazione a tutti 🙂
Ringrazio della bellissima spiegazione,e commento
Grazie Mario