Controlliamo DotBot con Arduino

DotBot

Questo tutorial è la prima bozza di parte delle lezioni di “Alfabeto Arduino con DotBot” per l’apprendimento dell’uso di Arduino mediante lo starter kit open source per l’insegnamento del coding e della robotica che abbiamo chiamato DotBot.
Sperimenterò questa prima parte durante il corso di cui sarò relatore presso l’IIS Cassato Gattapone (Gubbio): “Apprendimento attivo con Raspberry Pi e Arduino”.

Nel tutorial che segue illustro un schema estremamente semplice per la realizzazione del controllo di DotBot effettuata con Arduino con i relativi sketch di esempio è può essere considerato la base di partenza per ogni sperimentazione basata appunto su Arduino.
Per il pilotaggio dei motori ho utilizzato l’Arduino Motor Schield R3 di cui ho già effettuato un tutorial nei giorni scorsi (Utilizzo dell’Arduino Motor Shields R3) ed è propedeutico a questa lezione.

Più avanti aggiungerò esempi pratici con ulteriori sensori e inoltre mostrerò come far funzionare DotBot come segui linea e utilizzando soluzioni con motorini passo-passo. Vi saranno ulteriori lezioni basate su Raspberry Pi 3 e programmazione in Python e successive approfondimenti sull’uso di ROS (Robot Operating System).

L’intero tutorial sarà basato sulle indicazioni costruttive di DotBot che trovate descritte nell’articolo: DotBot: lo starter kit open source per l’insegnamento del coding e della robotica che ricordo potete stampare in 3D seguendo le indicazioni che trovate nell’articolo.
In ogni caso se non avete stampato DotBot potrete tranquillamente applicarlo al robot che disponete.

Ricordo che la rotazione, senza il controllo dei numeri di giri, dipende dalla carica delle batterie, quindi per ogni test effettuare un controllo ed eventualmente modificare la variabile: “tempoRotazione” che potrete poi tarare mediante la funzione calibrazioneRotazione() che trovate nell’ultimo sketch proposto. La soluzione ottimale per il controllo preciso del robot prevede l’uso di motorini con encoder, che mostrerò in lezioni successive.

Ovviamente anche la soluzione proposta in questo tutorial risulta approssimata (ed anche dettata da un risparmio economico) ricordo che lo scopo è comprenderne il funzionamento del movimento di DotBot, lascio a voi i successivi perfezionamenti.

Potrete sostituire alle batterie che io ho utilizzato, batterie ricarrabili, o pacchi batterie con autonomia maggiore che potrete fissare utilizzando gli appositi fori predisposti sullo chassis

Componenti utilizzati

  • Arduino UNO R3
  • Arduino Motor Shield R3
  • Sensore ad ultrasuoni HC-SR04

Montaggio del circuito

DotBot-Arduino-01

DotBot-Arduino-02

DotBot-Arduino-03

Ribadisco, come già indicato nel tutorial: Utilizzo dell’Arduino Motor Shields R3 che sono state fornite due alimentazioni diverse una per la scheda Arduino ed una per i motori, per effettuare tale operazione è indispensabile effettuare il taglio del “Vi connect

Come evidenziato i due motori sono stati collegati con polarità invertita in quanto per muovere in avanti il robot le due ruote dovranno muoversi in senso opposto.

Negli esempio che seguono verranno di volta aggiunte nuove funzioni, la lista completa è la seguente:

setupDotBot()

Imposta i pin dell’Arduino Motor Shield

driveDotBot([motore], [direzione], [velocità], [brake])

La funzione è da leggersi in questo modo:
driveDotBot pilota il [motore] (0 per A, 1 per B) in senso [direzione] (0 o 1 – orario o antiorario) a velocità [velocità] (tra 0 e 255), [brake] attiva o rilascia blocco motore.
I motori vanno avanti fino a quando non gli verrà detto di fermarsi.

stopDotBot([motore])

ferma il motore [motore] (0 o 1).

rotazioneOraria()

gira il robot di 90° in senso orario

rotazioneAntioraria()

gira il robot di 90° in senso antiorario

distanzaOstacolo()

restituisce la distanza in cm dell’ostacolo rilevato

paragonaDistanze()

verifica la distanza dell’ostacolo che si trova a distanza maggiore dal robot

scegliDirezione();

sceglie la direzione da prendere in funzione della distanza a cui si trova l’ostacolo

La spiegazione del funzionamento d ogni parte del codice è inclusa all’interno dello sketch come commento.

Nota per lo studio:
i 6 sketch proposti variano solo nel loop per la realizzazione delle funzioni richieste, la variazione tra uno sketch e l’altro consiste nell’aggiunta di poche linee di codice, sarà quindi necessario effettuare uno studio preliminare di tutte le parti dello sketch 1.

Sketch 1
Rotazione di 90° in senso orario del robot sul proprio asse e ritorno alla posizione di partenza con intervallo di stop di 3 secondi.

Descrizione delle singole sezioni dello sketch 1

Le due variabili CW e CCW indicano: CC: ClockWise, rotazione oraria e CCW: Coulter ClockWise, rotazione anti oraria che verranno utilizzate all’interno delle funzioni per in controllo del senso di rotazione dei motori.

MOTORE_A e MOTORE_B che assumono rispettivamente il valore 0 e 1 per identificare il motore su cui effettuare il controllo.

Pin utilizzati dall’Arduino Motor Shields R3, non possono essere utilizzati per altre funzioni.
Per la descrizione dell’utilizzo dello shield motori si consulti l’articolo: Utilizzo dell’Arduino Motor Shields R3

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

E’ la sezione dedicata all’impostazione delle velocità avanti, indietro e alla velocità di rotazione, inoltre, poiché questa versione di DotBot non è dotata di encoder sui motori è necessario effettuare alcune prove per impostare il tempo di rotazione, con la variabile: tempoAngolo, per effettuare una rotazione di 90°.

Come indicato nel commento, i motori possono avere velocità di rotazioni differenti, soprattutto perché sono motori DC estremamente economici, quindi potrebbe essere opportuno effettuare dei piccoli aggiustamenti sulla velocità di rotazione di entrambi, per default non il valore è fissato a 0, cioè nessuna correzione.

Nel setup viene invocata la funzione setupArdumoto() in cui vengono di volta in volta tutte le impostazioni sui pin.
La funzione setupArdumoto() è stata creata solamente per comodità di lettura delegando ad essa l’impostazione dei pin delle schede utilizzate. Nel setup(), negli esercizi che aggiungerò in successive lezioni, verranno aggiunte funzioni di calibrazione che hanno la necessità di essere eseguite una sola volta.

Nello sketch 1 viene richiesto di effettuare una rotazione di 90° in senso orario del robot sul proprio asse e ritorno alla posizione di partenza con intervallo di stop di 3 secondi.

la funzione driveDotBot() serve per impostare: il motore su cui vogliamo agire, il senso di rotazione, la sua velocità e stabilire se dobbiamo attivarlo o fermarlo (brake).
L’if consente la selezione del motore utilizzato su cui verranno impostati i pin dello shield motori, così come spiegato nel tutorial: Utilizzo dell’Arduino Motor Shields R3

stopDotBot() è una semplice funzione che invoca la funzione driveDotBot() con i parametri impostati per fermare lo specifico motore. Questa funzione è stata creata solamente per rendere più leggibile il codice ed identificare nel nome della funzione l’azione che si va ad impostare nel loop()

Si tenga conto che nel montaggio dei collegamenti del motore di sinistra l’impostazione delle connessioni è stata invertita.
Per effettuare una rotazione oraria di DotBot è necessario far girare in senso orario entrambi i motori alla velocità impostata in velRotazioneAnteriore con brake impostato a 0 che in altro modo vuol dire “freno a mano non tirato” 😃

La rotazione in senso orario dovrà essere effettuata per un tempo pari a tempoRotazione, necessario per effettuare una rotazione di 90° (circa).

Identica alla funzione descritta precedentemente ma con parametri impostati per far girare DotBot in senso antiorario.

Impostazione di tutti i pin utilizzati sulle schede.

Sketch 2
Rotazione di 180° in senso orario del robot sul proprio asse e ritorno alla posizione di partenza con intervallo di stop di 3 secondi.

Sketch 3
Rotazione di 360° in senso orario del robot sul proprio asse, rotazione di 360° in senso antiorario del robot sul proprio asse con intervallo di stop a pi/2 di 1 secondo e stop di 3 secondi a 360°.

Sketch 4
Avanti per 500 millisecondi, rotazione di 180° in senso orario del robot, avanti per 500 millisecondi, rotazione di 180° in senso movimento in avanti per 500 millisecondi.

Sketch 5
Parametrizzare il tempo necessario per effettuare una rotazione di una certa quantità di gradi
Far realizzare 3 movimenti di rotazione:
45° in senso antiorario del robot
dalla posizione raggiunta rotazione di 90° in senso orario
dalla posizione raggiunta, rotazione di 45° in senso antiorario

Sketch 6
Utilizzando il sensore ad ultrasuoni rilevare gli ostacoli ed effettuare la scelta della direzione da intraprendere in funzione dell’ostacolo che si trova a distanza maggiore dal robot.

Per l’utilizzo del sensore ad ultrasuoni ne avevo già dato spiegazione in EduRobot UNO – Come costruire il vostro primo Arduino Robot – Lezione 2  ma per permetterne un’agevole studio duplico quanto già scritto in questo tutorial.

Per far evitare gli ostacoli al nostro robot utilizzeremo un sensore ad ultrasuoni, in altro modo useremo questo sensore per misurare la distanza dell’ostacolo, ma potremo anche pensare di usare questo sensore, ad esempio, in un sistema anti-intrusione che deve far suonare un allarme. In questa lezione viene utilizzato il sensore HC-SR04, dispositivo economico e con un buon range operativo, ha una sensibilità dichiarata nei datasheet che va da 2 centimetri a 4,5 metri circa, in realtà la massima distanza da esperimenti che ho effettuato arriva a circa 3,5 metri, molto comunque dipende dai materiali colpiti e dalla loro capacità di assorbimento sonoro.

Ma come funziona un sensore di questo tipo?

Ripeto brevementa la lezione che avevo pubblicato su scuola.arduino.cc la spiegazione si riferisce ad un’altra tipologia di sensore ad ultrasuoni, ma il funzionamento è analogo.

I sensori ad ultrasuoni non forniscono direttamente la misura della distanza dell’oggetto più vicino, ma misurano il tempo impiegato da un segnale sonoro a raggiungere l’oggetto e ritornare al sensore.

L’impulso ad ultrasuoni inviato all’HC-SR04 è di circa 40KHz il tempo viene misurato in microsecondi, la tensione di funzionamento è di 5V, quindi potremo alimentarlo direttamente utilizzando Arduino.

L’HC-SR04 è dotato di 4 piedini: GND, eco, trigger, +Vcc.

Per convertire l’intervallo di tempo misurato in una lunghezza, bisogna ricordare che la velocità del suono è di 331,5 m/s a 0 °C e di 343,4 m/s a 20 °C ed in generale varia secondo la relazione:

v = 331,4 + 0,62 T

dove la temperatura T è misurata in °C.

Per effettuare una misura di distanza di un ostacolo assumiamo di lavorare ad una temperatura ambiente di 20 °C e quindi la velocità del suono sarà di 343 m/s (approssimiamo) che vuol dire anche 0,0343 cm/microsecondi.

Quindi, ricordando che v=s/t (v: velocità, s: spazio, t: tempo) allora lo spazio percorso sarà:

s = v*t

da cui

s = 0,0343 *t

però, per calcolare lo spazio percorso, bisogna tener conto che il suono percorre due volte la distanza da misurare (giunge sull’oggetto e ritorna indietro al sensore) quindi il valore di t ottenuto deve essere diviso per 2. La formula corretta per la misura dello spazio percorso è:

s = 0,0343 * t/2

eseguendo la divisione di 0,0343/2 possiamo scrivere:

s = 0,01715 * t

oppure:

s = t/58,31

approssimando

s = t/58

formula più semplice da ricordare.

Per calcolare la distanza dell’oggetto dal sensore sarà sufficiente dividere il tempo t (tempo impiegato dal segnale per giungere sull’oggetto e tornare al sensore) per 58.

Per poter effettuare una misurazione viene mantenuto a livello basso il pin Trigger, dopo di che viene fornito un impulso a livello alto della durata minima di 10µs riportandolo poi a livello basso, dopo questo momento la capsula trasmittente emette un burst (sequenza di livelli alti/bassi) a circa 40KHz, l’onda ultrasonica generata (burst) colpisce l’ostacolo, torna indietro venendo rilevata dalla capsula ricevente. L’elettronica del sensore effettua un calcolo del tempo di andata e ritorno del segnale emettendo sul pin Echo, normalmente a livello basso, un segnale a livello alto direttamente proporzionale alla distanza dell’ostacolo:

31-edurobot-uno

Descrizione delle sezioni dello sketch 6

Nota: si descrivono solo le sezioni aggiunte rispetto agli sketch precedenti.

Variabili utilizzate per la calibrazione di DotBot

Calibrazione della rotazione di DotBot

Per la calibrazione manuale decommentare la sezione che si intende utilizzare

Impostazione del sensore ad ultrasuoni

Questa sezione è dedicata all’impostazione del sensore ad ultrasuoni.

La variabile “durata” è il tempo impiegato dall’onda ultrasonica per giungere al rilevatore, questo valore verrà utilizzato per il calcolo della distanza dell’oggetto.
Le due variabili: pin_segnale e pin_trig sono quelle associate ai pin signal e trigger del sensore ad ultrasuoni.

Descrizione funzionamento loop()

Nel caso in cui si voglia calibrare DotBot togliere il commento a calibrazioneRotazione(scala) e commentare il resto del codice presente in loop().

Nel loop() come prima azione viene memorizzata nella variabile misuraDistanza il valore restituito dalla funzione che calcola la distanza dell’ostacolo: distanzaOstacolo() che riceve le informazioni dal sensore ad ultrasuoni.
Se la distanza misurata è maggiore della distanzaPericolo, la minima distanza dall’ostacolo, allora vuol dire che DotBot può continuare ad andare avanti, altrimenti se la misuraDistanza è inferiore alla distanza di pericolo bisogna fermare DotBot ed effettuare il cambio di direzione

Scelta della direzione da prendere

DotBot effettua una rotazione di 90° a destra, effettua la lettura ed assegna il valore letto alla variabile distanzaDestra, si ferma nella posizione per mezzo secondo.
DotBot effettua una rotazione di 180° in senso antiorario rispetto alla precedente posizione effettua la lettura della distanza dell’ostacolo che viene memorizzata nella variabile distanzaSinistra, si ferma nella posizione per mezzo secondo.
Si pone nuovamente in posizione frontale ruotando in senso orario di 90°, mantiene la posizione ed invoca la funzione paragonaDistanze() che verifica quale delle due misure risulta maggiore.

Lettura della distanza dell’ostacolo

La modalità di funzionamento di questa funzione è stata descritta nella parte iniziale della sezione dedicata allo sketch 6.

Paragonare le distanze per la scelta del percorso

Nel caso in cui l’ostacolo che si trova a sinistra è ad una distanza maggiore da quello dell’ostacolo di destra, allora DotBot ruoterà in senso antiorario di 90° e manterrà la posizione raggiunta per mezzo secondo.

Se invece l’ostacolo che si trova a destra si trova a distanza maggiore di quello di sinistra, allora DotBot ruoterà in senso orario di 90° e manterrà la posizione raggiunta per mezzo secondo.

Se le distanze degli ostacoli a sinistra e a destra sono identiche, DotBot ruota di 180° in senso orario e mantiene la posizione per 1 secondo.

Rotazione antioraria e oraria

Le due funzioni sono state parametrizzate ed accettano come variabile di ingresso tempoRotazione che è quello che viene valutato in fase di calibrazione manuale.

Movimento in avanti

Per movimentare DotBot in avanti è necessario far girare la ruota sinistra in senso antiorario e lo destra in senso orario alla velocità massima.
Nella funzione sono state aggiunte le variabili avantiDx e avantiSx che permettono una regolazione fine della velocità di rotazione delle due ruote che potrebbe essere leggermente differente.

Movimento indietro

Stessa modalità di funzionamento della precedente funziona ma in questo caso DotBot si muoverà in senso opposto.

Proposte esercizi di approfondimento

Esercizio 1
Ad ogni stop del robot si accendere un led rosso.

Esercizio 2
Ad ogni stop si accendere un led rosso e durante la scelta della direzione lampeggia un led giallo.

Esercizio 3
Ad ogni stop si accendere un led rosso e durante la scelta della direzione lampeggia un led giallo, mentre il movimento in avanti ed indietro è evidenziato da un led verde acceso che dovrà spegnersi durante la scelta della direzione.

Esercizio 4
Aggiungere al circuito dell’esercizio precedente un buzzer che all’avvio del robot per 2 secondi, vengano suonate alcune note musicali.

Esercizio 5
Aggiungere al circuito dell’esercizio precedente un buzzer che all’avvio del robot per 2 secondi,emetta un jingle musicale ed ogni volta che viene effettuata la rilevazione del percorso da intraprendere vengano suonate alcune note musicali.

Esercizio 6
Aggiungere una funzione di casualità che ad intervalli prestabiliti fa cambiare direzione al robot indipendentemente dalla scelta della direzione verso l’ostacolo più lontano.

Buona sperimentazione a tutti 🙂

Articoli simili:

Questa voce è stata pubblicata in arduino, corsi, i miei allievi, programmazione, tutorial e contrassegnata con , , , , , , , . Contrassegna il permalink.

2 risposte a Controlliamo DotBot con Arduino

  1. Arrigo scrive:

    Ottimo, ottimo articolo (ripetizione voluta!!)
    Grazie per la costante immissione in rete degli articoli e demo e nws ; ma qualche volta riesci a dormire?? ;-))
    da un affezionato lettore . Arrigo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.