Il sensore di distanza VL53L0X utilizza la tecnologia ToF acronimo di Time of Flight.
Si tratta di un sensore laser a infrarossi che presenta un funzionamento simile a quello di una fotocellula.
All’interno del dispositivo sono presenti un piccolo Emettitore Laser ed un Ricevitore.
Quanto viene emesso un impulso luminoso vien misurato il tempo di ritorno della luce.
Questo permette di calcolare la distanza tra il sensore e l’oggetto.
Citazione dell’articolo nelle sezioni ARTICOLI, NEWS, PROGETTI del blog di Elettronica In
Indice
Caratteristiche del sensore
Il sensore di distanza VL53L0X (datasheet) è un modulo laser Time-of-Flight (ToF) di nuova generazione alloggiato nel pacchetto più piccolo oggi sul mercato, che fornisce una misurazione accurata della distanza qualunque sia la riflettanza del bersaglio a differenza delle tecnologie convenzionali.
Può misurare fino a 3 metri con un’eccellente linearità a breve distanza e capacità di rilevare diversi oggetti nel campo visivo (FoV).
Si tenga comunque presente che il sensore misura la distanza di un oggetto come una parete perché il fascio che usa è un cono di luce: non è possibile utilizzarlo per misurare la distanza di un singolo punto. Se di fronte al sensore mettete un oggetto che non riempie il suo cono di misura la misura rilevata potrebbe non essere corretta.
Il VL53L0X integra un array SPAD (acronimo di Single Photon Avalanche Diodes) all’avanguardia e incorpora la tecnologia brevettata FlightSenseTM di seconda generazione di ST.
L’emettitore VCSEL (Vertical Cavity Surface-Emitting Laser) da 940 nm del VL53L0X è totalmente invisibile all’occhio umano (è visibile però se lo si inquadra per esempio con la camera di un cellulare ), accoppiato con filtri fisici a infrarossi interni, consente distanze più lunghe, maggiore immunità alla luce ambientale e una migliore robustezza per coprire la diafonia ottica in vetro .
Video del test del sensore
Schema elettrico del modulo
Analizziamo ora lo schema elettrico del modulo su cui è utilizzato il sensore di distanza VL53L0X ToF. Nel nostro caso il modulo riporta la sigla CJVL53L0XV2 con un PCB di colore nero , ma in commercio si trovano altri modelli con sigle diverse e PCB di altri colori.
Nello schema, oltre al sensore VL53L0X (datasheet), troviamo un modulo regolatore 662K 2.8V (datasheet)
Questo permette di alimentare il modulo a 5V, con riduzione del suo valore a quello di 2.8 V, valore massimo per il sensore.
E’ comunque possibile alimentare anche con una tensione di 3,3 V sul pin VIN, quindi il modulo è compatibile con MCU da 3.3 a 5 V .
Troviamo poi vari condensatori per il livellamento della tensione di alimentazione.
Visto la differenza di tensione di alimentazione e quella del sensore, è presente un circuito per la traslazione dei livelli per la line SCL e SDA- Il circuito è formato da due FET presenti all’interno di un chip 2N7002DW (datasheet).
Infine sono presenti due resistenze di pull-up sulle linee SCL e SDA. Sul connettore del modulo sono presenti due ulteriori pin:
- XSHUT: pin ingresso che permette lo shutdown del sensore
- GPIO1: pin uscita interrupt programmabile.
Foto del PCB
Caratteristiche
- Alimentazione: da 2,6 volt a 5,5 volt
- Corrente assorbita: 15 mA tipica – 40 mA max.
- Range di misura: min. 10 mm , max. 4 mt
- Emettitore laser: 940 nm invisibile – class 1
- Interfaccia di comunicazione: I²C
- Dimensioni (mm): 25x10x3 – passo fori 20 mm
- Connettore 6 poli: a saldare strip 12mm, passo 2,54mm
- Peso: circa 2 grammi
Pin del modulo
Sigla | Descrizione |
---|---|
VIN: | Positivo alimentazione (2,6 ÷5,5 V) |
GND: | Negativo alimentazione |
SCL: | Clock (SCL / SCK) per I2C e SPI |
SDA: | Dati (SDA / SDI) per I2C e SPI |
GPIO1: | Uscita interrupt open drain |
XSHUT: | Ingresso stand-by |
Tipologia di sensore
Il modulo MLX90614 GY-906 può essere trovato in tre diverse tipologie: BAA, BCC e DCI. Questi differiscono principalmente per l’accuratezza e la distanza di misura della temperatura .
Dove trovare il sensore?
Il modulo sensore VL53L3CX può essere acquistato presso il sito FUTURA ELETTRONICA, il codice prodotto è Il suo costo al momento della pubblicazione dell’articolo è di 21,00€. .
Citazione dell’articolo nella sezione ARTICOLI, NEWS, PROGETTI di Elettronica In
Contenuto del blister, il connettore andrà saldato a vostra cura
Collegamento di base del sensore
Vediamo prima di tutto il collegamento di base del sensore di distanza VL53L3CX ; in questo caso leggeremo i valori forniti dal sensore tramite il monitor seriale dell’IDE.
Materiale occorrente
Il materiale per realizzare il nostro termometro è formato da:
Scheda Arduino UNO | Sensore di distanza VL53L3CX |
Bread board | Cavi di collegamento colorati M/M |
Schema dei collegamenti
Verifica dell’indirizzo I2C
Per prima cosa bisogna scoprire e verificare l’indirizzo i2c del sensore tramite lo Sketch i2c_scan che troveremo nella sezione “File” –> “Esempi” –> “Wire”–> “i2c_scaner” dell’IDE di Arduino.
Carichiamolo sulla nostra scheda ed apriamo il monitor seriale, con il tasto
Verificare che la velocità sia 9600 baud, il risultato sarà simile al seguente:
Se non leggiamo nulla potremmo aver invertito i cavi del collegamento I2C quindi possiamo correggere la connessione.
Se tutto è corretto, leggeremo il suo indirizzo che è 0x29; è possibile comunque modificarlo nel caso si utilizzino più sensori o magari si abbiano altre periferiche I2C con lo stesso indirizzo.
Librerie di gestione del modulo
Libreria Adafruit
Per facilitare l’uso del modulo sono disponibili varie librerie. Per il caricamento occorre aprire sotto il menù Sketch, #include libreria, “Gestione Librerie..”
Nel campo ricerca si inserirà “Adafruit_VL53L0X” , trovata la libreria, premendo su “More info..” apparirà il tasto “Installa” cliccare il tasto, la libreria verrà installata.
Per maggiori informazioni sulla libreria e i suoi comandi vedere la relativa pagina github adafruit.
Libreria Pololu
È disponibile una libreria alternativa a quella scritta da Adafruit. Questa è stata scritta dalla Pololu.
La libreria ha tra i vari comandi disponibile uno che permette di aumentare la precisione della lettura nel caso fosse imprecisa per la propria applicazione.
Nota: Per installare le librerie, vi consiglio l’articolo Arduino – Tutorial, come installare una libreria
Sketch test di base
Sotto è riportato lo sketch di base per la lettura del sensore, l’unità di misura saranno i millimetri.
Per la lettura occorre attivare il monitor seriale dell’IDE premendo l’apposito tasto
Il risultato sarà simile a questo, se ci fossero problemi, verificare che la velocità di comunicazione sia impostata a115200 baud.
Nel caso il sensore non rilevi nulla di fronte a se oppure oltre il suo campo di misura , sarà riportata la scritta ” Fuori dal limite”
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 | #include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); void setup() { Serial.begin(115200); // wait until serial port opens for native USB devices while (! Serial) { delay(1); } Serial.println("Adafruit VL53L0X test"); if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while(1); } // power Serial.println(F("Esempio di lettura semplice VL53L0Xe\n\n")); } void loop() { VL53L0X_RangingMeasurementData_t measure; Serial.print("Lettura... "); lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data Serial.print("Distanza (mm): "); Serial.println(measure.RangeMilliMeter); } else { Serial.println(" Fuori dal limite "); } delay(100); } |
Lettura valori su display OLED
Per un utilizzo più semplice del sensore possiamo collegare un display OLED, in questo caso un modulo OLED da 0.96 ” con una risoluzione di 128×32 pixel, che sfrutta il driver SSD1306 e si interfaccia tramite la connessioni I2C.
Per informazioni sul display vi consiglio la lettura dell’articolo Display OLED 128×32 I2C
Materiale necessario
Scheda Arduino UNO | Sensore di distanza VL53L3CX |
OLED 0.96 ” 128×32 pixel I2C | Bread board |
Cavi di collegamento colorati M/M |
Schema dei collegamenti
Verifica dell’indirizzo I2C
Anche in questo caso è possibile utilizzare quanto si è già visto sopra per verificare che sia il sensore che il display siano ben collegati e riconosciti . I due dispositivi hanno indirizzi diversi per cui non ci sono problemi di gestione. L’esito dovrebbe essere simile a quello riportato nell’immagine sottostante
Se tutto è corretto, leggeremo sia l’indirizzo del sensore che è 0x29 sia quello del display che è 0x3C.
Libreria per display OLED
Per utilizzare il display OLED è necessario installare l’apposita libreria. Può essere cercata tra le librerie installabili nell’IDE, basterà inserire nel campo di ricerca “Adafruit_SSD1306“.
Sarà anche mostrata una finestra che segnala che la libreria ha una dipendenza con la libreria grafica “Adafruit GFX Library“. Procedete premendo “Install all”.
Per altre informazioni su come installare le librerie vedete l’articolo Arduino – Tutorial, come installare una libreria
Sketch test con display OLED
Sotto è riportato lo sketch che permette di leggere i valori di distanza direttamente sul display OLED, la misura della distanza è espressa in millimetri.
Nel caso il sensore non rilevi nulla di fronte a se oppure oltre il suo campo di misura , sul display non viene mostrato nulla.
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 | #include <Wire.h> #include "Adafruit_VL53L0X.h" #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display = Adafruit_SSD1306(); Adafruit_VL53L0X lox = Adafruit_VL53L0X(); #if (SSD1306_LCDHEIGHT != 32) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) // init done display.display(); delay(1000); Wire.begin(); if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while (1); } // text display big! display.setTextSize(4); display.setTextColor(WHITE); } void loop() { VL53L0X_RangingMeasurementData_t measure; lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data display.clearDisplay(); display.setCursor(0, 0); display.print(measure.RangeMilliMeter); display.print("mm"); display.display(); Serial.println(); delay(50); } else { display.display(); display.clearDisplay(); return; } } |
Utilizzo contemporaneo di più sensori VL53L0X
In un proprio progetto, potrebbe essere necessario utilizzare più sensori VL53L0X contemporaneamente. Questo è possibile in quanto si può modificare l’indirizzo I2C del sensore.
Si consideri che il cambio dell’indirizzo non è permanente, infatti quando si toglierà l’alimentazione al sensore verrà automaticamente reimpostato il valore di default 0x29.
Per modificare l’indirizzo I2C al sensore VL53L0X si dovrà utilizzare anche il piedino XSHUT. Questo piedino è internamente collegato a VCC e protetto da un diodo. Se non utilizzato è quindi internamente impostato a livello ALTO ed il sensore è attivo. Se collegato ad un pin di OUTPUT di Arduino e posto basso, il sensore viene disattivato.
Ogni sensore sarà gestito dal programma che imposterà il singolo indirizzo I2C. Sotto è riportato un esempio di schema e un’estratto del listato di gestione. Tra gli esempi della libreria, il programma completo “vl5310x_dual”
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 | #include "Adafruit_VL53L0X.h" // address we will assign if dual sensor is present #define LOX1_ADDRESS 0x30 #define LOX2_ADDRESS 0x31 // set the pins to shutdown #define SHT_LOX1 2 #define SHT_LOX2 3 // objects for the vl53l0x Adafruit_VL53L0X lox1 = Adafruit_VL53L0X(); Adafruit_VL53L0X lox2 = Adafruit_VL53L0X(); // this holds the measurement VL53L0X_RangingMeasurementData_t measure1; VL53L0X_RangingMeasurementData_t measure2; void setID() { // all reset digitalWrite(SHT_LOX1, LOW); digitalWrite(SHT_LOX2, LOW); delay(10); // all unreset digitalWrite(SHT_LOX1, HIGH); digitalWrite(SHT_LOX2, HIGH); delay(10); // activating LOX1 and resetting LOX2 digitalWrite(SHT_LOX1, HIGH); digitalWrite(SHT_LOX2, LOW); // initing LOX1 if(!lox1.begin(LOX1_ADDRESS)) { Serial.println(F("Failed to boot first VL53L0X")); while(1); } delay(10); // activating LOX2 digitalWrite(SHT_LOX2, HIGH); delay(10); //initing LOX2 if(!lox2.begin(LOX2_ADDRESS)) { Serial.println(F("Failed to boot second VL53L0X")); while(1); } } |