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.

Diagrama etiquetado de una placa adaptadora de sensor de tiempo de vuelo VL53L0X: una pequeña placa morada con el encapsulado de tiempo de vuelo en el centro mostrando dos aperturas, un emisor de láser circular y un receptor SPAD cuadrado, una flecha de haz de láser saliendo hacia fuera, y una cabecera de 6 pines (VIN, GND, SCL, SDA, GP1, XSH) a lo largo del borde inferior.
Un láser infrarrojo sale del emisor y el receptor SPAD cronometra el reflejo: medición por tiempo de vuelo con haz estrecho y precisión de milímetro. Descargar SVG

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

Referencias