Un kit robotico educativo con Arduino: Elegoo Smart Robot Car Kit

Tempo fa avevo bisogno di alcune protoboard (o, come diciamo in Italia: ‘millefori’) di varie dimensioni e di cavetti jumper. Dato che questo materiale mi serviva con una certa urgenza (e in più ebbi una brutta avventura con alcune millefori cinesi di qualità decisamente pessima) anzichè cercare su Ebay Cina (sappiamo bene tutti che li si paga pochissimo ma i tempi di attesa sono lunghissimi, e a volte capitano sorprese), mi misi a cercare su Amazon: trovai ciò che mi serviva ad un prezzo decisamente buono e con tante recensioni positive (link amazon: protoboard cavetti jumper). Mi arrivano quindi a casa in pochissimo tempo gli oggetti che avevo ordinato:

Non mi era mai capitato di ricevere un prodotto dalla Cina in così poco tempo, ad un prezzo ottimo e di simile fattura. Stiamo parlando di semplicissimi cavetti jumper e pcb millefori: roba che si trova dappertutto per 2 soldi, ma la qualità elevata e il packaging mi hanno sopreso. Addirittura due prodotti così comuni avevano la loro scatola, per di più in cartone sottile patinato e una stampa decisamente accurata… Insomma li per li pensai “è costata più la scatola che il contenuto!” Faccio così delle ricerche su questo marchio, Elegoo, perchè mi incuriosì non poco.

La Elegoo di Shenzen

La Elegoo si trova a Shenzen, ormai considerata da tutti la Silicon Valley cinese. Sappiamo bene tutti che ormai la grande maggioranza dei componenti elettronici e dispositivi proviene da li. E non viene solo fabbricata ma anche progettata. Shenzen per noi smanettoni è un po’ un luogo sacro. Personalmente rimango sempre affascinato dalle avventure di Scotty Allen, e in più sono rimasto folgorato dal libro di Andrew ‘bunnie’ Huang, The Hardware Hacker – che ormai considero una sorta di bibbia-, che fornisce uno spaccato di Shenzen e della dedizione al lavoro dei Cinesi che possiamo solo lontanamente immaginare.

La Elegoo nasce proprio qui nel 2011, conta un centinaio di impiegati ed è dedita alla progettazione, sviluppo e ricerca di prodotti Open Source, Arduino in primis. Nel loro catalogo ci sono diversi starter kit per Arduino, per tutti i gusti, kit di componenti, kit di sensori, kit per la prototipazione, accessori per Raspberry, moduli relè, una stampante 3D di loro produzione e, di recente, è entrato nella famiglia anche un simpaticissimo Penguin Bot, direi anche questo davvero bello e che non vedo l’ora di provare per la felicità dei miei bambini.

I loro kit sono acquistabili su Amazon e spesso vengono messe delle offerte che rendono ancora più interessante l’acquisto, nonchè dei contest/giveaway sulla loro pagina facebook che vi consiglio di seguire sia per rimanere aggiornati, sia per partecipare ai contest.

Smart Robot Car Kit

Dal momento che ho due bambini in una età in cui non si possono definire ancora “piccoli” ma nemmeno “grandi”, ho subito trovato qualcosa nel loro catalogo che mi ha interessato molto: La robot car Kit.

Premetto che sul sito sono disponibili 3 versioni di questo kit e la V3 è chiaramente la più recente. In realtà le 3 versioni sono tutte uguali (vi sono contenute le stesse cose) ma cambia la revisione di alcuni PCB disegnati da loro stessi e che permettono un collegamento più agevole dei vari componenti senza possibilità di errore. In aggiunta le 3 versioni differiscono anche per i sensori infrarossi utilizzati per la modalità Line Follower: la versione più aggiornata ha i 3 sensori sulla stessa scheda, le versioni 1 e 2 usano gli stessi sensori ma su 3 schedine separate.

Il kit in questione permette di realizzare una smart robot car a 4 ruote motrici. Viene definita “smart” perchè è “intelligente”: il cuore, basato su Arduino, permette anche alle persone con poca esperienza di cambiare i firmware di esempio per realizzare svariati tipi di applicazioni e “robot” perchè può anche trasformarsi in un veicolo autonomo ma anche essere controllata da remoto. Si tratta di un prodotto di elevata qualità, offerto ad un prezzo più che giusto (nel momento in cui vi scrivo si trova su Amazon a circa €70 iva e spedizione inclusa ma molto spesso ci sono delle offerte che permettono di averlo con un forte sconto). E’ un kit decisamente adatto e che consiglio soprattutto per chi ha bambini che vogliono imparare ad utilizzare Arduino ma anche grandi, per progetti scolastici e STEM, disciplina che un po’ alla volta si sta affermando anche nella nostra nazione. Vi ho lasciato il link corretto per l’acquisto al paragrafo Links più in basso.

Contenuto del kit

Il Kit ha tutto l’occorrente per realizzare una macchina robot di elevata qualità. Premetto che si tratta di un Kit principalmente studiato per i giovani e per quelli che vogliono avvicinarsi al mondo di Arduino e alla robotica. Un kit davvero carino, ben fatto, alloggiato in una comoda valigetta all’interno della quale troveremo anche un CD con tutte le istruzioni, i tutorial, i codici sorgente e quant’altro.

E’ presente un telaio in materiale acrilico tagliato al laser, molto bello da vedere e anche molto preciso. Oltre ad una scheda Arduino UNO è presente uno shield (expansion board) che permette di collegare ogni sensore al suo posto mediante connettori polarizzati e quindi non consente alcuna possibilità di errore:

Come dicevo prima: ci sono 4 ruote motrici. Sono presenti infatti 4 motoriduttori (gearmotors), uno per ogni ruota. I motoriduttori hanno anche un doppio asse di uscita per cui i più esperti possono anche sfruttare questa possibilità per prevedere, in futuro, al montaggio di encoders. I motori sono controllati da un Ponte H classico basato sull’L298N (molto simile al mio progetto Cen4ur di qualche anno fa).

Al comparto sensori abbiamo un sensore ad ultrasuoni di tipo HC-SR04, che abbiamo già imparato a conoscere qualche tempo fa qui su settorezero, che viene montato su una staffa mossa da un micro-servocomando modello SG-90. Questa soluzione permette al sensore di essere ruotato frontalmente di 180° e quindi consentire alla macchina di osservare un ampio angolo davanti a se per poter eseguire la giusta scelta della direzione in cui muoversi nel momento in cui si realizza un veicolo a guida autonoma.

Altri sensori li troviamo al di sotto del telaio: un array di 3 sensori a riflessione IR ci consentirà di realizzare un semplice robot Line-Follower. I sensori utilizzati sono i TCRT5000 della Vishay che arrivano fino ad una distanza di 15mm. La Elegoo non ha lasciato nulla al caso ed ha addirittura incluso nel kit un rotolo di scotch nero che utilizzeremo, appunto, per disegnare una linea a terra da seguire!

E’ presente un altro sensore IR sullo shield, di tipo TSOP1838, che è in pratica un sensore demodulatore standard per la ricezione dei segnali infrarossi a 38KHz dei comuni telecomandi e consente al robot di essere controllato tramite un telecomando. Anche il telecomando è incluso nel kit. Per quanto riguarda il controllo remoto, oltre ad essere possibile tramite telecomando IR, è possibile eseguirlo anche tramite Bluetooth e cellulare android!

Nel kit è difatti presente un modulo BLE (v4.0) HC-08 montato su di una schedina adattatrice (siglata ZS-040, comune a molti moduli Bluetooth simili) che possiede un connettore apposito il quale non permette al modulo di essere montato al contrario e che trova posto, anch’esso, sulla board di espansione (ricordate che ho già lavorato con questo tipo di modulo, in altra versione, qui).

Il modulo in questione è un semplicissimo bridge Bluetooth-UART basato sul comunissimo SOC CC2540 della Texas Instruments ed è quindi molto semplice da utilizzare: basta semplicemente comunicare con la UART. Sul CD, oltre agli esempi, è anche disponibile l’app per android.

Dato che la UART è condivisa con la porta USB di Arduino, quando programmate Arduino, abbiate cura di rimuovere il modulo Bluetooth! Per maggiori informazioni su questo modulo potete consultare il datasheet nel CD del kit, cartella English/Lesson1/Module specification document.

Infine l’alimentazione. Anche qui la Elegoo non ha lasciato nulla al caso. In tutti i kit simili a questo, fateci caso, è sempre presente un portabatterie per pile stilo. Qui invece no! Sono presenti due celle al Litio ricaricabili di tipo 18650 da 2200mA ed è presente anche il caricabatterie!

Anche questo è sicuramente un valore aggiunto al kit perchè consente un notevole risparmio e una maggiore autonomia.

Qui ho fatto un video dell’unboxing in cui illustro tutto il materiale contenuto nella pratica valigetta del kit:

Consigli per il montaggio

Il kit è davvero semplice da montare: nel CD sono contenute le istruzioni; per mia comodità le ho stampate, più che altro per coinvolgere i bambini durante il montaggio: per loro è più facile seguire le istruzioni su un foglio di carta insieme a voi e li aiuta a sviluppare la loro capacità di osservazione.

Cosa c’è di più bello che realizzare qualcosa insieme ai bambini, imparare insieme ed ascoltare le loro idee?

Spesso è difatti facile sbagliare l’orientamento di un pezzo perchè abbiamo guardato frettolosamente un’immagine: sotto questo punto di vista le istruzioni sono davvero ben dettagliate e personalmente non ci è capitato di sbagliare nulla.

In aggiunta viti, dadi e distanziali non sono buttati alla rinfusa in una busta come capita in molti kit: ci sono tante bustine separate, ognuna con un’etichetta che indica chiaramente per quale parte dovranno essere utilizzate. Anche questa cosa, pur potendo apparire banale, è per me un altro punto a favore della qualità. Chi mi segue anche su Twitter sa bene che ogni tanto acquisto qualche kit per far giocare i bambini e divertirmi insieme a loro insegnandogli qualcosa e imparare insieme, e raramente mi capita di trovare un prodotto di così ottima fattura e ben ingegnerizzato in cui nulla è lasciato al caso.

Le istruzioni di montaggio sono riportate sul CD nella cartella della vostra lingua (Italiano) – Lezione 0. Sul montaggio non ho nulla di particolare da segnalare dato che le istruzioni sono molto semplici e dettagliate ma voglio comunque darvi alcuni consigli:

  • Anche se sono già presenti gli attrezzi necessari (due cacciativi + una brugola : altro punto di qualità!), munitevi anche di una piccola pinza possibilmente a becco ricurvo: vi aiuterà a maneggiare meglio i dadi più piccoli consentendovi anche di stringerli bene. Alcuni dadi difatti vanno stretti abbastanza, come quelli che mantengono i motoriduttori, mentre altri sono davvero piccoli, come quelli M1.6 che mantengono il sensore ad ulstrasuoni e sono abbastanza difficili da maneggiare a mani nude.
  • Notate l’orientamento dei motoriduttori con la loro staffa di alluminio: la staffa di alluminio va montata dal lato del motoriduttore in cui escono i fili e questa parte va avvitata al telaio rivolgendola verso l’interno (ovvero dal lato opposto a cui verranno collegate le ruote).
  • Fate attensione al montaggio della scheda di controllo motori L298N. Questa scheda prende posto giusto al centro del telaio inferiore e va montata con il dissipatore rivolto verso il posteriore della macchina. Come riconoscere la parte posteriore del telaio inferiore? L’anteriore è distinguibile dal fatto che nella parte davanti ci sono i 4 fori per l’alloggiamento del modulo Line Follower.
  • Nelle istruzioni, osservate attentamente anche il percorso dei cavi: per un collegamento agevole è importante anche questo. Noterete che entrambi i telai hanno due grossi fori circolari di 18mm di diametro: questi fori servono al passaggio dei cavi. In particolare tutti i cavi che dalla parte superiore vanno nella parte inferiore, vengono fatti passare dal foro frontale (che nel telaio superiore è quello vicino al foro rettangolare destinato al servocomando). Personalmente per non affollare troppo quel foro, ho preferito passare i cavi del modulo L298N dal foro posteriore: ci passano senza problemi anche se quel foro viene parzialmente coperto dal vano batterie.
  • Il mio consiglio relativamente al montaggio del blocco staffa+sensore ultrasuoni sul perno del servocomando è quello di non montarlo subito. Difatti può accadere che il perno non si trovi in posizione centrale (90°) per cui è consigliabile, dopo aver montato tutto e lasciato soltanto il blocco servo “appeso”, caricare lo sketch “servo debug” che muove il servocomando al centro e farlo partire, per assicurarsi che il perno si porti in posizione centrale, solo a quel punto possiamo avvitare la staffa.
  • Controllate con un tester che le batterie siano cariche. Le celle Litio a piena carica misurano circa 4.2V. Il mio consiglio è di metterle subito a caricare mentre montate tutto. Il caricabatterie senza celle inserite illumina entrambi i led di blu. Mettendo le celle scariche i led diventano rossi, a fine carica tornano blu:

Operazioni preliminari

La prima cosa da fare è ovviamente installare Arduino IDE. L’ultima versione disponibile nel momento in cui scrivo questo articolo è la 1.8.7. Se non siete pratici, sul tutorial in PDF presente nel CD è addirittura riportata la procedura di installazione.

Ne approfitto per illustrarvi la struttura del CD-Rom. Nel CD ci sono le cartelle con varie lingue:

Ogni cartella contiene unicamente le istruzioni per ogni tutorial nella lingua relativa. I sorgenti invece sono contenuti tutti nella cartella della lingua Inglese (era inutile riportarli in ogni cartella!). Il file “parts and names” è una semplice immagine che riporta tutti i componenti con il nome con cui vengono chiamati nei tutorial, giusto per evitare confusione. Il file TXT contiene dei link a video-tutorial e il file “Wiring Tutorial.mp4” è un video che illustra in forma animata l’esploso della macchina e quindi il montaggio meccanico, e i collegamenti di ogni singolo modulo alla scheda di espansione con i propri cavetti in dotazione.

Non è necessario installare driver aggiuntivi perchè l’Arduino UNO R3 marchiato Elegoo presente nel kit utilizza come bridge USB/UART l’ATmega16U2 originale. Ad ogni modo, per ulteriori informazioni nella cartella “English” è presente un PDF dal titolo “UNO R3, MEGA, NANO DRIVER FAQ.pdf” che illustra l’installazione dei driver per la porta COM, ma ripeto: se state installando una versione nuova di Arduino, verrà fatto tutto automaticamente.

Per i tutorial non sono necessarie librerie aggiuntive tranne una: la libreria IR Remote che verrà utilizzata nella lezione 3 che prevede il controllo della macchina tramite telecomando Infrarossi.

La libreria in questione è possibile trovarla sempre nella cartella English/Lesson 3 in formato Zip. nel PDF di questa lezione è anche chiaramente indicato come installarla. Che dire: ancora un altro punto a favore della qualità, come vi dicevo: assolutamente nulla è lasciato al caso!

Se invece siete esperti potete anche installare la libreria IR Remote più aggiornata  (che consiglio) direttamente dal web con il solito sistema: Menù Sketch->#Include Libreria->Gestione librerie. Nel campo di ricerca scrivete semplicemente “IR remote”. La libreria da installare è quella di (Ken) Shirriff:

Come caricare uno sketch

I programmi di Arduino sono chiamati “Sketch”. Ogni programma è un file di testo con estensione .INO. Facendo doppio click sui files .ino delle lezioni viene aperto automaticamente Arduino IDE. Ogni sketch viene compilato (tradotto in linguaggio macchina) e quindi caricato su Arduino mediante il bootloader integrato sul microcontrollore principale (L’Atmega328). Questa operazione (compilazione ed upload) viene eseguita semplicemente premendo sul pulsante rotondo a forma di freccia presente su Arduino IDE.

Prima di caricare lo sketch (prima di premere il pulsante freccia) dovete assicurarvi che siano rispettate queste condizioni:

  • Aver collegato Arduino al PC tramite il cavo USB in dotazione
  • Aver rimosso il modulo Bluetooth
  • Aver tolto alimentazione alla macchina portando l’interruttore del vano batterie sulla posizione OFF
  • Aver selezionato Arduino/Genuino UNO nel menù scheda
  • Aver selezionato la corretta porta COM 

Vediamo qui gli ultimi due punti:

Selezionate “Arduino/Genuino UNO” nel menù Strumenti->Scheda:

Il vostro menù sarà sicuramente diverso dal mio dato che io nel mio Arduino IDE ho installato tutti gli add-in e schede possibili e immaginabili dato che le uso quasi tutte.

L’ultima selezione da fare è quella della porta COM. L’Atmega16U2 a bordo dell’Arduino UNO contiene infatti un firmware che gli consente di essere visto da PC come un dispositivo USB CDC (Communication Device Class), ovvero emula una porta COM e fa da “ponte” tra la porta USB e il microcontrollore ATmega328.

Potete selezionare la porta dal menù Strumenti->Porta:

Il mio computer fisso, che è molto vecchio, ha una porta COM1 (la RS232), i dispositivi che emulano la porta seriale hanno generalmente un numero da COM3 a salire a seconda di quanta roba abbiamo installato nel tempo sulle porte USB. Nel mio caso è venuta fuori una COM14. Cambiando la porta USB in genere cambia anche il numero della COM a parità di dispositivo collegato, quindi se cambiate porta USB non vi troverete sempre la stessa COM, ad ogni modo nel caso di schede Arduino siete sicuri di quale sia la porta giusta perchè viene scritto Arduino/Genuino Uno tra parentesi.

Fatte queste operazioni preliminari, siete pronti per caricare i primi sketch.

Sketch di esempio

A parte la “Lezione 0” che è incentrata sull’assemblaggio, ci sono altre 5 lezioni complete di codice sorgente e PDF con tutte le spiegazioni. Ricordo che i sorgenti si trovano nella cartella “English” mentre le spiegazioni in Italiano si trovano nella cartella “Italian”. Le lezioni sono:

  1. Far muovere la macchina
  2. Controllo tramite Bluetooth
  3. Controllo tramite telecomando ad Infrarossi
  4. Macchina autonoma con rilevamento ostacoli
  5. Line Follower

Si tratta di sketch di esempio molto elementari da comprendere e servono sia per prendere confidenza con tutto il sistema Arduino sia per consentirci da subito, senza minimo sforzo, di avere un prodotto funzionante. Analizziamo insieme le 5 lezioni.

Far muovere la macchina

Dopo aver assemblato la macchina e preparato correttamente l’ambiente di sviluppo, è questa la prima lezione che dovete affrontare per essere sicuri di aver montato tutto correttamente e assicurarsi che tutto funziona. Questa lezione contiene 5 diversi sketch molto elementari che consentono sia di verificare il funzionamento corretto di tutto il sistema di controllo dei 4 motoriduttori, sia per capire come possiamo implementare noi, da soli, eventuali miglioramenti e scrivere i nostri programmi.

Nella cartella English, dove sono contenuti gli sketch, a parte uno schema di massima (wire_connect.png) c’è un file chiamato “wire connect table v3.0.pdf” che indica chiaramente ogni componente a quale pin di Arduino è collegato.

Arduino non può fornire direttamente corrente ai motori perchè non ce la farebbe, è per questo motivo che viene utilizzato un ponte H, un particolare dispositivo che funge un po’ da interruttore di potenza: riceve un segnale di controllo dal microcontrollore ed esegue l’azionamento di potenza dei motori (ovvero a tensione e corrente più elevata di quella che Arduino può fornire). Il ponte H utilizzato è un integrato L298N che prende posto sulla scheda controller motori.

Vediamo subito che il controller motori sfrutta 6 ingressi digitali di Arduino:

  • D5, al quale è collegato l’Enable A del ponte H (abilitazione motori a sinistra)
  • D6, al quale è collegato l’Enable B del ponte H (abilitazione motori a destra)
  • D7 -> Input 1 (controllo direzione motori a sinistra)
  • D8 -> Input 2 (controllo direzione motori a sinistra)
  • D9 -> Input 3 (controllo direzione motori a destra)
  • D11 -> Input 4 (controllo direzione motori a destra)

Gli Enable (D5 e D6) in alcuni sketch sono controllati in PWM in modo da controllarne la velocità, mentre la direzione è affidata al controllo dei 4 singoli inputs. Questa modalità di controllo del motore è chiamata Sign-Magnitude, il segno dei 4 input di controllo del ponte controlla la direzione e il PWM sugli enable controlla la velocità

Questa modalità di controllo è diversa dalla Locked-AntiPhase che ho implementato in Cent4ur nel quale invece sia direzione che velocità sono controllati dal PWM. Per approfondimenti potete leggere questi due vecchi articoli: Cent4urCome Arduino gestisce il PWM

L’Enable A controlla i due motori sinistri, mentre l’Enable B controlla i due motori destri. I motori sono difatti montati in parallelo su ogni fiancata. Portando un Enable a livello alto si fornisce corrente alla relativa parte di ponte H e si da quindi il consenso alla rotazione che verrà stabilita dagli stati degli input 1,2,3 e 4.

Se questa cosa continua a non esservi chiara oppure avete la sbagliatissima convinzione che ogni input controlli un motore, vi prego di leggervi questo tutorial.

Gli input 1 e 2 controllano la direzione della parte sinistra: mettendo Input1 a livello alto e Input2 a livello basso, le due ruote sinistre ruotano in avanti (ovvero in senso antiorario). Invertendo, le due ruote gireranno all’indietro. Non è possibile mettere 2 input allo stesso livello.

Analogamente gli input 3 e 4 controllano la direzione di rotazione delle ruote poste sulla fiancata destra ma a specchio: portando Input 3 a livello basso e Input 4 a livello alto (quindi al contrario rispetto agli input 1 e 2) anche queste ruote ruoteranno in avanti (ovvero in senso orario): notate che chiaramente il senso di rotazione, per andare avanti è invertito sulle due fiancate.

Per questi esempi il mio consiglio è di poggiare la macchina sul banco piuttosto che farla camminare a terra dato che questi sketch non prevedono controllo e la macchina potrebbe sbattervi addosso o sui mobili. Chiaramente dovete tenerla sollevata altrimenti precipiterà giù dal tavolo: un rotolo di scotch da imballaggio è perfetto per questa operazione:

Per gli esempi della lezione 1 il mio consiglio è quello di tenere la macchina sollevata sul banco da lavoro piuttosto che lasciarla a terra senza controllo

Nel primo sketch, “AUTO GO” è riportata tra le note una tabella che illustra lo stato delle uscite digitali per i vari movimenti:

//  ENA   ENB   IN1   IN2   IN3   IN4   Description  
//  HIGH  HIGH  HIGH  LOW   LOW   HIGH  Car is running forward
//  HIGH  HIGH  LOW   HIGH  HIGH  LOW   Car is running back
//  HIGH  HIGH  LOW   HIGH  LOW   HIGH  Car is turning left
//  HIGH  HIGH  HIGH  LOW   HIGH  LOW   Car is turning right
//  HIGH  HIGH  LOW   LOW   LOW   LOW   Car is stopped
//  HIGH  HIGH  HIGH  HIGH  HIGH  HIGH  Car is stopped
//  LOW   LOW   N/A   N/A   N/A   N/A   Car is stopped

Per far girare la macchina si farà in modo che le ruote ruotino tutte in senso orario (per girare verso sinistra) o tutte in senso antiorario (per girare verso destra). Questo tipo di guida è chiamata Differential Steering, ovvero sterzata differenziale, o anche Skid Steer Drive, è lo stesso tipo di sterzata utilizzata sui bulldozer, sui bobcat ecc. le ruote sono “bloccate” ma sono tutte motrici, la rotazione in un verso o nell’altro di ogni ruota determina la direzione di movimento del veicolo.

La modalità di sterzata della auto, invece, che hanno due ruote motrici e l’asse sterzante viene chiamata Ackerman Steering.

Questo sketch (Auto Go), in particolare, non fa altro che far muovere la macchina nelle 4 direzioni.

Gli altri sketch sono ancora più semplici di questo:

  • forward_back muove la macchina unicamente in avanti e indietro
  • left_wheel_rotation fa muovere unicamente le ruote sinistre in avanti e indietro mentre quelle destre rimangono bloccate
  • right_wheel_rotation, come il precedente ma relativo alle ruote di destra
  • speed_control: muove la macchina in avanti e indietro ma quando va in avanti, prima di fermarsi, decelera, rimane ferma per un po’ e poi accellera andando indietro.

Lo sketch speed_control sfrutta il PWM sui pin digitali 5 e 6 per accelerare e decelerare, il duty cycle del PWM viene variato mediante la funzione analogWrite: scrivendo un valore pari a 255, il duty cycle è del 100%, ovvero segnale sempre alto, e la macchina va in avanti a massima velocità, man mano che ci avviciniamo al valore 0 il duty cycle diminuisce fino a far diventare il segnale pari a zero che porta i motori a fermarsi.

Potete notare che quando il duty cycle assume un valore basso, si ode un fischio. Questo accade perchè i pin 5 e 6 utilizzano un PWM controllato dal Timer TCCR0 che è preimpostato nelle librerie di Arduino ad un valore di 976Hz, frequenza che ricade nell’intervallo dei suoni udibili dall’orecchio umano. Anche se utilizzare le librerie analogWrite di Arduino è conveniente perchè è a portata di mano, in realtà le frequenze standard del PWM di Arduino sono buone per controllare la luminosità dei led ma non vanno tanto bene per controllare invece la velocità dei motori. Se volete passare ad un livello più esperto vi consiglio di leggervi questo mio vecchio articolo in cui spiego come cambiare la frequenza standard del PWM di Arduino per renderla più adatta a controllare i motori.

Bluetooth Car

Questa lezione, per me, è la più figa di tutte perchè consente un controllo del robot tramite il cellulare. Nella cartella della lezione 2 ci sono 2 sketch e l’app in formato APK. Se avete il collegamento ad internet, anzichè installare l’APK in manuale, è consigliabile aprire il Google Play Store e quindi cercare ed installare l’app “ELEGOO BLE Bluetooth tool”:

Se non avete collegamento internet (? allora non potete nemmeno leggere questo articolo!) potete copiare l’APK sul cellulare collegandolo al PC e quindi lanciarlo (in questo caso nelle impostazioni avanzate dovete abilitare l’installazione da terze parti e utilizzare un programma che visualizzi le cartelle del telefono per poter trovare l’APK).

Il file PDF della lezione spiega tutto: come installare l’App e come utilizzarla e l’utilizzo degli sketch, ma anche in questo caso vi do un consiglio dato che ci ho penato non poco: questo modulo bluetooth non richiede l’accoppiamento!

Non avevo letto bene le istruzioni (mea culpa!) per il semplice motivo che immaginavo funzionasse come qualsiasi altro modulo bluetooth che ho utilizzato in precedenza ovvero: accoppiare cellulare con dispositivo dopodichè lanciare l’app e connetterla al modulo già accoppiato.

Beh… Non c’era verso di accoppiare il modulo al cellulare! Senza leggere le istruzioni ho provato ad accoppiare il modulo bluetooth con svariati cellulari sia nuovi che vecchi, sia economici che costosi, ho cambiato le impostazioni del modulo tramite i comandi AT collegandolo al PC con un bridge USB/UART, cercato informazioni su internet perchè pare che in molti hanno problemi con il modulo HC-08… niente da fare!

Qual’era il problema? Come dicevo su: il modulo non va accoppiato e l’unica cosa da fare è attivare il bluetooth dal cellulare e connetterlo dall’App come d’altronde è anche scritto chiaramente sul manuale! Tra l’altro pare che l’app della Elegoo sia una delle poche che riesce a collegarsi con l’HC-08. Vi spiego semplicemente come fare la connessione anche se non ce ne sarebbe bisogno.

Prima di tutto caricate su Arduino lo sketch bluetooth_blink, a caricamento ultimato staccate il cavo USB e collegate il modulo Bluetooth. Accendete quindi il robot, il led rosso del modulo bluetooth lampeggia.

Sul cellulare lanciate l’app ELEGOO BLE Tool, la prima volta uscirà un messaggio che vi chiede di acconsentire all’utilizzo del bluetooth da parte dell’app. Vi si presenta questa schermata:

Cliccate in alto a sinistra dove c’è scritto “Connection” in piccolo. Vi si presenta quest’altra schermata:

attendete un po’ che nella lista appaia la scritta HC-08, eventualmente premete Scan. Quando appare HC-08 cliccateci sopra, la schermata cambia, compare in pratica due volte HC-08 sotto due voci diverse (dispositivo connesso in alto  e dispositivi disponibili in basso):

Tornate quindi alla schermata principale premendo il simbolo < in alto a sinistra affianco alla scritta Bluetooth Connection. Notate che il dispositivo ora è collegato al cellulare perchè compare la scritta HC-08 al centro:

Lo sketch di esempio che abbiamo caricato è un semplice esempio che accende/spegne il led collegato normalmente sul pin digitale n°13 di Arduino in base ad un comando ricevuto sulla UART, che nella fattispecie ora è collegata al bridge Bluetooth. Questo led è riportato anche sulla scheda di espansione in alto a sinistra. Dall’App sul cellulare, in modalità terminal, scriviamo a (minuscola) nel campo iMessage e premiamo Send: il piccolo led verde sulla scheda di espansione si accende! Facciamo di nuovo la stessa cosa: si spegne.

Leggendo le poche righe dello sketch potete rendervi conto quanto può essere semplice controllare un dispositivo con il cellulare.

Il secondo sketch di esempio è in pratica derivato dalla lezione 1 (auto_go) al quale è stato aggiunto il controllo via UART per i movimenti. In pratica mandando dei singoli caratteri sulla UART è possibile far muovere la macchina:

  • f : avanti (forward)
  • b : indietro (back)
  • l : sterzata a sinistra (left)
  • r : sterzata a destra (right)
  • s : stop
  • a : inverte lo stato del led, come nello sketch di esempio precedente

Stacchiamo nuovamente il modulo bluetooth dopo aver spento la macchina, colleghiamo il cavo USB, carichiamo lo sketch bluetooth_car. 

Rimettiamo il modulo Bluetooth e proviamo lo sketch, per ora tenendo sempre la macchina sollevata sul banco giusto per capire cosa succede. Tenendo l’app sempre in modalità terminal, proviamo a dare i comandi come li ho scritti nella lista (le lettere devono essere minuscole!), vediamo che otteniamo anche delle risposte nel programma dato che lo sketch è impostato per fornire anche una risposta in ogni funzione che esegue il movimento tramite Serial.print:

chiaramente questa modalità di controllo è un po’ scomoda, per questo motivo c’è la terza modalità del programma denominata Keyboard.

C’è in pratica una griglia di 12 pulsantoni quadrati ai quali possiamo assegnare comandi a piacere: basta tenere premuto un pulsante per editarlo. Per ogni pulsante è possibile definire il colore e due comandi con la propria descrizione che verrà visualizzata sul pulsante stesso.

E’ possibile definire 2 comandi perchè premendo la prima volta viene inviato il primo comando, la descrizione visualizzata  sul pulsante quindi cambia con la seconda stringa e premendolo nuovamente viene inviato il secondo comando: una funzione utile per eseguire funzioni di toggle (esempio: scriviamo ON e quindi dopo la pressione possiamo scriverci OFF) ma nel nostro caso non serve.

Anche se nel manuale viene scritto di assegnare ad entrambi i comandi lo stesso valore, io ho compilato solo il primo campo lasciando vuoto il secondo e funziona lo stesso. In pratica nel campo sopra inserite la descrizione (che appare sul pulsante), nel secondo campo scrivete il comando (il carattere da inviare sulla seriale) e lasciate selezionato “Character”. I campi successivi che costituiscono il secondo comando da inviare alla seconda pressione potete lasciarli vuoti, selezionate quindi il colore che preferite dare al pulsante e date OK:

Ripetete l’operazione per tutti i comandi fino ad avere una cosa simile a questa:

Bene…potete divertirvi a controllare la vostra macchina dal cellulare!

Infrared Remote Car

Questi esempi sono molto simili al precedente ma utilizzano il telecomando infrarossi in dotazione e il sensore IR collegato sul pin digitale 12. La ricezione di comandi IR è piu complessa rispetto alla semplice UART ma nel documento è spiegato tutto. Osserviamo il primo programma di questa lezione: infrared_Blink. Anche questo consente di accendere/spegnere il led su D13 mediante la pressione di un pulsante sul telecomando, il pulsante 1. Carichiamo lo sketch, togliamo la linguetta protettiva dal telecomando e premiamo il tasto 1: le pressioni successive accendono/spengono il led.

La magia è tutta fatta dalla libreria IR Receive di Ken Shirriff che abbiamo installato all’inizio. Osserviamo un attimo lo sketch. All’inizio troviamo:

#define RECV_PIN 12 //Infrared signal receiving pin
#define LED 13 //define LED pin
#define L 16738455
#define UNKNOWN_L 1386468383

Il pin digitale 12 è quello a cui è collegato il ricevitore demodulatore IR, sul pin 13 c’è il LED, il valore di L è un numero restituito dalla decodifica del segnale ricevuto quando si preme il pulsante 1 sul telecomando, l’altro valore UNKNOWN_L è un altro valore che viene restituito dalla pressione prolungata del tasto 1. Molte codifiche utilizzati dai telecomandi IR difatti inviano un segnale differente a seconda che venga eseguita una pressione corta o lunga (ripetuta). I due valori vengono verificati contemporaneamente con un OR per poter rispondere alla pressione corta o prolungata del tasto:

28
29
30
31
32
33
34
35
36
if (irrecv.decode(&results)) { 
    val = results.value;
    Serial.println(val);
    irrecv.resume();      // Receive the next value
    delay(150);
    if(val == L || val == UNKNOWN_L) {  
      stateChange();
    }
  }

Curiosità: il motivo per il quale la pressione prolungata è stata etichettata come UNKNOWN è dato dal fatto che la libreria utilizzata non riconosce la codifica tra quelle presenti in libreria e la identifica appunto come codifica UNKNOWN, mentre la pressione breve dei tasti viene correttamente riconosciuta come codifica NEC.

Da dove vengono fuori questi numeri associati ai tasti? Ve lo dico subito dato che vorreste poter utilizzare tutti i pulsanti a disposizione e, in aggiunta, quello che sto per dirvi può tornare utile anche per leggere altri telecomandi ad infrarossi (come quello della vostra TV). Dal menù File selezioniamo Esempi-> IRremote -> IRrecvDemo:

Modifichiamo leggermente lo sketch per adattarlo alle nostre esigenze. A riga 11 cambiamo cambiamo il pin a cui è collegato il ricevitore IR impostandolo a 12:

11
int RECV_PIN = 12;

A riga 29 cambiamo HEX con DEC per avere il risultato espresso in decimale anzichè in esadecimale:

29
Serial.println(results.value, DEC);

Carichiamo lo sketch su Arduino. Dopodichè apriamo il monitor seriale dal menù Strumenti->Monitor Seriale. Assicuriamoci che sia impostata una velocità di trasmissione dati di 9600 Baud in basso a destra:

Puntiamo il telecomando verso il ricevitore IR e premiamo brevemente il pulsante 1, a terminale abbiamo questo:

Vedete che il numero riportato è proprio quello definito da L nello sketch di esempio. Potete anche notare che dopo una pressione lunga viene restituito il numero 4294967295 che è in pratica il numero massimo ottenibile con 32bit, questo perchè, come dicevo prima, il particolare tipo di codifica usato dal telecomando fa in modo da inviare un codice differente per la pressione breve e quella lunga (repeat code), notiamo che la pressione lunga di qualsiasi tasto con questo sketch restituisce quel numero probabilmente per qualche bug, se invece provate a caricare un altro sketch di esempio della libreria in questione, come IRrecvDump, notate che i valori restituiti dalla pressione lunga sono quelli giusti e utilizzati negli sketch di esempio della Elegoo.

Il problema è che spesso, durante la pressione lunga, spesso viene restituito sempre il valore massimo a 32 bit oppure valori diversi. Credo sia dovuto a qualche  bug della libreria o a qualche particolare settaggio per cui non mi sono applicato. Gli unici codici sicuri sono quelli rilevati dalla pressione breve.

Con questo sistema potete ricavare i codici di qualsiasi telecomando, Per questo telecomando ho già fatto io il lavoro per voi e nella seguente tabella sono riportati i codici relativi alla pressione breve dei tasti:

TastoCodiceTastoCodice
Freccia Su16736925
516718055
Freccia Giù16754775616743045
Freccia Sinistra16720605716716015
Freccia Destra16761405816726215
OK16712445
916734885
116738455
016730805
216750695
*16728765
316756815#16732845
416724175

Lo sketch successivo di questa lezione, infrared_remote_control_car, esegue il controllo della macchina tramite il telecomando sfruttando le 4 frecce per la direzione. Ogni comando ricevuto viene interrotto se la distanza tra un comando ricevuto ed il successivo è superiore a 500mS, altrimenti la macchina continuerebbe nella direzione impostata anche dopo aver rilasciato il tasto!

Il controllo tramite IR è chiaramente meno preciso rispetto a quello Bluetooth per svariate ragioni: il telecomando deve puntare verso il ricevitore, c’è la questione che a volte i codici ricevuti per la pressione prolungata non vengono sempre decodificati allo stesso modo e in più c’è il fatto che la decodifica del segnale IR è molto più laboriosa della UART (che è invece un modulo hardware) per cui il sistema risponde in maniera più lenta.

Macchina che evita gli ostacoli

Questa lezione fa uso del sensore ad ultrasuoni e quindi del servocomando per poterlo ruotare di 180°. Lo sketch Servo_debug serve  a portare il servocomando nella posizione a 90°, ovvero serve a rivolgere il sensore ad ultrasuoni dritto frontalmente. Questo è lo sketch che dovete caricare per poter eseguire il centraggio perfetto del sensore, come dicevo nel paragrafo relativo al montaggio.

Lo sketch successivo di questa lezione, Obstacle_Avoidance_Car consente alla macchina di muoversi in maniera autonoma e quindi di evitare gli ostacoli servendosi del sensore ad ultrasuoni. Il sensore ha due segnali: Trigger, collegato al pin A5 ed Echo, collegato al pin A4.

Molti non sanno che i pin analogici di Arduino possono essere utilizzati come normali pin digitali utilizzando le normali funzioni pinMode e digitalWrite.

Per poter leggere la distanza di un ostacolo posto di fronte al sensore bisogna dare un impulso a livello alto di almeno 10µS al pin di Trigger e quindi misurare l’ampiezza del segnale restituito dal pin Echo. In questo mio vecchio articolo spiego in maniera esauriente come funziona questo sensore. La risposta del sensore è lineare: il rapporto tra la durata del segnale di Echo espresso in microsecondi e il valore fisso 58 fornisce la misura espressa in centimetri della distanza dell’ostacolo dal sensore: avevo trovato sperimentalmente questo numero tempo fa e lo ritrovo anche adesso nello sketch di esempio della Elegoo. La funzione Distance_test dell’esempio restituisce la distanza in cm. La misura della durata dell’impulso di Echo viene eseguita mediante una funzione apposita di Arduino: pulseIn.

Lo sketch è molto elementare: fa camminare in avanti la macchina controllando di continuo il sensore ad ultrasuoni. Se il sensore rileva un ostacolo a meno di 20cm fa fermare i motori, quindi viene girato il servocomando a destra per farlo arrivare a circa 10° (viene dato il valore 10 alla funzione servo.Write), viene quindi misurata la distanza e salvata in una variabile, il servocomando viene successivamente portato al centro, e quindi girato a sinistra a 180° e misurata nuovamente la distanza. Se la distanza misurata a destra risulta maggiore di quella misurata a sinistra, la macchina viene fatta girare a destra e viceversa. La macchina quindi continua dritta e il programma si ripete. Se invece entrambe le distanze sono inferiori a 20cm, la macchina cammina all’indietro.

Gli inconvenienti riscontrati con questo sketch, per me, sono stati due:

  • la rotazione a sinistra di 180° è risultata un po’ eccessiva: utilizzando la funzione servo.Write(180), il servo si sforza molto perchè raggiunge il limite della corsa, se succede anche a voi (sentite proprio un rumore strano), diminuite questo valore.
  • Il valore di distanza di 20cm, in corsa, a volte è poco e la macchina arriva a toccare l’ostacolo: in questo caso aumentate tale valore.

In aggiunta, in assenza di sistemi di dead Reckoning, potrebbe capitare che il robot rimanga incastrato in un angolo girando continuamente a destra e sinistra: in questo caso bisogna introdurre un algoritmo che faccia fare dietro-front al robot.

Line Follower

Questo sketch fa uso dei 3 sensori infrarossi posti nella parte inferiore frontale del robot per poter seguire una linea scura tracciata a terra. Quella dei Line Follower è una categoria di robot molto particolare e molto cara agli amici di Artigianato Robotico che spesso organizzano gare proprio per questa categoria! I sensori sono collegati ai pin digitali 2 (sinistro), 4 (centrale) e 10 (destro) e restituiscono un valore logico basso quando non c’è riflessione del raggio infrarossi, ovvero hanno incontrato la linea nera. Lo sketch è il più semplice di tutti, nel loop la macchina viene mandata in avanti se è attivo il solo sensore centrale, se si attiva un sensore laterale, la macchina viene ruotata fino a che non scompare il segnale sul relativo sensore:

71
72
73
74
75
76
77
78
79
80
81
if(LT_M){
    forward();
  }
  else if(LT_R) { 
    right();
    while(LT_R);                             
  }   
  else if(LT_L) {
    left();
    while(LT_L);  
  }

Sulla scheda sensori line follower è presente un trimmer che serve a regolare la sensibilità dei sensori. Notate che ogni sensore ha un led rosso: quando il led è acceso vuol dire il ricevitore del sensore non rileva il raggio IR che sta emettendo il che può significare soltanto due cose: ha rilevato la linea (che essendo nera assorbe tutto il raggio senza rifletterlo) oppure un eventuale oggetto riflettente è fuori distanza massima di rilevamento, per cui otterrete il led acceso anche se il sensore è rivolto in aria. Se il led è invece spento vuol dire che il raggio IR di ritorno viene rilevato, quindi non è presente la linea nera, ovvero è presente un oggetto che riflette il raggio IR nelle immediate vicinanze.

Girate quindi il trimmer fino a che non notate che il led rimane acceso quando lungo un sensore è presente la striscia nera.  Cercate di eseguire la regolazione al minimo, ovvero girate poco fino a che la linea non viene rilevata. Ovviamente dovete fare le prove su un pavimento che non sia nero!

Per eseguire la regolazione dei sensori, la cosa più saggia è staccare dalla scheda di espansione il connettore L298 Power in modo tale che la macchina non cammini, accendere la macchina ed appoggiarla sulla linea per vedere se i led si accendono  quando rilevano la linea e si spengono quando rilevano il pavimento e l’eventuale fuga tra le mattonelle (io ho un pavimento chiaro con la fuga scura e ho penato non poco per poter regolare per benino):

Per fare la linea a terra c’è il rotolo di scotch in dotazione. Sul mio c’era scritto 5m ma in realtà ne sono venuti fuori circa 2 metri che mi hanno consentito di fare un cerchio di circa 70cm di diametro. Probabilmente non dovevano essere 5 metri bensì 5 piedi.

Nonostante la semplicità, per me questa del line follower rimane l’applicazione più divertente di tutti soprattutto per i bambini, che possono divertirsi un mondo a creare dei binari lungo i quali far passare la macchina. Questo sketch è secondo me quello che si presta alle personalizzazioni più ampie: si possono aggiungere delle istruzioni per fare in modo che la macchina si fermi quando tutti e tre i sensori rilevano la linea e sulla pista si può mettere un pezzo di scotch trasversale alla linea e predisporre la ripartenza della macchina utilizzando magari il telecomando ad infrarossi.

Nel seguente download, dato che i miei bambini hanno fatto una pista grande con lo scotch, ho aggiunto al sorgente di esempio del line follower la possibilità di fermare/avviare la macchina dal cellulare inviando il comando “s” via bluetooth e la rilevazione degli ostacoli frontali che fanno fermare immediatamente la macchina, e per farla ripartire si deve inviare il comando dal cellulare. Questo sketch può anche esservi utile se dovete fare la regolazione dei sensori senza staccare il cavo che alimenta la board motori:  Line_tracking_car2 (286 download)

Links

 

Galleria fotografica

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)