In diesem Beitrag möchte ich den Laser Distanz Sensor VL53LXX-V2 vorstellen. Dieser Sensor kann eine Distanz von bis zu 4 m messen und arbeitet dabei mit einer Abtastgeschwindigkeit von 50Hz.
Bezug
Den Laser Distanz Sensor kann man über ebay.de für ca. 8 € inkl. Versandkosten* beziehen oder deutlich günstiger über aliexpress.com (4,19 $ inkl. Versandkosten).
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Ich habe den Sensor über aliexpress.com bestellt und habe ca. 5 Wochen auf diesen Sensor warten dürfen. Dafür aber weniger als die Hälfte bezahlt.
Lieferumfang
Der Sensor wird in einer kleinen Antistatik Tüte geliefert und enthält neben dem Sensor noch eine Stiftleiste.
Technische Daten des VL53LXX-V2
- Betriebsspannung 3.3V bis 5.5V
- Messbereich
- Minimal 40 mm
- Maximal 4 m
- Messbereichsgenauigkeit ±5 %
- Wellenlänge des Lasers 940 nm
- Betriebstemperatur -20 °C bis 80 °C
- Abmessungen
- ohne Löcher 15 mm x 10 mm
- mit Löcher 25 mm x 10 mm
- Durchmesser der Löcher 3 mm
Aufbau & Schaltung
Bevor der Sensor verwendet werden kann, muss dieser mit der Stiftleiste verbunden werden. Um die Stiftleiste korrekt (also im 90° Winkel) an den Sensor zu löten habe ich zusätzlich ein 170 Pin Breadboard und die überzähligen Stifte verwendet.
Aufbau
Der Sensor verfügt über 6 Pins welche wie folgt an den Arduino UNO angeschlossen werden.
VL53LXX-V2 | Arduino UNO |
---|---|
VIN | 5V |
GND | GND |
SCL | analoger Pin A5 |
SDA | analoger Pin A4 |
GPIO01 | |
XSHUT |
Die Pins GPIO01 & XSHUT werden in meinen Beispielen zunächst nicht verwendet.
Schaltung
Quellcode
Bibliothek
Bibliotheken erleichtern einem Programmierer die Arbeiten enorm, besonders wenn man wie wir mit Hardware arbeitet und so die einzelnen Adressen und Speicherbereiche be-/verarbeiten muss. Daher gibt es auch für diesen Sensor eine Bibliothek, welche wir uns in die Entwicklungsumgebung (in meinem Fall wie immer die Arduino IDE) einbinden.
Den Bibliotheksverwalter erreicht man über das Hauptmenü “Sketch” > “Bibliothek einbinden” > “Bibliotheken verwalten…”. In diesem Dialog wird zunächst nach der Bibiothek mit dem Suchbegriff “vl53l” (1) gesucht. Ich verwende die Bibliothek von Sparkfun und wähle den zweiten Eintrag aus den Suchergebnissen (2) nach dem betätigen der Schaltfläche “Installieren” kann (nach Abschluss) der Dialog geschlossen werden (3).
Beispiel – Ausgabe der Daten auf dem seriellen Monitor
Der Bibliothek liegt ein Beispiel bei, wie man diesen Sensor in der Arduino IDE programmiert. Das werde ich hier nutzen und etwas umschreiben und kommentieren.
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); //Um die Debug Ausgaben zu aktivieren //muss dieser Wert auf "true" gesetzt werden. #define debugSensor false //Es werden 10 Messungen durchgeführt. const int MAX_DATA = 10; //der Index der aktuellen Messung int readDataIndex = -1; //das Array für die Daten int data[MAX_DATA] = {}; //zählen der fehlerhaften Messungen int failureMeasures = 0; void setup() { //begin der seriellen Kommunikation mit 115200 baud Serial.begin(115200); //Warten auf den Seriellen Port while (! Serial) { delay(1); } //Wenn der Serielle Port bereit ist dann eine Ausgabe auf diesen tätigen //und prüfen ob der Sensor korrekt angeschlossen ist (ob dieser Ansprechbar ist) Serial.println("GY-VL53L0X test"); if (!lox.begin()) { Serial.println("Fehler beim lesen des Sensors!"); while(1); //eine Endlos Schleife } } void loop() { //instanziieren des Sensors zum empfangen von Daten VL53L0X_RangingMeasurementData_t measure; lox.rangingTest(&measure, debugSensor); //lesen des Sensor Status //der Sensor kann verschiedene Status annehmen, //jedoch interessiert für uns nur der Wert "4" int sensorStatus = measure.RangeStatus; //Wenn Daten empfangen wurden dann... if (sensorStatus != VL53L0X_DEVICEERROR_MSRCNOTARGET) { //den Zähler für das Array um eins erhöhen readDataIndex++; //zuweisen des Wertes in das Array data[readDataIndex] = measure.RangeMilliMeter; //Wenn das Array "fertig" befüllt ist, dann... if(readDataIndex == MAX_DATA){ //eine Variable für die Berechnung des Durchschnittswertes int averageData = 0; //über das Array itereieren und die Daten zusammenzählen for(int i=0;i<MAX_DATA;i++){ averageData = averageData+data[i]; } //um den Durchschnittswert zu erhalten muss man die Zahl //durch die Anzahl der Werte teilen averageData = averageData / MAX_DATA; //Ausgeben des berechnenen Durchschnitts für die Distanz Serial.print("Distanz: "); Serial.print(averageData); Serial.println("mm"); readDataIndex = -1; failureMeasures =0; }else if(debugSensor && readDataIndex % 2 == 0){ Serial.print("X"); } } else if(debugSensor && sensorStatus != VL53L0X_DEVICEERROR_NONE) { Serial.println(" Signal konnte nicht gelesen / verarbeitet werden! "); } else { if(debugSensor && ++failureMeasures % 2==0){ Serial.print("-"); } } if(debugSensor && (failureMeasures + readDataIndex)> MAX_DATA){ Serial.println(""); } //eine Pause von 5ms einlegen delay(5); }
Video
Vergleich mit einem Ultraschallsensor HC-SR04
Den Ultraschallsensor HC-SR04 habe ich bereits im Beitrag Arduino Lektion 9: Ultraschall Modul HC-SR04 vorgestellt. Da beide Sensoren (GY-VL53L0XV2 & HC-SR04) den Abstand von Objekten messen können, möchte ich kurz beide Sensoren testen.
Man kann sehr gut erkennen, dass der Ultraschallsensor den Abstand nicht so genau misst wie der Laser Distanzsensor.
Fazit
Der Laser Distanzsensor GY-VL53L0XV2 ist günstig in der Anschaffung und durch das einfache Einbinden einer Bibliothek auch genauso einfach zu programmieren. Jedoch ist dieser nicht ganz so genau und hatte in meinem Test eine Abweichung von bis zu mehreren Zentimetern.
Netter Artikel. Habe den VL53lxx auch grade beim Stöbern entdeckt. Auch der vergleich zum HC-SR04 hilft. Aber könntest du den Test noch mal mit größeren Abständen machen? Der TOF-Sensor soll ja “bis zu 4m” messen können.
Ich denke da an Belegtanzeigen von Parkbuchten o.a. Was passiert, wenn das “Hindernis” nicht genau im rechten Winkel zur Messtrecke steht. ist dann die Erkennung auch noch OK?
Dann wäre der Blog-Artikel perfekt 🙂
Interessanter Artikel. Ich habe gerade ein Paar dieser Sensoren erhalten und will auch damit experimentieren.
Als erstes bemerke ich jedoch das auf der Platine VL53LXX steht, und nicht L1X/L0X wie beim Verkäufer auf Aliexpress. Kann das wohl mit der Ungenauigkeit zu tun haben?
Ich habe Fragezeichen.
Im Video ist zu sehen, wie weit die Pappwand weg ist und der Abstand zum Sensor stimmt doch. Dagegen ist die Ausgabe vom Ultraschallsensor doch falsch.
Das passt nicht zueinander.
Hi Karsten,
in einem anderen Beitrag habe ich das Problem mit dem Laserdistanzsensor gefunden, je nachdem wie hell bzw. dunkel die Oberfläche ist umso genauer ist dieser Sensor.
Gruß,
Stefan Draeger
Hallo Stefan,
danke für Deinen lehrreichen Artikel.
Ich habe mittlerweile zwei dieser Sensoren bei einem RC- Fahrzeug für die Hinderniserkennung vorn und hinten im Einsatz. In Abhängigkeit von der Hindernisentfernung wird ein entsprechender Ton ausgegeben.
Ab und zu machen sich die Sensoren jedoch scheinbar ‘selbständig’, obwohl keine Änderung im ‘Sichtfeld’ vorliegt: Dann gibt es einen kurzes Piepsen, obwohl kein Hindernis vorhanden ist.
Hast Du eine Idee dazu, wie man das verhindern kann?
Ich sag’ schon mal DANKE!