Search Code

Les 78: Vertoon afstand vanaf VL53L0X op LCD | Arduino Stap-vir-stap Kursus

Les 78: Vertoon afstand vanaf VL53L0X op LCD | Arduino Stap-vir-stap Kursus

Hierdie gids demonstreer hoe om 'n presiese laserafstandmeter te bou met behulp van die VL53L0X-tyd-van-vlug-sensor en 'n 16x2-LCD-skerm met 'n I2C-module. Hierdie projek is perfek vir makers wat akkurate, kontaklose afstandmeting by hul skeppings wil voeg. Die VL53L0X gebruik 'n laser om afstand te meet, wat dit ideaal maak vir toepassings waar ultrasoniese sensors dalk sukkel, soos om die vulvlak van 'n tenk te meet of die presiese posisie van 'n voorwerp op 'n vervoerband op te spoor.

Hier is 'n paar praktiese maniere waarop jy hierdie projek kan gebruik:

  • Outomatiese Troeteldiervoerder: Meet die kosvlak in 'n houer om 'n hervulling te aktiveer of 'n kennisgewing te stuur.
  • Slim Vullisdrom: Bespeur hoe vol die drom is en waarsku jou wanneer dit leeggemaak moet word.
  • Selfdoen-Hoogtemeter: Skep 'n presiese meetinstrument vir klein voorwerpe of om 'n kind se groei te volg.
  • Parkeerassistent: Bou 'n sensorstelsel om te help met presiese parkering in 'n motorhuis of nou ruimte.
  • Robotika: Gebruik dit in 'n robot om hindernisse te bespeur of die afstand na 'n muur te meet vir navigasie.
VL53L0x_pin_round_module

Hardeware Benodig

  • Arduino-bord (bv. Uno)
  • VL53L0X-laserafstandsensor
  • LCD 1602-skerm met I2C-module
  • Springdrade

Bedradingsgids

Die bedrading vir hierdie projek is eenvoudig, danksy die I2C-protokol, wat beide die LCD en die sensor in staat stel om oor dieselfde twee drade te kommunikeer. Die VL53L0X-sensor benodig 'n 5V-kragtoevoer, wat direk vanaf die Arduino se 5V-pen getrek word. Om te verseker dat die sensor 'n stabiele kragbron het, word 'n bykomende pen as 'n sekondêre VCC gebruik. (in video by 00:27)

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

Hier is die verbindingsdiagram:

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

Die verbindings is soos volg:

  • VL53L0X VCC -> Arduino 5V en Pen 13 (Pen 13 word as 'n digitale uitset gestel om ekstra kragstabiliteit te verskaf).
  • 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).

As jy 'n ander Arduino-model gebruik, kan die I2C-penne elders geleë wees. Die SDA- en SCL-penne word dikwels direk op die bord gemerk. (in video by 02:42)

Kodeverduideliking

Die kode is ontwerp om maklik te konfigureer. Die hoof gebruikerskonfigureerbare dele is heel bo aan die skets. (in video by 04:18)

Eerstens definieer ons 'n konstante vir die ekstra kragpen. Dit word gebruik om 'n skoon 5V-toevoer aan die sensor te verskaf.

const int vcc2 = 13; // Ekstra VCC-pen vir die VL53L0X-sensor

Vervolgens skep ons 'n instansie van die LCD-biblioteek en definieer sy I2C-adres. Jy kan hierdie adres vind deur 'n I2C-skandeerder-skets te laat loop, soos in die video gewys word. (in video by 03:26)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // Stel die LCD-adres na 0x3F vir 'n 16-karakter en 2-lyn-skerm

Laastens is daar 'n veranderlike wat die meeteenheid beheer. Jy kan hierdie waarde verander om die afstand in óf millimeter óf sentimeter te vertoon.

const int type = 1; // Stel na 1 vir millimeter, 2 vir sentimeter

In die setup()-funksie word die ekstra VCC-pen as 'n uitset gekonfigureer en op HOOG gestel om krag aan die sensor te verskaf. Die LCD word dan geïnisialiseer.

Die hoof logika in die loop()-funksie lees die afstand van die sensor, maak die LCD skoon, en druk die waarde saam met die eenheid. Wanneer type op 2 gestel is, word die afstand van millimeter na 'n dryfwaardewaarde in sentimeter omgeskakel vir 'n meer presiese lesing. (in video by 06:47)

Lewende Projekdemonstrasie

In die demonstrasie word die sensor teen 'n liniaal getoets om sy akkuraatheid te verifieer. Die video wys dat die sensor baie presiese lesings verskaf, met slegs 'n paar millimeter se afwyking. (in video by 08:32)

Dit is belangrik om daarop te let dat die sensor 'n maksimum reikafstand van ongeveer 1.2 meter in deurlopende meetmodus het. Wanneer die teiken buite reikafstand is, sal die skerm 'n waarde van 8190 wys. (in video by 09:53)

Nog 'n belangrike waarneming is dat die sensor onakkurate lesings kan gee op hoogs reflektiewe oppervlaktes. Om dit na 'n glansende voorwerp te rig kan aansienlike foute veroorsaak, terwyl dit na 'n mat oppervlak gerig akkurate resultate lewer. (in video by 10:42)

Die kode is ook versoenbaar met verskillende VL53L0X-modulevariasies en groter LCD's, soos die 2004-model, sonder enige veranderinge aan die bedrading. (in video by 11:30)

Video-hoofstukke

  • [00:05] Inleiding tot die VL53L0X- en LCD-projek
  • [00:27] Bedradingsdiagram vir die VL53L0X en LCD
  • [02:51] Gedetailleerde bedrading op 'n werklike Arduino-bord
  • [03:26] Skandering vir die I2C-adresse
  • [04:18] Kodeverduideliking en -konfigurasie
  • [08:32] Lewendige demonstrasie van afstandsmeting
  • [09:53] Toets van die sensor se reikwydte en beperkings
  • [10:42] Akkuraatheid op verskillende oppervlaktes
  • [11:30] Toets met 'n ander sensormodule en groter LCD

Beelde

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);
}

Goedere wat jy dalk nodig het

Hulpbronne en verwysings

Lêers📁

Fritzing-lêer

  • 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