En algunos de tus proyectos habrás necesitado medir distancias. Pues debes saber que el VL53L0X es un dispositivo que permite medirlas con una alta precisión. Además, su reducido tamaño y el bajo precio que tiene lo hacen ideal para tus proyectos DIY, en especial para integrar con Arduino.
Existen muchos dispositivos que pueden medir distancias, algunos de ellos son distanciómetros basados en ultrasonidos que emiten un sonido y al rebotar con el objeto permite saber con bastante exactitud la distancia que hay. Pero si quieres la más alta de las precisiones, para ello necesitas un distanciómetro óptico. Este tipo de dispositivos de medida se basa en láser, como es el caso del VL53L0X.
¿Qué es el ToF?
Cámara de tiempo de vuelo o ToF (Time-of-Flight) es una técnica utilizada para medir distancias. Se basa en la óptica, midiendo el tiempo transcurrido entre la emisión de un haz luminoso y la recepción. Pueden ser sensores CCD, CMOS, y los pulsos pueden ser infrarrojos, láser, etc. El sistema estará sincronizado para comenzar la medición de tiempo justo cuando se lanza el pulso y parar el contador cuando reciben el rebote por el sensor.
De esa forma, se puede calcular la distancia con bastante precisión. Tan solo hace falta una circuitería lógica adicional integrada en el chip para realizar los cálculos desde que se lanza el haz hasta que se recibe y así determinar cuál es la distancia. El principio es bastante sencillo.
Este tipo de dispositivos se emplean en robótica para permitir al robot o drone evitar obstáculos, saber a qué distancia se encuentran de un objetivo, para detectar movimiento o proximidad, para sensores para automóviles usados para distintas aplicaciones, para implementar un metro electrónico, como un actuador para que Arduino haga algo cuando detecte cierta proximidad de un objeto, etc.
Qué es el VL53L0X y datasheet
El VL53L0X emplea ese principio para medir distancias por infrarrojo láser de última generación. Junto con un procesador, como Arduino, puede ser una potente herramienta para medir. Concretamente el chip puede captar distancias de entre 50mm y 2000mm, es decir, entre 5 centímetros y 2 metros.
Para medir distancias más cercanas probablemente necesites una variante de este chip denominada VL6180X que permite medir un rango de entre 5 y 200 mm, es decir, entre medio centímetro y 20 centímetros. Si quieres encontrar un dispositivo similar pero basado en ultrasonidos por cualquier motivo técnico, entonces deberías mirar el HC-SR04, otro módulo bastante barato y popular entre los makers.
El chip VL53L0X ha sido diseñado para funcionar incluso cuando la luz ambiental es bastante elevada. Ten en cuenta que al trabajar de forma óptica, mientras mayor sea la «contaminación» luminosa del ambiente, más complicado será captar adecuadamente el rebote de la señal. Pero en este caso no presenta demasiado problema. Además, el sistema de compensación que integra le permite medir incluso si lo usas tras un cristal protector.
Eso lo transforman en uno de los mejores sensores de distancias que encontrarás en el mercado. Con una precisión bastante superior a los sensores basados en ultrasonidos o infrarrojos (IR). El motivo de ser tan preciso es que el láser no se verá afectado por ecos o reflectancia de objetos como ocurre en los otros casos.
Actualmente puedes encontrarlo integrado en mulos con algunos extra por unos 16€ o en placas más simples de poco más de 1€ o 3€ en otros casos. Ya sabes que lo encontrarás en tiendas como eBay, AliExpress, Amazon, etc. Los fabricantes de estos dispositivos son varios, por lo que si necesitas conocer los detalles del modelo que has comprado lo mejor es que compruebes el datasheet del fabricante que has elegido. Por ejemplo:
El VL53L0X tiene dentro del chip el emisor del pulso láser y el sensor para captar el haz que vuelve. En este caso el emisor es un láser de 940nm de longitud de onda y de tipo VCSEL (Vertical Cavity Surface-Emitting Laser). En cuanto al sensor de captación es un SPAD (Single Photon Avalanche Diodes). También integra una electrónica interna denominada FlightSenseTM que calculará la distancia.
El angulo de medición o FOV (Field of View) es de 25º en este caso. Eso se traduce a un área de medición de 0,44m de diámetro a una distancia de 1m. Aunque el rango de medición dependerá de las condiciones del entorno. Si se hace en el interior es un poco superior a si se hace en el exterior. También dependerá de la reflectancia del objeto al que apuntes:
Reflectancia objetivo | Condiciones | Interior | Exterior |
---|---|---|---|
Objetivo blanco | Típico | 200cm | 80cm |
Mímimo | 120cm | 60cm | |
Objetivo gris | Típico | 80cm | 50cm |
Mínimo | 70cm | 40cm |
Además, el VL53L0X tiene varios modos de funcionamiento que puede variar los resultados. Esos modos se resumen en la siguiente tabla:
Modo | Timing | Alcance | Precisión |
---|---|---|---|
Por defecto | 30ms | 1.2m | Ver la tabla siguiente |
Alta precisión | 200ms | 1.2m | +/- 3% |
Largo alcance | 33ms | 2m | Ver la tabla siguiente |
Alta velocidad | 20ms | 1.2m | +/- 5% |
Según esos modos, tenemos varias precisiones estándar y de largo alcance que tienes en esta tabla:
Interior | Exterior | |||||
---|---|---|---|---|---|---|
Reflectancia objetivo | Distancia | 33ms | 66ms | Distancia | 33ms | 66ms |
Objetivo blanco | a 120cm | 4% | 3% | a 60cm | 7% | 6% |
Objetivo gris | a 70cm | 7% | 6% | a 40cm | 12% | 9% |
Pinout y conexión
Para que todo eso funcione adecuadamente necesita una interfaz con el exterior. Y eso se consigue a través de unos pines o conexiones. El pinout del VL53L0X es bastante simple, solo dispone de 6 pines. Para su integración con Arduino se puede hacer la comunicación mediante I2C.
Para alimentarlo, puedes conectar los pines así:
- VCC a 5v de Arduino
- GND a GND de Arduino
- SCL a un pin analógico de Arduino. Por ejemplo A5
- SDA a otro pin analógico. Por ejemplo A4
- Los pines GPI01 y XSHUT no los tienes que usar por el momento.
Integración con Arduino
Al igual que para otros muchos módulos, para el VL53L0X también tienes bibliotecas (p.e. la de Adafruit) de código disponibles que puedes usar para trabajar con ciertas funciones cuando escribes el código fuente para manejar tu proyecto en Arduino IDE. Si es tu primera vez con Arduino, te recomiendo nuestro manual de programación.
Un ejemplo de código simple para que tome medidas y muestre el valor de la medición a través del puerto serie para que puedas verlo desde la pantalla de tu PC mientras tengas la placa Arduino conectada es:
#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); }
En la propia biblioteca de Adafruit tienes más ejemplos de uso si lo necesitas…