Skip to Content

VL6180X Abstandssensor mit Arduino

VL6180X Abstandssensor mit Arduino

In diesem Tutorial lernst du, wie du den VL6180X Laser-Entfernungssensor mit einem Arduino oder einem anderen gängigen Mikrocontroller (ESP32/ESP8266) verwendest, um Entfernungen bis zu 100 mm zu messen.

Der VL6180X ist ein sehr kleiner Time-of-Flight (ToF) Entfernungssensor, der infrarotes Laserlicht nutzt, um die Nähe eines Objekts zu messen. Durch die Messung der Zeit, die das Licht benötigt, um von einem Objekt reflektiert zu werden, kann er Entfernungen mit hoher Genauigkeit berechnen. Aufgrund der vergleichsweise kurzen Reichweite eignet er sich besonders als Näherungssensor oder für einfache Gestenerkennung.

Benötigte Teile

Natürlich benötigst du einen VL6180X Entfernungssensor. Als Mikrocontroller habe ich für dieses Projekt einen Arduino Uno verwendet, aber jeder andere Arduino oder ESP32/ESP8266 funktioniert ebenfalls, da der Sensor mit 5V oder 3,3V arbeitet. Außerdem verwenden wir ein OLED-Display, um die vom VL6180X gemessenen Entfernungen anzuzeigen.

VL6180X Entfernungssensor

Arduino

Arduino Uno

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Dupont wire set

Dupont-Kabel-Set

Half_breadboard56a

Breadboard

OLED display

OLED-Display

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 VL6180X

Der VL6180X ist ein winziger Chip (4,8 x 2,8 x 1,0 mm) mit mehreren Öffnungen an der Oberseite. Eine ist für den Laserlicht-Emitter, eine für den Laserlicht-Detektor und es gibt auch einen Umgebungslichtsensor. Siehe das Bild unten:

VL6180X Chip
VL6180X Chip (source)

Der VL6180X arbeitet, indem er einen Laserlichtimpuls vom Emitter aussendet, das reflektierte Licht von einem Objekt im Detektor empfängt und basierend auf der benötigten Zeit (Time-of-Flight) die Entfernung zum Objekt berechnet. Das Bild unten zeigt die Kegel des Emitters (Beleuchtung) und des Detektors (Sichtfeld).

Working Principle of VL6180X
Funktionsprinzip des VL6180X (source)

Hier sind die Hauptmerkmale und technischen Spezifikationen des VL6180X laut Datenblatt:

Features of VL6180X
Eigenschaften des VL6180X (source)

Beachte, dass das Datenblatt eine Reichweite von 100 mm angibt, ich jedoch tatsächlich Entfernungen bis zu 170 mm messen konnte. Andererseits werden die Messwerte ungenau, wenn sich das Objekt näher als 10 mm befindet.

Anwendungsschaltplan des VL6180X

Der folgende Anwendungsschaltplan zeigt die externe Verdrahtung, die für die Nutzung des VL6180X-Chips erforderlich ist. Du siehst die Pull-up-Widerstände für die I2C-Schnittstelle, die den VL6180X mit einem Mikrocontroller verbindet, sowie zwei Kondensatoren, die die 2,8V-Versorgung stabilisieren.

Application schematic for VL6180X
Anwendungsschaltplan für VL6180X (source)

SDA und SCL sind die Pins für die I2C-Schnittstelle. GPIO0 ist der Chip-Enable-Pin. Bei ähnlichen Laser-Entfernungssensoren wie VL53L1X oder VL53L0X wird dieser Pin als XSHUT (Shutdown) bezeichnet, mit dem der Sensor abgeschaltet werden kann, wenn er auf Masse gezogen wird. Das ist nützlich, wenn du mehrere Sensoren an derselben I2C-Leitung anschließen möchtest. GPIO1 ist ein Interrupt-Pin, der dem Mikrocontroller signalisiert, dass Daten bereitstehen.

Anstatt den winzigen VL6180X-Chip direkt zu verwenden, ist es besser, ein Breakout-Board zu verwenden, das die oben genannten Elektronikkomponenten bereits integriert hat und zudem viel einfacher anzuschließen ist.

Breakout-Board für VL6180X

Das folgende Bild zeigt das Breakout-Board für den VL6180X. Der rechteckige Chip in der Mitte ist der VL6180X-Chip. Das Board verfügt außerdem über einen Spannungsregler und Level-Shifter, sodass du es an 5V- oder 3,3V-Mikrocontroller anschließen kannst.

Breakout board for VL53L1X
Breakout-Board für VL6180X (source)

Die Pinbelegung entspricht weitgehend den Pins im Anwendungsschaltplan. SDA, SCL für I2C, VIN und GND für die Stromversorgung und GPIO1 als Interrupt-Signal. SHDN (= GPIO0, XSHUT) ist der Chip-Enable-/Shutdown-Pin. Schließlich ist 2v8 der 2,8V-Ausgang des onboard-Spannungsreglers, der bis zu 100mA liefern kann.

Anschluss des VL6180X an Arduino

Dank der I2C-Schnittstelle des VL6180X ist der Anschluss an einen Arduino einfach. Verbinde zuerst die SCL- und SDA-Pins des VL6180X-Breakout-Boards mit den entsprechenden Pins am Arduino-Board, wie unten gezeigt. Verbinde dann Masse mit GND und 3,3V mit VIN des VL6180X, und schon bist du fertig.

Connecting VL6180X with Arduino
Anschluss von VL6180X an Arduino

Das VL6180X-Breakout-Board läuft mit 5V oder 3,3V, du kannst also entweder für VIN verwenden. Als Nächstes schreiben wir etwas Code, um die Funktion des VL6180X-Sensors zu testen.

Code zum Messen der Entfernung mit VL6180X

Bevor du Entfernungen mit dem VL6180X messen kannst, musst du eine Bibliothek installieren. Die gängigsten sind die Adafruit VL6180X Library und die VL6180X library by Pololu. Ich hatte jedoch Probleme mit den Adafruit-Bibliotheken beim Schreiben des Tutorials für den VL53L0X Distance Sensor und werde daher die VL6180X library by Pololu verwenden.

Installation der VL6180X-Bibliothek von Pololu

Um die VL6180X library by Pololu zu installieren, suche einfach nach VL6180X, finde die von Pololu und installiere sie über den Library Manager. Das Bild unten zeigt, wie das aussieht, wenn die Bibliothek installiert ist:

Installing VL6180X Library by Pololu via Library Manager
Installation der VL6180X-Bibliothek von Pololu über den Library Manager

Mit installierter Bibliothek testen wir den Sensor. Der folgende Code liest die vom VL6180X gemessenen Entfernungen aus und gibt sie im Serial Monitor aus.

#include "Wire.h"
#include "VL6180X.h"

VL6180X sensor;

void setup() {
  Serial.begin(9600);
  Wire.begin();  
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

void loop() { 
  Serial.println(sensor.readRangeSingleMillimeters()); 
  delay(1000);
}

Schauen wir uns den Beispielcode oben genauer an.

Bibliotheken einbinden

Der erste Teil des Codes bindet die notwendigen Bibliotheken für die Kommunikation mit dem Sensor ein.

#include "Wire.h"
#include "VL6180X.h"

Die Wire.h-Bibliothek wird für die I2C-Kommunikation verwendet, über die der Arduino mit dem VL6180X kommuniziert. Die VL6180X.h-Bibliothek enthält die Funktionen und Definitionen speziell für den VL6180X-Sensor, was die Interaktion erleichtert.

Erstellen eines Sensor-Objekts

Als Nächstes erstellen wir eine Instanz der VL6180X-Klasse.

VL6180X sensor;

Diese Zeile deklariert eine Variable namens sensor, mit der wir die Methoden der VL6180X-Bibliothek nutzen können.

Setup-Funktion

In der setup()-Funktion initialisieren wir die serielle Kommunikation und den Sensor.

void setup() {
  Serial.begin(9600);
  Wire.begin();  
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}
  • Serial.begin(9600) initialisiert die serielle Kommunikation mit einer Baudrate von 9600 Bit pro Sekunde, sodass wir Daten an den Serial Monitor senden können.
  • Wire.begin() initialisiert den I2C-Bus und ermöglicht so die Kommunikation mit dem Sensor.
  • sensor.init() initialisiert den VL6180X-Sensor und bereitet ihn auf den Betrieb vor.
  • sensor.configureDefault() konfiguriert den Sensor mit Standardeinstellungen, um sicherzustellen, dass er korrekt für die Distanzmessung eingerichtet ist.
  • sensor.setTimeout(500) setzt ein Timeout für Sensormessungen von 500 Millisekunden. Wenn der Sensor innerhalb dieser Zeit nicht reagiert, wird ein Fehler zurückgegeben.

Loop-Funktion

Die loop()-Funktion liest kontinuierlich die Entfernung vom Sensor aus und gibt sie im Serial Monitor aus.

void loop() { 
  Serial.println(sensor.readRangeSingleMillimeters()); 
  delay(1000);
}

Die readRangeSingleMillimeters()-Funktion liest die vom Sensor gemessene Entfernung in Millimetern aus. Dieser Wert wird dann im Serial Monitor ausgegeben. Wenn der Sensor kein Objekt erkennt (außerhalb der Reichweite), wird der Wert 255 ausgegeben. Der folgende Screenshot zeigt einige Beispielmessungen im Serial Monitor:

Distance Measurements of VL6180X on Serial Monitor
Entfernungsmessungen des VL6180X im Serial Monitor

Die delay(1000) pausiert das Programm für 1000 Millisekunden (1 Sekunde) vor der nächsten Messung und verlangsamt so die Messfrequenz.

Im nächsten Abschnitt fügen wir unserem Schaltkreis ein OLED-Display hinzu und zeigen die Entfernungen darauf an, anstatt sie im Serial Monitor auszugeben.

Hinzufügen eines OLED-Displays zur Anzeige der VL6180X-Daten

Da das OLED ebenfalls ein I2C-Gerät ist, ist der Anschluss unkompliziert. Wir verbinden einfach SDA und SCL mit denselben Pins, an denen der VL6180X angeschlossen ist. Und da das OLED mit 3,3V läuft, können wir auch die Stromversorgungsleitungen teilen.

Connecting OLED and VL6180X with Arduino
Anschluss von OLED und VL6180X an Arduino

Code zur Anzeige der vom VL6180X gemessenen Entfernungen auf dem OLED

Der folgende Code liest die Entfernungsmessungen vom VL6180X-Sensor aus und zeigt sie auf dem OLED an. Schau dir zuerst den kompletten Code an, danach besprechen wir die Details.

#include "Wire.h"
#include "VL6180X.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
VL6180X sensor;

void sensor_init() {
  Wire.begin();
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void display() {
  static char text[30];
  int dist = sensor.readRangeSingleMillimeters();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);
  oled.display();
}

void setup() {
  oled_init();
  sensor_init(); 
}

void loop() {
  display();
}

Lass uns den Code in seine Teile zerlegen, um ihn besser zu verstehen.

Eingebundene Bibliotheken

Am Anfang des Codes binden wir die notwendigen Bibliotheken für die I2C-Kommunikation (Wire), den VL6180X-Sensor und das Adafruit SSD1306 OLED-Display ein.

#include "Wire.h"
#include "VL6180X.h"
#include "Adafruit_SSD1306.h"

Falls du die Adafruit_SSD1306 Library noch nicht installiert hast, musst du das tun. Installiere sie einfach wie gewohnt über den Library Manager:

Adafruit_SSD1306 library installed in Library Manager
Adafruit_SSD1306-Bibliothek im Library Manager installiert

Objektinitialisierung

Wir erstellen Instanzen des OLED-Displays und des VL6180X-Sensors. Das OLED-Display wird mit einer Breite von 128 Pixeln und einer Höhe von 64 Pixeln initialisiert.

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
VL6180X sensor;

Sensor-Initialisierungsfunktion

Die sensor_init()-Funktion initialisiert die I2C-Kommunikation und konfiguriert den VL6180X-Sensor mit Standardeinstellungen. Außerdem wird ein Timeout von 500 Millisekunden für Sensormessungen gesetzt.

void sensor_init() {
  Wire.begin();
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

OLED-Initialisierungsfunktion

Die oled_init()-Funktion initialisiert das OLED-Display. Sie aktiviert die interne Ladungspumpe und legt die I2C-Adresse (0x3C) fest. Die Textgröße wird auf 2 gesetzt, und die Textfarbe auf Weiß.

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Beachte, dass die I2C-Adresse für das OLED-Display auf 0x3C in oled.begin() eingestellt ist. Die meisten dieser kleinen OLEDs verwenden diese Adresse, aber deine könnte anders sein. Wenn du nichts auf dem OLED siehst, hat es höchstwahrscheinlich eine andere I2C-Adresse, die du ändern musst. Wenn du die I2C-Adresse nicht kennst, schau dir das How to Interface the SSD1306 I2C OLED Graphic Display With Arduino Tutorial an.

Anzeige-Funktion

Die display()-Funktion liest die Entfernung vom Sensor in Millimetern aus und formatiert sie als String. Dann löscht sie das OLED-Display, setzt den Cursor, gibt die Entfernung aus und aktualisiert die Anzeige.

void display() {
  static char text[30];
  int dist = sensor.readRangeSingleMillimeters();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);
  oled.display();
}

Wenn der Sensor kein Objekt erkennen konnte, weil es außerhalb der Reichweite ist, wird auf dem OLED der Wert 255 mm angezeigt:

Output of VL6180X on OLED
Ausgabe des VL6180X auf OLED

Setup-Funktion

In der setup()-Funktion rufen wir die Initialisierungsfunktionen für das OLED-Display und den Sensor auf, um sie einsatzbereit zu machen.

void setup() {
  oled_init();
  sensor_init(); 
}

Loop-Funktion

Schließlich ruft die loop()-Funktion kontinuierlich die display()-Funktion auf, sodass die Entfernungswerte in Echtzeit auf dem OLED-Display aktualisiert werden.

void loop() {
  display();
}

Der folgende kurze Videoclip zeigt den VL6180X-Sensor und die Anzeige in Aktion:

Distance measurements with VL6180X sensor
Entfernungsmessungen mit VL6180X-Sensor

Fazit

In diesem Tutorial hast du gelernt, wie du den VL6180X Entfernungssensor mit einem Arduino verwendest, um Entfernungen zu messen und diese auf einem OLED anzuzeigen.

Der VL6180X Sensor ist ein sehr kleiner Sensor, der infrarotes Laserlicht zur Distanzmessung nutzt. Der VL6180X ist ähnlich wie die VL53L1X, VL53L0X und TOF10120 Sensoren, hat aber eine kürzere Reichweite. Wenn du einen Sensor für eine viel größere Reichweite benötigst, schau dir den TF Luna an, der Entfernungen bis zu 8 Metern messen kann.

Er eignet sich besser als Näherungs- oder einfacher Gestensensor als als Langstrecken-Entfernungsmesser. Er verfügt außerdem über einen integrierten Umgebungslichtsensor, allerdings konnte ich mit der VL6180X-Bibliothek von Pololu keine Messwerte vom Lichtsensor erhalten.

Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Viel Spaß beim Tüfteln ; )