Search Code

Lekcija 78: Prikaz udaljenosti sa VL53L0X na LCD | Arduino Korak po korak kurs

Lekcija 78: Prikaz udaljenosti sa VL53L0X na LCD | Arduino Korak po korak kurs

Ovaj vodič pokazuje kako napraviti precizan laserski mjerač udaljenosti koristeći VL53L0X senzor vremena leta i 16x2 LCD ekran sa I2C modulom. Ovaj projekat je savršen za makere koji žele dodati precizno, beskontaktno mjerenje udaljenosti svojim kreacijama. VL53L0X koristi laser za mjerenje udaljenosti, što ga čini idealnim za aplikacije gdje ultrazvučni senzori mogu imati poteškoća, kao što je mjerenje nivoa napunjenosti rezervoara ili detekcija tačne pozicije objekta na pokretnoj traci.

Evo nekoliko praktičnih načina na koje možete koristiti ovaj projekat:

  • Automatizovana hranilica za kućne ljubimce: Izmjerite nivo hrane u posudi da biste pokrenuli dopunjavanje ili poslali obavijest.
  • Pametna kanta za smeće: Detektujte koliko je kanta puna i upozorite vas kada je treba isprazniti.
  • DIY mjerač visine: Napravite precizan mjerni alat za male predmete ili za praćenje rasta djeteta.
  • Asistent za parkiranje: Napravite senzorski sistem koji pomaže pri preciznom parkiranju u garaži ili uskom prostoru.
  • Robotika: Koristite ga u robotu za detekciju prepreka ili mjerenje udaljenosti do zida za navigaciju.
VL53L0x_pin_round_module

Potreban hardver

  • Arduino ploča (npr. Uno)
  • VL53L0X laserski senzor udaljenosti
  • LCD 1602 ekran sa I2C modulom
  • Konektorski kablovi

Vodič za povezivanje

Povezivanje za ovaj projekat je jednostavno, zahvaljujući I2C protokolu, koji omogućava i LCD-u i senzoru da komuniciraju preko iste dvije žice. VL53L0X senzor zahtijeva napajanje od 5V, koje se uzima direktno sa Arduino 5V pina. Da bi se osiguralo da senzor ima stabilan izvor napajanja, dodatni pin se koristi kao sekundarni VCC. (u videu na 00:27)

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

Ovdje je dijagram povezivanja:

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

Veze su sljedeće:

  • VL53L0X VCC -> Arduino 5V i Pin 13 (Pin 13 je postavljen kao digitalni izlaz za dodatnu stabilnost napajanja).
  • 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).

Ako koristite drugačiji Arduino model, I2C pinovi mogu biti na drugom mjestu. SDA i SCL pinovi su često označeni direktno na ploči. (u videu na 02:42)

Objašnjenje koda

Kod je dizajniran da bude jednostavan za konfigurisanje. Glavni dijelovi koje korisnik može podešavati su na samom vrhu skice. (u videu na 04:18)

Prvo, definišemo konstantu za dodatni pin napajanja. Ovo se koristi za osiguravanje čistog napajanja od 5V za senzor.

const int vcc2 = 13; // Dodatni VCC pin za VL53L0X senzor

Zatim, kreiramo instancu LCD biblioteke i definišemo njenu I2C adresu. Ovu adresu možete pronaći pokretanjem I2C skener skice, kao što je prikazano u videu. (u videu na 03:26)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // Postavite LCD adresu na 0x3F za ekran od 16 znakova i 2 linije

Konačno, postoji varijabla koja kontroliše jedinicu mjere. Možete promijeniti ovu vrijednost da biste prikazali udaljenost u milimetrima ili centimetrima.

const int type = 1; // Postavite na 1 za milimetre, 2 za centimetre

U setup() funkciji, dodatni VCC pin je konfigurisan kao izlaz i postavljen na HIGH da bi se osiguralo napajanje senzora. LCD se zatim inicijalizuje.

Glavna logika u loop() funkciji čita udaljenost sa senzora, čisti LCD i ispisuje vrijednost zajedno sa jedinicom. Kada je type postavljen na 2, udaljenost se pretvara iz milimetara u float vrijednost u centimetrima radi preciznijeg očitavanja. (u videu na 06:47)

Demonstracija projekta uživo

U demonstraciji, senzor se testira protiv ravnala kako bi se provjerila njegova tačnost. Video prikazuje da senzor pruža vrlo precizna očitavanja, sa samo nekoliko milimetara odstupanja. (u videu na 08:32)

Važno je napomenuti da senzor ima maksimalni domet od oko 1,2 metra u režimu kontinuiranog mjerenja. Kada je cilj van dometa, ekran će prikazati vrijednost 8190. (u videu na 09:53)

Još jedno ključno zapažanje je da senzor može dati netačna očitanja na visoko reflektivnim površinama. Usmjeravanje na sjajni predmet može uzrokovati značajne greške, dok usmjeravanje na mat površinu daje tačne rezultate. (u videu na 10:42)

Kod je također kompatibilan s različitim varijantama VL53L0X modula i većim LCD ekranima, poput modela 2004, bez ikakvih izmjena na ožičenju. (u videu na 11:30)

Poglavlja videa

  • [00:05] Uvod u VL53L0X i LCD projekat
  • [00:27] Šema ožičenja za VL53L0X i LCD
  • [02:51] Detaljno ožičenje na stvarnoj Arduino ploči
  • [03:26] Skeniranje I2C adresa
  • [04:18] Objašnjenje koda i konfiguracija
  • [08:32] Živa demonstracija mjerenja udaljenosti
  • [09:53] Testiranje dometa i ograničenja senzora
  • [10:42] Tačnost na različitim površinama
  • [11:30] Testiranje s drugim senzorskim modulom i većim LCD ekranom

Images

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

Things you might need

Resources & references

Files📁

Fritzing File

  • 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