Componente · Sensor
VL53L0X Time-of-Flight Sensor
Sensor de distancia láser que mide el tiempo que tarda la luz en rebotar. Precisión milimétrica independiente del color y reflectividad del objeto.
Qué es
El VL53L0X mide distancia como lo hace un telémetro láser: con luz en lugar de sonido. Lanza un pulso de láser infrarrojo invisible y cronometra el viaje de ida y vuelta, dando una lectura ajustada, rápida y precisa hasta el milímetro por I²C. Donde un HC-SR04 detecta con un cono ancho con unos centímetros de dispersión, el VL53L0X detecta un punto estrecho con precisión: el sensor al que recurres cuando «más o menos a qué distancia» no basta.
Cómo funciona
El encapsulado contiene dos aperturas: un emisor de láser y un receptor SPAD (un detector de un solo fotón). El sensor dispara un pulso de luz infrarroja de 940 nm, el receptor cronometra cuánto tarda en volver el reflejo y —como la luz viaja a una velocidad conocida— ese tiempo se convierte en una distancia. Todo el cronometraje ocurre en el chip; tu microcontrolador solo lee el valor en milímetros por I²C. Los compromisos frente al sonido son exactamente los que se sopesan en ultrasónicos frente a sensores de tiempo de vuelo.
Cuándo usarlo
Recurre a un VL53L0X cuando un robot necesite medición de haz estrecho y precisa:
- Distancias cercanas y exactas: juzgar un hueco concreto, seguir una pared a una distancia fijada, o una parada precisa.
- Obstáculos pequeños o finos: una pata de mesa o un cable que el cono ancho del ultrasónico difuminaría o no vería.
- Lazos rápidos: hasta 50 Hz de actualización para un control con respuesta.
Para una detección barata e indulgente de «¿hay algo delante?» en una zona más amplia, el HC-SR04 es mejor relación calidad-precio, y las ideas de filtrado de leer el HC-SR04 se aplican a cualquier flujo de medición, láser incluido.
Cableado y errores comunes
- I²C, y las direcciones chocan. Todos los VL53L0X comparten una misma dirección por defecto: usa el pin XSHUT para levantarlos de uno en uno y reasignar direcciones si quieres usar varios.
- Cuidado con la luz ambiente. El sol brillante (mucho infrarrojo) y las superficies oscuras o especulares acortan el rango utilizable.
- Mantén la ventana limpia. Una huella dactilar o polvo en la apertura dispersa el haz y corrompe las lecturas.
- Respeta el límite cercano (~5 cm); como cualquier sensor de distancia, tiene una zona ciega demasiado cerca para medir.
Patillaje
| Pin | Nombre | Qué hace |
|---|---|---|
| 1 | VIN | 3–5 V. La placa reguladora baja hasta los 2,8 V del sensor |
| 2 | GND | Masa |
| 3 | SCL | Reloj de I²C |
| 4 | SDA | Datos de I²C |
| 5 | GPIO1 | Salida de interrupción: dispara cuando hay una medida lista |
| 6 | XSHUT | Apagado, activo a nivel bajo. Ponlo en bajo para deshabilitar el sensor por completo |
XSHUT es el pin que hace posibles varios sensores, y merece entenderse antes de comprar el
segundo.
Manejar varios sensores VL53L0X
Todos los VL53L0X arrancan en la misma dirección, 0x29, y no hay pines de selección de
dirección. Pon dos en un bus y ambos responden a la vez, lo que corrompe todas las
transacciones. La dirección se puede cambiar por software, pero el cambio es volátil: se pierde
en cada ciclo de alimentación.
La solución estándar usa XSHUT para levantarlos de uno en uno:
#include <Wire.h>
#include <VL53L0X.h>
const int XSHUT[] = {4, 5, 6}; // one GPIO per sensor
const uint8_t ADDR[] = {0x30, 0x31, 0x32};
VL53L0X sensor[3];
void setup() {
Wire.begin();
// 1. Hold every sensor in reset.
for (int i = 0; i < 3; i++) { pinMode(XSHUT[i], OUTPUT); digitalWrite(XSHUT[i], LOW); }
delay(10);
// 2. Release one at a time and give each a new address before the next wakes.
for (int i = 0; i < 3; i++) {
digitalWrite(XSHUT[i], HIGH);
delay(10);
sensor[i].init();
sensor[i].setAddress(ADDR[i]); // now it is off 0x29 and the next can boot
sensor[i].setTimeout(500);
}
}
Dos detalles que confunden: los pines deben estar en LOW para el reset y luego liberarse, y
toda la secuencia tiene que volver a ejecutarse después de cada ciclo de alimentación porque las
direcciones no persisten. Algunas placas llevan XSHUT en alto con una resistencia de a bordo, así
que simplemente dejar el pin al aire deja el sensor habilitado.
Presupuesto de tiempos: el dial de precisión/velocidad/rango
El VL53L0X tiene un ajuste que importa más que todos los demás, y casi ningún código de ejemplo lo toca. El presupuesto de tiempos es cuánto tiempo se le permite al sensor integrar fotones para una sola medición, y lo equilibra tres cosas entre sí:
| Presupuesto de tiempos | Frecuencia de actualización | Rango típico | Mejor para |
|---|---|---|---|
| 20 ms | ~50 Hz | ~0.8 m | Lazos de control rápidos, rango cercano |
| 33 ms (por defecto) | ~30 Hz | ~1.2 m | Uso general |
| 66 ms | ~15 Hz | ~1.7 m | Mejor precisión a distancia |
| 200 ms | ~5 Hz | ~2 m | Máximo alcance, medición estática |
sensor.setMeasurementTimingBudget(20000); // microseconds
También hay modos de largo alcance y de alta precisión que ajustan el umbral de velocidad de señal y los periodos de pulso. La regla práctica: si el sensor no llega bastante lejos, gasta más tiempo antes de culpar al sensor. Un presupuesto de 200 ms duplica de verdad el rango utilizable frente a uno de 20 ms.
Código mínimo funcional
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
void setup() {
Serial.begin(115200);
Wire.begin();
if (!sensor.init()) {
Serial.println("VL53L0X not found"); // check wiring and XSHUT
while (1) {}
}
sensor.setTimeout(500);
sensor.setMeasurementTimingBudget(33000);
sensor.startContinuous();
}
void loop() {
uint16_t mm = sensor.readRangeContinuousMillimeters();
if (sensor.timeoutOccurred()) {
Serial.println("timeout");
} else if (mm >= 8190) {
Serial.println("out of range"); // 8190/8191 mean "no valid target"
} else {
Serial.println(mm);
}
delay(20);
}
8190 y 8191 no son distancias. Son la forma del sensor de decir que no consiguió un retorno utilizable: o no hay nada ahí, o el objetivo es demasiado oscuro o está demasiado lejos. Un código que trate el 8191 como 8,19 metros se comportará de forma extraña en una habitación vacía; un código que lo trate como cero detendrá el robot de emergencia en una.
Lo que no puede ver
El VL53L0X falla en casi exactamente el conjunto de superficies opuesto al de un sensor ultrasónico, y esa es toda la base para elegir entre ellos.
| Condición | Qué pasa | Por qué |
|---|---|---|
| Superficies negras mates | El rango cae en picado, a menudo a un tercio | Vuelve muy poca de la luz de 940 nm |
| Espejos y metal pulido | Lee lejos, o nada | El haz se refleja de forma especular, como la luz en el cristal |
| Sol directo e intenso | El rango se desploma | La luz solar está llena de infrarrojo de 940 nm que inunda el retorno |
| Cristal | Lee lo que hay detrás, o el cristal, de forma impredecible | En parte transmite, en parte refleja |
| Más cerca de ~3–5 cm | Poco fiable | Por debajo de la distancia mínima de trabajo del sensor |
| Más allá de ~1,2 m con los ajustes por defecto | Se agota el tiempo | Sube el presupuesto de tiempos antes de concluir que está roto |
El del sol merece énfasis porque es el más sorprendente. Un VL53L0X que funciona perfectamente en interiores puede ser casi inútil en un invernadero iluminado por el sol, y el fallo es gradual: el rango se acorta en lugar de que las lecturas se vuelvan evidentemente erróneas.
Resolución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
init() falla |
Cableado, o XSHUT mantenido en bajo |
Escanea el bus buscando 0x29; comprueba que XSHUT está en alto o flotando en alto |
| Dos sensores y solo funciona uno | Los dos en 0x29 |
Usa la secuencia XSHUT de arriba en cada arranque |
| Las direcciones se pierden tras un ciclo de alimentación | Son volátiles por diseño | Vuelve a ejecutar la secuencia de asignación en setup() |
| Lee 8190/8191 constantemente | No hay retorno válido | Comprueba el color, la distancia y la luz ambiente del objetivo |
| Rango mucho menor de 2 m | Presupuesto de tiempos por defecto | Súbelo a 100–200 ms |
| Funciona en interiores, falla fuera | IR ambiente del sol | Sombre el sensor, o usa ultrasónicos en exteriores |
| Las lecturas se desvían a lo largo de minutos | Ventana sucia, o temperatura | Limpia la apertura; ejecuta la calibración del sensor |
| Valores disparatados ocasionales | Borde de un objetivo, o reflexión parcial | Aplica un filtro de mediana al flujo, como con cualquier sensor de distancia |
¿VL53L0X u otra cosa?
| Componente | Rango | Destacado | Elígelo cuando |
|---|---|---|---|
| VL53L0X | 5 cm – 2 m | El barato y omnipresente por defecto | Medición precisa de corto alcance en interiores |
| VL53L1X | 4 cm – 4 m | El doble de alcance, región de interés programable | Necesitas más cobertura, o estrechar el campo de visión por software |
| VL6180X | 5 mm – 20 cm | Alcance muy corto, también detecta la luz ambiente | Sensado de huecos y proximidad a escala de centímetros |
| HC-SR04 | 2 cm – 4 m | Sonido, cono ancho, sin necesidad de biblioteca | Detección de obstáculos barata e indulgente; ve superficies oscuras |
| Sharp GP2Y0A21 | 10–80 cm | Triangulación IR analógica, un pin ADC | No hay I²C disponible y una salida no monótona es aceptable |
El VL53L1X merece destaca específicamente: es una mejora directa en casi todos los aspectos, y su región de interés programable te deja estrechar el campo de visión por software, es decir, redirigir el haz sin mover el sensor. Si estás eligiendo hoy en lugar de usar lo que ya tienes, suele ser la mejor compra.
Explora el grafo
Se usa en estos montajes
Proyectos, rutas de aprendizaje y simuladores que incluyen VL53L0X Time-of-Flight Sensor.
Comparar
Alternativas
Preguntas
Preguntas frecuentes sobre VL53L0X Time-of-Flight Sensor
¿Cuál es la distancia máxima del VL53L0X?
Unos 2 metros en modo estándar; algunas placas sacrifican frecuencia de actualización a cambio de más alcance. Es más preciso en la franja cercana; más allá de un par de metros, o con mucho infrarrojo ambiental, como la luz del sol, las lecturas dejan de ser fiables. También tiene una zona ciega cercana por debajo de unos 5 cm.
¿Qué limitaciones tiene el VL53L0X?
Su alcance es corto (~2 m) comparado con un sensor ultrasónico, la luz solar intensa y las superficies oscuras o especulares lo reducen aún más, y todos los sensores vienen con la misma dirección I²C, así que para usar varios necesitas el truco de XSHUT para reasignar direcciones. Mantén también limpia la pequeña ventana; el polvo dispersa el haz.
¿Funciona el VL53L0X sobre superficies negras?
Mal. Las superficies oscuras y mates absorben el láser infrarrojo, así que el reflejo es débil y el alcance útil cae bruscamente: una pared negra queda mucho más cerca del límite del sensor que una blanca. Las superficies brillantes o especulares también lo confunden, porque desvían el haz lejos del receptor.
¿Qué es el sensor de distancia láser VL53L0X?
Un diminuto sensor de tiempo de vuelo que mide la distancia con luz en lugar de con sonido. Dispara un pulso láser infrarrojo invisible de 940 nm y cronometra cuánto tarda en volver el reflejo, lo que da una lectura focalizada, rápida y con precisión milimétrica a través de I²C.
Tiempo de vuelo o ultrasonidos: ¿cuál es mejor?
Un sensor de tiempo de vuelo como el VL53L0X tiene un haz estrecho y precisión milimétrica, así que detecta un punto concreto y objetos pequeños que un sensor ultrasónico pasaría por alto. El HC-SR04 es más barato, llega más lejos y su cono ancho, de hecho, ayuda a no pasar por alto obstáculos. Usa ToF para la precisión y ultrasonidos para una detección barata y tolerante.
Lecturas adicionales