Lição 78: Exibir distância do VL53L0X no LCD | Curso Arduino Passo a Passo


Este guia demonstra como construir um medidor de distância a laser de precisão usando o sensor de tempo de voo VL53L0X e um display LCD 16x2 com módulo I2C. Este projeto é perfeito para makers que desejam adicionar medição de distância precisa e sem contato às suas criações. O VL53L0X usa um laser para medir distância, tornando-o ideal para aplicações onde sensores ultrassônicos podem ter dificuldades, como medir o nível de enchimento de um tanque ou detectar a posição exata de um objeto em uma esteira transportadora.
Aqui estão algumas maneiras práticas de usar este projeto:
- Alimentador Automático para Animais de Estimação: Meça o nível de ração em um recipiente para acionar um reabastecimento ou enviar uma notificação.
- Lixeira Inteligente: Detecte o quão cheia a lixeira está e alerte quando precisar ser esvaziada.
- Medidor de Altura DIY: Crie uma ferramenta de medição precisa para objetos pequenos ou para acompanhar o crescimento de uma criança.
- Assistente de Estacionamento: Construa um sistema de sensor para ajudar no estacionamento preciso em uma garagem ou espaço apertado.
- Robótica: Use-o em um robô para detectar obstáculos ou medir a distância até uma parede para navegação.
Hardware Necessário
- Placa Arduino (ex.: Uno)
- Sensor de Distância a Laser VL53L0X
- Display LCD 1602 com Módulo I2C
- Cabos Jumper
Guia de Conexões
As conexões para este projeto são simples, graças ao protocolo I2C, que permite que tanto o LCD quanto o sensor se comuniquem pelos mesmos dois fios. O sensor VL53L0X requer uma fonte de alimentação de 5V, que é obtida diretamente do pino de 5V do Arduino. Para garantir que o sensor tenha uma fonte de alimentação estável, um pino adicional é usado como VCC secundário. (no vídeo em 00:27)
Aqui está o diagrama de conexões:

As conexões são as seguintes:
- VL53L0X VCC -> Arduino 5V e Pino 13 (O pino 13 é configurado como saída digital para fornecer estabilidade extra de energia).
- 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 você estiver usando um modelo diferente de Arduino, os pinos I2C podem estar localizados em outro lugar. Os pinos SDA e SCL geralmente estão identificados diretamente na placa. (no vídeo em 02:42)
Explicação do Código
O código foi projetado para ser simples de configurar. As principais partes configuráveis pelo usuário estão no topo do sketch. (no vídeo em 04:18)
Primeiro, definimos uma constante para o pino de energia extra. Isso é usado para fornecer uma alimentação limpa de 5V ao sensor.
const int vcc2 = 13; // Pino VCC extra para o sensor VL53L0X
Em seguida, criamos uma instância da biblioteca do LCD e definimos seu endereço I2C. Você pode encontrar esse endereço executando um sketch de varredura I2C, como mostrado no vídeo. (no vídeo em 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Define o endereço do LCD como 0x3F para um display de 16 caracteres e 2 linhas
Finalmente, há uma variável que controla a unidade de medida. Você pode alterar esse valor para exibir a distância em milímetros ou centímetros.
const int type = 1; // Defina como 1 para milímetros, 2 para centímetros
Na função setup(), o pino VCC extra é configurado como saída e definido como HIGH para fornecer energia ao sensor. O LCD é então inicializado.
A lógica principal na função loop() lê a distância do sensor, limpa o LCD e imprime o valor junto com a unidade. Quando type é definido como 2, a distância é convertida de milímetros para um valor flutuante em centímetros para uma leitura mais precisa. (no vídeo em 06:47)
Demonstração ao Vivo do Projeto
Na demonstração, o sensor é testado contra uma régua para verificar sua precisão. O vídeo mostra que o sensor fornece leituras muito precisas, com apenas alguns milímetros de desvio. (no vídeo em 08:32)
É importante notar que o sensor tem um alcance máximo de cerca de 1,2 metros no modo de medição contínua. Quando o alvo está fora do alcance, o display mostrará um valor de 8190. (no vídeo em 09:53)
Outra observação importante é que o sensor pode fornecer leituras imprecisas em superfícies altamente reflexivas. Apontá-lo para um objeto brilhante pode causar erros significativos, enquanto apontá-lo para uma superfície fosca fornece resultados precisos. (no vídeo em 10:42)
O código também é compatível com diferentes variantes do módulo VL53L0X e LCDs maiores, como o modelo 2004, sem qualquer alteração na fiação. (no vídeo em 11:30)
Capítulos do Vídeo
- [00:05] Introdução ao projeto VL53L0X e LCD
- [00:27] Diagrama de fiação para o VL53L0X e LCD
- [02:51] Fiação detalhada em uma placa Arduino real
- [03:26] Verificação dos endereços I2C
- [04:18] Explicação do código e configuração
- [08:32] Demonstração ao vivo da medição de distância
- [09:53] Testando o alcance e as limitações do sensor
- [10:42] Precisão em diferentes superfícies
- [11:30] Teste com um módulo de sensor diferente e LCD maior
Imagens
/*
* 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);
}
Coisas que você pode precisar
-
AmazonasCompre o VL53L0X na Amazon.amzn.to
-
eBayCompre VL53l0x no eBayebay.us
Recursos e referências
-
ExternoBiblioteca Arduino (GitHub)github.com
-
ExternoCompre VL53l0x no eBayebay.us
-
ExternoDatasheet VL53L0X (PDF)st.com
Arquivos📁
Arquivo 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