Componente · Sensore

Sensore ToF VL53L0X

VL53L0X misura distanze con un fascio laser, non con il suono: stretto e rapido, con precisione millimetrica, usa I²C per robot che richiedono misure precise.

Che cos’è

VL53L0X misura la distanza come fa un misuratore laser, con la luce anziché con il suono. Emette un impulso laser infrarosso invisibile e misura il tempo di andata e ritorno, fornendo tramite I²C una lettura stretta, rapida e con precisione millimetrica. Mentre HC-SR04 rileva un ampio cono con una dispersione di pochi centimetri, VL53L0X misura un punto stretto con precisione: è il sensore da scegliere quando «all’incirca quanto dista» non è abbastanza.

Schema etichettato di una schedina adattatrice per il sensore a tempo di volo VL53L0X: una piccola scheda viola con il componente del sensore a tempo di volo al centro, dove sono visibili due aperture, un emettore laser circolare e un ricevitore SPAD quadrato, una freccia del fascio laser verso l'esterno e un header a 6 pin (VIN, GND, SCL, SDA, GP1, XSH) lungo il bordo inferiore.
Un laser infrarosso viene emesso dall'emettente e il ricevitore SPAD misura il riflesso: misurazione a tempo di volo con fascio stretto e precisione millimetrica. Scarica SVG

Come funziona

Il componente contiene due aperture: un emettitore laser e un ricevitore SPAD, un rivelatore di singolo fotone. Il sensore emette un impulso di luce infrarossa a 940 nm, il ricevitore misura il tempo impiegato dal riflesso per tornare e — poiché la luce viaggia a una velocità nota — quel tempo viene convertito in una distanza. Tutta la temporizzazione avviene sul chip; il microcontrollore deve soltanto leggere il valore in millimetri tramite I²C. I compromessi rispetto al suono sono esattamente quelli valutati in ultrasuoni rispetto ai sensori a tempo di volo.

Quando usarlo

Scegli VL53L0X quando un robot necessita di misurazioni precise con fascio stretto:

  • Distanze ravvicinate ed esatte — valutare uno specifico passaggio, seguire una parete a una distanza prestabilita o eseguire un arresto preciso.
  • Ostacoli piccoli o sottili — una gamba del tavolo o un filo che l’ampio cono ultrasonoro spalmerebbe o non rileverebbe.
  • Anelli veloci — aggiornamenti fino a 50 Hz per un controllo reattivo.

Per rilevare in modo economico e tollerante la presenza di qualcosa davanti su un’area più ampia, HC-SR04 offre un rapporto migliore: le idee di filtraggio presenti in lettura di HC-SR04 si applicano a qualsiasi flusso di misurazione, laser compreso.

Cablaggio e aspetti critici

  • I²C e collisioni di indirizzo. Ogni VL53L0X condivide lo stesso indirizzo predefinito: usa il pin XSHUT per avviarli uno alla volta e riassegnare gli indirizzi quando ne usi diversi.
  • Fai attenzione alla luce ambiente. Il sole intenso (molta radiazione infrarossa) e le superfici scure o simili a specchi riducono la portata utilizzabile.
  • Mantieni pulita la finestra. Un’impronta o della polvere sull’apertura disperde il fascio e corrompe le letture.
  • Rispetta il limite vicino (~5 cm): come qualsiasi sensore di distanza, ha una zona cieca troppo ravvicinata per la misurazione.

Piedinatura

Pin Nome Funzione
1 VIN 3–5 V. La schedina adattatrice regola la tensione fino ai 2.8 V del sensore
2 GND Terra
3 SCL Clock I²C
4 SDA Dati I²C
5 GPIO1 Uscita di interrupt — si attiva quando una misurazione è pronta
6 XSHUT Spegnimento, attivo a livello basso. Portalo a livello basso per disabilitare completamente il sensore

XSHUT è il pin che rende possibili più sensori e vale la pena comprenderlo prima di acquistare il secondo.

Utilizzo di più sensori VL53L0X

Ogni VL53L0X si avvia sullo stesso indirizzo, 0x29, e non dispone di pin per la selezione dell’indirizzo. Mettine due sullo stesso bus ed entrambi rispondono contemporaneamente, corrompendo ogni transazione. L’indirizzo può essere modificato via software, ma la modifica è volatile e viene persa a ogni ciclo di accensione.

La soluzione standard usa XSHUT per avviarli uno alla volta:

#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);
  }
}

Due dettagli traggono in inganno: i pin devono essere pilotati a livello LOW per il reset e poi rilasciati, e l’intera sequenza deve essere ripetuta dopo ogni ciclo di accensione perché gli indirizzi non persistono. Alcune schedine adattatrici portano XSHUT a livello alto tramite una resistenza integrata, quindi lasciare semplicemente libero il pin mantiene il sensore abilitato.

Budget di temporizzazione: la manopola precisione/velocità/portata

VL53L0X ha un’impostazione più importante di tutte le altre e la maggior parte del codice di esempio non la modifica mai. Il budget di temporizzazione indica per quanto tempo il sensore può integrare i fotoni per una singola misurazione e mette in conflitto tre fattori:

Budget di temporizzazione Frequenza di aggiornamento Portata tipica Uso ideale
20 ms ~50 Hz ~0.8 m Anelli di controllo veloci, distanze ravvicinate
33 ms (predefinito) ~30 Hz ~1.2 m Uso generale
66 ms ~15 Hz ~1.7 m Maggiore precisione a distanza
200 ms ~5 Hz ~2 m Portata massima, misurazione statica
sensor.setMeasurementTimingBudget(20000);   // microseconds

Esistono anche modalità a lunga portata e ad alta precisione che regolano la soglia del tasso di segnale e i periodi degli impulsi. La regola pratica è: se il sensore non raggiunge abbastanza lontano, concedi più tempo prima di accusare il sensore. Un budget di 200 ms raddoppia davvero la portata utilizzabile rispetto a uno di 20 ms.

Codice funzionale minimo

#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 e 8191 non sono distanze. Sono il modo del sensore di comunicare che non ha ricevuto un riflesso utilizzabile: non c’è nulla oppure il bersaglio è troppo scuro o troppo lontano. Un codice che interpreta 8191 come 8.19 metri si comporterà in modo strano in una stanza vuota; un codice che lo interpreta come zero effettuerà un arresto di emergenza in un attimo.

Che cosa non può vedere

VL53L0X fallisce su un insieme di superfici quasi esattamente opposto a quello di un sensore ultrasonoro, il che costituisce l’intera base per scegliere tra i due.

Condizione Comportamento Motivo
Superfici nere opache La portata diminuisce bruscamente, spesso fino a un terzo Torna pochissima luce a 940 nm
Specchi e metallo lucidato Legge una distanza molto grande oppure nulla Il fascio viene riflesso specularmente, come la luce sul vetro
Luce solare diretta e intensa La portata crolla La luce solare è ricca di radiazione infrarossa a 940 nm e sovrasta il riflesso
Vetro Legge in modo imprevedibile ciò che si trova dietro oppure il vetro stesso In parte trasmette e in parte riflette
Più vicino di circa 3–5 cm Inaffidabile Sotto la distanza minima di lavoro del sensore
Oltre circa 1.2 m con le impostazioni predefinite Scade Aumenta il budget di temporizzazione prima di concludere che sia guasto

Il caso della luce solare merita attenzione perché è il più sorprendente. Un VL53L0X che funziona perfettamente al chiuso può essere quasi inutile in una serra soleggiata e il guasto è graduale: la portata si accorcia invece che le letture diventino palesemente errate.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
init() non riesce Cablaggio oppure XSHUT tenuto a livello basso Scansiona il bus alla ricerca di 0x29; verifica che XSHUT sia alto o libero a livello alto
Due sensori, ma ne funziona uno solo Entrambi su 0x29 Usa la sequenza XSHUT indicata sopra a ogni avvio
Gli indirizzi vengono persi dopo un ciclo di accensione Sono volatili per progettazione Ripeti la sequenza di assegnazione in setup()
Legge costantemente 8190/8191 Nessun riflesso utilizzabile Controlla colore, distanza e luce ambiente del bersaglio
Portata molto inferiore a 2 m Budget di temporizzazione predefinito Portalo a 100–200 ms
Funziona al chiuso, ma non all’aperto Radiazione infrarossa ambientale del sole Scherma il sensore oppure usa l’ultrasuono all’aperto
Le letture derivano nell’arco di minuti Finestra sporca oppure temperatura Pulisci l’apertura; esegui la calibrazione del sensore
Valori improvvisi occasionali Bordo del bersaglio oppure riflesso parziale Applica un filtro mediano al flusso, come per qualsiasi sensore di distanza

VL53L0X o qualcos’altro?

Componente Portata Caratteristiche Quando sceglierlo
VL53L0X 5 cm – 2 m L’opzione economica e diffusa per eccellenza Misurazioni precise a breve distanza al chiuso
VL53L1X 4 cm – 4 m Portata doppia, regione di interesse programmabile Serve maggiore portata o vuoi restringere il campo visivo via software
VL6180X 5 mm – 20 cm Portata molto breve, misura anche la luce ambiente Rilevamento di spazi e prossimità su scala centimetrica
HC-SR04 2 cm – 4 m Suono, cono ampio, nessuna libreria necessaria Rilevamento economico e tollerante degli ostacoli; vede le superfici scure
Sharp GP2Y0A21 10–80 cm Triangolazione IR analogica, un pin ADC Nessun I²C disponibile ed è accettabile un’uscita non monotona

Vale la pena menzionare specificamente VL53L1X: è un miglioramento intercambiabile sotto quasi ogni aspetto e la sua regione di interesse programmabile permette di restringere il campo visivo via software, deviando di fatto il fascio senza spostare il sensore. Se stai scegliendo oggi anziché usare ciò che possiedi, è quasi sempre l’acquisto migliore.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Sensore ToF VL53L0X.

Confronto

Alternative

Domande

FAQ su Sensore ToF VL53L0X

Qual è la distanza massima del VL53L0X?

Circa 2 metri in modalità standard; alcune schede sacrificano la frequenza di aggiornamento per ottenere una portata maggiore. È più preciso nella fascia di distanze ravvicinate; oltre pochi metri oppure in luce ambientale intensa come il sole, le letture diventano inaffidabili. Ha inoltre una zona cieca sotto circa 5 cm.

Quali sono i limiti del VL53L0X?

Rispetto a un sensore ultrasonoro ha una portata breve (~2 m), la luce solare diretta e le superfici scure o simili a specchi la riducono ulteriormente e ogni sensore ha lo stesso indirizzo I²C; per usarne diversi serve il trucco di XSHUT per riassegnare gli indirizzi. Mantieni pulita anche la piccola finestra, perché la polvere disperde il fascio.

VL53L0X funziona sulle superfici nere?

Male. Le superfici scure e opache assorbono il laser infrarosso, quindi il riflesso è debole e la portata utilizzabile diminuisce bruscamente; un muro nero viene letto molto più vicino al limite del sensore rispetto a uno bianco. Anche le superfici lucide o simili a specchi lo ingannano deviando il fascio lontano dal ricevitore.

Che cos'è il sensore laser di distanza VL53L0X?

Un minuscolo sensore a tempo di volo che misura la distanza con la luce anziché con il suono. Emette un impulso laser infrarosso invisibile a 940 nm e misura il tempo impiegato dal riflesso per tornare, fornendo tramite I²C una lettura rapida, stretta e con precisione millimetrica.

Tempo di volo o ultrasonoro — quale è migliore?

Un sensore a tempo di volo come VL53L0X ha un fascio stretto e una precisione millimetrica, quindi rileva un punto specifico e oggetti piccoli che un sensore ultrasonoro potrebbe non vedere. HC-SR04 costa meno, misura più lontano e il suo ampio cono permette in realtà di non perdere ostacoli. Usa ToF per la precisione e l'ultrasuono per rilevamenti economici e tolleranti.

Per approfondire

Fonti