Search Code

Lecția 78: Afișarea distanței de la VL53L0X pe LCD | Cursul Arduino Pas cu Pas

Lecția 78: Afișarea distanței de la VL53L0X pe LCD | Cursul Arduino Pas cu Pas

Acest ghid demonstrează cum să construiești un telemetru laser precis folosind senzorul de timp de zbor VL53L0X și un afișaj LCD 16x2 cu modul I2C. Acest proiect este perfect pentru makerii care doresc să adauge măsurarea precisă a distanței fără contact creațiilor lor. VL53L0X folosește un laser pentru a măsura distanța, fiind ideal pentru aplicații unde senzorii ultrasonici ar putea avea dificultăți, cum ar fi măsurarea nivelului de umplere al unui rezervor sau detectarea poziției exacte a unui obiect pe o bandă transportoare.

Iată câteva moduri practice în care poți folosi acest proiect:

  • Hrănitor automat pentru animale de companie: Măsoară nivelul hranei dintr-un recipient pentru a declanșa reumplerea sau pentru a trimite o notificare.
  • Coș de gunoi inteligent: Detectează cât de plin este coșul și te alertează când trebuie golit.
  • Instrument de măsurare a înălțimii DIY: Creează un instrument precis de măsurare pentru obiecte mici sau pentru a urmări creșterea unui copil.
  • Asistent de parcare: Construiește un sistem cu senzori pentru a ajuta la parcarea precisă într-un garaj sau într-un spațiu îngust.
  • Robotică: Folosește-l într-un robot pentru a detecta obstacole sau pentru a măsura distanța până la un perete pentru navigare.
Modul rotund cu pin VL53L0x

Hardware necesar

  • Placă Arduino (de exemplu, Uno)
  • Senzor laser de distanță VL53L0X
  • Afișaj LCD 1602 cu modul I2C
  • Fire de legătură

Ghid de cablare

Cablarea pentru acest proiect este simplă, datorită protocolului I2C, care permite atât afișajului LCD, cât și senzorului să comunice prin aceleași două fire. Senzorul VL53L0X necesită o sursă de alimentare de 5V, care este preluată direct de la pinul de 5V al Arduino. Pentru a asigura o sursă stabilă de alimentare pentru senzor, un pin suplimentar este folosit ca VCC secundar. (în video la 00:27)

Cablare VL53L0X_LCD1602-3
Cablare VL53L0X_LCD1602-2
Cablare VL53L0X_LCD1602-1
Cablare VL53L0X_LCD1602-4

Iată diagrama de conexiuni:

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

Conexiunile sunt următoarele:

  • VL53L0X VCC -> Arduino 5V și Pin 13 (Pin 13 este setat ca ieșire digitală pentru a oferi stabilitate suplimentară a puterii).
  • 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).

Dacă folosești un alt model de Arduino, pinii I2C s-ar putea afla în altă parte. Pinii SDA și SCL sunt adesea etichetați direct pe placă. (în video la 02:42)

Explicația codului

Codul este conceput pentru a fi simplu de configurat. Principalele părți configurabile de utilizator se află chiar în partea de sus a schiței. (în video la 04:18)

Mai întâi, definim o constantă pentru pinul suplimentar de alimentare. Acesta este folosit pentru a furniza o sursă curată de 5V senzorului.

const int vcc2 = 13; // Pin VCC suplimentar pentru senzorul VL53L0X

Apoi, creăm o instanță a bibliotecii LCD și definim adresa sa I2C. Poți găsi această adresă rulând o schiță de scanare I2C, așa cum este arătat în video. (în video la 03:26)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // Setează adresa LCD la 0x3F pentru un afișaj de 16 caractere și 2 linii

În cele din urmă, există o variabilă care controlează unitatea de măsură. Poți schimba această valoare pentru a afișa distanța fie în milimetri, fie în centimetri.

const int type = 1; // Setează la 1 pentru milimetri, 2 pentru centimetri

În funcția setup(), pinul VCC suplimentar este configurat ca ieșire și setat la HIGH pentru a furniza putere senzorului. LCD-ul este apoi inițializat.

Logica principală din funcția loop() citește distanța de la senzor, șterge LCD-ul și afișează valoarea împreună cu unitatea. Când type este setat la 2, distanța este convertită din milimetri într-o valoare float în centimetri pentru o citire mai precisă. (în video la 06:47)

Demonstrație live a proiectului

În demonstrație, senzorul este testat împotriva unei rigle pentru a verifica precizia sa. Video-ul arată că senzorul oferă citiri foarte precise, cu doar câțiva milimetri de abatere. (în video la 08:32)

Este important de reținut că senzorul are o rază maximă de aproximativ 1,2 metri în modul de măsurare continuă. Când ținta este în afara razei, afișajul va arăta o valoare de 8190. (în video la 09:53)

O altă observație importantă este că senzorul poate oferi citiri inexacte pe suprafețe puternic reflectorizante. Îndreptarea lui către un obiect lucios poate cauza erori semnificative, în timp ce îndreptarea către o suprafață mată oferă rezultate precise. (în video la 10:42)

Codul este, de asemenea, compatibil cu diferite variante ale modulului VL53L0X și cu LCD-uri mai mari, cum ar fi modelul 2004, fără nicio modificare a cablajului. (în video la 11:30)

Capitolele Video

  • [00:05] Introducere în proiectul VL53L0X și LCD
  • [00:27] Schema de cablare pentru VL53L0X și LCD
  • [02:51] Cablare detaliată pe o placă Arduino reală
  • [03:26] Scanarea adreselor I2C
  • [04:18] Explicația codului și configurarea
  • [08:32] Demonstrație live a măsurării distanței
  • [09:53] Testarea razei și limitărilor senzorului
  • [10:42] Precizia pe diferite suprafețe
  • [11:30] Testarea cu un alt modul de senzor și un LCD mai mare

Imagini

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

Lucruri de care ai putea avea nevoie

Resurse și referințe

Fișiere📁

Fișier Fritzing

  • 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