In questa lezione mostrerò uno sketch di esempio in cui la velocità, il senso di rotazione e la durata di rotazione vengono passati come parametri alle funzioni che controllano il movimento del robot. Ovviamente potrete modificare e migliorare l’esempio proposto.
Si tenga in conto che questo tipo di controllo, sia per la bassa qualità dei servomotori utilizzati, e sia per la scelta del tipo di motore, non consente una regolazione precisa, ma in ogni caso ci permette di raggiungere gli obiettivi esposti nella lezione 1.
Lo schema di collegamento a cui farò riferimento sarà quello utilizzato nella lezione precedente, che indico di seguito.
L’inizializzazione dei servomotori viene eseguita nella stessa modalità come illustrato nella lezione 2.
Le funzioni principali di orientamento del robot permettono di controllare con discreta precisione:
Le tre funzioni al loro interno utilizzano il metodo write() sugli oggetti motoreDx e motoreSx.
Le funzioni prevedono due parametri di ingresso: velocità e durata della rotazione.
Con l’impostazione della velocità impostiamo anche il senso di rotazione. Nel caso di rotazione antioraria il valore dovrà essere compreso tra 90 e 180 ed il valore scelto stabilirà anche la velocità di rotazione.
La funzione antiorarioRobot() accetta due parametri di ingresso:
velMaxAntioraria, massima velocità oraria
durata, indica la durata della rotazione in millisecondi
in questo caso i valori inseriti per la velocità dovranno essere compresi tra 0 e 90:
motoreDX.write(velMaxOraria); // Rotazione oraria del motore DX
3
motoreSX.write(velMaxOraria); // Rotazione oraria del motore SX
4
delay(durata); // durata: durata della rotazione
5
}
Come esercizio invito gli studenti a realizzare un’unica funzione di comando che ingloba le due precedenti in grado di realizzare qualsiasi tipo di movimento.
La funzione stopRobot() accetta come unico parametro la durata dello stop.
In questa lezione vedremo come collegare e controllare i servomotori a rotazione continua di SumoBot.
Fate riferimento allo schema di collegamento che segue, in cui i servomotori vengono connessi ai pin 4 e 5 della Sensor Shield per Arduino Uno Nano V3, come si nota a fianco di ogni pin è disponibile l’alimentazione, infatti troviamo sempre il positivo, indicato con la lettera V e il GND indicato con la lettera G. Come ribadito nella lezione 1 utilizziamo una Sensor Shield perchè permette rapidamente di realizzare tutti i collegamenti senza la necessità i dover ricorrere ad una breadboard oppure alla saldatura dei cavi.
Per questa lezione vengono indicati solo i collegamenti ai motori, non verranno collegati ne il sensore ad ultrasuoni e ne i sensori ad infrarossi.
Per quanto riguarda l’utilizzo dei servomotori a rotazione continua fare riferimento alla slide: Alfabeto di Arduino – Lezione 6, ma per completezza riporto di seguito la spiegazione adattandola all’utilizzo con SumoBot.
Il servomotore è costituito in genere da tre cavi connessi ad un connettore femmina con passo standard tra i fori di 2,54 mm quindi facilmente utilizzabile con qualsiasi strip che ne permette il collegamento ad esempio su una breadboard oppure ai pin maschio della Sensor Shield che utilizziamo per SumoBot.
I fili di connessione possono assumere colori diversi in funzione della marca del servo.
Pinout del servomotore
Filo ROSSO: +V
Filo NERO o MARRONE: GND
Filo BIANCO o ARANCIO o BIANCO o BLU: Segnale
Nel servomotori adottati per questa esperienza i fili di connessione sono:
Filo ROSSO: +V
Filo MARRONE: GND
Filo ARANCIO: Segnale
Collegamenti
Guardando SumoBot frontalmente, collegheremo il motore di destra al pin 4 e il motore di sinistra al pin 5.
Principio di funzionamento del servomotore a rotazione continua
Notoriamente i servomotori possono effettuare una rotazione che oscilla tipicamente da 0 a 180, esistono inoltre modelli che consentono una rotazione inferiore tra 0 e 120 gradi, questi tipi di servomotori possono essere modificati facendo in modo che possano effettuare una rotazione continua, ovvero tra 0 e 360 gradi, ma in commercio sono disponibili servomotori di diverse dimensioni che funzionano in questa modalità. Nel kit utilizzato per la realizzazione di SumoBot utilizziamo due servomotori FS90R.
Sul servomotore a rotazione continua possiamo controllare da programma il senso di rotazione e in modo non molto preciso anche la velocità.
Il funzionamento di un servomotore a rotazione continua è simile a quella di un motore in corrente continua con la differenza che non necessitano di appositi shield per poter funzionare.
Rispetto ad altri tipi di motori in CC offrono scelte limitate per il controllo della velocità e limitazioni di alimentazione.
L’alimentazione potrà avvenire direttamente Attraverso Arduino o mediante alimentazione esterna. L’alimentazione dei motori di SumoBot avverrà direttamente dalla scheda Arduino.
* Sketch 01: rotazione oraria e antioraria continua
7
*
8
* Note:
9
* Per l'orientamento del robot
10
* guardare SumoBot anteriormente
11
*
12
* 180: max velocità in senso antiorario
13
* 90 : servomotori fermi
14
* 0 : max velocità in senso orario
15
*
16
*/
17
18
// inclusione della libreria servo.h per il controllo dei servomotori
19
#include <Servo.h>
20
21
// Creazione oggetti servo
22
Servo motoreDX; // Inizializzazione del servomotore destro
23
Servo motoreSX; // Inizializzazione del servomotore sinistro
24
25
byte pinDx = 4; // Inizializza del pin 4 a cui è connesso il pin segnale del servo destro
26
byte pinSx = 5; // Inizializza del pin 5 a cui è connesso il pin segnale del servo sinistro
27
intdurata = 250; // Durata movimento (orario/antiorario)
28
intferma = 3000; // Durata dello stop
29
30
voidsetup() {
31
32
// attach() consente di definire a quale pin viene connesso il servomotore
33
// e lo collega all'oggetto che gestisce il servomotore
34
35
motoreDX.attach(pinDx); // pinDx collegato al motore destro
36
motoreSX.attach(pinSx); // pinSxcollega to al motore sinistro
37
}
38
39
voidloop() {
40
orarioRobot(); // Rotazione in senso orario del robot
41
stopRobot(); // Stop rotazione per un tempo fissato (vedere variabile ferma)
42
antiorarioRobot(); // Rotazione in senso antiorario del robot
43
stopRobot(); // Stop rotazione per un tempo fissato (vedere variabile ferma)
44
}
45
46
// rotazione del robot in senso antiorario
47
voidantiorarioRobot(void) {
48
motoreDX.write(150); // Rotazione oraria del motore DX
49
motoreSX.write(150); // Rotazione antioraria del motore SX
50
delay(durata); // durata: durata della rotazione
51
}
52
53
// rotazione del robot in senso orario
54
voidorarioRobot(void) {
55
motoreDX.write(30); // Rotazione antioraria del motore DX
56
motoreSX.write(30); // Rotazione oraria del motore SX
57
delay(durata); // durata: durata della rotazione
58
}
59
60
// stop del robot
61
voidstopRobot(void) {
62
motoreDX.write(90); // Ferma il motore DX
63
motoreSX.write(90); // Ferma il motore SX
64
delay(ferma); // Durata dello stop
65
}
Per quanto riguarda il controllo dei servomotori seguire la spiegazione inserita come commento all’interno del codice, ricordo comunque che per controllare i servomotori sono necessarie 4 operazioni:
includere la libreria Servo.h
creazione dell’oggetto Servo. motoreDx e motoreSx saranno i due oggetti su cui opererete
assegnare un nome al pin di controllo del servomotore (filo arancione nello schema)
indicare nel setup il metodo attach() che permette di legare gli oggetti motoreDx e motoreSx ai pin su Arduino nell’esempio 4 e 5 a cui abbiamo assegnato i nomi pinDx e pinSx.
All’interno del codice utilizziamo il metodo write() che per i servomotori a rotazione continua permette il passaggio, all’oggetto motoreDx e motoreSx, la direzione e la velocità di rotazione del motore:
passando il valore 0 gradi al metodo write() il servo ruota alla massima velocità in una direzione.
passando il valore 90 gradi al metodo write() poniamo il servo in stop (posizione “neutra”)
passando il valore 180 gradi al metodo write() il servo di ruotare in senso opposto alla massima velocità.
Nel codice che segue SumoBot ripeterà continuamente una rotazione oraria di 250 millisecondi, si fermerà per 3 secondi e riprenderà la rotazione in senso antiorario per 250 millisecondi.
Per effettuare questa operazione vengono definite 3 funzioni:
orarioRobot()
stopRobot()
antiorarioRobot()
Nel codice si può notare che nella funzione antiorarioRobot() viene passato al metodo write() non il valore 180 che farebbe ruotare il robot alla massima velocità, ma un valore inferiore, nel nostro caso 150, ciò ridurrà la velocità di rotazione.
In modo analogo accade per la funzione orarioRobot() in cui invece di passare il valore 0 alla metodo write(), che lo farebbe ruotare alla massima velocità in senso orario, passiamo un valore maggiore, 30, che lo farà ruotare ad una velocità inferiore.
La fermata del robot avviene utilizzando la funzione stopRobot() in cui viene passato il valore 90 al metodo write(), ciò fermerà i motori.
Si noti che i motori potranno ruoteranno in un senso o in un altro, oppure potranno essere fermati non solo invocando il metodo write, ma bisognerà sempre inserire un delay() in cui viene specificato per quanto tempo il metodo deve agire.
Esercizio 01
Far compiere a SumoBot rotazioni continue di 90 gradi in senso orario inserendo un intervallo di 3 secondi ad ogni quarto di giro
Esercizio 02
Far compiere a SumoBot una rotazione continua di 360° con intervalli di 3 secondi ad ogni quarto di giro, raggiunti i 360° far cambiare il senso di rotazione ripetendo le fermate di 3 secondi ad ogni quarto di giro.
Esercizio 03
Individuare quanto tempo necessita per far effettuare una rotazione di 45° in senso orario a SumoBot e realizzare un programma che permetta di fare le seguenti operazioni:
Mannaggia fare questo mestiere è complicato, la giornata sarà ancora lunga, terminerà solo questa sera dopo la riunione con le famiglie…
ora mi prendo 10 minuti di pausa, è intervallo, mi chiudo in laboratorio di sistemi elettronici alla ricerca di un momento yogico, ma il frastuono degli allievi che chiacchierano a gran voce in corridoio non mi permette la “ricarica” completa.
Con la matita pasticcio su un foglio di carta millimetrata, ad un certo punto un frastuono mi fa sobbalzare dalla sedia, è la porta del laboratorio aperta malamente da un allievo che mi dice:
Allievo: “Vabbè Prof. poteva dircelo!”
Io: “Marco! La parola magicaaaa?”
Allievo: “Buooongioorno Proooof”
Io: “Marco il Prof. è un po’ scombussolato, tenta di far la dieta è in carenza di zuccheri ha dormito poco…. eeee sta cercando unaaa soluzione!”
Allievo: “Cosa Prof???
Aaaa ok ho capito!
Sta scarabocchiando sui nostri disegni, ci vuole fregare!
Si sta inventando una di quelle robe elettroniche per farci venire voglia di studiare…
vabbè vabbè Prof.! Volevo solo sapere perché non porta anche noi di seconda alla mostra Lego, porta tutti gli altri e a noi non ha detto nulla!
Vogliamo usare anche noi i robottini!”
Io: “Marco! Porta pazienza ma anche il tuo Prof. dimentica!”
Allievo: “Ok ok ok ho capito l’età si fa sentire!”
Io: “Marco tu sai che gestisco il registro elettronico, vuoi mica che tutti i tuoi voti diventino bit disordinati persi nel Matrix?”
Allievo: “Magari Prof.! Scomparirebbero i 4 di mate!”
…volevo dirle… allora… noi veniamo con lei,
siamo in quattro,
e se vuole diamo anche una mano a fare orientamento scolastico,
insomma lei ci porta alla mostra e noi la ripaghiamo facendo orientamento”
Io: ”Marco ma questa cosa si chiama estorsione!
ok ok dai vi porto”
E’ sera…
torni a casa correggi i disegni e ritrovi lo scarabocchio,
ma a cosa stavo pensando?
Pensavo agli “oggetti faro”.
Te le devi inventar tutte per far studiare gli allievi.
Cos’é “l’oggetto faro”?
Il progetto che vi condivido è quello di un piccolo e semplice braccio robot, che sarà inserito all’interno di un percorso più ampio di Coding in cui si utilizza sia di BBC micro:bit che di Arduino, l’attività sarà svolta tra qualche mese.
Durante i corsi mi capita che studenti appassionati chiedano di realizzare progetti che pregiudicano competenze ancora non acquisite ed il rischio è che lo studio inizia con gran voglia di fare e subito dopo sopraggiunge affanno perché non si riesce a gestire la complessità degli argomenti trattati.
Ecco che il metodo degli“oggetti faro” può venirci in aiuto.
Ma di cosa si tratta?
E’ una strategia che probabilmente con altri nomi già viene attuata da altri colleghi, a me piace chiamarla in questo modo e in sostanza mi permette, costruendo “oggetti faro” di far percepire allo studente la direzione in cui si sta andando e durante l’attività di formazione mi permette di mantenere vivo l’interesse anche se la complessità aumenta nel tempo.
“Professore voglio progettare un braccio robot che possa sollevare almeno 1 kg e che abbia 6 gradi di libertà, ma non voglio copiarlo on-line, ma voglio progettarlo io, ho visto che sta usando micro:bit, ritiene che debba usare questa scheda oppure e meglio usare Arduino? Mi spiega come fare?
A Prof. non so molto di meccanica e di elettronica se compro tutto e porto a scuola mi spiega?”
Se la richiesta viene da un allievo di prima superiore, l’attività può diventare un po’ complessa da gestire
Tornando agli “oggetti faro”, RobotArm:bit è uno di questi.
Arriverà un momento in cui l’allievo mi chiederà di non giocare più con la matrice di LED del micro:bit, ma vorrà incominciare a movimentare oggetti e dopo aver spiegato come gestire ad esempio un servo con micro:bit gli si spiega come usarne due insieme, poi come usarne tre e poi come pilotare i tre servo a distanza con un altro micro:bit e poiché bisogna dare delle risposte all’allievo citato prima, si aggiunge l’esercitazione con “l’oggetto faro” realizzato in modo molto elementare ed espandibile…
A questo punto si attua una strategia project learning breve che ha come punto di partenza “l’oggetto faro” RobotArm:bit per esempio. Cosa può succedere?
Nella mente del ragazzo nascono nuove idee:
“Prof. disegno una versione più grande e la stampiamo a scuola, quali software devo imparare ad usare? Lo faccio io da solo a casa!”
Quindi nuovi breanch si aprono e gli studenti portano ad esplorare in autonomia nuovi argomenti, tutto questo mi permette di insegnare ad esplorare, è una semplice strategia che serve per far nascere passioni.
Però bisogna proseguire con il corso.
Nuovi contenuti nuove sperimentazioni per giungere “all’oggetto faro” successivo, ad esempio un WalkerBot:bit e così di seguito.
Insomma un percorso intervallato da milestones (punti di riferimento) costituiti da “oggetti faro” su cui attuo del project learning da cui cerco di far nascere branch creativi gestiti in modo indipendente da parte dello studente.
Come realizzare RobotArm:bit?
Se avete necessità di realizzare RobotArm:bit vi rimando su Thingiverse dove potrete prelevare i sorgenti grafici per la stampa 3D, di seguito invece una sequenza fotografica che mostra i passi di costruzione, alla fine di questo post trovate video e link al programma di test realizzato con il JavaScript Blocks editor, è molto semplice e mi permette di selezionare tre movimenti.
Le leve collegate ai servo devono essere incollate alle parti stampate in 3D, ovviamente se desiderate potete utilizzare delle viti.
4 oggetti
Inserimento del primo servo
Incollare le leve con i giunti da collegare all’albero di ciascun servomotore
Fissare i servomotori con le viti in dotazione
Unire ogni parte
Per la stampa si poteva fare di meglio… ma vabbè lascio a voi i miglioramenti.
Se avete bisogno del codice per realizzare i medesimi movimenti del video seguite il link.
Rendo disponibile su Thingiverse i sorgenti grafici per la stampa 3D degli elementi aggiuntivi da connettere al DotBot:bit per renderlo Lego compatibile. Inoltre ho realizzato in due versioni, un supporto per la scheda moto:bit di Sparkfun che può essere impiegata sul DotBot:bit ma anche su altre tipologie di chassis robotici.
I due supporti per il moto:bit si differenziano nel diverso modo con cui la scheda viene vincolata alla struttura, in un caso mediante semplici perni nell’altro mediante viti M3.
Aggiungo alla famiglia DotBot una semplicissima struttura robotica che cammina, l’idea è quella di fornire agli studenti più giovani una soluzione rapida da realizzare ed economicamente accessibile a tutti, WalkerBot:bit vuole essere un nuovo ausilio da utilizzare durante le attività di Coding.
Come scrivevo nel gruppo BBC micro:bit Italy tra le mie attività del maker di mezzanotte l’idea del WalkerBot:bit è nato durante il viaggio di rientro dalla Valle d’Aosta mentre la moglie guidava ed i figli sonnecchiavano, ho velocemente reinterpretato alcuni progetti di walking robot visti on-line e pensando ad un controllo con BBC micro:bit. La versione che ho realizzato fa uso di due micro servo pilotati dal micro:bit mediante il Servo:Lite di kitronik.
Questi i progetti da cui sono partito:
La versione che ho realizzato è molto simile a quelli indicati nei link, ma ho cercato, rispetto alle soluzioni viste on-line, di renderlo riproducibili velocemente mediante stampa 3D e facili da costruire. Il costo in stampa non supera gli 80 centesimi, il tempo per costruirlo (esclusa la stampa) non supera i 20 min, tutto si incastra, le uniche parti da avvitare sono i servo alla base e le zampe al mozzo del servo (volendo è possibile usare anche della colla), il micro:bit viene disposto all’interno di una sede che lo vincola alla struttura.