Dans ce tutoriel, vous apprendrez à utiliser le capteur de distance infrarouge GP2Y0E03 avec un Arduino ou tout autre microcontrôleur courant (ESP32/ESP8266) pour mesurer des distances jusqu’à 50 cm.
Le GP2Y0E03 utilise la réflexion de la lumière IR et la triangulation pour déterminer la distance des objets. Ses applications typiques incluent les robots de nettoyage, les interrupteurs sans contact et les machines de jeu.
Pièces requises
Tout d’abord, vous aurez besoin d’un capteur de distance GP2Y0E03. Ensuite, un microcontrôleur. J’ai utilisé un Arduino Uno pour ce projet, mais tout autre Arduino ou ESP32/ESP8266 conviendra également.

Capteur de distance GP2Y0E03

Arduino Uno

Câble USB pour Arduino UNO

Jeu de fils Dupont

Plaque d’essai (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.
Caractéristiques du capteur de distance GP2Y0E03
Le GP2Y0E03 est un petit capteur qui utilise la lumière infrarouge (IR) et la triangulation pour mesurer la distance d’un objet. Le capteur émet une impulsion IR et, selon la distance de l’objet, l’impulsion réfléchie apparaît décalée sur la plaque détectrice. Voir l’image ci-dessous pour illustration.

La plage de mesure va de 4 à 50 cm avec un intervalle de rafraîchissement d’environ 40 ms entre les mesures. La tension d’alimentation du capteur GP2Y0E03 est de 2,7 à 5,5 V et la consommation moyenne est de 26 mA.
Brochage du GP2Y0E03
Le capteur GP2Y0E03 fait partie de la famille incluant les capteurs GP2Y0E02A et GP2Y0E02B. Cependant, le GP2Y0E03 est le seul à posséder une sortie analogique et une sortie numérique (I2C). L’image ci-dessous montre le brochage du capteur.

- La broche 1 est l’alimentation positive (2,7 à 5,5 V).
- La broche 2 est Vout(A), la sortie analogique qui renvoie une tension inversement proportionnelle à la distance.
- La broche 3 est la masse (GND) de l’alimentation.
- La broche 4 est VIN(IO), la tension d’alimentation pour l’interface I2C, qui doit être comprise entre 1,8 et 3,3 V.
- La broche 5 est GPIO1, qui peut être utilisée pour activer ou désactiver le capteur.
- Les broches 7 et 6 sont les lignes SDA et SCL de l’interface I2C.
Le capteur est généralement livré avec un connecteur japonais sans soudure (JST) à 7 broches et des câbles compatibles avec la plupart des capteurs de distance Sharp. Notez cependant que le code couleur des fils est trompeur. Par exemple, le noir n’est PAS la masse et le rouge n’est PAS l’alimentation positive. Voir la photo des câbles du capteur ci-dessous :

Schéma interne du GP2Y0E03
Le schéma interne du GP2Y0E03 ci-dessous montre la LED IR avec son driver LED responsable de l’émission de l’impulsion IR. L’imagerie CMOS (détecteur) reçoit l’impulsion réfléchie, et un convertisseur AD la transforme en signal numérique traité par le processeur de signal numérique (DSP).

Le DSP calcule la distance à l’objet et la transmet via l’interface I2C (SCL, SDA). De plus, cette mesure numérique est convertie en signal analogique via le convertisseur DA et envoyée à la broche de sortie Vout.
Spécifications du GP2Y0E03
Selon le Datasheet, les principales caractéristiques du capteur GP2Y0E03 sont les suivantes :
- Circuit de traitement du signal intégré (DSP)
- Plage de mesure de distance : 4 à 50 cm
- Fonctionnement basse tension : minimum 2,7 V
- Taille compacte (16,7 × 11,0 × 5,2 mm)
- Sortie numérique (I2C) et analogique
J’ai constaté que le capteur peut en réalité mesurer des distances entre 3 cm et 60 cm voire un peu plus. En revanche, les mesures ne sont pas très précises, surtout comparées aux capteurs de distance laser Time-of-Flight.
Pour plus de détails, consultez la fiche technique et les notes d’application du GP2Y0E03 liées ci-dessous :
Connexion du GP2Y0E03 à Arduino
Le GP2Y0E03 offre une sortie numérique (I2C) et une sortie analogique. Vous pouvez utiliser l’une ou l’autre, mais dans le schéma de câblage ci-dessous, j’ai connecté les deux pour comparer les distances rapportées via l’interface numérique ou analogique.
Pour l’interface I2C, on connecte la ligne SDA en reliant A4 de l’Arduino à la broche 7 du GP2Y0E03. Pour la ligne SCL, connectez A5 à la broche 6. Voir l’image ci-dessous.

Pour la sortie analogique (vout), on connecte la broche 2 du GP2Y0E03 à A3 de l’Arduino. Vous pouvez utiliser n’importe quelle autre entrée analogique restante (A0…A2), mais il faudra ajuster le code présenté dans les sections suivantes.
Ensuite, on connecte l’alimentation. Commencez par relier la masse (GND) de l’Arduino à la broche 3 du GP2Y0E03. Enfin, on connecte 3,3 Vde l’Arduino aux broches 5 (GPIO1), 4 (VIN(IO)) et 1 (VDD).
Notez que selon le Datasheet du GP2Y0E03, VDD peut aller jusqu’à 5,5 V mais VIN(IO) ne doit pas dépasser 3,3 V (voir conditions de fonctionnement ci-dessous). Il faut donc utiliser du 3,3 V pour VIN et VIO. J’ai essayé avec 5 V et le capteur a fonctionné et survécu (cependant non recommandé).

L’entrée GPIO1 (broche 5) permet d’activer (actif) ou de désactiver (veille) le capteur. Vous pouvez connecter GPIO1 à une sortie numérique de l’Arduino pour l’allumer ou l’éteindre. Cela est utile si vous souhaitez connecter plusieurs capteurs GP2Y0E03 avec la même adresse I2C sur la même interface I2C, ou pour économiser de l’énergie entre les mesures.
En mode veille (désactivé), le GP2Y0E03 consomme seulement 20 µA, tandis qu’en fonctionnement il consomme en moyenne 26 mA. Cependant, le Datasheet indique qu’il faut une alimentation capable de fournir jusqu’à 150 mA car le courant d’impulsion de la LED IR est de 100 mA.
Code pour mesurer la distance avec GP2Y0E03
Dans cette section, nous allons écrire un code simple qui lit les distances mesurées par le GP2Y0E03 et les affiche sur le moniteur série.
Installer la bibliothèque GP2Y0E03
Malheureusement, il n’existe pas de bibliothèque Arduino officielle pour le capteur GP2Y0E03 (à partir d’octobre 2024). J’ai donc développé la mienne. Pour installer cette bibliothèque GP2Y0E03, allez sur le GP2Y0E03_arduino_lib repo et cliquez sur le bouton vert « Code ». Puis cliquez sur « Download Zip » comme montré ci-dessous :

Ensuite, allez dans « Sketch » -> « Include Library » -> « Add .Zip Library.. » et sélectionnez le fichier « GP2Y0E03_arduino_lib-main.zip » que vous venez de télécharger :

Alternativement, vous pouvez simplement télécharger tout le code du dépôt, le zipper, puis inclure la bibliothèque de la même manière que décrite ci-dessus. Ou vous pouvez copier-coller les fichiers GP2Y0E03.h et GP2Y0E03.cpp dans votre dossier de projet.
Code pour mesurer les distances avec GP2Y0E03
L’exemple de code suivant montre comment mesurer les distances avec le capteur GP2Y0E03 en utilisant simultanément sa sortie numérique et sa sortie analogique.
#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);
}
On commence par inclure le fichier d’en-tête GP2Y0E03 et créer l’objet capteur :
#include "GP2Y0E03.h" GP2Y0E03 sensor = GP2Y0E03();
L’adresse I2C 7 bits par défaut du GP2Y0E03 est 0x40. Mais vous pouvez aussi spécifier une autre adresse I2C dans le constructeur GP2Y0E03(address).
Dans la fonction setup, on initialise la communication série à 9600 bauds et on initialise aussi le capteur, avec sa sortie analogique (vout) connectée à l’entrée analogique A3 de l’Arduino :
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
Si vous ne souhaitez pas utiliser la sortie analogique, initialisez simplement le capteur avec init() ou init(-1). De plus, si vous devez utiliser des broches SDA et SCL spécifiques sur votre microcontrôleur, vous pouvez appeler init(vout, sda, scl) ou init(sda, scl).
Dans la fonction loop, on appelle ensuite sensor.distDigital() pour lire la distance via I2C, et sensor.distAnalog() pour lire la distance via la sortie analogique du GP2Y0E03.
void loop() {
Serial.print("digital:");
Serial.println(sensor.distDigital());
Serial.print("analog:");
Serial.println(sensor.distAnalog());
Serial.println();
delay(1000);
}
On affiche les deux distances sur le moniteur série puis on attend 1 seconde. Notez qu’il ne faut pas interroger le capteur plus vite que toutes les 40 ms.
Sortie sur le moniteur série et le traceur série
La capture d’écran ci-dessous montre un exemple de sortie du code sur le moniteur série. Vous pouvez voir que les distances mesurées diffèrent selon la sortie numérique ou analogique. Cela est en partie dû à l’étalonnage du signal analogique (plus d’explications plus tard).

Si vous jouez un peu avec le capteur et le code, vous remarquerez qu’une valeur de -1 est retournée si vous vous approchez trop du capteur (< 3 cm) ou si la distance dépasse 60 cm.
Le traceur série montre que les distances retournées par la sortie analogique et numérique sont fortement corrélées, mais que la sortie analogique présente des valeurs aberrantes (distances négatives) :

Étalonnage de la sortie analogique
La sortie numérique (I2C) du GP2Y0E03 fournit directement la distance mesurée en centimètres. La sortie analogique, en revanche, renvoie simplement une tension de sortie (Vout) qui doit être étalonnée pour être convertie en distance.
Le graphique suivant montre qu’il existe une relation inverse entre Vout et la distance :

Le GP2Y0E03 library effectue cet étalonnage en interne mais vous permet aussi d’ajuster l’étalonnage pour votre capteur ou microcontrôleur spécifique, si nécessaire. La procédure est la suivante :
- Placez le capteur à une petite distance d’un objet, par exemple 3 cm (distMin)
- Enregistrez la valeur Vout correspondante, par exemple 448 (voutMin)
- Placez le capteur à une grande distance d’un objet, par exemple 30 cm (distMax)
- Enregistrez la valeur Vout correspondante, par exemple 289 (voutMax)
- Calibrez le capteur :
calibrateAnalog(voutMin, voutMax, distMin, distMax);
Vous pouvez utiliser le code suivant pour afficher Vout, où Vout n’est pas une tension mais la valeur numérique produite par le convertisseur analogique-numérique de l’Arduino. Selon votre microcontrôleur et son convertisseur AD, vous pouvez obtenir des valeurs différentes.
#include "GP2Y0E03.h"
GP2Y0E03 sensor = GP2Y0E03();
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
void loop() {
Serial.println(sensor.vout());
delay(1000);
}
Une fois que vous avez les mesures pour voutMin, voutMax, distMin et distMax, (par exemple 448, 289, 3, 30) vous pouvez calibrer la mesure de distance analogique comme suit :
#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);
}
Conclusions
Dans ce tutoriel, vous avez appris à utiliser le capteur de distance GP2Y0E03 avec un Arduino pour mesurer des distances.
Le GP2Y0E03 est similaire à d’autres capteurs de distance infrarouges tels que le GP2Y0A710K0F ou le GP2Y0A21YK0F et utilise la triangulation pour déterminer la distance d’un objet. Cependant, en plus de la sortie analogique classique, il dispose aussi d’une sortie numérique (I2C).
Comparés aux capteurs de distance laser Time-of-Flight (ToF) comme le VL6180X, VL53L1X, VL53L0X ou TOF10120, les capteurs basés sur la triangulation sont moins précis et ont une portée plus courte. Un autre inconvénient est qu’ils ne peuvent pas mesurer les distances lorsque l’objet est trop proche (par exemple < 3 cm) et ont des difficultés avec les objets très réfléchissants (par exemple un miroir incliné). En revanche, ces capteurs sont généralement moins chers que les capteurs de distance ToF.
Si vous avez des questions, n’hésitez pas à les laisser dans la section commentaires.
Bon bricolage ; )

