En este tutorial aprenderás a usar el sensor de distancia infrarrojo GP2Y0E03 con un Arduino o cualquier otro microcontrolador común (ESP32/ESP8266) para medir distancias de hasta 50 cm.
El GP2Y0E03 utiliza la reflexión de luz IR y triangulación para determinar la distancia a los objetos. Sus aplicaciones típicas incluyen robots de limpieza, interruptores sin contacto y máquinas de juego.
Piezas necesarias
Primero, necesitarás un sensor de distancia GP2Y0E03. Segundo, un microcontrolador. Usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o un ESP32/ESP8266 también funcionará.

Sensor de distancia GP2Y0E03

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

Protoboard
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.
Características del sensor de distancia GP2Y0E03
El GP2Y0E03 es un sensor pequeño que usa luz infrarroja (IR) y triangulación para medir la distancia a un objeto. El sensor emite un pulso IR y, dependiendo de la distancia del objeto, el pulso reflejado aparece desplazado en la placa del detector. Mira la imagen a continuación para ilustrarlo.

El rango de medición es de 4 a 50 cm con un intervalo de actualización entre mediciones de aproximadamente 40 ms. El voltaje de alimentación para el sensor GP2Y0E03 es de 2.7 a 5.5 V y el consumo promedio de corriente es de 26 mA.
Pinout del GP2Y0E03
El sensor GP2Y0E03 forma parte de la familia que incluye los sensores GP2Y0E02A y GP2Y0E02B. Sin embargo, el GP2Y0E03 es el único que tiene una salida analógica y una digital (I2C). La imagen a continuación muestra el pinout del sensor.

- El pin 1 es la alimentación positiva (2.7 a 5.5 V).
- El pin 2 es Vout(A), la salida analógica que devuelve un voltaje inversamente proporcional a la distancia.
- El pin 3 es tierra (GND) de la alimentación.
- El pin 4 es VIN(IO), el voltaje de alimentación para la interfaz I2C, que debe ser entre 1.8 y 3.3 V.
- El pin 5 es GPIO1, que puede usarse para habilitar o deshabilitar el sensor.
- Los pines 7 y 6 son las líneas SDA y SCL de la interfaz I2C.
El sensor normalmente viene con un conector JST sin soldadura de 7 pines y cables que encajan con la mayoría de los sensores de distancia Sharp. Sin embargo, ten en cuenta que el código de colores de los cables puede ser confuso. Por ejemplo, el negro NO es tierra y el rojo NO es alimentación positiva. Mira la imagen de los cables del sensor a continuación:

Esquema interno del GP2Y0E03
El diagrama esquemático interno del GP2Y0E03 que se muestra a continuación presenta el LED IR con su controlador LED, responsable de emitir el pulso IR. El imager CMOS (detector) recibe el pulso reflejado, y un convertidor AD lo transforma en una señal digital que es procesada por el procesador de señal digital (DSP).

El DSP calcula la distancia al objeto y la reporta vía la interfaz I2C (SCL, SDA). Además, esta medición digital de distancia se convierte en una señal analógica mediante el convertidor DA y se envía al pin de salida Vout.
Especificaciones del GP2Y0E03
Según el Datasheet, las principales características del sensor GP2Y0E03 son las siguientes:
- Circuito de procesamiento de señal integrado (DSP)
- Rango de medición de distancia: 4 a 50 cm
- Funcionamiento a bajo voltaje: mínimo 2.7 V
- Tamaño compacto (16.7 × 11.0 × 5.2 mm)
- Salida digital (I2C) y analógica
He comprobado que el sensor puede medir distancias entre 3 cm hasta 60 cm o un poco más. Por otro lado, las mediciones no son muy precisas, especialmente comparadas con sensores de distancia láser Time-of-Flight.
Para más detalles, consulta la hoja de datos y las notas de aplicación del GP2Y0E03 enlazadas a continuación:
Conectando el GP2Y0E03 al Arduino
El GP2Y0E03 ofrece una salida digital (I2C) y una salida analógica. Puedes usar cualquiera de las dos, pero en el diagrama de conexión a continuación conecté ambas para poder comparar las distancias reportadas por la interfaz digital y la analógica.
Para la interfaz I2C conectamos la línea SDA uniendo A4 del Arduino con el pin 7 del GP2Y0E03. Para la línea SCL conecta A5 con el pin 6. Mira la imagen a continuación.

Para la salida analógica (Vout), conectamos el pin 2 del GP2Y0E03 con A3 del Arduino. Podrías usar cualquiera de las otras entradas analógicas restantes (A0…A2), pero tendrías que ajustar el código que te mostraré en las secciones siguientes.
Luego conectamos la alimentación. Empezamos conectando tierra (GND) del Arduino con el pin 3 del GP2Y0E03. Finalmente, conectamos 3.3V del Arduino con el pin 5 (GPIO1), pin 4 (VIN(IO)) y pin 1 (VDD).
Ten en cuenta que según el Datasheet del GP2Y0E03, VDD puede ser hasta 5.5 V pero VIN(IO) solo puede ser hasta 3.3 V (ver condiciones de operación abajo). Por lo tanto, necesitamos usar 3.3 V para VIN y VIO. Aunque probé con 5 V y el sensor funcionó y sobrevivió (no recomendado).

La entrada GPIO1 (pin 5) permite habilitar (activo) o deshabilitar (standby) el sensor. Puedes conectar GPIO1 a una salida digital del Arduino para encenderlo o apagarlo. Esto es útil si quieres conectar varios sensores GP2Y0E03 con la misma dirección I2C a la misma interfaz I2C, o si quieres ahorrar energía entre mediciones.
En modo standby (deshabilitado) el GP2Y0E03 consume solo 20 µA, mientras que en promedio consume 26 mA. Sin embargo, el Datasheet indica que necesitas una fuente de alimentación que pueda entregar hasta 150 mA ya que el pulso del LED IR consume 100 mA.
Código para medir distancia con GP2Y0E03
En esta sección escribiremos un código simple que lea las distancias que mide el GP2Y0E03 y las imprima en el Monitor Serial.
Instalar la librería GP2Y0E03
Desafortunadamente no existe una librería Arduino para el sensor GP2Y0E03 (a octubre de 2024). Así que implementé la mía propia. Para instalar esta librería GP2Y0E03 ve a GP2Y0E03_arduino_lib repo y haz clic en el botón verde «Code». Luego haz clic en «Download Zip» como se muestra a continuación:

Luego ve a «Sketch» -> «Include Library» -> «Add .Zip Library..» y selecciona el archivo «GP2Y0E03_arduino_lib-main.zip» que acabas de descargar:

Alternativamente, puedes descargar todo el código del repositorio, comprimirlo y luego incluir la librería de la misma forma descrita arriba. O simplemente copiar y pegar los archivos GP2Y0E03.h y GP2Y0E03.cpp en la carpeta de tu proyecto.
Código para medir distancias con GP2Y0E03
El siguiente código de ejemplo muestra cómo medir distancias con el sensor GP2Y0E03 usando su salida digital y analógica al mismo tiempo.
#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);
}
Comenzamos incluyendo el archivo de cabecera GP2Y0E03 y creando el objeto sensor:
#include "GP2Y0E03.h" GP2Y0E03 sensor = GP2Y0E03();
La dirección I2C por defecto de 7 bits del GP2Y0E03 es 0x40. Pero también puedes especificar una dirección I2C diferente en el constructor GP2Y0E03(address).
En la función setupiniciamos la comunicación serial con una velocidad de 9600 baudios y también iniciamos el sensor, con su salida analógica (vout) conectada a la entrada analógica A3 del Arduino:
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
Si no quieres usar la salida analógica solo inicializa el sensor con init() o init(-1). Además, si necesitas usar pines SDA y SCL específicos en tu microcontrolador puedes llamar a init(vout, sda, scl) o init(sda, scl).
En la función loopllamamos a sensor.distDigital() para leer la distancia vía I2C, y a sensor.distAnalog() para leer la distancia vía la salida analógica del GP2Y0E03.
void loop() {
Serial.print("digital:");
Serial.println(sensor.distDigital());
Serial.print("analog:");
Serial.println(sensor.distAnalog());
Serial.println();
delay(1000);
}
Imprimimos ambas distancias en el Monitor Serial y luego esperamos 1 segundo. Ten en cuenta que no debes hacer consultas más rápidas que cada 40 ms.
Salida en el Monitor Serial y Serial Plotter
La captura de pantalla a continuación muestra una salida de ejemplo del código en el Monitor Serial. Puedes ver que las distancias medidas difieren según la salida digital o analógica. Esto se debe en parte a la calibración de la señal analógica (más sobre eso después).

Si juegas un poco con el sensor y el código notarás que se devuelve un valor de -1 si te acercas demasiado al sensor (< 3 cm) o si la distancia supera los 60 cm.
El Serial Plotter muestra que las distancias devueltas por la salida analógica y digital están altamente correlacionadas, pero que la salida analógica muestra valores atípicos (distancias negativas):

Calibración de la salida analógica
La salida digital (I2C) del GP2Y0E03 entrega la distancia medida directamente en centímetros. La salida analógica, sin embargo, solo devuelve un voltaje de salida (Vout) que debe calibrarse para convertirlo en distancia.
El siguiente gráfico muestra que existe una relación inversa entre Vout y la distancia:

El GP2Y0E03 library realiza esta calibración internamente pero también te permite ajustar la calibración para tu sensor o microcontrolador específico, si es necesario. El proceso es el siguiente:
- Coloca el sensor a una distancia pequeña de un objeto, por ejemplo 3 cm (distMin)
- Registra el valor correspondiente de Vout, por ejemplo 448 (voutMin)
- Coloca el sensor a una distancia larga de un objeto, por ejemplo 30 cm (distMax)
- Registra el valor correspondiente de Vout, por ejemplo 289 (voutMax)
- Calibra el sensor:
calibrateAnalog(voutMin, voutMax, distMin, distMax);
Puedes usar el siguiente código para imprimir Vout, donde Vout no es un voltaje sino el valor digital producido por el convertidor analógico-digital del Arduino. Dependiendo de tu microcontrolador y su convertidor AD puedes leer valores diferentes.
#include "GP2Y0E03.h"
GP2Y0E03 sensor = GP2Y0E03();
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
void loop() {
Serial.println(sensor.vout());
delay(1000);
}
Una vez que tengas las mediciones para voutMin, voutMax, distMiny distMax(digamos 448, 289, 3, 30) puedes calibrar la medición analógica de distancia de la siguiente manera:
#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);
}
Conclusiones
En este tutorial aprendiste a usar el sensor de distancia GP2Y0E03 con un Arduino para medir distancias.
El GP2Y0E03 es similar a otros sensores de distancia infrarrojos como el GP2Y0A710K0F o el GP2Y0A21YK0F y usa triangulación para determinar la distancia a un objeto. Sin embargo, además de la salida analógica común, también tiene una salida digital (I2C).
Comparado con sensores de distancia láser Time-of-Flight (ToF) como el VL6180X, VL53L1X, VL53L0X o TOF10120, los sensores basados en triangulación son menos precisos y tienen un rango más corto. Otra desventaja es que no pueden medir distancias cuando el objeto está muy cerca (por ejemplo, < 3 cm) y tienen dificultades con objetos muy reflectantes (por ejemplo, espejos angulados). Por otro lado, estos sensores suelen ser más baratos que los sensores de distancia ToF.
Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.
¡Feliz bricolaje ; )

