Es un medidor de distancias de nueva generación basado en el principio de “Tiempo de Vuelo” (ToF) integrado en un módulo compacto. Pueden ser utilizados para escanear objetos en 3D, mira este video.
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
- Tamaño del módulo: 15x25x3 mm
Toda la información técnica en la hoja de datos del fabricante: datasheet_VL53L0X
Mira este video de una aplicación LIDAR:
Ejemplo:
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 } |