Skip to Content

Sensore di Distanza GP2Y0E03 con Arduino

Sensore di Distanza GP2Y0E03 con Arduino

In questo tutorial imparerai come utilizzare il sensore di distanza a infrarossi GP2Y0E03 con un Arduino o qualsiasi altro microcontrollore comune (ESP32/ESP8266) per misurare distanze fino a 50 cm.

Il GP2Y0E03 utilizza la riflessione della luce IR e la triangolazione per determinare la distanza dagli oggetti. Le applicazioni tipiche sono robot per la pulizia, interruttori senza contatto e macchine da gioco.

Componenti necessari

Per prima cosa, ti servirà un sensore di distanza GP2Y0E03. In secondo luogo, ti servirà un microcontrollore. Ho usato un Arduino Uno per questo progetto, ma va bene anche qualsiasi altro Arduino o ESP32/ESP8266.

Sensore di distanza GP2Y0E03

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Caratteristiche del sensore di distanza GP2Y0E03

Il GP2Y0E03 è un piccolo sensore che utilizza la luce a infrarossi (IR) e la triangolazione per misurare la distanza da un oggetto. Il sensore emette un impulso IR e, a seconda della distanza dell’oggetto, l’impulso riflesso appare spostato sulla piastra del rilevatore. Vedi l’immagine sotto per illustrazione.

Distance measurement by Triangulation
Misurazione della distanza tramite triangolazione (source)

L’intervallo di misura va da 4 a 50 cm con un intervallo di aggiornamento tra le misurazioni di circa 40 ms. La tensione di alimentazione per il sensore GP2Y0E03 è da 2,7 a 5,5 V e il consumo medio di corrente è di 26 mA.

Pinout del GP2Y0E03

Il sensore GP2Y0E03 fa parte della famiglia che include i sensori GP2Y0E02A e GP2Y0E02B. Tuttavia, il GP2Y0E03 è l’unico che ha un’uscita analogica e una digitale (I2C). L’immagine sotto mostra il pinout del sensore.

Pinout of GP2Y0E03 Sensor
Pinout del sensore GP2Y0E03
  • Il pin 1 è l’alimentazione positiva (2,7 a 5,5 V).
  • Il pin 2 è Vout(A), l’uscita analogica che restituisce una tensione inversamente proporzionale alla distanza.
  • Il pin 3 è la massa (GND) dell’alimentazione.
  • Il pin 4 è VIN(IO), la tensione di alimentazione per l’interfaccia I2C, che deve essere tra 1,8 e 3,3 V.
  • Il pin 5 è GPIO1, che può essere usato per abilitare o disabilitare il sensore.
  • Il pin 7 e il pin 6 sono le linee SDA e SCL dell’interfaccia I2C.

Il sensore solitamente viene fornito con un connettore JST senza saldature a 7 pin e cavi compatibili con la maggior parte dei sensori di distanza Sharp. Nota però che la codifica colore dei fili è fuorviante. Per esempio, il nero NON è massa e il rosso NON è alimentazione positiva. Vedi l’immagine dei cavi del sensore sotto:

Connector cable for GP2Y0E03 Sensor
Cavo connettore per sensore GP2Y0E03

Schema interno del GP2Y0E03

Lo schema interno del GP2Y0E03 qui sotto mostra il LED IR con il suo driver LED responsabile dell’emissione dell’impulso IR. Il sensore CMOS (rilevatore) riceve l’impulso riflesso, e un convertitore AD lo trasforma in un segnale digitale che viene elaborato dal Digital Signal Processor (DSP).

Internal Schematic of GP2Y0E03 Sensor
Schema interno del sensore GP2Y0E03 (source)

Il DSP calcola la distanza dall’oggetto e la comunica tramite l’interfaccia I2C (SCL, SDA). Inoltre, questa misura digitale della distanza viene convertita in un segnale analogico tramite il convertitore DA e inviata al pin di uscita Vout.

Specifiche del GP2Y0E03

Secondo il Datasheet le principali caratteristiche del sensore GP2Y0E03 sono le seguenti:

  • Circuito di elaborazione del segnale integrato (DSP)
  • Intervallo di misura della distanza: 4 a 50 cm
  • Funzionamento a bassa tensione: minimo 2,7 V
  • Dimensioni compatte (16,7 × 11,0 × 5,2 mm)
  • Uscita digitale (I2C) e analogica

Ho riscontrato che il sensore può effettivamente misurare distanze tra 3 cm fino a 60 cm o poco più. D’altra parte, le misurazioni non sono molto precise, specialmente se confrontate con sensori di distanza laser Time-of-Flight.

Per maggiori dettagli consulta il datasheet e le note applicative del GP2Y0E03 linkati qui sotto:

Collegare il GP2Y0E03 ad Arduino

Il GP2Y0E03 offre un’uscita digitale (I2C) e un’uscita analogica. Puoi usare una delle due, ma nello schema di collegamento sotto ho collegato entrambe, così possiamo confrontare le distanze riportate tramite l’interfaccia digitale o analogica.

Per l’interfaccia I2C colleghiamo la linea SDA collegando A4 dell’Arduino al pin 7 del GP2Y0E03. Per la linea SCL colleghiamo A5 al pin 6. Vedi l’immagine sotto.

Connecting GP2Y0E03 with Arduino
Collegamento GP2Y0E03 con Arduino

Per l’uscita analogica (vout), colleghiamo il pin 2 del GP2Y0E03 con A3 dell’Arduino. Puoi usare anche uno degli altri ingressi analogici rimanenti (A0…A2) ma dovrai modificare il codice che ti mostrerò nelle sezioni successive.

Successivamente colleghiamo l’alimentazione. Iniziamo collegando la massa (GND) dell’Arduino al pin 3 del GP2Y0E03. Infine colleghiamo 3.3Vdell’Arduino ai pin 5 (GPIO1), 4 (VIN(IO)) e 1 (VDD).

Nota che secondo il Datasheet del GP2Y0E03, VDD può arrivare fino a 5,5 V ma VIN(IO) può essere solo fino a 3,3 V (vedi condizioni di funzionamento sotto). Perciò dobbiamo usare 3,3 V per VIN e VIO. Anche se ho provato con 5 V e il sensore ha funzionato e resistito (non consigliato però).

Recommended Operating Conditions of GP2Y0E03
Condizioni operative consigliate del GP2Y0E03 (source)

L’ingresso GPIO1 (pin 5) permette di abilitare (attivo) o disabilitare (standby) il sensore. Puoi collegare GPIO1 a un’uscita digitale dell’Arduino per accenderlo o spegnerlo. Questo è utile se vuoi collegare più sensori GP2Y0E03 con lo stesso indirizzo I2C sulla stessa interfaccia I2C, o se vuoi risparmiare energia tra una misura e l’altra.

In modalità standby (disabilitato) il GP2Y0E03 consuma solo 20 µA, mentre in media consuma 26 mA. Tuttavia, il Datasheet afferma che serve un’alimentazione in grado di fornire fino a 150 mA poiché la corrente dell’impulso del LED IR è di 100 mA.

Codice per misurare la distanza con GP2Y0E03

In questa sezione scriveremo un codice semplice che legge le distanze misurate dal GP2Y0E03 e le stampa sul Monitor Seriale.

Installare la libreria GP2Y0E03

Purtroppo non esiste una libreria Arduino per il sensore GP2Y0E03 (a ottobre 2024). Quindi ho implementato la mia. Per installare questa libreria GP2Y0E03 vai su GP2Y0E03_arduino_lib repo e clicca sul pulsante verde “Code”. Poi clicca su “Download Zip” come mostrato sotto:

Download GP2Y0E03  library
Scarica la libreria GP2Y0E03

Poi vai su “Sketch” -> “Include Library” -> “Add .Zip Library..” e seleziona il file “GP2Y0E03_arduino_lib-main.zip” che hai appena scaricato:

Adding TOF10120 library to sketch
Aggiungere la libreria TOF10120 allo sketch

In alternativa, puoi scaricare l’intero codice del repository, comprimerlo in zip e poi includere la libreria nello stesso modo descritto sopra. Oppure puoi semplicemente copiare e incollare i file GP2Y0E03.h e GP2Y0E03.cpp nella cartella del tuo progetto.

Codice per misurare distanze con GP2Y0E03

Il codice di esempio seguente mostra come misurare distanze con il sensore GP2Y0E03 usando contemporaneamente l’uscita digitale e quella analogica.

#include "GP2Y0E03.h"

GP2Y0E03 sensor = GP2Y0E03();

void setup() {
  Serial.begin(9600);
  sensor.init(A3);
}

void loop() {
  Serial.print("digital:");
  Serial.println(sensor.distDigital());

  Serial.print("analog:");
  Serial.println(sensor.distAnalog());

  Serial.println();
  delay(1000);
}

Iniziamo includendo il file header GP2Y0E03 e creando l’oggetto sensore:

#include "GP2Y0E03.h"

GP2Y0E03 sensor = GP2Y0E03();

L’indirizzo I2C predefinito a 7 bit del GP2Y0E03 è 0x40. Ma puoi anche specificare un indirizzo I2C diverso nel costruttore GP2Y0E03(address).

Nella funzione setup, inizializziamo la comunicazione seriale con baud rate 9600 e anche il sensore, con la sua uscita analogica (vout) collegata all’ingresso analogico A3 dell’Arduino:

void setup() {
  Serial.begin(9600);
  sensor.init(A3);
}

Se non vuoi usare l’uscita analogica, inizializza il sensore con init() o init(-1). Inoltre, se devi usare pin SDA e SCL specifici sul tuo microcontrollore, puoi chiamare init(vout, sda, scl) o init(sda, scl).

Nella funzione loop chiamiamo poi sensor.distDigital() per leggere la distanza via I2C, e sensor.distAnalog() per leggere la distanza tramite l’uscita analogica del GP2Y0E03.

void loop() {
  Serial.print("digital:");
  Serial.println(sensor.distDigital());

  Serial.print("analog:");
  Serial.println(sensor.distAnalog());

  Serial.println();
  delay(1000);
}

Stampiamo entrambe le distanze sul Monitor Seriale e poi aspettiamo 1 secondo. Nota che non dovresti interrogare il sensore più velocemente di 40 ms.

Output su Monitor Seriale e Serial Plotter

Lo screenshot sotto mostra un esempio di output del codice sul Monitor Seriale. Puoi vedere che le distanze misurate differiscono a seconda che vengano riportate dall’uscita digitale o analogica. Questo è in parte dovuto alla calibrazione del segnale analogico (ne parleremo più avanti).

Output of GP2Y0E03 on Serial Monitor
Output del GP2Y0E03 sul Monitor Seriale

Se giochi un po’ con il sensore e il codice noterai che viene restituito un valore -1 se ti avvicini troppo al sensore (< 3 cm) o se la distanza supera i 60 cm.

Il Serial Plotter mostra che le distanze restituite dall’uscita analogica e digitale sono altamente correlate, ma che l’uscita analogica mostra valori anomali (distanze negative):

Output of GP2Y0E03 on Serial Plotter
Output del GP2Y0E03 sul Serial Plotter

Calibrazione dell’uscita analogica

L’uscita digitale (I2C) del GP2Y0E03 fornisce la distanza misurata direttamente in centimetri. L’uscita analogica, invece, restituisce solo una tensione di uscita (Vout) che deve essere calibrata per convertirla in distanza.

Il grafico seguente mostra che esiste una relazione inversa tra Vout e la distanza:

Relationship between Vout and distance of GP2Y0E03
Relazione tra Vout e distanza del GP2Y0E03 (source)

Il GP2Y0E03 library esegue questa calibrazione internamente ma permette anche di regolare la calibrazione per il tuo specifico sensore o microcontrollore, se necessario. Il processo è il seguente:

  1. Posiziona il sensore a una distanza ridotta da un oggetto, ad esempio 3 cm (distMin)
  2. Registra il valore corrispondente di Vout, ad esempio 448 (voutMin)
  3. Posiziona il sensore a una distanza maggiore da un oggetto, ad esempio 30 cm (distMax)
  4. Registra il valore corrispondente di Vout, ad esempio 289 (voutMax)
  5. Calibra il sensore: calibrateAnalog(voutMin, voutMax, distMin, distMax);

Puoi usare il codice seguente per stampare Vout, dove Vout non è una tensione ma il valore digitale prodotto dal convertitore Analogico-Digitale dell’Arduino. A seconda del tuo microcontrollore e del suo convertitore AD potresti leggere valori diversi.

#include "GP2Y0E03.h"

GP2Y0E03 sensor = GP2Y0E03();

void setup() {
  Serial.begin(9600);
  sensor.init(A3);
}

void loop() {
  Serial.println(sensor.vout());
  delay(1000);
}

Una volta ottenute le misurazioni per voutMin, voutMax, distMin e distMax, (ad esempio 448, 289, 3, 30) puoi calibrare la misura analogica della distanza come segue:

#include "GP2Y0E03.h"

GP2Y0E03 sensor = GP2Y0E03();

void setup() {
  Serial.begin(9600);
  sensor.init(A3);
  sensor.calibrateAnalog(448, 289, 3, 30);
}

void loop() {
  Serial.print("analog:");
  Serial.println(sensor.distAnalog());
  delay(1000);
}

Conclusioni

In questo tutorial hai imparato come usare il sensore di distanza GP2Y0E03 con un Arduino per misurare distanze.

Il GP2Y0E03 è simile ad altri sensori di distanza a infrarossi come il GP2Y0A710K0F o il GP2Y0A21YK0F e usa la triangolazione per determinare la distanza da un oggetto. Tuttavia, oltre all’uscita analogica comune, ha anche un’uscita digitale (I2C).

Rispetto ai sensori di distanza laser Time-of-Flight (ToF) come il VL6180X, VL53L1X, VL53L0X o TOF10120, i sensori basati su triangolazione sono meno precisi e hanno un raggio d’azione più corto. Un altro svantaggio è che non possono misurare distanze quando l’oggetto è troppo vicino (es. < 3 cm) e hanno difficoltà con oggetti molto riflettenti (es. specchi inclinati). D’altra parte, questi sensori tendono a costare meno rispetto ai sensori di distanza ToF.

Se hai domande, sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il fai-da-te ; )