Tutorial: SHARP 2D120X e Arduino

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

Sensore SHARP 2D120X

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.

sistema di squadrette

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:

risposta del sensore SHARP 2D120X

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:

sensore a riflessione

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:

Sensore SHARP GP2Y0A21YK

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

sistema di squadrette

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

sistema di test del sensore sharp

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:

risposta del sensore SHARP GP2Y0A21YK

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.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/tutorial-sharp2d120x-e-arduino.html

16 comments

3 pings

Skip to comment form

  1. 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

    1. 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 on 1 aprile 2013 at 14:30
    • Reply

    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

    1. 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

    • Michele on 13 marzo 2014 at 09:16
    • Reply

    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 .

    1. 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.

    • Gino on 19 novembre 2014 at 22:56
    • Reply

    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

    1. 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.

    • gino on 20 novembre 2014 at 07:41
    • Reply

    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

    1. Ciao Gino,
      lo sono anch’io .. non si finisce mai di scoprire nuove possibilità con arduino 🙂

    • Luca on 18 gennaio 2015 at 11:03
    • Reply

    Scusa mauro,sapresti dirmi dove prendere la libreria “DistanceGP2Y0A21YK.h”?
    perchè se no lo sketch risulta sbagliato.

    1. 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.

    • Simone on 21 aprile 2015 at 17:32
    • Reply

    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

    1. Ciao Simone,
      hai già modofocato lo sketch per leggere i 4 sensori su 4 pin separati?

    • francesco on 5 marzo 2016 at 09:13
    • Reply

    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?

    1. Ciao Francesco,
      penso tu possa trovare le risposte sul datasheet del produttore.

  1. […] +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 […]

  2. […] Qualche sensore come i sempre-verdi Sharp. […]

  3. […] Qualche sensore come i sempre-verdi Sharp. […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.