Sensore di distanza GY-VL53L0XV2 VL53L0X Time-of-Flight Distance Sensor

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: