Il sensore: SHARP 2D120X ha un costo contenuto, sotto i 20 euro, ed è utilissimo per realizzare i tuoi primi robot.

Per mostrarti come utilizzare questo sensore ho deciso di acquistarne uno e fissarlo al tavolo, collegarlo ad arduino e costruirmi un sistema di squadrette che possano scorrere le une sulle altre.
Giocando con questi 2 assi puoi realizzare delle misurazioni e comprendere meglio cosa rileva il sensore.
Caratteristiche del sensore
se prendi come riferimento il datasheet del costruttore: SHARP 2D120X questo sensore è in grado di rilevare da 4 a 30cm un oggetto.
Non è un sensore di precisione ed il suo funzionamento non è lineare come mostra il grafico di risposta estratto dal datasheet ufficiale:

per questo motivo le distanze inferiori saranno più precise e più facili da rilevare rispetto alle distanze maggiori.
Come funziona
Questa tipologia di sensore funziona sul principio della riflessione, ossia un led a raggi infrarossi emette una luce ( impercettibile all’occhio umano e non dannosa) ed un ricevitore cattura il fascio dopo che questo si è riflesso contro l’ostacolo:

la distanza è calcolata grazie all’angolo con cui il fascio di luce si infrange contro la parte ricevente del sensore, questo angolo viene trasformato dall’elettronica a bordo del sensore in una variazione in volt da 2.55 a 1.95 ossia a distanza inferiore corrisponde maggiore voltaggio erogato.
il piano per il test
Per costruirlo puoi bloccare il sensore con del nastro adesivo al tavolo:

poi prepari una riga ed una squadretta in modo che scorrano una sull’altra, la riga la fermi lungo l’asse perpendicolare al sensore:

e sulla squadretta poni un cartoncino scuro in modo che abbia un lato verticale difronte al sensore:

sei pronto per eseguire il test.
Lo sketch
inizialmente ho pensato di darti io uno sketch semplice con cui leggere un segnale analogico, nel mio caso ho collegato al pin A5 il Vo del sensore; cercando in internet ho trovato la libreria scritta per i sensori Sharp, nella realtà è scritta per il sensore GP2Y0A21YK che opera da 10 a 80 cm ma l’ho testato anche con questo sensore riscontrando una certa precisione fino ai 9 cm, oltre la misura va ritarata.
All’interno del file zip c’è sia la liberia vera e propria sia alcuni sketch di esempio, io ho provato quello che stampa nel moritor seriale la distanza in cm tra l’oggetto ed il sensore:
#include <DistanceGP2Y0A21YK.h>
DistanceGP2Y0A21YK Dist;
int distance;
void setup()
{
Serial.begin(9600);
Dist.begin(A5);
}
void loop()
{
distance = Dist.getDistanceCentimeter();
Serial.print("\nDistance in centimers: ");
Serial.print(distance);
delay(500); //make it readable
}
Lo sketch è davvero semplice, sono solo 18 linee di codice:
linea 01: includi la libreria di interfaccia per il sensore;
linea 03: inizializza l’oggetto Dist come istanza della classe DistanceGP2Y0A21YK;
line 04: imposta una variabile di tipo integer distance;
La funzione setup() ti serve per definire la comunicazione seriale e per indicare all’oggetto Dist su quale pin restare in ascolto dal sensore;
linea 08: imposta la comunicazione seriale con una velocità di 9600 baud, ricordati di impostare il monitor seriale alla medesima velocità;
linea 09: indica all’oggetto Dist su quale pin è collegato il Vo del sensore, nei miei test io ho utilizzato il pin A5;
linea 14:leggi dal pin A5 il valore inviato dal sensore e assegnalo alla variabile distance mediante il metodo getDistanceCentimeter() che restituisce il valore convertito in centimetri;
linea 15: scrivi a video la frase “Distance in centimers: “;
linea 16: aggiunge in fondo alla linea appena stampata sul monitor seriale il valore letto alla linea 14;
line 17: attende un tempo di 500 millisecondi (1/2 secondo) prima di ricominciare il ciclo di loop().
Utilizzando questo sketch noterai che la corrispondenza tra la distanza dell’oggetto ed il valore impostato non è costante ossia leggerai sul monitor seriale:
| distanza oggetto (cm) | distanza letta su arduino |
| 4 | 0 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9,3 | 9 |
| 10,4 | 10 |
| 11,9 | 11 |
| 13,3 | 12 |
| 14,9 | 13 |
| 16,5 | 14 |
| 18,2 | 15 |
| 20 | 16 |
| 15,5 | 17 |
Questo ti indica che fino ai 10cm la classe risponde in modo lineare, successivamente si discosta dalla misura reale, la differenza è dovuta al fatto che i due sensori non sono identici e che gestiscono in modo differente l’output di tensione a parità di distanza, in particolare il sensore 2D120X presenta una curva di risposta distanza/Vo mostrata sopra mentre il sensore GP2Y0A21YK ha una curva di questo tipo:
Per utilizzare quella classe dovresti modificarla ad hoc, in alternativa proverò a realizzare una tabella di conversione ed uno sketch adatto a risolvere questa differenza.
Per adesso ti consiglio di utilizzare la classe indicata solo per distanze inferiori ai 10 cm.
Ecco un video interssante realizzato con questo sensore:
Buon divertimento.







4 comments
1 ping
Thomas
4 ottobre 2012 a 12:34 (UTC 2) Link to this comment
Ciao Mauro, volevo chiederti una precisazione, giusto per capire meglio il mio problema.
Sto usando un sensore sharp GP2Y0A21YK per controllare i canali RGB di una striscia led, per il momento è programmato per gestirne uno solo, ma il primo problema evidente è che sia da una distanza elevata (80cm) che ravvicinata (10cm) il segnale sembra piuttosto instabile, cioè la luce “sfarfalla”.
Questo secondo te dipende dalla non elevata precisione del sensore ?
E se così fosse c’è un modo per correggerla ? magari nello sketch ?
Grazie infinite
Mauro Alfieri
5 ottobre 2012 a 08:29 (UTC 2) Link to this comment
Ciao Thomas,
se la luce sfarfalla non penso sia direttamente lagato al sensore, per stabilirlo con certezza dovrei conoscere che cosa vuoi ottenerecambiando la distanza dell’oggetto dinanzi al sensore.
Lo sfarfallio mi sembra di natura elettrica, tuttavia se così non fosse certamente puoi intervenire introducendo il concetto di tolleranza tra i valori rilevati e ciò che fai inviare ai led.
Cerca la parola tolleranza nel blog, ricordo di aver scritto qualche tutorial in cui spiego cosa sia e come utilizzarla.
Mauro
Luigi
1 aprile 2013 a 14:30 (UTC 2) Link to this comment
Ciao Mauro, ottimo tutorial. Ho delle domande: posso usare un GP2Y0A21YK IR Proximity Sensor con Arduino due considerando la limitazione dei 3,3 V per gli ingressi analogici ? e la libreria funziona con il nuovo IDE? grazie
Mauro Alfieri
2 aprile 2013 a 07:30 (UTC 2) Link to this comment
Ciao Luigi,
la libreria funziona con l’ide 1.0
Per il segnale a 3,3v devi realizzare un partitore resistivo, trovi un tutorial sul blog.
Mauro
Rover5: il montaggio e il primo test - Mauro Alfieri
28 settembre 2012 a 09:46 (UTC 2) Link to this comment
[...] +5v ), GND ( polo negativo o massa ) e segnale analogico, come puoi aver letto dal datasheet e nel Tutorial: SHARP 2D120X e Arduino dedicato a questo [...]