Search Code

Les 78: Afstand van VL53L0X weergeven op LCD | Arduino Stap voor Stap Cursus

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.
VL53L0x_pin_round_module

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)

VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-4

Hier is het aansluitschema:

Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)

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

VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-blue
VL53L0X 200cm range sensor-blue
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
VL53L0x_pin_module
VL53L0x_pin_module
VL53L0x_pin_round_module
VL53L0x_pin_round_module
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-3
641-Lesson 78: Using a VL53L0X Laser Distance Sensor with an LCD1602 or LCD2004 Display and Arduino
Taal: C++
/*
* 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

Hulpmiddelen en referenties

Bestanden📁

Fritzing-bestand

  • Adafruit VL6180X Time of Flight Distance Sensor
    Fritzing 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.fzpz 0.02 MB