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.
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