In diesem Tutorial lernst du, wie du den GP2Y0E03 Infrarot-Abstandssensor mit einem Arduino oder einem anderen gängigen Mikrocontroller (ESP32/ESP8266) verwendest, um Entfernungen bis zu 50 cm zu messen.
Der GP2Y0E03 nutzt die Reflexion von IR-Licht und Triangulation, um die Entfernung zu Objekten zu bestimmen. Typische Anwendungen sind Reinigungsroboter, berührungslose Schalter und Spielautomaten.
Benötigte Teile
Zuerst benötigst du einen GP2Y0E03 Abstandssensor. Zweitens brauchst du einen Mikrocontroller. Für dieses Projekt habe ich einen Arduino Uno verwendet, aber jeder andere Arduino oder ESP32/ESP8266 funktioniert ebenfalls.

GP2Y0E03 Abstandssensor

Arduino Uno

USB-Kabel für Arduino UNO

Dupont-Kabelsatz

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.
Eigenschaften des GP2Y0E03 Abstandssensors
Der GP2Y0E03 ist ein kleiner Sensor, der Infrarot (IR)-Licht und Triangulation verwendet, um die Entfernung zu einem Objekt zu messen. Der Sensor sendet einen IR-Impuls aus, und je nach Entfernung des Objekts erscheint der reflektierte Impuls verschoben auf der Detektorplatte. Siehe das Bild unten zur Veranschaulichung.

Der Messbereich liegt zwischen 4 und 50 cm mit einem Aktualisierungsintervall von etwa 40 ms. Die Versorgungsspannung für den GP2Y0E03 Sensor beträgt 2,7 bis 5,5 V und der durchschnittliche Stromverbrauch liegt bei 26 mA.
Pinbelegung des GP2Y0E03
Der GP2Y0E03 Sensor gehört zur Familie, zu der auch die Sensoren GP2Y0E02A und GP2Y0E02B gehören. Allerdings ist der GP2Y0E03 der einzige mit einem analogen und einem digitalen Ausgang (I2C). Das Bild unten zeigt die Pinbelegung des Sensors.

- Pin 1 ist die positive Versorgungsspannung (2,7 bis 5,5 V).
- Pin 2 ist Vout(A), der analoge Ausgang, der eine Spannung zurückgibt, die umgekehrt proportional zur Entfernung ist.
- Pin 3 ist Masse (GND) der Stromversorgung.
- Pin 4 ist VIN(IO), die Versorgungsspannung für die I2C-Schnittstelle, die zwischen 1,8 und 3,3 V liegen muss.
- Pin 5 ist GPIO1, der verwendet werden kann, um den Sensor ein- oder auszuschalten.
- Pin 7 und Pin 6 sind die SDA- und SCL-Leitungen der I2C-Schnittstelle.
Der Sensor wird typischerweise mit einem 7-poligen japanischen steckbaren Terminal (JST) Stecker und Kabeln geliefert, die zu den meisten Sharp-Abstandssensoren passen. Beachte jedoch, dass die Farbkennzeichnung der Kabel irreführend ist. Zum Beispiel ist schwarz NICHT Masse und rot NICHT die positive Versorgung. Siehe das Bild der Sensorkabel unten:

Interne Schaltung des GP2Y0E03
Das interne Schaltbild des GP2Y0E03 unten zeigt die IR-LED mit ihrem LED-Treiber, der für das Aussenden des IR-Impulses verantwortlich ist. Der CMOS-Bildsensor (Detektor) empfängt den reflektierten Impuls, und ein AD-Wandler wandelt ihn in ein digitales Signal um, das vom Digitalen Signalprozessor (DSP) verarbeitet wird.

Der DSP berechnet die Entfernung zum Objekt und gibt sie über die I2C-Schnittstelle (SCL, SDA) aus. Zusätzlich wird diese digitale Distanzmessung über den DA-Wandler in ein analoges Signal umgewandelt und an den Vout-Ausgangspin gesendet.
Spezifikationen des GP2Y0E03
Laut dem datasheet sind die Hauptmerkmale des GP2Y0E03 Sensors wie folgt:
- Integrierte Signalverarbeitungsschaltung (DSP)
- Messbereich: 4 bis 50 cm
- Niedrige Betriebsspannung: mindestens 2,7 V
- Kompakte Größe (16,7 × 11,0 × 5,2 mm)
- Digitaler (I2C) und analoger Ausgangstyp
Ich habe festgestellt, dass der Sensor tatsächlich Entfernungen zwischen 3 cm und bis zu 60 cm oder etwas mehr messen kann. Andererseits sind die Messungen nicht sehr genau, besonders im Vergleich zu Time-of-Flight Laser-Entfernungssensoren.
Für weitere Details siehe das Datenblatt und die Anwendungshinweise des GP2Y0E03, die unten verlinkt sind:
Anschluss des GP2Y0E03 an Arduino
Der GP2Y0E03 bietet einen digitalen (I2C) Ausgang und einen analogen Ausgang. Du kannst einen von beiden verwenden, aber im Schaltplan unten habe ich beide angeschlossen, damit wir die über die digitale oder analoge Schnittstelle gemeldeten Entfernungen vergleichen können.
Für die I2C-Schnittstelle verbinden wir die SDA-Leitung, indem wir A4 des Arduino mit Pin 7 des GP2Y0E03 verbinden. Für die SCL-Leitung verbinden wir A5 mit Pin 6. Siehe das Bild unten.

Für den analogen Ausgang (Vout) verbinden wir Pin 2 des GP2Y0E03 mit A3 des Arduino. Du kannst auch jeden anderen verbleibenden analogen Eingang (A0…A2) verwenden, musst dann aber den Code in den späteren Abschnitten entsprechend anpassen.
Als nächstes verbinden wir die Stromversorgung. Wir beginnen mit der Verbindung von Masse (GND) des Arduino mit Pin 3 des GP2Y0E03. Schließlich verbinden wir 3,3 Vdes Arduino mit Pin 5 (GPIO1), Pin 4 (VIN(IO)) und Pin 1 (VDD).
Beachte, dass laut dem datasheet des GP2Y0E03 VDD bis zu 5,5 V betragen kann, aber VIN(IO) nur bis zu 3,3 V (siehe Betriebsbedingungen unten). Daher müssen wir 3,3 V für VIN und VIO verwenden. Ich habe zwar 5 V ausprobiert und der Sensor funktionierte und überlebte (nicht empfohlen), aber besser ist 3,3 V.

Der GPIO1 (Pin 5) Eingang ermöglicht es, den Sensor ein- (aktiv) oder auszuschalten (Standby). Du kannst GPIO1 an einen digitalen Ausgang des Arduino anschließen, um ihn ein- oder auszuschalten. Das ist nützlich, wenn du mehrere GP2Y0E03 Sensoren mit derselben I2C-Adresse an dieselbe I2C-Schnittstelle anschließen möchtest oder wenn du zwischen den Messungen Strom sparen willst.
Im Standby-Modus (deaktiviert) verbraucht der GP2Y0E03 nur 20 µA, während er im Durchschnitt 26 mA verbraucht. Allerdings gibt das datasheet an, dass du eine Stromversorgung benötigst, die bis zu 150 mA liefern kann, da der IR-LED-Impulsstrom 100 mA beträgt.
Code zur Abstandsmessung mit GP2Y0E03
In diesem Abschnitt schreiben wir einfachen Code, der die vom GP2Y0E03 gemessenen Entfernungen ausliest und im Serial Monitor ausgibt.
GP2Y0E03 Bibliothek installieren
Leider gibt es keine Arduino-Bibliothek für den GP2Y0E03 Sensor (Stand Okt 2024). Daher habe ich eine eigene implementiert. Um diese GP2Y0E03 Bibliothek zu installieren, gehe zum GP2Y0E03_arduino_lib repo und klicke auf den grünen „Code“-Button. Dann klicke auf „Download Zip“, wie unten gezeigt:

Dann gehe zu „Sketch“ -> „Include Library“ -> „Add .Zip Library..“ und wähle die zuvor heruntergeladene Datei „GP2Y0E03_arduino_lib-main.zip“ aus:

Alternativ kannst du den gesamten Code des Repos herunterladen, zippen und die Bibliothek auf die gleiche Weise einbinden wie oben beschrieben. Oder du kopierst die Dateien GP2Y0E03.h und GP2Y0E03.cpp einfach in deinen Projektordner.
Code zur Abstandsmessung mit GP2Y0E03
Der folgende Beispielcode zeigt, wie man mit dem GP2Y0E03 Sensor Entfernungen gleichzeitig über den digitalen und den analogen Ausgang misst.
#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);
}
Wir beginnen mit dem Einbinden der GP2Y0E03 Header-Datei und der Erstellung des Sensorobjekts:
#include "GP2Y0E03.h" GP2Y0E03 sensor = GP2Y0E03();
Die Standard 7-Bit I2C-Adresse des GP2Y0E03 ist 0x40. Du kannst aber auch eine andere I2C-Adresse im Konstruktor angeben GP2Y0E03(address).
In der setup Funktion starten wir die serielle Kommunikation mit 9600 Baud und initialisieren den Sensor, wobei der analoge Ausgang (vout) mit dem analogen Eingang A3 des Arduino verbunden ist:
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
Wenn du den analogen Ausgang nicht verwenden möchtest, initialisiere den Sensor einfach mit init() oder init(-1). Falls du spezielle SDA- und SCL-Pins an deinem Mikrocontroller verwenden musst, kannst du init(vout, sda, scl) oder init(sda, scl) aufrufen.
In der loop Funktion rufen wir dann sensor.distDigital() auf, um die Entfernung über I2C zu lesen, und sensor.distAnalog(), um die Entfernung über den analogen Ausgang des GP2Y0E03 auszulesen.
void loop() {
Serial.print("digital:");
Serial.println(sensor.distDigital());
Serial.print("analog:");
Serial.println(sensor.distAnalog());
Serial.println();
delay(1000);
}
Wir geben beide Entfernungen im Serial Monitor aus und warten dann 1 Sekunde. Beachte, dass du nicht schneller als alle 40 ms abfragen solltest.
Ausgabe im Serial Monitor und Serial Plotter
Der Screenshot unten zeigt eine Beispielausgabe des Codes im Serial Monitor. Du kannst sehen, dass die gemessenen Entfernungen je nach digitalem oder analogem Ausgang unterschiedlich sind. Das liegt teilweise an der Kalibrierung des analogen Signals (dazu später mehr).

Wenn du ein wenig mit dem Sensor und Code spielst, wirst du feststellen, dass der Wert -1 zurückgegeben wird, wenn du zu nah am Sensor bist (< 3 cm) oder wenn die Entfernung 60 cm überschreitet.
Der Serial Plotter zeigt, dass die Entfernungen, die vom analogen und digitalen Ausgang zurückgegeben werden, stark korreliert sind, aber der analoge Ausgang Ausreißer (negative Entfernungen) zeigt:

Kalibrierung des analogen Ausgangs
Der digitale Ausgang (I2C) des GP2Y0E03 liefert die gemessene Entfernung direkt in Zentimetern. Der analoge Ausgang gibt jedoch nur eine Ausgangsspannung (Vout) zurück, die kalibriert werden muss, um in eine Entfernung umgerechnet zu werden.
Die folgende Grafik zeigt, dass eine inverse Beziehung zwischen Vout und der Entfernung besteht:

Der GP2Y0E03 library führt diese Kalibrierung intern durch, erlaubt dir aber auch, die Kalibrierung für deinen spezifischen Sensor oder Mikrocontroller bei Bedarf anzupassen. Der Ablauf ist wie folgt:
- Platziere den Sensor in geringer Entfernung zu einem Objekt, z.B. 3 cm (distMin)
- Notiere den entsprechenden Vout-Wert, z.B. 448 (voutMin)
- Platziere den Sensor in großer Entfernung zu einem Objekt, z.B. 30 cm (distMax)
- Notiere den entsprechenden Vout-Wert, z.B. 289 (voutMax)
- Kalibriere den Sensor:
calibrateAnalog(voutMin, voutMax, distMin, distMax);
Du kannst den folgenden Code verwenden, um Vout auszugeben, wobei Vout nicht die Spannung, sondern der digitale Wert ist, der vom Analog-Digital-Wandler des Arduino erzeugt wird. Je nach Mikrocontroller und AD-Wandler können die Werte variieren.
#include "GP2Y0E03.h"
GP2Y0E03 sensor = GP2Y0E03();
void setup() {
Serial.begin(9600);
sensor.init(A3);
}
void loop() {
Serial.println(sensor.vout());
delay(1000);
}
Sobald du die Messwerte für voutMin, voutMax, distMin und distMax hast (z.B. 448, 289, 3, 30), kannst du die analoge Distanzmessung wie folgt kalibrieren:
#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);
}
Fazit
In diesem Tutorial hast du gelernt, wie man den GP2Y0E03 Abstandssensor mit einem Arduino verwendet, um Entfernungen zu messen.
Der GP2Y0E03 ist ähnlich wie andere Infrarot-Abstandssensoren wie der GP2Y0A710K0F oder der GP2Y0A21YK0F und verwendet Triangulation, um die Entfernung zu einem Objekt zu bestimmen. Zusätzlich zum üblichen analogen Ausgang verfügt er auch über einen digitalen (I2C) Ausgang.
Im Vergleich zu Time-of-Flight (ToF) Laser-Entfernungssensoren wie dem VL6180X, VL53L1X, VL53L0X oder TOF10120 sind triangulationsbasierte Sensoren weniger genau und haben eine kürzere Reichweite. Ein weiterer Nachteil ist, dass sie Entfernungen nicht messen können, wenn das Objekt zu nah ist (z.B. < 3 cm) und Schwierigkeiten mit stark reflektierenden Objekten (z.B. schräger Spiegel) haben. Andererseits sind diese Sensoren in der Regel günstiger als ToF-Entfernungssensoren.
Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.
Viel Spaß beim Tüfteln ; )

