Entfernungsmessung mit Time-of-Flight-Modul VL53L0X

Time-of-Flight-Modul VL53L0X
Abb.: Time-of-Flight-Modul VL53L0X

Warnung Klasse-1-Laser Bei dem Sensor handelt es sich um einen Klasse-1-Laser, welcher im Infrarotbereich strahlt, daher kann man das Laserlicht nicht sehen und sollte immer einen Mindestabstand vom Sensor von 30cm einhalten. Wie in der folgenden Abbildung zu sehen ist, besitzt der Laserstrahl aber eine Aufweitung von 35°, daher ist eine Gefährdung für die Augen nur in unmittelbarer Nähe zur Emitteröffnung gegeben.


Aufweitung des Laserlichts beim VL53L0X-Bauteil
Abb.: Aufweitung des Laserlichts beim VL53L0X-Bauteil. Der Sensor einen Öffnungswinkel von 25°. Bei einer Entfernung von 1m entspricht das einer Breite von 43cm.

Funktionsweise

Der VL53L0X sendet 940nm-Lichtpulse (Infrarot), welche an entfernten Gegenständen reflektiert und dann vom Sensor detektiert werden können. Die Zeit zwischen dem Aussenden und dem Empfangen des Lichtpulses wird gemessen und dann entsprechend mit der Lichtgeschwindigkeit verrechnet. Daraus ergibt sich dann die Entfernung zwischen dem Sensor und dem Gegenstand, der das Licht reflektiert hat.
Der Messbereich liegt laut Datenblatt zwischen 30mm und 2000mm.

Verwendete Bauteile

Anschlüsse

VL53L0X Beschreibung Arduino Uno
VCC Spannungsversorgung 5V
GND Masse GND
SCL I²C-Clock A5
SDA I²C-Data A4
GPIO1 Dieser Pin zeigt an, ob Daten am Sensor bereit stehen. Ist nützlich für kontinuierliche Messungen.
XSHUT Bringt den Sensor in den "shutdown"-Modus, wenn LOW anliegt.

Vorsicht: der VL53L0X-Chip wird laut Datenblatt mit 2,8V betrieben, daher sollte darauf geachtet werden, dass an VCC bzw. GPIO1 und XSHUT jeweils eine korrekte Spannung anliegt!

Aufbau

Schaltplan des Aufbaus

Der Aufbau für den Neopixel-Ring siehe bei WS2812.

Sketch

#include "Adafruit_NeoPixel.h"
#include "Adafruit_VL53L0X.h"

#define PIN       8           // Digital PIN used on the Arduino
#define NUMPIXELS 16          // number of LEDs in the ring

Adafruit_VL53L0X lox = Adafruit_VL53L0X();
Adafruit_NeoPixel ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
byte ledIndex = 0;

void setup()
{
    Serial.begin(9600);
    if (!lox.begin()) {
        Serial.println(F("Failed to boot VL53L0X"));
        while(true);
    }
    ring.begin();
}

void loop()
{
    VL53L0X_RangingMeasurementData_t measure;

    lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
    if (measure.RangeStatus != 4) {  // phase failures have incorrect data
        Serial.println(String(measure.RangeMilliMeter) + " mm");
        ledIndex = (byte)map(measure.RangeMilliMeter, 5, 80, 0, 15);
    } else {
        Serial.println("-out of range-");
    }

    for (byte i = 0; i < NUMPIXELS; i++) {
        ring.setPixelColor(i, ring.Color(0, 0, 0));
    }

    ledIndex = constrain(ledIndex, 0, 15);
    ring.setPixelColor(ledIndex, ring.Color((15 - ledIndex) * 3, ledIndex * 3, 0));
    ring.show();

    delay(100);
}
Video: Live-Demonstration der Entfernungsmessung mit dem VL53L0X-Modul
zurück