Esercitazione di robotica con LEGO EV3
Roomba
A cura del prof. Giuseppe SPALIERNO
Aprile 2020
In questa esercitazione il robot si muove simulando il percorso del noto aspirapolvere autonomo.
Il principio di funzionamento si basa sull’utilizzo del sensore di distanza ad ultrasuoni: a mano a mano che il robot si avvicina ad un ostacolo, ad esempio un muro, la velocità rallenta; a 10cm. di distanza si ferma, retrocede di 16cm. circa, ruota di ¾ di giro e ripete la procedura effettuando un percorso differente.
Il programma è arricchito con un suono “sonar”per ogni ciclo, ed alla fine dell’esecuzione del programma emette “stop”.
Viene definita una variabile x che si incrementa ad ogni ciclo che viene visualizzata sul display del robot.
Vengono eseguiti 10 cicli, alla fine dei quali il robot si ferma, emette “stop” ed il programma ha termine.
Il progetto si chiama roomba.ev3 ed è costituito da un programma principale di nome mov_indoor e da due sottoprogrammi richiamati all’interno di mov_indoor di nome num_Cicli e vel_dist.
Nella seguente figura si mostrano i blocchi del programma mov_indoor.
All’avvio il robot resta fermo per 1s per poi entrare in un ciclo ripetuto per 10 volte.
All’interno di tale ciclo troviamo il comando sonoro che emette la parola “sonar”, il sottoprogramma numCicli che consente di visualizzare sul display del robot il numero del ciclo corrente da 1 a 10.
Incontriamo, poi, un ciclo costituito dal sottoprogramma vel_dist che è in grado di ridurre la velocità del robot a mano a mano che questi si avvicina ad un ostacolo finché tale distanza diventa minore di 10cm. I due blocchi successivi fanno muovere il robot a marcia indietro con potenza 50% e successivamente una rotazione su se stesso per 540° di rotazione delle ruote che corrispondono a 270°, circa, di rotazione del robot. Una volta eseguite i 10 cicli, il programma esce dal ciclo, esegue l’istruzione di arresto motori ed emette il suono “stop”.
Esaminiamo, ora, i sottoprogrammi numCicli e vel_dist.
In questa sequenza di blocchi si utilizzano alcune funzioni matematiche.
Il primo blocco definisce, in lettura (simbolo del libro), una variabile denominata x.
Il secondo blocco è in grado di svolgere una delle quattro operazioni aritmetiche fondamentali, somma, sottrazione, moltiplicazione e divisione; su due operandi “a” e “b”.
Nella fattispecie viene eseguita la somma x+1 perché il filo giallo dell’uscita x è collegato all’ingresso “a” del secondo blocco. L’ingresso “b” è la costante 1. In pratica tale blocco incrementa x di 1.
L’uscita del secondo blocco, cioè il risultato della precedente operazione, viene scritta nella stessa variabile x. L’operazione di scrittura si ottiene selezionando la casella in basso a sinistra del blocco potendo scegliere solo lettura (simbolo del libro) o scrittura (simbolo della matita).
Il quarto blocco è sempre quello della variabile x, in modalità lettura, che viene collegato all’ingresso di testo del display del robot. Impostando |x|=10 e y=5 il valore di x viene visualizzato al centro del display. Infatti il display può ospitare caratteri alfanumerici.
Su ogni riga prendono posto fino a 22 caratteri da sinistra a destra numerati da 0 a 21.
Il display contiene 12 righe numerate da 0 a 11 dall’alto al basso. Un carattere è costituito da una matrice di pixel di dimensioni 10x8 (10 in altezza e 8 in larghezza).
Nella seguente figura si mostra il sottoprogramma vel_dist che consente di ridurre la velocità del robot al diminuire della distanza.
Anche in questo sottoprogramma si utilizzano due blocchi aritmetici.
In particolare si imposta il sensore di distanza in modo da fornire sul cavo di uscita la distanza in cm. dall’ostacolo. Tale valore viene diviso per 2 ed il risultato viene aumentato di 10cm secondo la formula: potenza=d/2+10 ove d è la distanza in cm.
Per avere la potenza del 100%, la distanza deve essere di 180cm mentre a 10cm di distanza, cioè quando il robot viene fatto retrocedere e ruotare, la potenza scende a 15%.
In un ambiente con pareti distanti dal robot meno di 180cm, la potenza dei motori è inferiore a 100%. In caso contrario si potrebbe aumentare il denominatore della precedente divisione inserendo 3 nel caso di massima distanza di 270cm.
Tuttavia se i motori sono pilotati da un valore di potenza superiore a 100, il robot si muoverà con la velocità pari al 100% di potenza.
Inoltre va tenuto conto della portata del sensore di distanza ad ultrasuoni: esso è in grado di individuare un ostacolo ad una distanza compresa tra 4cm e 250cm.
Resta da capire come definire i due sottoprogrammi ciascuno in un unico blocco da inserire in un altro programma dello stesso progetto, nel nostro caso in mov_indoor.
Si consideri la figura precedente. Dopo aver disegnato i vari blocchi, si selezionano tutti, escluso quello di avvio, e successivamente si va nel menù Strumenti e si sceglie il comando Generatore del blocco personalizzato: si apre una finestra nella quale si può personalizzare un piccolo blocchetto con una immagine scelta tra quelle messe a disposizione che più ci sembra attinente alla funzione che il sottoprogramma dovrà svolgere e inserendo il nome che si vuole dare al sottoprogramma.
Questo nuovo blocco va a popolare, in basso, il menù dei blocchetti di colore verde, l’ultimo della serie a destra. Inizialmente tale menù è vuoto. Ovviamente si possono definire più sottoprogrammi.
In figura si mostrano le sagome dei due sottoprogrammi utilizzati in questa esercitazione: numCicli e vel_dist.
ROOMBA2
È una variante del precedente programma Roomba in quanto si è aggiunta una procedura chiamata “contay” che incrementa la variabile y quando il robot attraversa una striscia nera e si visualizza il numero nella parte bassa del display per evitare che tale numero si confonda con la x che indica il numero di cicli svolti dal robot e visualizzato nella parte centrale del display.
Inoltre, poiché il programma si è complicato ulteriormente, sono stati inseriti nuovi blocchi personalizzati per favorire una migliore lettura dei comandi.
Intanto si mostra un diagramma di come sono collegate tra loro le varie procedure.
La procedura “mov_indoor” contiene, oltre ad altri comandi, i blocchi personalizzati “ciclo” e “stop”. Il blocco “ciclo”, a sua volta, contiene i blocchi personalizzati, “numCicli2”, “vel_dist”. Quest’ultimo, infine, contiene il blocco personalizzato “contay”.
Il programma “mov_indoor” emette il suono "start", attende 1s, ripete 10 volte la procedura “ciclo” ed infine esegue il blocco personalizzato “stop”.
Il programma “ciclo” emette il suono “sonar”, esegue il blocco personalizzato “numCicli”, poi esegue il programma “vel_dist” ripetutamente fino a quando il sensore di distanza rivela un ostacolo a meno di 15cm, poi fa retrocedere il robot di 17,6cm ed infine lo fa ruotare sul suo asse di 270° circa.
Il blocco personalizzato “numCicli” emette il suono "Turn", mostra sul display in riga 8 la scritta "Num. cicli:", incrementa la x (numero di cicli) e ne visualizza il valore accanto alla precedente scritta.
Il blocco personalizzato “vel_dist” pilota il motore con potenza cm/2 +10, ove cm è il valore in centimetri tra il sensore di distanza e un ostacolo frontale. Se viene rilevato sul pavimento una luminosità riflessa inferiore a 50, il selettore esegue il blocco personalizzato “contay” altrimenti lo bypassa.
La procedura del blocco personalizzato “contay” inizia con l'emissione del suono "Black" seguito dalla scritta "Strisce nere:" in riga 4 ed è, poi, del tutto simile a “numCicli” con la differenza che qui viene incrementata la variabile y che rappresenta il numero di strisce nere rilevate dal sensore di luminosità riflessa che viene visualizzata sul display. In coda si inserisce un lieve ritardo per consentire il passaggio del robot sulla striscia nera. Se dovesse mancare si avrebbero conteggi multipli.
Infine il blocco personalizzato “stop” si attiva al termine dei 10 cicli imposti dalla procedura “mov_indoor”. Si bloccano i motori B+C, si emette il suono “stop” e si attende 3s per consentire la lettura sul display.