Sensore di distanza GY-VL53L0XV2 VL53L0X Time-of-Flight Distance Sensor
Il sensore VL53L0X è un sensore di distanza laser a 940 nm laser VCSEL.
Il modulo ha un funzionamento simile ad una fotocellua, il corpo ha un piccolo Emettitore Laser ed un Ricevitore. Viene emesso un impulso luminoso e misurato il tempo di ritorno della luce. Questo permette di calcolare la distanza tra il sensore e l’oggetto.
I principali campi di utilizzo sono:
– Rilevamento utente per personal computer / laptop / tablet e IoT (risparmio energetico)
– Robotica (rilevamento ostacoli)
– Prodotti bianchi (rilevamento delle mani in rubinetti automatici, distributori di sapone, ecc.)
– Riconoscimento gestuale 1D.
– Autofocus laser assistito. Migliora e accelera le prestazioni del sistema di messa a fuoco automatica della fotocamera, specialmente in scene difficili (livelli di scarsa luminosità, basso contrasto), o modalità video in rapido movimento.
Range di misura 20 – 200 mm.
Il dadasheet completo è scaricabile da qui.
Per comunicare utilizza il protocollo i2c.
ll sensore VL53L0X si può acquistare, già assemblato e dotato di tutti i componenti necessari all’utilizzo direttamente con Arduino, sui vari siti e-commerce con la sigla GY-VL53L0XV2:
UTILIZZO CON ARDUINO
Con Arduino Uno si può utilizzare il seguente schema:
I piedini i2c possono variare a seconda del modello di Arduino, clicca qui per ulteriori dettagli.
Per prima cosa andiamo a scoprire 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 Il risultato sarà simile al seguente:
Quindi il suo indirizzo sarà 0x29 (più avanti verderemo come poterlo cambiare nel caso si utilizzino più sensori, o si abbiano altre periferiche i2c con lo stesso indirizzo).
Per utilizzare con semplicità il sensore ci viene incontro la libreria creata da Adafruit la Adafruit_VL53L0X che può essere scaricata dal loro github da qui, oppure una copia dal nostro sito da qui.
Aggiungiamo la libreria appena scaricata all’IDE di Arduino andando su “Sketch” –> “#include libreria” –> “Aggiungi libreria da file .ZIP…” e selezioniamo la libreria scaricata.
NOTA: in alcune versioni dell’IDE di Arduino, per poter attivare la libreria appena installata, deve essere riavviato.
Ora andiamo su “File” –> “Esempi” –> “Adafruit_VL53L0X” –> “vl53l0x” e avremo il seguente codice:
#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("VL53L0X API Simple Ranging example\n\n")); } void loop() { VL53L0X_RangingMeasurementData_t measure; Serial.print("Reading a measurement... "); lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(100); }
Carichiamolo sulla nostra scheda ed apriamo il monitor seriale con il tasto ed impostiamo la velocità di comunicazione a 115200 baudIl risultato sarà simile al seguente:
CAMBIO INDIRIZZO I2C DEL SENSORE VL53L0X
NOTE PRELIMINARI: il cambio dell’indirizzo non è permanente, infatti se si toglie l’alimentazione al sensore verrà automaticamente reimpostato il valore 0x29.
Se si utilizza più di un 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.
Se si utilizza un unico sensore e si vuole cambiare indirizzo i2c basta utilizzare il seguente codice:
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); void setup() { lox.begin(0x29); // Scrivere l'indirzzo i2C scelto } void loop() { }
Basterà quindi modificare la stringa:
lox.begin(0x29);
Sostituendo a 0x29, l’indirizzo scelto, la gamma degli indirizzi utilizzabili vanno da 0x30 a 0x3F.
Se si utilizzano più sensori VL53L0X:
Se si adottano più sensori si dovrà utilizzare anche il pin XSHUT.
La procedura sarà la seguente:
1) Si inizia settando tutti i pin connessi ai vari XSHUT a LOW per un tempo di 10 millisecondi.
2) Settare tutti i pin XSHUT a HIGH per uscire dalla modalità reset.
3) Settare tutti i pin XSHUT tranne quello del sensore n.1 a LOW
4) Inizializza il sensore n.1 con lox1.begin (new_i2c_address) Scegliere qualsiasi indirizzo tranne 0x29 (il range è da 0x30 a 0x7E).
5) Mantenere il sensore n. 1 attivo lasciando il suo pin XSHUT HIGH, ora attivare il sensore n.2 impostando il suo pin XSHUT a HIGH.
6) Inizializza il sensore n.2 con lox2.begin (new_i2c_address) Scegliere qualsiasi numero tranne 0x29 e qualunque altro numero già utilizzato precedentemente per altri sensori.
7) Ripetere le operazioni precedenti per ciascun sensore, lasciando i pin XSHUT a HIGH per tutti i sensori già inizializzati e accendendo ciascuno sensore ed impostando un indirizzo univoco.
Lo sketch sarà il seguente:
#include <Wire.h> #include "Adafruit_VL53L0X.h" #define XSHUT_LOX1 8 #define XSHUT_LOX2 3 #define LOX1_Adr 0x31 #define LOX2_Adr 0x32 Adafruit_VL53L0X lox1 = Adafruit_VL53L0X(); Adafruit_VL53L0X lox2 = Adafruit_VL53L0X(); void setup() { pinMode(XSHUT_LOX1, OUTPUT); pinMode(XSHUT_LOX2, OUTPUT); Serial.begin(9600); while (! Serial) { delay(1); } Serial.println("Serial init ==> OK"); delay(500); Serial.println("Reset Sensori"); digitalWrite(XSHUT_LOX1, LOW); digitalWrite(XSHUT_LOX2, LOW); delay(10); digitalWrite(XSHUT_LOX1, HIGH); digitalWrite(XSHUT_LOX2, HIGH); delay(10); Serial.println("Cambio i2c address sensore 1"); digitalWrite(XSHUT_LOX1, HIGH); digitalWrite(XSHUT_LOX2, LOW); lox1.begin(LOX1_Adr); Serial.println("Cambio i2c address sensore 1"); digitalWrite(XSHUT_LOX2, HIGH); delay(10); lox2.begin(LOX2_Adr); delay(10); } void loop() { VL53L0X_RangingMeasurementData_t measure1; Serial.print("Reading a measurement...1 "); lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout! if (measure1.RangeStatus != 4) { // phase failures have incorrect data Serial.print("Distance (mm): "); Serial.println(measure1.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(500); VL53L0X_RangingMeasurementData_t measure2; Serial.print("Reading a measurement...2 "); lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout! if (measure2.RangeStatus != 4) { // phase failures have incorrect data Serial.print("Distance (mm): "); Serial.println(measure2.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(500); }
Carichiamolo sulla nostra scheda ed apriamo il monitor seriale con il tasto ed impostiamo la velocità di comunicazione a 9600 baudIl risultato sarà simile al seguente: