Les 78: Afstand van VL53L0X weergeven op LCD | Arduino Stap voor Stap Cursus
Deze handleiding laat zien hoe je een nauwkeurige laserafstandsmeter bouwt met behulp van de VL53L0X time-of-flight-sensor en een 16x2 LCD-scherm met een I2C-module. Dit project is perfect voor makers die nauwkeurige, contactloze afstandsmeting willen toevoegen aan hun creaties. De VL53L0X gebruikt een laser om afstand te meten, waardoor het ideaal is voor toepassingen waar ultrasone sensoren moeite kunnen hebben, zoals het meten van het vulniveau van een tank of het detecteren van de exacte positie van een object op een transportband.Hier zijn een paar praktische manieren waarop je dit project kunt gebruiken:
- Automatische dierenvoeder: Meet het voederniveau in een container om een bijvulling te activeren of een melding te sturen.
- Slimme vuilnisbak: Detecteer hoe vol de bak is en waarschuw je wanneer deze geleegd moet worden.
- Zelfgemaakte hoogtemeter: Maak een nauwkeurig meetinstrument voor kleine objecten of om de groei van een kind te volgen.
- Parkeerassistent: Bouw een sensorsysteem om te helpen bij nauwkeurig parkeren in een garage of krappe ruimte.
- Robotica: Gebruik het in een robot om obstakels te detecteren of de afstand tot een muur te meten voor navigatie.
Benodigde hardware
- Arduino-board (bijv. Uno)
- VL53L0X-laserafstandssensor
- LCD 1602-scherm met I2C-module
- Jumperdraden
Bedradingshandleiding
De bedrading voor dit project is eenvoudig, dankzij het I2C-protocol, waardoor zowel het LCD-scherm als de sensor via dezelfde twee draden kunnen communiceren. De VL53L0X-sensor vereist een 5V-voeding, die rechtstreeks wordt gehaald uit de 5V-pin van de Arduino. Om ervoor te zorgen dat de sensor een stabiele stroombron heeft, wordt een extra pin gebruikt als secundaire VCC. (in video op 00:27)
Hier is het aansluitschema:

De verbindingen zijn als volgt:
- VL53L0X VCC -> Arduino 5V en Pin 13 (Pin 13 is ingesteld als digitale uitgang voor extra voedingsstabiliteit).
- 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).
Als je een ander Arduino-model gebruikt, kunnen de I2C-pinnen zich elders bevinden. De SDA- en SCL-pinnen zijn vaak direct op het bord gelabeld. (in video op 02:42)
Uitleg van de code
De code is ontworpen om eenvoudig te configureren te zijn. De belangrijkste door de gebruiker instelbare delen staan helemaal bovenaan de sketch. (in video op 04:18)
Eerst definiëren we een constante voor de extra voedingspin. Deze wordt gebruikt om een schone 5V-voeding aan de sensor te leveren.
const int vcc2 = 13; // Extra VCC-pin voor de VL53L0X-sensor
Vervolgens maken we een instantie van de LCD-bibliotheek en definiëren we het I2C-adres. Je kunt dit adres vinden door een I2C-scanner-sketch uit te voeren, zoals in de video wordt getoond. (in video op 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Stel het LCD-adres in op 0x3F voor een display van 16 tekens en 2 regels
Tenslotte is er een variabele die de meeteenheid regelt. Je kunt deze waarde wijzigen om de afstand in millimeters of centimeters weer te geven.
const int type = 1; // Stel in op 1 voor millimeter, 2 voor centimeter
In de setup()-functie wordt de extra VCC-pin geconfigureerd als uitgang en ingesteld op HIGH om stroom aan de sensor te leveren. Het LCD-scherm wordt vervolgens geïnitialiseerd.
De hoofdlogica in de loop()-functie leest de afstand van de sensor, wist het LCD-scherm en print de waarde samen met de eenheid. Wanneer type is ingesteld op 2, wordt de afstand omgezet van millimeters naar een float-waarde in centimeters voor een nauwkeurigere meting. (in video op 06:47)
Live demonstratie van het project
In de demonstratie wordt de sensor getest tegen een liniaal om de nauwkeurigheid te verifiëren. De video laat zien dat de sensor zeer nauwkeurige metingen levert, met slechts een paar millimeter afwijking. (in video op 08:32)
Het is belangrijk om op te merken dat de sensor een maximaal bereik heeft van ongeveer 1,2 meter in continue meetmodus. Wanneer het doel buiten bereik is, toont het display een waarde van 8190. (in video op 09:53)
Een andere belangrijke observatie is dat de sensor onnauwkeurige metingen kan geven op sterk reflecterende oppervlakken. Het richten op een glanzend object kan aanzienlijke fouten veroorzaken, terwijl het richten op een mat oppervlak nauwkeurige resultaten oplevert. (in video op 10:42)
De code is ook compatibel met verschillende VL53L0X-modulevarianten en grotere LCD's, zoals het 2004-model, zonder wijzigingen aan de bedrading. (in video op 11:30)
Video-hoofdstukken
- [00:05] Introductie tot het VL53L0X- en LCD-project
- [00:27] Bedradingsschema voor de VL53L0X en LCD
- [02:51] Gedetailleerde bedrading op een echte Arduino-board
- [03:26] Scannen naar de I2C-adressen
- [04:18] Uitleg van de code en configuratie
- [08:32] Live-demonstratie van afstandsmeting
- [09:53] Testen van het bereik en de beperkingen van de sensor
- [10:42] Nauwkeurigheid op verschillende oppervlakken
- [11:30] Testen met een andere sensormodule en groter LCD
Afbeeldingen
/*
* 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);
}
Dingen die je misschien nodig hebt
-
AmazonPurchase VL53L0X from Amazonamzn.to
-
eBayPurchase VL53l0x from eBayebay.us
Hulpmiddelen en referenties
-
ExternArduino Library (GitHub)github.com
-
ExternPurchase VL53l0x from eBayebay.us
-
ExternVL53L0X datasheet (PDF)st.com
Bestanden📁
Fritzing-bestand
-
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