Sensor Láser VL53L0X
Es un medidor de distancias de nueva generación basado en el principio de “Tiempo de Vuelo” (ToF) integrado en un módulo compacto.
El VL53L0X utiliza la tecnología FlightSense de ST para medir con precisión el tiempo empleado por los pulsos de luz láser infrarroja en alcanzar el objeto más cercano y reflejarse hasta el detector, por lo que se puede considerar un minúsculo sistema autónomo LIDAR. Esta medida permite determinar con precisión la distancia absoluta a un objeto sin que la reflectancia del objeto, ni la luz ambiental influyan demasiado en la medición.
Al usar una fuente de luz muy estrecha, el sensor es bueno para calcular la distancia de la superficie justo frente a él, a diferencia de los sistemas de ultrasonidos que tienen un “cono” de detección mucho mayor. Puede medir distancias de hasta 2m con una resolución de 1 mm, pero su alcance y precisión (ruido) dependen en gran medida de las condiciones ambientales y de las características del objeto como reflectancia y tamaño, así como de la configuración del sensor. La precisión del sensor puede llegar a alcanzar ± 3% en el mejor de los casos a más de ± 10% en condiciones menos óptimas. Las mediciones están disponibles a través de la interfaz I²C del sensor, que también se utiliza para configurar los ajustes del sensor.
Resumimos las características básicas del sensor:
- Emisor Laser Infrarrojo: 940 nm
- Rango Máximo: 2cm – 2 m
- Resolución: 1 mm
- Interface: I²C (hasta 400 kHz, dirección: 0x52)
- Voltaje operación: 2.6 a 3.5 V
- Consumo máximo sensor: 18 mA
- Temperatura de operación: -20 to 70°C
Toda la información técnica en la hoja de datos del fabricante: datasheet_VL53L0X
El sensor viene montado en una placa de soporte que incluye un regulador de voltaje lineal de baja caída que proporciona los 2,8 V requeridos por el sensor VL53L0X, lo que permite que el módulo sea alimentado desde un voltaje de 2,6 V a 5,5 V. El módulo también incluye un circuito que adapta las lineas del bus I²C al mismo nivel lógico que el voltaje Vcc utilizado, facilitando la conexión de la placa con un MCU a 3,3 V ó 5 V.
VCC Alimentación de 2,6 V a 5,5 V
GND Conexión a tierra (0 V)
SDA Línea de datos I²C: HIGH es VCC, LOW es 0 V
SCL Línea de reloj I²C: HIGH es VCC, LOW es 0 V
DNC Sin conexión
XSH Cuando se pone a LOW, sensor en modo espera
INT Salida de interrupción (Open drain).
El sensor viene de fábrica cubierto con una pequeña lámina que se debe retirar para su correcto funcionamiento.
ATENCIÓN: Aunque sea invisible, el sensor funciona con un laser Clase1 y deben tomarse las debidas precauciones.
La conexión del módulo con Arduino es muy simple y la librería se puede descargar de este enlace: https://github.com/pololu/vl53l0x-arduino
Ejemplo 1
El siguiente sketch, basado en los ejemplos que incluye la librería, nos muestra a través de la consola serial, la distancia en centímetros del objeto detectado frente al módulo. Para reducir el ruido de la medida se muestra el promedio de varias medidas. Las líneas comentadas muestran los distintos modos de funcionamiento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/* ################## Sensor VL53L0X ############################# * Filename: VL53L0X_Ej1.ino * Descripción: Test Medidor Distancia Laser * Autor: Jose Mª Morales * Revisión: 12-04-2017 * Probado: ARDUINO UNO r3 - IDE 1.8.2 (Windows7) * Web: www.playbyte.es/electronica/ * Licencia: Creative Commons Share-Alike 3.0 * http://creativecommons.org/licenses/by-sa/3.0/deed.es_ES * ############################################################## */ #include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; int n_Samples = 5; // numero de muestras para promediar //#define LONG_RANGE // Aumenta sensibilidad, +rango, -precision //#define HIGH_SPEED // Mayor velocidad, menor precision #define HIGH_ACCURACY // Alta precision, menor velocidad void setup() { Serial.begin(9600); Wire.begin(); sensor.init(); sensor.setTimeout(500); //###### Parametros Medida simple ########## #if defined LONG_RANGE // Limite de la tasa de retorno (por defecto 0.25 MCPS) sensor.setSignalRateLimit(0.1); // Periodo de pulso laser (por defecto 14 y 10 PCLKs) sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18); sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14); #endif #if defined HIGH_SPEED // reduce tiempo estimado a 20 ms (por defecto 33 ms) sensor.setMeasurementTimingBudget(20000); #elif defined HIGH_ACCURACY // incrementa tiempo estimado a 200 ms sensor.setMeasurementTimingBudget(200000); #endif } void loop() { float DISTANCIA = getDISTANCIA (n_Samples); if (sensor.timeoutOccurred()) { Serial.println(" TIME OUT"); }else { if (DISTANCIA< 2) Serial.println("Fuera de Rango (d < 2 cm)"); else if (DISTANCIA>220) Serial.println("Fuera de Rango (d > 2 m)"); else { Serial.print(DISTANCIA, 1); // distancia en cm y 1 decimal Serial.println(" cm"); } } delay (300); } float getDISTANCIA(int n) { // hacemos "n" mediciones float SUMA_n = 0; for (int i = 0; i < n; i++) { SUMA_n += sensor.readRangeSingleMillimeters(); } return( SUMA_n /n /10); // Promedio en centimetros } |
Como ejemplo de aplicación, en este vídeo vemos un escáner LIDAR basado en Arduino: