Neste tutorial, vais aprender a usar o Sensor de Distância Infravermelho GP2Y0E03 com um Arduino ou qualquer outro microcontrolador comum (ESP32/ESP8266) para medir distâncias até 50 cm.
O GP2Y0E03 utiliza a reflexão da luz IR e triangulação para determinar a distância a objetos. As aplicações típicas incluem robôs de limpeza, interruptores sem toque e máquinas de jogos.
Peças Necessárias
Primeiro, vais precisar de um Sensor de Distância GP2Y0E03. Depois, precisas de um microcontrolador. Usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou ESP32/ESP8266 também serve.

Sensor de Distância GP2Y0E03

Arduino Uno

Cabo USB para Arduino UNO

Conjunto de Fios Dupont

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.
Características do Sensor de Distância GP2Y0E03
O GP2Y0E03 é um sensor pequeno que usa luz Infravermelha (IR) e triangulação para medir a distância a um objeto. O sensor emite um pulso IR e, dependendo da distância do objeto, o pulso refletido aparece deslocado na placa do detector. Veja a imagem abaixo para ilustração.

O intervalo de medição é de 4 a 50 cm com um intervalo de atualização entre medições de cerca de 40ms. A tensão de alimentação para o sensor GP2Y0E03 é de 2,7 a 5,5V e o consumo médio de corrente é de 26mA.
Pinout do GP2Y0E03
O sensor GP2Y0E03 faz parte da família que inclui os sensores GP2Y0E02A e GP2Y0E02B. No entanto, o GP2Y0E03 é o único que tem uma saída analógica e uma digital (I2C). A imagem abaixo mostra o pinout do sensor.

- O pino 1 é a alimentação positiva (2,7 a 5,5V).
- O pino 2 é Vout(A), a saída analógica que retorna uma tensão inversamente proporcional à distância.
- O pino 3 é o terra (GND) da alimentação.
- O pino 4 é VIN(IO), a tensão de alimentação para a interface I2C, que deve ser entre 1,8 e 3,3V.
- O pino 5 é GPIO1, que pode ser usado para ativar ou desativar o sensor.
- Os pinos 7 e 6 são as linhas SDA e SCL da interface I2C.
O sensor normalmente vem com um conector japonês sem solda (JST) de 7 pinos e cabos que se encaixam na maioria dos sensores de distância Sharp. Note, porém, que a codificação das cores dos fios é enganadora. Por exemplo, preto NÃO é terra e vermelho NÃO é alimentação positiva. Veja a imagem dos cabos do sensor abaixo:

Esquema Interno do GP2Y0E03
O Diagrama Esquemático Interno do GP2Y0E03 abaixo mostra o LED IR com o seu driver de LED responsável por emitir o pulso IR. O Imager CMOS (detector) recebe o pulso refletido, e um conversor AD converte-o em sinal digital que é processado pelo Processador de Sinal Digital (DSP).

O DSP calcula a distância ao objeto e reporta-a via interface I2C (SCL, SDA). Além disso, esta medição digital da distância é convertida em sinal analógico via Conversor DA e enviada ao pino de saída Vout.
Especificações do GP2Y0E03
De acordo com o Datasheet as principais características do Sensor GP2Y0E03 são as seguintes:
- Circuito de processamento de sinal incorporado (DSP)
- Intervalo de medição de distância: 4 a 50 cm
- Operação em baixa tensão: mínimo 2,7V
- Tamanho compacto (16,7 × 11,0 × 5,2mm)
- Saída digital (I2C) e analógica
Descobri que o sensor pode realmente medir distâncias entre 3 cm até 60 cm ou um pouco mais. Por outro lado, as medições não são muito precisas, especialmente quando comparadas com sensores de distância a laser Time-of-Flight.
Para mais detalhes, consulte o datasheet e as notas de aplicação do GP2Y0E03 ligados abaixo:
Ligação do GP2Y0E03 ao Arduino
O GP2Y0E03 oferece uma saída digital (I2C) e uma saída analógica. Podes usar qualquer uma delas, mas no diagrama de ligação abaixo liguei ambas para podermos comparar as distâncias reportadas via interface digital ou analógica.
Para a interface I2C, ligamos a linha SDA conectando o A4 do Arduino ao pino 7 do GP2Y0E03. Para a linha SCL, conecta o A5 ao pino 6. Veja a imagem abaixo.

Para a saída analógica (vout), ligamos o pino 2 do GP2Y0E03 ao A3 do Arduino. Podes usar qualquer uma das outras entradas analógicas restantes (A0…A2), mas terás de ajustar o código que mostro nas secções seguintes.
De seguida, ligamos a alimentação. Começamos por ligar o terra (GND) do Arduino ao pino 3 do GP2Y0E03. Finalmente, ligamos 3.3V do Arduino aos pinos 5 (GPIO1), 4 (VIN(IO)) e 1 (VDD).
Note que, de acordo com o Datasheet do GP2Y0E03, o VDD do GP2Y0E03 pode ser até 5,5V, mas o VIN(IO) só pode ser até 3,3V (veja as condições de operação abaixo). Portanto, precisamos usar 3,3V para VIN e VIO. Embora eu tenha testado 5V e o sensor tenha funcionado e sobrevivido (não recomendado, no entanto).

A entrada GPIO1 (pino 5) permite ativar (ativo) ou desativar (standby) o sensor. Podes ligar o GPIO1 a uma saída digital do Arduino para ligar ou desligar o sensor. Isto é útil se quiseres ligar vários sensores GP2Y0E03 com o mesmo endereço I2C à mesma interface I2C, ou se quiseres poupar energia entre medições.
Em modo standby (desativado), o GP2Y0E03 consome apenas 20µA, enquanto que em média consome 26mA. No entanto, o Datasheet indica que precisas de uma fonte de alimentação que possa fornecer até 150mA, pois a corrente do pulso do LED IR é de 100mA.
Código para medir distância com GP2Y0E03
Nesta secção, vamos escrever um código simples que lê as distâncias medidas pelo GP2Y0E03 e as imprime no Monitor Serial.
Instalar a biblioteca GP2Y0E03
Infelizmente, não existe uma biblioteca Arduino para o Sensor GP2Y0E03 (até outubro de 2024). Por isso, implementei a minha própria. Para instalar esta biblioteca GP2Y0E03, vai ao GP2Y0E03_arduino_lib repo e clica no botão verde “Code”. Depois clica em “Download Zip” como mostrado abaixo:

Depois vai a “Sketch” -> “Include Library” -> “Add .Zip Library..” e seleciona o ficheiro “GP2Y0E03_arduino_lib-main.zip” que acabaste de descarregar:

Alternativamente, podes simplesmente descarregar todo o código do repositório, zipá-lo e depois incluir a biblioteca da mesma forma descrita acima. Ou podes copiar e colar os ficheiros GP2Y0E03.h e GP2Y0E03.cpp na pasta do teu projeto.
Código para medir distâncias com GP2Y0E03
O código de exemplo seguinte mostra como medir distâncias com o sensor GP2Y0E03 usando a sua saída digital e analógica ao mesmo tempo.
#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);
}
Começamos por incluir o ficheiro de cabeçalho GP2Y0E03 e criar o objeto sensor:
#include "GP2Y0E03.h" GP2Y0E03 sensor = GP2Y0E03();
O endereço I2C padrão de 7 bits do GP2Y0E03 é 0x40. Mas também podes especificar um endereço I2C diferente no construtor GP2Y0E03(address).
Na função setup, iniciamos a comunicação serial com uma taxa de 9600 baud e também iniciamos o sensor, com a sua saída analógica (vout) ligada à entrada analógica A3 do Arduino:
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
Se não quiseres usar a saída analógica, basta inicializar o sensor com init() ou init(-1). Também, se precisares usar pinos SDA e SCL específicos no teu microcontrolador, podes chamar init(vout, sda, scl) ou init(sda, scl).
Na função loop chamamos sensor.distDigital() para ler a distância via I2C, e sensor.distAnalog() para ler a distância via saída analógica do GP2Y0E03.
void loop() {
Serial.print("digital:");
Serial.println(sensor.distDigital());
Serial.print("analog:");
Serial.println(sensor.distAnalog());
Serial.println();
delay(1000);
}
Imprimimos ambas as distâncias no Monitor Serial e depois esperamos 1 segundo. Nota que não deves fazer polling mais rápido que 40ms.
Saída no Monitor Serial e Serial Plotter
A captura de ecrã abaixo mostra um exemplo da saída do código no Monitor Serial. Podes ver que as distâncias medidas diferem dependendo da saída digital ou analógica. Isto deve-se em parte à calibração do sinal analógico (mais sobre isso depois).

Se experimentares um pouco com o sensor e o código, vais notar que é retornado o valor -1 se te aproximares demasiado do sensor (< 3cm) ou se a distância ultrapassar 60 cm.
O Serial Plotter mostra que as distâncias retornadas pela saída analógica e digital estão altamente correlacionadas, mas que a saída analógica apresenta valores fora do padrão (distâncias negativas):

Calibração da Saída Analógica
A saída digital (I2C) do GP2Y0E03 fornece a distância medida diretamente em centímetros. A saída analógica, no entanto, apenas retorna uma tensão de saída (Vout) que precisa ser calibrada para converter em distância.
O gráfico seguinte mostra que existe uma relação inversa entre Vout e a distância:

O GP2Y0E03 library realiza esta calibração internamente, mas também permite que ajustes a calibração para o teu sensor ou microcontrolador específico, se necessário. O processo é o seguinte:
- Coloca o sensor a uma pequena distância de um objeto, por exemplo, 3 cm (distMin)
- Regista o valor correspondente de Vout, por exemplo, 448 (voutMin)
- Coloca o sensor a uma distância maior de um objeto, por exemplo, 30 cm (distMax)
- Regista o valor correspondente de Vout, por exemplo, 289 (voutMax)
- Calibra o sensor:
calibrateAnalog(voutMin, voutMax, distMin, distMax);
Podes usar o código seguinte para imprimir Vout, onde Vout não é uma tensão, mas o valor digital produzido pelo Conversor Analógico-Digital do Arduino. Dependendo do teu microcontrolador e do seu conversor AD, podes ler valores diferentes.
#include "GP2Y0E03.h"
GP2Y0E03 sensor = GP2Y0E03();
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
void loop() {
Serial.println(sensor.vout());
delay(1000);
}
Depois de teres as medições para voutMin, voutMax, distMin e distMax, (digamos 448, 289, 3, 30) podes calibrar a medição analógica da distância da seguinte forma:
#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);
}
Conclusões
Neste tutorial aprendeste a usar o Sensor de Distância GP2Y0E03 com um Arduino para medir distâncias.
O GP2Y0E03 é semelhante a outros sensores de distância infravermelhos como o GP2Y0A710K0F ou o GP2Y0A21YK0F e usa triangulação para determinar a distância a um objeto. No entanto, além da saída analógica comum, também tem uma saída digital (I2C).
Comparado com sensores de distância a laser Time-of-Flight (ToF) como o VL6180X, VL53L1X, VL53L0X ou TOF10120, sensores baseados em triangulação são menos precisos e têm um alcance mais curto. Outra desvantagem é que não conseguem medir distâncias quando o objeto está muito próximo (ex. < 3cm) e têm dificuldades com objetos altamente reflexivos (ex. espelho inclinado). Por outro lado, estes sensores tendem a ser mais baratos que sensores de distância ToF.
Se tiveres alguma dúvida, sente-te à vontade para deixar nos comentários.
Boas experiências ; )

