Código de búsqueda

Lección 78: Mostrar distancia desde VL53L0X en LCD | Curso de Arduino Paso a Paso

Lección 78: Mostrar distancia desde VL53L0X en LCD | Curso de Arduino Paso a Paso

VL53L0X 200cm range sensor-blue

Esta guía demuestra cómo construir un medidor de distancia láser de precisión utilizando el sensor de tiempo de vuelo VL53L0X y una pantalla LCD de 16x2 con módulo I2C. Este proyecto es perfecto para creadores que buscan agregar medición de distancia precisa y sin contacto a sus creaciones. El VL53L0X utiliza un láser para medir la distancia, lo que lo hace ideal para aplicaciones donde los sensores ultrasónicos podrían tener dificultades, como medir el nivel de llenado de un tanque o detectar la posición exacta de un objeto en una cinta transportadora.

Aquí hay algunas formas prácticas en las que puedes usar este proyecto:

  • Alimentador automático para mascotas: Mide el nivel de comida en un contenedor para activar un relleno o enviar una notificación.
  • Papelera inteligente: Detecta qué tan lleno está el contenedor y te alerta cuando necesita ser vaciado.
  • Medidor de altura casero: Crea una herramienta de medición precisa para objetos pequeños o para seguir el crecimiento de un niño.
  • Asistente de estacionamiento: Construye un sistema de sensores para ayudar con el estacionamiento preciso en un garaje o espacio reducido.
  • Robótica: Úsalo en un robot para detectar obstáculos o medir la distancia a una pared para la navegación.
VL53L0x_pin_round_module

Hardware Requerido

  • Placa Arduino (ej., Uno)
  • Sensor de distancia láser VL53L0X
  • Pantalla LCD 1602 con módulo I2C
  • Cables de conexión

Guía de Conexiones

El cableado para este proyecto es sencillo, gracias al protocolo I2C, que permite que tanto la pantalla LCD como el sensor se comuniquen a través de los mismos dos cables. El sensor VL53L0X requiere una fuente de alimentación de 5V, que se toma directamente del pin de 5V del Arduino. Para asegurar que el sensor tenga una fuente de alimentación estable, se utiliza un pin adicional como VCC secundario. (en el video en 00:27)

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

Aquí está el diagrama de conexión:

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

Las conexiones son las siguientes:

  • VL53L0X VCC -> Arduino 5V y Pin 13 (El Pin 13 se configura como salida digital para proporcionar estabilidad adicional de energía).
  • 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).

Si estás utilizando un modelo diferente de Arduino, los pines I2C podrían estar ubicados en otro lugar. Los pines SDA y SCL a menudo están etiquetados directamente en la placa. (en el video en 02:42)

Explicación del Código

El código está diseñado para ser simple de configurar. Las partes principales configurables por el usuario están en la parte superior del boceto. (en el video en 04:18)

Primero, definimos una constante para el pin de alimentación adicional. Esto se utiliza para proporcionar un suministro limpio de 5V al sensor.

const int vcc2 = 13; // Pin VCC adicional para el sensor VL53L0X

A continuación, creamos una instancia de la librería LCD y definimos su dirección I2C. Puedes encontrar esta dirección ejecutando un boceto de escaneo I2C, como se muestra en el video. (en el video en 03:26)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // Configura la dirección LCD a 0x3F para una pantalla de 16 caracteres y 2 líneas

Finalmente, hay una variable que controla la unidad de medida. Puedes cambiar este valor para mostrar la distancia en milímetros o centímetros.

const int type = 1; // Configura a 1 para milímetros, 2 para centímetros

En la función setup(), el pin VCC adicional se configura como salida y se establece en HIGH para proporcionar energía al sensor. Luego se inicializa la pantalla LCD.

La lógica principal en la función loop() lee la distancia del sensor, limpia la pantalla LCD e imprime el valor junto con la unidad. Cuando type está configurado en 2, la distancia se convierte de milímetros a un valor flotante en centímetros para una lectura más precisa. (en el video en 06:47)

Demostración del Proyecto en Vivo

En la demostración, el sensor se prueba contra una regla para verificar su precisión. El video muestra que el sensor proporciona lecturas muy precisas, con solo unos pocos milímetros de desviación. (en el video en 08:32)

Es importante tener en cuenta que el sensor tiene un rango máximo de aproximadamente 1.2 metros en modo de medición continua. Cuando el objetivo está fuera de rango, la pantalla mostrará un valor de 8190. (en el video en 09:53)

Otra observación clave es que el sensor puede dar lecturas inexactas en superficies altamente reflectantes. Apuntarlo a un objeto brillante puede causar errores significativos, mientras que apuntarlo a una superficie mate proporciona resultados precisos. (en el video en 10:42)

El código también es compatible con diferentes variantes del módulo VL53L0X y pantallas LCD más grandes, como el modelo 2004, sin necesidad de cambios en el cableado. (en el video en 11:30)

Capítulos del video

  • [00:05] Introducción al proyecto VL53L0X y LCD
  • [00:27] Diagrama de conexiones para el VL53L0X y la LCD
  • [02:51] Conexiones detalladas en una placa Arduino real
  • [03:26] Escaneo de las direcciones I2C
  • [04:18] Explicación del código y configuración
  • [08:32] Demostración en vivo de la medición de distancia
  • [09:53] Prueba del alcance y limitaciones del sensor
  • [10:42] Precisión en diferentes superficies
  • [11:30] Prueba con un módulo de sensor diferente y una LCD más grande

Imágenes

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

Cosas que podrías necesitar

Recursos y referencias

Archivos📁

Archivo de 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