Lektion 78: Entfernung vom VL53L0X auf LCD anzeigen | Arduino Schritt-für-Schritt-Kurs
Dieser Leitfaden zeigt, wie man ein präzises Laser-Entfernungsmessgerät mit dem VL53L0X-Time-of-Flight-Sensor und einem 16x2-LCD-Display mit I2C-Modul baut. Dieses Projekt ist perfekt für Maker, die ihrer Kreationen eine genaue, berührungslose Entfernungsmessung hinzufügen möchten. Der VL53L0X verwendet einen Laser zur Entfernungsmessung und ist daher ideal für Anwendungen, bei denen Ultraschallsensoren Probleme haben könnten, wie zum Beispiel die Messung des Füllstands eines Tanks oder die Erkennung der genauen Position eines Objekts auf einem Förderband.Hier sind einige praktische Möglichkeiten, wie Sie dieses Projekt nutzen können:
- Automatischer Futterspender für Haustiere: Messen Sie den Futterstand in einem Behälter, um eine Nachfüllung auszulösen oder eine Benachrichtigung zu senden.
- Intelligenter Mülleimer: Erkennen Sie, wie voll der Behälter ist, und werden Sie benachrichtigt, wenn er geleert werden muss.
- DIY-Höhenmesser: Erstellen Sie ein präzises Messwerkzeug für kleine Objekte oder zur Verfolgung des Wachstums eines Kindes.
- Parkassistent: Bauen Sie ein Sensorsystem, das beim präzisen Einparken in einer Garage oder auf engem Raum hilft.
- Robotik: Verwenden Sie es in einem Roboter, um Hindernisse zu erkennen oder die Entfernung zu einer Wand für die Navigation zu messen.
Benötigte Hardware
- Arduino-Board (z. B. Uno)
- VL53L0X-Laser-Entfernungssensor
- LCD-1602-Display mit I2C-Modul
- Jumper-Kabel
Verdrahtungsanleitung
Die Verdrahtung für dieses Projekt ist dank des I2C-Protokolls unkompliziert, da sowohl das LCD als auch der Sensor über dieselben zwei Drähte kommunizieren können. Der VL53L0X-Sensor benötigt eine 5V-Stromversorgung, die direkt vom 5V-Pin des Arduinos bezogen wird. Um eine stabile Stromversorgung des Sensors zu gewährleisten, wird ein zusätzlicher Pin als sekundäre VCC verwendet. (im Video bei 00:27)
Hier ist das Verbindungsdiagramm:

Die Verbindungen sind wie folgt:
- VL53L0X VCC -> Arduino 5V und Pin 13 (Pin 13 ist als digitaler Ausgang eingestellt, um zusätzliche Stromstabilität zu bieten).
- VL53L0X GND -> Arduino GND.
- VL53L0X SCL -> Arduino SCL (A5).
- VL53L0X SDA -> Arduino SDA (A4).
- LCD I2C VCC -> Arduino 5V.
- LCD I2C GND -> Arduino GND.
- LCD I2C SCL -> Arduino SCL (A5).
- LCD I2C SDA -> Arduino SDA (A4).
Wenn Sie ein anderes Arduino-Modell verwenden, befinden sich die I2C-Pins möglicherweise an anderer Stelle. Die SDA- und SCL-Pins sind oft direkt auf dem Board beschriftet. (im Video bei 02:42)
Code-Erklärung
Der Code ist so konzipiert, dass er einfach zu konfigurieren ist. Die wichtigsten benutzerkonfigurierbaren Teile befinden sich ganz oben im Sketch. (im Video bei 04:18)
Zuerst definieren wir eine Konstante für den zusätzlichen Strompin. Dieser wird verwendet, um eine saubere 5V-Versorgung für den Sensor bereitzustellen.
const int vcc2 = 13; // Zusätzlicher VCC-Pin für den VL53L0X-Sensor
Als Nächstes erstellen wir eine Instanz der LCD-Bibliothek und definieren ihre I2C-Adresse. Sie können diese Adresse finden, indem Sie einen I2C-Scanner-Sketch ausführen, wie im Video gezeigt. (im Video bei 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Setzen Sie die LCD-Adresse auf 0x3F für ein 16-Zeichen- und 2-Zeilen-Display
Schließlich gibt es eine Variable, die die Maßeinheit steuert. Sie können diesen Wert ändern, um die Entfernung entweder in Millimetern oder Zentimetern anzuzeigen.
const int type = 1; // Auf 1 für Millimeter setzen, auf 2 für Zentimeter
In der setup()-Funktion wird der zusätzliche VCC-Pin als Ausgang konfiguriert und auf HIGH gesetzt, um den Sensor mit Strom zu versorgen. Das LCD wird dann initialisiert.
Die Hauptlogik in der loop()-Funktion liest die Entfernung vom Sensor, löscht das LCD und gibt den Wert zusammen mit der Einheit aus. Wenn type auf 2 gesetzt ist, wird die Entfernung von Millimetern in einen Float-Wert in Zentimetern umgewandelt, um eine präzisere Messung zu erhalten. (im Video bei 06:47)
Live-Projektdemonstration
In der Demonstration wird der Sensor gegen ein Lineal getestet, um seine Genauigkeit zu überprüfen. Das Video zeigt, dass der Sensor sehr präzise Messwerte liefert, mit nur wenigen Millimetern Abweichung. (im Video bei 08:32)
Es ist wichtig zu beachten, dass der Sensor im kontinuierlichen Messmodus eine maximale Reichweite von etwa 1,2 Metern hat. Wenn das Ziel außerhalb der Reichweite liegt, zeigt das Display einen Wert von 8190 an. (im Video bei 09:53)
Eine weitere wichtige Beobachtung ist, dass der Sensor auf stark reflektierenden Oberflächen ungenaue Messwerte liefern kann. Wenn man ihn auf ein glänzendes Objekt richtet, kann dies zu erheblichen Fehlern führen, während das Richten auf eine matte Oberfläche genaue Ergebnisse liefert. (im Video bei 10:42)
Der Code ist außerdem mit verschiedenen VL53L0X-Modulvarianten und größeren LCDs, wie dem 2004-Modell, kompatibel, ohne dass Änderungen an der Verkabelung erforderlich sind. (im Video bei 11:30)
Videokapitel
- [00:05] Einführung in das VL53L0X- und LCD-Projekt
- [00:27] Schaltplan für VL53L0X und LCD
- [02:51] Detaillierte Verkabelung auf einem echten Arduino-Board
- [03:26] Suche nach den I2C-Adressen
- [04:18] Code-Erklärung und Konfiguration
- [08:32] Live-Demonstration der Distanzmessung
- [09:53] Test der Reichweite und Grenzen des Sensors
- [10:42] Genauigkeit auf verschiedenen Oberflächen
- [11:30] Test mit einem anderen Sensormodul und größerem LCD
Bilder
/*
* Lesson 76-1: Using One single VL6180 Laser Distance Sensor with Arduino
* Adafruit code modified for this tutorial
* by Ahmad Shamshiri at 22:22 on
* March 10-11, 2021 in Ajax, ON, Canada
Please watch video instruction of this code: https://youtu.be/_H9D0czQpSI
View code for using two or more VL6180X sensors: https://robojax.com/course1/lecture76
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. *
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.print(range);
Serial.println("mm");
}
// if(range <=76)
// {
// //do something
// }
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
}
Dinge, die Sie vielleicht brauchen
-
AmazonKaufen Sie VL53L0X bei Amazonamzn.to
-
eBayKaufe VL53l0x bei eBayebay.us
Ressourcen & Referenzen
-
ExternArduino-Bibliothek (GitHub)github.com
-
ExternKaufe VL53l0x bei eBayebay.us
-
ExternVL53L0X-Datenblatt (PDF)st.com
Dateien📁
Fritzing-Datei
-
Adafruit VL6180X Time of Flight Distance SensorFritzing part for the Adafruit VL6180X Time of Flight distance sensor. This sensor measures absolute distance up to 100mm and ambient light, communicating via I2C. Includes the sensor breakout board and pin connections for use in Fritzing projects.
Adafruit VL6180X Time of Flight Distance Sensor-1.fzpz0.02 MB