Roboduino
Nel 2009 abbiamo iniziato a sviluppare un robot con Arduino che, anno dopo anno, ha subito diverse modifiche (vedi la storia dei prototipi). Quello che è venuto fuori è un robot line-follower: dotato di due ruote e tre sensori frontali, deve riuscire a percorrere un dato percorso senza sbagliare e nel minor tempo possibile.
In questa pagina abbiamo riassunto le basi della progettazione, disponibili a chi volesse realizzarne uno simile, insieme alle migliorie che stiamo applicando ad un nuovo modello da donare al museo del calcolo della nostra città.
La scheda centrale
Il cervello del robot è relativamente semplice, visto che fa uso di soli due chip: il microprocessore ATmega328 che coordina il tutto, e il ponte H che pilota i due motori. Oltre a questi è presente un regolatore di tensione 7805 per l'alimentazione del micro (con relativi condensatori di stabilizzazione) e un led che indica che il robot è acceso.
L'ATmega328 riceve in input, sui pin analogici 0, 1 e 2
, lo stato dei tre sensori. Questo viene elaborato, e quando necessario vengono attivati i motori tramite i pin 5, 6, 10, 11. Gli ordini di start e stop vengono letti via wireless dalla seriale (pin 0 e 1), con un modulo XBee. L'altro è connesso al computer via USB o RS-232 e trasmette i comandi impartiti da terminale o dalla cloche grafica scritta da noi con Processing.
Il tutto è alimentato da un pacco batterie ricaricabili Sanyo Eneloop, che forniscono una tensione totale di 7.2V. Le abbiamo scelte perché durano molto, e i motori che abbiamo usato consumano abbastanza. Per motori con minore riduzione è possible usare anche una tensione leggermente più bassa (ma non sotto i 5V) e pile più economiche.
I motori
Nel progetto sono stati usati dei motoriduttori SBGM9, dotati di una serie di ingranaggi che riducono la velocità del motore ma ne aumentano la coppia. Questo è sempre utile, perché un robot che vada troppo veloce può non fare in tempo a rallentare in curva, finendo fuori strada.
Gli SBGM sono progettati per essere collegati a ruote acquistabili a parte, anche se un amico che lavora nel campo dei macchinari CNC ce le ha realizzate (insieme al telaio). Non tutti hanno però un CNC in casa, quindi o si comprano le ruote, o ci si arrangia. Le ruote possono essere fabbricate in casa, per chi ha una discreta manualità, oppure di può usare un altro genere di motore.
Un'alternativa è un motore servo 5v a basso costo, preso per esempio da ebay. Di solito presenta già una riduzione, ma soprattutto ha il modo per fissarlo facilmente ad una ruota anche fatta a mano con trapano e tazza. I servo hanno però una parte elettronica e un blocco che gli impedisce di fare giri con angoli maggiori di 180° o 360°, parti che vanno eliminate. Senza di queste diventa un semplice motoriduttore.
La sensoristica
Per un inseguilinee basta un solo tipo di sensore: il fototransistor. Questo emette da un led infrarosso un fascio di luce, che viene in parte assorbita dalla superficie sottostante, e in parte riflessa, in base al suo colore: superfici più scure assorbono più luce, superfici più chiare riflettono meglio. La luce riflessa è captata dal ricevitore, da cui il micro legge una tensione proporzionale alla percentuale di radiazione riuscita a tornare al sensore.
Prevalentemente vengono usati i modelli CNY70 e QRD1114, entrambi testati personalmente. In base al tipo, vanno collegati come si vede negli schemi seguenti, insieme alle resistenze da circa 220Ohm e 10kOhm; la prima riduce la corrente che attraversa il LED emettitore (altrimenti si brucerebbe), la seconda è combinata con il ricevitore per fungere da partitore di tensione.
Il programma
Lo stato del robot in funzione si può suddividere in tre fasi: l'attesa di comandi, all'interno della funzione loop()
, la calibrazione, nella funzione calibra()
e l'inseguimento della linea vero e proprio, in percorso()
.
Il robot appena acceso attende che dal computer gli venga passato l'ordine di calibrazione, non è infatti possibile dirgli di partire senza aver prima stabilito il colore della linea. Con il carattere 'c'
si avvia la procedura di calibrazione, e successivamente con 'p'
si avvia il percorso;
Nella calibrazione il robot deve essere posizionato con i sensori sulla linea trasversale di partenza e perpendicolari al percorso. Inviato il segnale 'c'
viene letto lo stato dei sensori e salvato, viene percorso qualche centimetro in avanti e viene letto e salvato lo stato dei sensori laterali, questa volta posti sopra la superficie e non sulla linea. Viene fatta una media delle letture, che stabilisce il "valore soglia" e, in base al contrasto, se la linea è scura o chiara rispetto alla superficie;
La funzione acceso(a)
restituisce un valore di verità leggendo lo stato del sensore a
e confrontandolo con il valore soglia: se la lettura è maggiore della soglia significa che il sensore è "acceso", ovvero si trova sul percorso, se è minore ne è fuori; il risultato è invertito se la linea è di colore chiaro.
La struttura portante del percorso è la struttura if... else
che analizza lo stato dei tre sensori:
if (Serial.available() > 0 && (char)Serial.read()=='s') { // Stop muovi(5); break; } if (acceso(ftrans_sx) && acceso(ftrans_c) && acceso(ftrans_dx)) { // Avanti muovi(1); } else if (acceso(ftrans_sx)) { // Sinistra muovi(4); destra=false; } else if (acceso(ftrans_dx)) { // Destra muovi(2); destra=true; } else if (!acceso(ftrans_sx) && !acceso(ftrans_c) && !acceso(ftrans_dx)) { // Sinistra o destra in base all'ultima manovra muovi(destra ? 2 : 4); } else muovi(1);
Ovviamente, se viene ricevuto lo stop il robot deve fermarsi e uscire da percorso()
, tornando in attesa. Le altre casistiche sono riassunte dall'immagine a fianco del codice: se tutti i sensori sono accesi procede dritto, se uno laterale è spento curva nella direzione opposta, se si spengono tutti riprende l'ultima curva, negli altri casi va dritto. Inoltre, ogni volta che è eseguita una curva, questa viene memorizzata in modo da essere ripristinata se il robot dovesse finire fuori strada.
Il telaio
Come le ruote, il telaio in plexiglass è stato realizzato da un amico. I motoriduttori sono stati fissati con un supporto fatto a mano, sulla base dell'originale. Il telaio della nuova versione sarà direttamente su millefori.
Riassunto
- Arduino e ATmega328;
- Moduli XBee con adattatori;
- L293D;
- Motoriduttori SBGM9 (ricorda, prova i servo);
- 7805 e 2 condensatori elettrolitici 100uF;
- 3 fototransistor QRD1114 o CNY70;
- Relative resistenze 220Ohm e 10kOhm;
- 6 batterie Sanyo Eneloop ricaricabili (7.2V totali, 1900mAh)
- Millefori, filo e spinotti vari;
Scarica lo schema PNG o Eagle - Scarica il listato