Alessandro
Un semplice robottino basato su piattaforma di sviluppo
Tutorials -
Martedì 27 Luglio 2010 19:31
Scritto da Alessandro

Riprendo il discorso che avevo iniziato nel forum, illustrando la costruzione del telaio di un robottino che utilizza la piattaforma di sviluppo in vendita nel sito. Questo è il link. Voglio spiegare come ho realizzato un piccolo robot basato su arduino, dotato di un sensore ad ultrasuoni che gli permette di evitare gli ostacoli.

Si consideri che io sono un neofita di arduino e dei robottini in generale e mi rendo conto che ci sono centinaia di esempi simili su internet, quindi non c'è nulla di veramente originale nel mio approccio, però penso sia un progetto adeguato ad un novizio e voglio testimoniare come sia semplice realizzarlo. Si consideri che non ho 'copiato' il sw, ma l'ho scritto da zero. Solo così si impara realmente. Ho fatto tutto in meno di 3 settimane lavorandoci un po' la sera e nei weekend. Non avevo mai visto un arduino dal vivo prima!

Tanto per iniziare a far capire di cosa sto parlando, ecco una immagine del robottino:

Robottino basato su piattaforma di sviluppo

Il robottino è assemblato a partire dai seguenti componenti:

- arduino duemilanove

- piattaforma di sviluppo per robot (link)

- supporti ad elle per servi (link)

- servi Hitec HRS-1422CR a rotazione continua (link)

- ruote per servi Hitec (link)

- ruotino di acciaio (link)

- sensore ad ultrasuoni DFRobot URM37 V 3.2 (link)

- micro-servo per sensore ad ultrasuoni acquistato su ebay scegliendo quello che costava meno

- una breadboard a 400 contatti (link)

- portabatterie, cavi e viti varie

 

Cosa fa il robottino? va dritto davanti a se e controlla se ci sono ostacoli. Se ne trova, gira la 'testina' e guarda a sinistra e destra per vedere dove la strada è più libera. Poi va dalla parte della strada più libera. Come si vede niente di speciale. Un paio di video per vedere come il robottino se la cava con un percorso misto.

video 1:

http://www.youtube.com/watch?v=79eoYnDIG7g

video2:

http://www.youtube.com/watch?v=NibHrfXjEws

 

Mi è piaciuto molto il sensore ad ultrasuoni URM37. Sono disponibili delle librerie (link) che pilotano completamente il sensore. Sono molto facili da utilizzare. Il sensore abbastanza avanzato. Infatti è in grado di offrire queste funzionalità:

- rilevazione distanza da 4cm a 3m (di più non ce la fa)

- rilevazione temperatura

- pilotaggio del servo del sensore

Questo è un primo piano del sensore:

sensore ad ultrasuoni URM37

Inizialmente mi sembrava molto interessante la funzionalità di pilotaggio del servo del sensore, utilizzando il sensore stesso, tuttavia dalle prove che ho fatto non riuscivo a pilotare bene il servo che se ne andava a tutta birra da una parte all'altra. Ho utilizzato allora direttamente l'Arduino per pilotare anche il servo del sensore. Però spendendoci più tempo si può fare di meglio.

Per quanto rigurda gli altri componenti, ecco qualche commento:

- telaio e servi a elle - sono perfetti, niente da eccepire

- servi Hitec - dolente nota. Purtroppo non hanno un potenziometro per regolare lo stallo, cioè per farli stare fermi, per cui sono andato per tentativi. Inoltre non sono riuscito a capire bene come far girare il robottino di angoli precisi, se non andando per tentativi. Sono rimasto abbastanza deluso, ma leggendo in giro ho capito che è un problema un po' generalizzato nei servi a rotazione continua

- batterie e arduino: ho utilizzato due pacchi di batterie, perchè altrimenti l'arduino stentava a pilotare tutto. Non riusciva a far andare i tre servi e il sensore insieme. Separate le alimentazioni non ho avuto problemi.

- ruotino: nel complesso si comporta molto bene, scorre e ha un suo peso per dare stabilità a tutta la struttura

Ecco il listato che pilota il robottino:

#include "URMSerial.h"
#include
Servo sservo;
Servo dservo;
Servo uservo;
int ang=0;
int angolomax=0;
int distmax=0;
int value=100;
int ind=0;
int rotazione=0;

// Definizione delle misure
#define DISTANCE 1
#define TEMPERATURE 2
#define ERROR 3
#define NOTREADY 4

//angolo di riposo dei servi delle ruote
#define RIPOSOS 94
#define RIPOSOD 93

// inizializza l'oggetto della libreria urm del sensore ultrasuoni
URMSerial urm;

void setup()
{
Serial.begin(9600); // Imposta il baud rate a 9600
urm.begin(6,7,9600); // RX Pin, TX Pin, Baud Rate
sservo.attach(10); // Attacca il servo sinistro al pin 10
dservo.attach(9); // Attacca il servo destro al pin 9
uservo.attach(3); // Attacca il servo degli ultrasuoni al pin 3
uservo.write(90); // metti il servo degli ultrasuoni dritto
delay(200);
}

void loop()
{
// sservo.write(RIPOSOS); // ferma il robot
// dservo.write(RIPOSOD); // ferma il robot
sservo.write(RIPOSOS + 90); // fai andare il robot dritto
dservo.write(RIPOSOD - 90); // fai andare il robot dritto

// Richiedi la distanza al sensore ad ultrasuoni
urm.requestMeasurement(DISTANCE);
delay(50); // attendi allineamento dei servi
if(urm.hasReading())
{
switch(urm.getMeasurement(value)) // Verifica che il valore letto sia una distanza
{
case DISTANCE: // Ulteriore verifica che sia una distanza

if (value>0 & value<20) // se il valore e' distmax)
break;
} // end switch interno
} // end if(urm.hasReading())
} //end for (ang=0; ang 180)
angolomax=180;
if (angolomax < 0)
angolomax=0;

rotazione=abs(angolomax-90); //serve per far durare di più la rotazione

// scrivi un po' di valori di controllo nel serial monitor
Serial.print("Angolo inviato ai servi \t");
Serial.println(RIPOSOS+angolomax-90);
Serial.print("Valore di rotazione \t");
Serial.println(rotazione / 5);

// fai andare i servi verso l'angolo di max distanza
for (ind=1; ind < rotazione/5; ind+=1)
{
sservo.write(RIPOSOS+angolomax-90);
dservo.write(RIPOSOD+angolomax-90);
delay (40); // attendi allineamento servi
} // end for (ind=1; ind < rotazione / 9; ind+=1)
} // end if (value 0)
break;
} // end switch esterno
} // end if(urm.hasReading()) esterno

} //end loop

 

Il listato è tutto commentato, quindi spero che sia semplice da comprendere.

Ho ancora qualche problemino da risolvere: quando il robottino avanza, la 'testa' con il sensore ondeggia leggermente, senza motivo. Dovrei indagare più a fondo. Devo inoltre migliorare l'angolo di rotazione dei servi, ma trovo molta difficoltà nel pilotare i servi in modo che girino di un angolo prestabilito.

Le prossime cose che vorrei fare sono:

- utilizzare un pannello solare per alimentare l'arduino

- mettere un display per visualizzare un po' di informazioni

- collegare un lettorino mp3 per farlo parlare.

Appena ho aggiornamenti vi farò sapere.

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi