¿Qué es un VL53L0X?
El VL53L0X es un sensor de distancia infrarrojo láser de última generación, que podemos emplear junto con un procesador como Arduino para medir distancias de 50mm a 2000 mm de forma precisa. Para rangos más cercanos, la variante VL6180X tiene un rango de 5mm a 200mm.
El VL53L0X es capaz de operar incluso con elevada luz ambiental infrarroja, e incorpora un sistema de compensación de la medición que lo permite hacer funcionar incluso detrás de un cristal protector.
Es uno de los mejores sensores de distancia disponibles. Tiene una precisión superior que los sensores de ultrasonidos e infrarrojos, y no se ve alterado por las condiciones del ambiente como los ecos o la reflectancia de los objetos.
Por otro lado el ángulo de medición es relativamente estrecho. Esto es una ventaja en la mayoría de circunstancias, donde deseamos leer la distancia justo en frente del sensor. Aunque también puede ser una desventaja, por ejemplo, a la hora de detectar obstáculos.
Precio
Los sensores VL53L0X son algo más caros que otros sensores de distancia, aunque a cambio tiene unas prestaciones superiores. Podemos encontrar módulos con VL53L0X por 3,90€ en vendedores internacionales de eBay y AliExpress.
¿Cómo funciona un VL53L0X?
El VL53L0X es un sensor ToF (Time of flight). Su funcionamiento consiste en enviar un pulso láser de luz infrarroja y medir el tiempo necesario en el haz en volver al sensor.
El integrado incorpora un emisor laser 940nm VCSEL (Vertical Cavity Surface-Emitting Laser), un detector SPAD (Single Photon Avalanche Diodes) y la electrónica interna (denominada FlightSenseTM) que realiza los cálculos necesarios.
El ángulo de medición o FOV (Field of View) es de 25º. Esto se traduce en un área de medición de 0.44m de diámetro a una distancia de 1m.
El rango de medición depende de las condiciones del entorno (interior, o exterior), de las características del objetivo y del modo de funcionamiento. En general, tenemos dos modos. El estándar es de 50 a 1200mm, y un modo ampliado hasta 2000mm. Para rangos más cercanos, la variante VL6180X tiene un rango de 5mm a 200mm.
Reflectancia objetivo | Conditions | Indoor | Outdoor |
---|---|---|---|
Objetivo blanco | Tipico | 200cm | 80cm |
Minimo | 120cm | 60cm | |
Objetivo gris | Tipico | 80cm | 50cm |
Minimo | 70cm | 40cm |
En cuanto a precisión, nuevamente depende del entorno, objetivo, y modo de funcionamiento. La siguiente tabla muestra valores típicos de rango y precisión según los distintos modos de funcionamiento del VL53L0X.
Modo | Timing | Alcance | Precisión |
---|---|---|---|
Default | 30ms | 1.2m | Ver tabla siguiente |
Alta precisión | 200ms | 1.2m | +/- 3% |
Largo alcance | 33ms | 2m | Ver tabla siguiente |
Alta velocidad | 20ms | 1.2m | +/- 5% |
Esto se traduce en las siguientes precisiones de referencia para los modos de funcionamiento estándar y de largo alcance.
Indoor | Outdoor | |
---|---|---|
Reflectancia objetivo | Distancia | 33ms |
Objetivo blanco | a 120cm | 4% |
Objetivo gris | a 70cm | 7% |
Que se sintetiza en la siguiente gráfica, para el modo de funcionamiento estándar.
Para mayor detalle consultar el Datasheet del fabricante, que incorpora información detallada sobre modos de funcionamiento, rango de medición y precisión, entre otros muchos datos interesantes.
Esquema de montaje
La conexión de los módulos que integran el VL53L0X es sencilla, ya que la comunicación se realiza a través de I2C. Por tanto, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.
El esquema, visto desde Arduino, sería el siguiente.
Ejemplos de código
Para realizar la lectura del sensor VL53L0X usaremos la librería desarrollada por Adafruit, disponible en este enlace.
La librería incorpora varios ejemplos de uso. El siguiente código toma lecturas de la distancia y muestra los resultados por puerto serie.
#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
void setup() {
Serial.begin(9600);
// Iniciar sensor
Serial.println("VL53L0X test");
if (!lox.begin()) {
Serial.println(F("Error al iniciar VL53L0X"));
while(1);
}
}
void loop() {
VL53L0X_RangingMeasurementData_t measure;
Serial.print("Leyendo sensor... ");
lox.rangingTest(&measure, false); // si se pasa true como parametro, muestra por puerto serie datos de debug
if (measure.RangeStatus != 4)
{
Serial.print("Distancia (mm): ");
Serial.println(measure.RangeMilliMeter);
}
else
{
Serial.println(" Fuera de rango ");
}
delay(100);
}
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.