In questo seconda parte del manuale di costruzione di EduRobot – ASL vedremo come effettuare tutti i collegamenti elettrici tra motori, Arduino, L298N e proporrò alcuni esercizi.
Durante questa fase non collegate la batteria di alimentazione alla scheda, accertatevi che tutti i collegamenti siano corretti e prima di procedere con i test di funzionamento chiedete un controllo al docente presente in aula oppure contattatemi.
L298N Dual H-Bridge Motor Controller
Per poter pilotare i motori in corrente continua di EduRobot è necessario utilizzare un driver motori costituito da due ponti H, se sei uno dei miei studenti di 3′ che sta svolgendo questa esercitazione per l’Alternanza Scuola Lavoro, ti ricordo che questo argomento di elettronica sarà affrontato al 4′ anno, ma se vuoi avere dettagli sul controllo dei motori in CC puoi consultare la mia dispensa: Alfabeto di Arduino – Lezione 6 alla pagina n. 39 dove spiego come usare un driver L293D e fornisco alcuni sketch di esempio, il funzionamento è molto simile al driver L298N.
Inoltre ti ricordo che per comprendere esattamente il controllo della velocità e della direzione dei motori è essenziale leggere la dispensa: Alfabeto di Arduino – Lezione 2 alla pagina 85 in cui parlo di Modulazione di larghezza di impulso (PWM). Per i miei allievi di 3′ affronterò questo argomento nelle prossime lezioni di Laboratorio di Sistemi.
Per lo svolgimento di questa esercitazione sarà sufficiente seguire gli esempi è fornirò, in maniera molto più semplice la modalità per controllare velocità e direzione di EduRobot.
Ponte H
Per controllare la direzione di rotazione del motore abbiamo bisogno di invertire la direzione del flusso di corrente attraverso il motore, il metodo più comune per fare questa operazione è quella che fa uso di un ponte H.
Un ponte H è costituito da quattro elementi di commutazione che possono essere dei transistor o dei mosfet, per semplicità, poiché hai incominciato elettronica quest’anno, non conosci ancora questi componenti elettronici, per ora assumi la loro funzione a degli interruttori che possiamo comandare attraverso Arduino, nei prossimi mesi ti spiegherò come funzionano.
Al centro del ponte H è collocato il motore elettrico e come puoi vedere dall’immagine, attivando contemporaneamente due interruttori alla volta è possibile modificare la direzione della corrente modificando in questo modo modifichiamo anche la direzione di rotazione del motore.
Nella scheda che ti ho consegnato sono presenti due ponti H uno per ogni motore, inoltre con questa scheda possiamo anche controllare la velocità di rotazione dei motori.
Per ora tutto ciò può essere sufficiente per svolgere l’esercitazione.
L298N Dual H-Bridge Motor Controller è presente in commercio in forme diverse ma con stesse funzionalità, ha una dimensione estremamente contenuta:
All’interno della scheda sono presenti due ponti H in grado di controllare velocità e senso di rotazione di due motori in CC (quelli gialli che trovate nel kit allegato, a lezioni vi spiegheremo il funzionamento teorico) oppure controllare un motore passo-passo (come quelli presenti nella stampante 3D che vi ho mostrato a scuola). La scheda può essere usata per motori con tensione di alimentazione dai 5 ai 35V e corrente massima di lavoro di 2A.
Ogni ponte H può essere abilitato o disabilitato attraverso i pin enable, quelli che sulla scheda sono indicati con ENA e ENB. Abilitare o meno il ponte H è come dire: “comando o non comando il motore”, per fare un’analogia possiamo considerarlo ENA e ENB all’aceleratore dei motori A e B, vedremo che se viene inviato su di essi un valore MAGGIORE DI 0, permettiamo la rotazione del motore (premiamo l’acceleratore), se invece viene inviato il VALORE 0 ad uno degli EN non permettiamo la rotazione del motore (non premiamo l’acceleratore).
Descrizione dei pin della scheda
Di seguito trovate i riferimenti per la scheda L298N tra numero del pin e la sua funzione:
- Motore 1 CC: [OUT1: +]. Motore passo-passo: A+
- Motore 1 CC: [OUT2: -]. Motore passo-passo: A-
- Jumper da rimuovere se la tensione di alimentazione dei motori risulta superiore ai 12V.
- Alimentazione del/dei motori. Il pin accetta una tensione massima di 35V CC. Se la tensione di funzionamento dei motori è superiore ai 12V è necessario rimuovere il ponticello 3
- GND – il ground
- Uscita a 5 V tensione stabilizzata che può essere usata per alimentare direttamente Arduino
- ENA – permette l’abilitazione o la disabilitazione del motore A in CC (Corrente Continua), quello connesso ai pin nominati OUT1 e OUT2. Se si vuole comandare un motore in CC togliere il ponticello o posizionarlo come indicato nell’immagine che segue. Nel caso si voglia pilotare un motore passo passo non rimuovere il ponticello. Il pin ENA dovrà essere connesso ad un pin Arduino di tipo PWM per il controllo della velocità di un motore in CC.
- IN1 – per il controllo della direzione di rotazione
- IN2 – per il controllo della direzione di rotazione
- IN3 – per il controllo della direzione di rotazione
- IN4 – per il controllo della direzione di rotazione
- ENB – permette l’abilitazione o la disabilitazione del motore A in CC (Corrente Continua), quello connesso ai pin nominati OUT3 e OUT4. Se si vuole comandare un motore in CC togliere il ponticello o posizionarlo come indicato nell’immagine che segue. Nel caso si voglia pilotare un motore passo passo non rimuovere il ponticello. Il pin ENA dovrà essere connesso ad un pin Arduino di tipo PWM per il controllo della velocità di un motore in CC.
- Motore 2 CC: [OUT3: +]. Motore passo-passo: B+
- Motore 2 CC: [OUT4: +]. Motore passo-passo: B-
Circuito n. 1 – schema di collegamento
Il collegamento dei motori di EduRobot avranno polarità invertita (ricordate che il motore di sinistra per andara avanti deve girare in senso antiorario e il motore di destra in senso orario), così come indicato nell’immagine che segue, se invertite la polarità la rotazione sarà opposta.
Seguire le indicazioni di collegamento per effettuare i primi test di funzionamento.
I collegamenti tra scheda L298N e Arduino devono essere quelli riportati nello schema e dettagliati nell’immagine che segue. I pin ENA e ENB dovranno essere collegati ai pin 10 e 9 di Arduino che sono pin di tipo PWM con essi controlleremo l’attivazione dei motori e la loro velocità. I pin Arduino di tipo PWM sono quelli indicati dal segno “~“.
Fate attenzione al collegamento che segue: Pin +12V della Scheda motori con VIN scheda Arduino, ciò consentirà di alimentare direttamente tutta l’elettronica mediante la tensione applicata al Jack di alimentazione di Arduino.
L’alimentazione dei motori, della scheda motori e della scheda Arduino UNO avviene collegando una batteria da 9V al Jack di alimentazione di Arduino.
Programmi di test 1
Specifiche: si realizzi la sequenza che ripete ciclicamente la rotazione avanti e indietro delle due ruote del robot:
- Il motore Sx ruota in senso antiorario (in avanti) per 500 millisecondi (o,5 secondi).
- Il motore Sx si ferma per 500 millisecondi.
- Il motore Sx ruota in senso orario (indietro) per 500 millisecondi
- Il motore Sx si ferma per 500 millisecondi
- Il motore Dx ruota in senso antiorario (in avanti) per 500 millisecondi (o,5 secondi).
- Il motore Dx si ferma per 500 millisecondi.
- Il motore Dx ruota in senso orario (indietro) per 500 millisecondi
- Il motore Dx si ferma per 500 millisecondi
Quando effettuate l’upload del programma sulla scheda Arduino scollegate la batteria di alimentazione di EduRobot.
Per collegare il cavo USB alla scheda Arduino potrebbe essere necessario togliere la ruota SX.
Per il test del programma posizionate il robot in una modalità in cui le ruote non toccano la superficie di appoggio, per esempio come rappresentato in figura:
Ricordate che la polarità di collegamento dei motori alla scheda L298N è opposta, nel caso di discordanza di rotazione rispetto a quanto indicato nel programma provate ad invertire la modalità di collegamento dei motori sulla breadboard oppure variate il programma.
/* Prof. Maffucci Michele 20.01.19 EduRobot - Programma test n. 1 Collegamenti: L298N --> Arduino ENB --> Pin 10 IN4 --> Pin 5 IN3 --> Pin 4 IN2 --> Pin 3 IN1 --> Pin 2 ENA --> Pin 9 +12V --> Vin GND --> GND */ // Impostazione pin motori // motore 1 (sx) int direzione1_M1 = 2; int direzione2_M1 = 3; int velocita_M1 = 9; // pin di tipo PWM per controllare la velocità del motore // motore 2 (dx) int direzione1_M2 = 4; int direzione2_M2 = 5; int velocita_M2 = 10; // pin di tipo PWM per controllare la velocità del motore int velocita = 200; // velocità di rotazione dei motori. Valore compreso tra 0 e 255 int tempo_rotazione = 500; // quantità di tempo di rotazione o di fermo motore int attesa = 3000; // tempo di attesa prima che parta la rotazione dei motori void setup() { // modalità di utilizzo dei pin di controllo pinMode(direzione1_M1, OUTPUT); pinMode(direzione2_M1, OUTPUT); pinMode(velocita_M1, OUTPUT); pinMode(direzione1_M2, OUTPUT); pinMode(direzione2_M2, OUTPUT); pinMode(velocita_M2, OUTPUT); delay(attesa); } void loop() { // --- Motore 1 --- // Motore 1 (Sx) avanti - senso antiorario analogWrite(velocita_M1, velocita); // Imposta la velocità del motore M1 a velocità = 200 // per far girare il motore M1 (Sx) in senso antiorario digitalWrite(direzione1_M1, HIGH); digitalWrite(direzione2_M1, LOW); delay(tempo_rotazione); // Motore 1 (Sx) fermo analogWrite(velocita_M1, 0); // Per fermare il motore impostare a 0 il secondo parametro // fermare il motore M1 (Sx) digitalWrite(direzione1_M1, LOW); digitalWrite(direzione2_M1, LOW); delay(tempo_rotazione); // Motore 1 (Sx) indietro - in senso orario analogWrite(velocita_M1, velocita); // Imposta la velocità del motore M1 a velocità = 200 // per far girare il motore M1 (Sx) in senso orario digitalWrite(direzione1_M1, LOW); digitalWrite(direzione2_M1, HIGH); delay(tempo_rotazione); // Motore 1 (Sx) fermo analogWrite(velocita_M1, 0); // Per fermare il motore impostare a 0 il secondo parametro // fermare il motore M1 (Sx) digitalWrite(direzione1_M1, LOW); digitalWrite(direzione2_M1, LOW); delay(tempo_rotazione); // --- Motore 2 --- // Motore 2 (Dx) avanti - senso orario analogWrite(velocita_M2, velocita); // Imposta la velocità del motore M2 a velocità = 200 // per far girare il motore M2 (Dx) in senso orario digitalWrite(direzione1_M2, HIGH); digitalWrite(direzione2_M2, LOW); delay(tempo_rotazione); // Motore 2 (Dx) fermo analogWrite(velocita_M2, 0); // Per fermare il motore impostare a 0 il secondo parametro // fermare il motore M2 (Dx) digitalWrite(direzione1_M2, LOW); digitalWrite(direzione2_M2, LOW); delay(tempo_rotazione); // Motore 2 (Dx) indietro - senso antiorario analogWrite(velocita_M2, velocita); // Imposta la velocità del motore M2 a velocità = 200 // per far girare il motore M2 (Dx) in senso antiorario digitalWrite(direzione1_M2, LOW); digitalWrite(direzione2_M2, HIGH); delay(tempo_rotazione); // Motore 2 (Dx) fermo analogWrite(velocita_M2, 0); // Per fermare il motore impostare a 0 il secondo parametro // fermare il motore M2 (Dx) digitalWrite(direzione1_M2, LOW); digitalWrite(direzione2_M2, LOW); delay(tempo_rotazione); }
Esercizio 1
Realizzare un programma che ciclicamente esegua la sequenza: avanzamento di EduRobot in avanti per 500 millisecondi, si ferma nella posizione per 500 millisecondi e successivamente torna indietro (in retromarcia) per 500 millisecondi e si ferma nella posizione per 500 millisecondi.
Esercizio 2
Realizzare un programma che faccia compiere ciclicamente a EduRobot il perimetro di un quadrato. Il tempo di percorrenza di ogni singolo lato deve essere di 500 millisecondi e la velocità di rotazione deve essere ridotta a 150 (variabile: velocita = 150).
Semplifichiamo la gestione dei motori
Per semplificare la gestione dei motori utilizziamo una specifica libreria sviluppata da yohendry e che dovrà essere prelevata dal seguente link: https://github.com/yohendry/arduino_L298N
Il file zip scaricato dovrà essere installato all’interno di Arduino (per i miei allievi questa operazione richiede le password di amministratore del computer, chiedere il supporto dell’Assistente di Laboratorio).
Per installare la libreria: Sketch > Include library > Add ZIP Library… e caricare il file ZIP precedentemente scaricato:
All’interno della libreria troverete una cartella con due esempi che potete utilizzare per comprendere il funzionamento della libreria:
Programma test n. 2
Specifiche: Utilizzando la libreria appena installata per realizzare un programma che ciclicamente esegua i seguenti passi:
- avanti per 500 millisecondi
- sosta di 500 millisecondi
- indietro per 500 millisecondi
- sosta di 500 millisecondi.
/* Prof. Maffucci Michele 20.01.19 EduRobot - Programma test n. 2 Avanti e indietro Collegamenti: L298N --> Arduino ENB --> Pin 10 IN4 --> Pin 5 IN3 --> Pin 4 IN2 --> Pin 3 IN1 --> Pin 2 ENA --> Pin 9 +12V --> Vin GND --> GND */ #include <L298N.h> const int ENB = 10; const int IN4 = 5; const int IN3 = 4; const int IN2 = 3; const int IN1 = 2; const int ENA = 9; L298N driver(ENA, IN1, IN2, IN3, IN4, ENB); int tempo_rotazione = 500; int velocita = 200; void setup() { } void loop() { driver.forward(velocita, tempo_rotazione); // avanti per per 500 millisecondi alla velocità 200 driver.full_stop(tempo_rotazione); // fermata di 500 millisecondi driver.backward(velocita, tempo_rotazione); // indietro per per 500 millisecondi alla velocità 200 driver.full_stop(tempo_rotazione); // fermata di 500 millisecondi }
Programma test n. 3
Specifiche: Utilizzando la libreria appena installata per realizzare un programma che ciclicamente esegua i seguenti passi:
- avanti per 500 millisecondi
- sosta di 500 millisecondi
- rotazione a destra per 500 millisecondi
- sosta di 500 millisecondi
- rotazione a sinistra per 500 millisecondi
- sosta di 500 millisecondi
- indietro per 500 millisecondi.
Impostare la velocità dei motori a 100.
/* Prof. Maffucci Michele 20.01.19 EduRobot - Programma test n. 3 Movimento Collegamenti: L298N --> Arduino ENB --> Pin 10 IN4 --> Pin 5 IN3 --> Pin 4 IN2 --> Pin 3 IN1 --> Pin 2 ENA --> Pin 9 +12V --> Vin GND --> GND */ #include <L298N.h> const int ENB = 10; const int IN4 = 5; const int IN3 = 4; const int IN2 = 3; const int IN1 = 2; const int ENA = 9; L298N driver(ENA, IN1, IN2, IN3, IN4, ENB); int tempo_rotazione = 500; int velocita = 100; void setup() { } void loop() { driver.forward(velocita, tempo_rotazione); // avanti per per 500 millisecondi alla velocità 200 driver.full_stop(tempo_rotazione); // fermata di 500 millisecondi driver.turn_right(velocita, tempo_rotazione); // rotazione a destra per 500 millisecondi driver.full_stop(tempo_rotazione); // fermata di 500 millisecondi driver.turn_left(velocita, tempo_rotazione); // rotazione a sinistra per 500 millisecondi driver.full_stop(tempo_rotazione); // fermata di 500 millisecondi driver.backward(velocita, tempo_rotazione); // indietro per per 500 millisecondi alla velocità 200 }
Esercizio 3
Dovreste aver notato che il robot accelerando in avanti si alza bruscamente (impenna) siete in grado di realizzare un programma che faccia accelerare gradualmente in avanti il robot?
Esercizio 4
Utilizzando la libreria appena installata realizzare un programma che faccia muovere EduRobot lungo il perimetro di un quadrato.
Buon lavoro.