Lezione 78: Mostra la distanza dal VL53L0X su LCD | Corso Arduino Passo Dopo Passo


Questa guida dimostra come costruire un preciso misuratore di distanza laser utilizzando il sensore a tempo di volo VL53L0X e un display LCD 16x2 con modulo I2C. Questo progetto è perfetto per i maker che desiderano aggiungere una misurazione di distanza accurata e senza contatto alle loro creazioni. Il VL53L0X utilizza un laser per misurare la distanza, rendendolo ideale per applicazioni in cui i sensori a ultrasuoni potrebbero avere difficoltà, come misurare il livello di riempimento di un serbatoio o rilevare la posizione esatta di un oggetto su un nastro trasportatore.
Ecco alcuni modi pratici in cui puoi utilizzare questo progetto:
- Mangiatoia automatica per animali: Misura il livello del cibo in un contenitore per attivare un rifornimento o inviare una notifica.
- Cestino intelligente: Rileva quanto è pieno il bidone e avvisa quando deve essere svuotato.
- Misuratore di altezza fai-da-te: Crea uno strumento di misura preciso per piccoli oggetti o per monitorare la crescita di un bambino.
- Assistente di parcheggio: Costruisci un sistema di sensori per aiutare nel parcheggio preciso in un garage o in uno spazio ristretto.
- Robotica: Usalo in un robot per rilevare ostacoli o misurare la distanza da una parete per la navigazione.
Hardware Richiesto
- Scheda Arduino (es. Uno)
- Sensore di distanza laser VL53L0X
- Display LCD 1602 con modulo I2C
- Cavi jumper
Guida al Cablaggio
Il cablaggio per questo progetto è semplice, grazie al protocollo I2C, che consente sia al display LCD che al sensore di comunicare sugli stessi due fili. Il sensore VL53L0X richiede un'alimentazione a 5V, che viene prelevata direttamente dal pin 5V di Arduino. Per garantire una fonte di alimentazione stabile al sensore, viene utilizzato un pin aggiuntivo come VCC secondario. (nel video a 00:27)
Ecco il diagramma di connessione:

Le connessioni sono le seguenti:
- VL53L0X VCC -> Arduino 5V e Pin 13 (Il Pin 13 è impostato come uscita digitale per fornire ulteriore stabilità di alimentazione).
- 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).
Se stai utilizzando un diverso modello di Arduino, i pin I2C potrebbero trovarsi altrove. I pin SDA e SCL sono spesso etichettati direttamente sulla scheda. (nel video a 02:42)
Spiegazione del Codice
Il codice è progettato per essere semplice da configurare. Le parti principali configurabili dall'utente si trovano all'inizio dello sketch. (nel video a 04:18)
Innanzitutto, definiamo una costante per il pin di alimentazione extra. Questo viene utilizzato per fornire un'alimentazione pulita a 5V al sensore.
const int vcc2 = 13; // Pin VCC extra per il sensore VL53L0X
Successivamente, creiamo un'istanza della libreria LCD e definiamo il suo indirizzo I2C. Puoi trovare questo indirizzo eseguendo uno sketch di scansione I2C, come mostrato nel video. (nel video a 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Imposta l'indirizzo LCD a 0x3F per un display a 16 caratteri e 2 righe
Infine, c'è una variabile che controlla l'unità di misura. Puoi modificare questo valore per visualizzare la distanza in millimetri o centimetri.
const int type = 1; // Imposta a 1 per millimetri, 2 per centimetri
Nella funzione setup(), il pin VCC extra viene configurato come uscita e impostato su HIGH per fornire alimentazione al sensore. Il LCD viene quindi inizializzato.
La logica principale nella funzione loop() legge la distanza dal sensore, pulisce il LCD e stampa il valore insieme all'unità. Quando type è impostato su 2, la distanza viene convertita da millimetri a un valore float in centimetri per una lettura più precisa. (nel video a 06:47)
Dimostrazione dal Vivo del Progetto
Nella dimostrazione, il sensore viene testato contro un righello per verificarne l'accuratezza. Il video mostra che il sensore fornisce letture molto precise, con solo pochi millimetri di deviazione. (nel video a 08:32)
È importante notare che il sensore ha una portata massima di circa 1,2 metri in modalità di misurazione continua. Quando il bersaglio è fuori portata, il display mostrerà un valore di 8190. (nel video a 09:53)
Un'altra osservazione chiave è che il sensore può fornire letture inaccurate su superfici altamente riflettenti. Puntarlo verso un oggetto lucido può causare errori significativi, mentre puntarlo su una superficie opaca fornisce risultati accurati. (nel video a 10:42)
Il codice è anche compatibile con diverse varianti del modulo VL53L0X e LCD più grandi, come il modello 2004, senza alcuna modifica al cablaggio. (nel video a 11:30)
Capitoli del video
- [00:05] Introduzione al progetto VL53L0X e LCD
- [00:27] Schema di cablaggio per VL53L0X e LCD
- [02:51] Cablaggio dettagliato su una scheda Arduino reale
- [03:26] Scansione degli indirizzi I2C
- [04:18] Spiegazione del codice e configurazione
- [08:32] Dimostrazione dal vivo della misurazione della distanza
- [09:53] Test del range e dei limiti del sensore
- [10:42] Precisione su diverse superfici
- [11:30] Test con un diverso modulo sensore e LCD più grande
Immagini
/*
* 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);
}
Cose di cui potresti avere bisogno
-
AmazonAcquista VL53L0X su Amazonamzn.to
-
eBayAcquista VL53l0x da eBayebay.us
Risorse e riferimenti
-
EsternoAcquista VL53l0x da eBayebay.us
-
EsternoLibreria Arduino (GitHub)github.com
-
EsternoScheda tecnica VL53L0X (PDF)st.com
File📁
File Fritzing
-
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