Nr.44 – Entfernungsmessung mit VL6180X

Der VL6180X, oder auch nur VL6180 ist ein Entfernungssensor. Aufgrund seiner Beschaffenheit wird er auch „Time of Flight“ Sensor genannt. Der Sensor enthält eine sehr kleine Laserlichtquelle und einen passenden Empfänger. Der VL6180X kann die „Flugzeit“ oder die Zeit, in der das Laserlicht zum Sensor zurück-reflektiert wurde, messen und daraus die Entfernung berechnen. Da es eine sehr schmale Lichtquelle verwendet, funktioniert dieser Sensor sehr gut bei kleinen Abständen zum detektierenden Objekt. Die Kommunikation mit dem Sensor erfolgt über den I2C-Bus und ist damit sehr leicht zu verkabeln. Mit einer passenden Library ist die Auswertung der Messergebnisse ebenfalls kein schwieriges Unterfangen.

Unterschied zu anderen Entfernungssensoren:
Im Gegensatz zu Ultraschallsensoren ist der Bereich oder die Breite der Abtastung sehr eng.
Im Gegensatz zu Infrarot-Entfernungs-Sensoren, die versuchen, die Menge des reflektierten Lichts zu messen, ist der VL6180X viel präziser, da die Menge des Lichts nicht für die Entfernungsmessung relevant ist.

Der Sensor hat eine Reichweite zwischen ca. 15 und ca. 200mm. Äußere Einflüsse wie starker Lichteinfall können die Reichweite jedoch reduzieren. Der Sensor kann aufgrund der integrierten Elektronik mit jedem 3-5VMikrocontroller verwendet werden.

Wie im folgenden Bild zu sehen, ist die Verkabelung sehr einfach.

Sensor VIN  -> Mikrocontroller 5V oder 3.3V

Sensor GND-> Mikrocontroller GND

Sensor SCL-> Mikrocontroller SCL

Sensor SDA-> Mikrocontroller SDA

Für den ersten Sketch verwenden wir als Grundlage eine Library von Adafruit mit dem Namen Adafruit_VL6180X, die direkt über den Bibliotheksverwalter installiert werden kann.

In der Library sind Beispielsketche vorhanden, in denen der volle Leistungsumfang des VL6180X Sensors genutzt werden kann. In dieser Anleitung reduzieren wir den Sketch ausschließlich auf die Entfernungsmessung.

Unser Sketch Sieht nun so aus und gibt die Messwerte am Seriellen Monitor aus. Als Datenübertragungsrate haben wir 115200 gewählt. Da dies nicht der Standardwert ist, muss dieser am Seriellen Monitor eingestellt werden.

#include <Wire.h>
#include "Adafruit_VL6180X.h"

Adafruit_VL6180X vl = Adafruit_VL6180X();

void setup() 
{
  Serial.begin(115200);
  while (!Serial) // Warten, bis die serielle Verbindung aufgebaut ist
  {
  delay(1); // Die Pause wird immer wieder aufgerufen, solange die serielle Verbindung nicht aufgebaut ist.
  } 
  vl.begin();
}

void loop() 
{
  uint8_t Entfernung = vl.readRange(); // Unter "Entfernung" wird der Messwert für die Entfernung erfasst.
  uint8_t status = vl.readRangeStatus(); // Der Sensorstatus wird gelesen. 
  if (status == VL6180X_ERROR_NONE) { // Wenn der Sensorstatus keine Fehler enthält, folgt der Inhalt der IF-Schleife
    Serial.print("Entfernung in mm: "); Serial.println(Entfernung);  //Ausgabe der Entfernung am seriellen Monitor
  }
  delay(100); // Das delay sorgt dafür, dass die Werte am seriellen Monitor lesbar bleiben. In Anwendungen zur Messwerterfassung sollte man auf solche Pausen verzichten.
}

Das Ergebnis sollte bei richtigem Sketch und fehlerfreier Verkabelung wie im folgenden Bild aussehen. Es muss sich dann jedoch auch ein Objekt im Messbereich befinden.