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.
16 commenti
3 ping
Vai al modulo dei commenti
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
Autore
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
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
Autore
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
Ciao mauro,
Se montassi il sensore su di un robot a 4 ruote e lo impostassi che a una certa distanza da un ostacolo il robot si fermi e torni indietro, ci sono dei problemi se il sensore nn sia perpendicolare all’ostacolo o anche se forma un angolo di inclinazione con questo, il sensore legge bene la distanza ed esegue l’operazione?
Grazie, Michele .
Autore
Ciao Michele,
trattandosi di un sensore ottico si basa sulla riflessione di un fascio di luce invisibile sull’ostacolo.
Ne deduci da solo che se l’angolo di inclinazione del sensore rispetto all’ostacolo non è perpendicolare avrai delle differenze di valutazione.
salve
sto testando il sensore sharp GP2Y0A21YK0F
utilizzando il codice da voi riportato utilizzandolo con la libreria.
Ho notato che anche con i sensori scollegati da arduino sul
monitor seriale continuano ad arrivano misure. e’ normale??
Inoltre vorrei chiedervi qualche consiglio su
come azionare contemporaneamente 2 sensori
e leggere i valori di entrambi sul display
grazie
Gino
Autore
Ciao Gino, si é normale. Quando non é collegato nulla ai pin analogici essi fluttuano tra valori casuali. Ti consiglio di leggere un po’ di articoli sul blog, magari partendo dal corso base gratuito che ho pubblicato a disposizione di tutti gli appassionati, come te, che iniziano con arduino.
Se ti occorre aiuto a comprendere qualche descrizione usa pure i commenti.
Grazie Mauro
Confermo che sono un novellino su arduino.
Spero grazie al tuo sito di poter apprendere e riuscire a realizzare
Il mio primo progetto.
Sicuramente tornero’ in futuro a chiederti qualche consiglio
Ciao e grazie
Autore
Ciao Gino,
lo sono anch’io .. non si finisce mai di scoprire nuove possibilità con arduino 🙂
Scusa mauro,sapresti dirmi dove prendere la libreria “DistanceGP2Y0A21YK.h”?
perchè se no lo sketch risulta sbagliato.
Autore
Ciao Luca,
quando trovo ed uso una libreria di solito riporto il link nel progetto, hai letto bene il mio articolo?
Troverai il link nel testo, ho appena verificato.
Ti chiedo, in futuro, prima di scrivermi di leggere attentamente i miei articoli e cercare di comprenderli se vuoi imparare a usare arduino per i tuoi progetti.
Ciao Mauro.
Sto utilizzando 4 sensori sharp 2D120 X e sto utilizzando il tuo tipo di sketch per leggere il valore in cm… tuttavia quando lo sketch viene caricato il sensore letto è solamente uno… praticamente ho fatto in modo che con un pulsante vengano visualizzate le 4 diverse distanze sul display LCD ma le 4 distanze non sono una per ogni sensore ma vengono tutte da un unico sensore… come devo fare? Ciao grazie
Autore
Ciao Simone,
hai già modofocato lo sketch per leggere i 4 sensori su 4 pin separati?
Ciao
Io dovrei usarne più di uno di quei sensori, e dovrei metterli uno affilato all’altro, volevo sapere se si creano dei disturbi tra di loro, più o meno di quanti gradi è il cono di rilevazione?
Autore
Ciao Francesco,
penso tu possa trovare le risposte sul datasheet del produttore.
[…] +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 […]
[…] Qualche sensore come i sempre-verdi Sharp. […]
[…] Qualche sensore come i sempre-verdi Sharp. […]