Código de Pesquisa

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

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

VL53L0X 200cm range sensor-blue

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.
Módulo redondo com pinos VL53L0x

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)

Conexões VL53L0X_LCD1602-3
Conexões VL53L0X_LCD1602-2
Conexões VL53L0X_LCD1602-1
Conexões VL53L0X_LCD1602-4

Aqui está o diagrama de conexões:

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

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

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

Coisas que você pode precisar

Recursos e referências

Arquivos📁

Arquivo 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