Prodotti
Brainbooster
Il sensore Sharp GP2D12 per la misura della distanza
Tutorials -
Lunedì 02 Agosto 2010 20:06
Scritto da Brainbooster

Cos'è il sensore Sharp GP2D12?

Lo Sharp GP2D12 è uno dei migliori sensori di distanza in circolazione, perchè ha tutte le caratteristiche che gli appassionati di robotica amatoriale cercano, infatti è abbastanza preciso, dal costo abbordabile e facilmente interfacciabile con i suoi 3 piedini di uscita.

Sharp range finder

L'immagine che vedete sopra è quella del sensore di cui parliamo, la dimensione si avvicina a quella reale quindi praticamente possiamo metterlo quasi dove ci pare sul nostro robot e misurerà la distanza da se stesso all'ostacolo che ha di fronte in un range che và da 10 a 80 cm dandoci in uscita una tensione proporzionale (o quasi) alla distanza.

Ma Come funziona questo sensore?

Lo sharp GP2D12, contrariamente la pensiero comune, non è il classico sensore che misura la quantità di infrarossi riflessi dalla superfice colpita, ma bensì funziona con il principio della triangolazione.

Triangolazione

Quindi riassumendo a grandi linee, il diodo infrarosso all'interno emette un fascio di luce modulato, il quale colpisce, o anche no, l'ostacolo e si disperde nelle varie direzioni tra cui anche quella che darà un riflesso più intenso perchè frontale al sensore.

Se pensiamo all'infrarosso, non come una luce diffusa (come è) ma come un raggio laser (anche se non lo è) possiamo immaginare il funzionamento come si vede nell'immagine appena sopra, quindi il "raggio "riflesso dall'ostacolo, tornando indietro andrà a colpire il sensore che è un sensore tipo CCD ed ha una lunghezza (+ o -) di 256 pixel, tutti belli in fila...

Di conseguenza a seconda del punto colpito sulla "stringa", l'elettronica interna (il DSP) calcolerà l'angolo, di conseguenza anche la distanza dall'ostacolo e darà in uscita una tensione proporzionale alla distanza calcolata.

Semplice no?

Troppo bello per essere vero

Anche troppo.... questo metodo ha qualche svantaggio, e cioè che la luce del sole (che contiene infrarossi), sia diretta che riflessa è in grado di disturbare pesantemente la lettura, e quindi è buona pratica non utilizzare le singole letture che vengono fuori dal sensore ma piuttosto prendere una decina di valori e fare una media, per appianare questo tipo di problema.

Un altro problema intrinseco del sensore è che il suo output è abbastanza rumoroso ed ogni tot di tempo spara degli inspiegabili picchi di tensione, anche questo problema è mitigabile aggiungendo una resistenza da 150 ohm con in parallelo un condensatore da 10uF sulla linea di uscita del sensore anche se così sacrifichiamo un pòi tempi di risposta portandoli dall'ordine dei microsecondi a quello dei millisecondi.

Ed in fine l'ultimo ma non meno importante dei problemi è quello della distanza minima; data l'architettura del sensore esiste un angolo massimo apprezzabile (l'ultimo pixel del CCD) oltre il quale il sensore non vede più il riflesso del raggio e quindi in uscita ci si ritrova con dei valori che hanno poco senso.. Io ho provato a spingerlo oltre il suo range consueto ed il problema si manifesta quando si scende sotto i 2 cm circa, quindi se avete intenzione di usarlo per evitare gli ostacoli con il vostro robot, ricordatevi di non posizionarlo al bordo della base ma bensì in posizione poù arretrata (almeno a 4 cm dal bordo).

E' comunque possibile ampliare entro certi limiti il range del sensore, facendo una piccola modifica che consiste nello svitare l'unica vite che è visibile sul retro del sensore e poi, prima di rimontare il corpo del sensore, aggiungere uno spessore (non metallico) in modo da distanziare il corpo del sensore dalle lenti ;)

L'output del sensore non è lineare (vedi datasheet)  http://document.sharpsma.com/files/GP2D12-DATA-SHEET.PDF ma la sua curva caratteristica è più simile ad un iperbole..

Ma come si usa?

Questo tipo di sensore dispone di tre terminali, rispettivamente Vcc (alimentazione a 5v) GND (terminale di massa e OUT (uscita dato di lettura).

Sharp GP2D12 arduino wiring

Colleghiamo  vcc all'uscita 5v di arduino e gnd ad uno dei piedini di massa, mentre per esempio il terminale di output, visto che abbiamo una tensione analogica da leggere lo collegheremo al pin 2 di arduino.

Per iniziare da subito a fare qualche esperimento apriamo l'ide di arduino e scriviamo il seguente codice:

int tot = 0;                  // Il nostro totale
void setup()
{
Serial.begin(9600);
}

float read_ir(byte pin) {
int temptot;
temptot = analogRead(pin);
if (temptot < 3)
return -1; // Valore non valido

return (6787.0 /((float)temptot - 3.0)) - 4.0;
}
void loop()
{
tot = read_ir(2);  // Diciamo ad arduino a quale pin applicare la funzione di letture
// in questo caso il pin 2
// e immagazziniamo il valore nella variabile "tot".
Serial.print("Distanza: ");
Serial.print(tot); // stampiamo il valore sulla seriale
Serial.println(" cm");
delay(100);       //aspettiamo un pò...
}

// Basato sul codice disponibile su: http://www.arduino.cc/playground/Main/ReadGp2d12Range

 

Ciao

Brainbooster

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

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