Il Modulo TOF VL6180 è un sensore di tipo Time Of Flight ( da cui TOF ) il cui componente attivo è costituito dal VL6180 della STMicroelectronics.
L’esigenza a cui potresti dover rispondere è quella di rilevare un oggetto in modo accurato a pochi centimetri da un sistema in movimento con l’aggravante della luminosità che può cambiare influenzando il comportamento e la risposta.
In modo specifico ho utilizzato tale sensore per il progetto SpritzDress presentato lo scorso Martedì 17 luglio 2018 all’AUG e di cui hai potuto leggere l’articolo pubblicato il giorno seguente.
Il Modulo TOF VL6180
Il Modulo TOF VL6180 basa il suo funzionamento sul principio del Tempo di Volo ( Time Of Flight ) che puoi approfondire qui
In modo semplice il principio del tempo di volo si basa sulla misura del tempo che una data particella nota impiega a percorrere uno spazio in un mezzo noto.
Nel nostro caso la particella è una lunghezza d’onda laser di 850 nm e il mezzo in cui si sposta è l’aria, conoscendo la velocità con cui tale particella si muove nell’aria e misurando il tempo che impiega a raggiungere un oggetto puoi determinarne la distaza e non solo.
Il DataSheet del VL6180 è dettagliato e ti spiega come funzioni il sensore e quali siano le sue caratteristiche.
Test del Modulo TOF VL6180
Dovendolo utilizzare per il progetto dell’abito puoi eseguire qualche prova prima di impiegarlo in un progetto più complesso.
Nello SpritzDress il modulo TOF VL6180 si occupa di rilevare il bicchiere per essere certo che il cocktail non sia erogato se non è presente il bicchiere o un altro contenitore.
Il bicchiere, di plastica o vetro è trasparente per cui facilmente attraversato da fasci luminosi generati da led o altre fonti che non siano puntiformi come il laser.
Il modulo comunica con Arduino mediante il protocollo I2C e quindi 4 fili: SDA, SCL, Vcc e Gnd.
Salda 4 cavetti al modulo TOF VL6180 in questo modo:
E’ ora di installare le librerie per il modulo TOF VL6180 che sono disponibili nell’IDE arduino.
Tra le molte librerie provate quella più rispondente alle esigenze del progetto per cui il modulo deve essere impiegato è quella di Adafruit:
clicca su “Installa”, ed al termine dell’installazione vedrai la seguente schermata:
e nel menù degli esempi troverai i due esempi rilasciati con la libreria:
puoi selezionare il primo esempio e lo analizziamo insieme nel paragrafo dedicato allo sketch:
Sketch di test del modulo tof vl6180x
Il test del modulo tof vl6180 puoi farlo utilizzando il codice di esempio rilasciato con la libreria Adafruit per il modulo:
#include <Wire.h> #include "Adafruit_VL6180X.h" Adafruit_VL6180X vl = Adafruit_VL6180X(); void setup() { Serial.begin(115200); // wait for serial port to open on native usb devices while (!Serial) { delay(1); } Serial.println("Adafruit VL6180x test!"); if (! vl.begin()) { Serial.println("Failed to find sensor"); while (1); } Serial.println("Sensor found!"); } void loop() { float lux = vl.readLux(VL6180X_ALS_GAIN_5); Serial.print("Lux: "); Serial.println(lux); uint8_t range = vl.readRange(); uint8_t status = vl.readRangeStatus(); if (status == VL6180X_ERROR_NONE) { Serial.print("Range: "); Serial.println(range); } // Some error occurred, print it out! if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) { Serial.println("System error"); } else if (status == VL6180X_ERROR_ECEFAIL) { Serial.println("ECE failure"); } else if (status == VL6180X_ERROR_NOCONVERGE) { Serial.println("No convergence"); } else if (status == VL6180X_ERROR_RANGEIGNORE) { Serial.println("Ignoring range"); } else if (status == VL6180X_ERROR_SNR) { Serial.println("Signal/Noise error"); } else if (status == VL6180X_ERROR_RAWUFLOW) { Serial.println("Raw reading underflow"); } else if (status == VL6180X_ERROR_RAWOFLOW) { Serial.println("Raw reading overflow"); } else if (status == VL6180X_ERROR_RANGEUFLOW) { Serial.println("Range reading underflow"); } else if (status == VL6180X_ERROR_RANGEOFLOW) { Serial.println("Range reading overflow"); } delay(50); }
analizziamo insieme lo sketch di test del modulo tof vl6180 partendo dalle linee 01-02 che includono le librerie necessarie alla comunicazione con il modulo, la libreria Wire per gestire l’I2C e la libreria specifica dell’Adafruit;
linea 04: definisci l’istanza vl con la quale accedi ai metodi della classe Adafruit_VL6180X();
linee 07-14: imposta e controlla la comunicazione seriale tra Arduino e l’IDE in modo da essere certo che lo sketch continui solo in presenza del monitor seriale connesso;
linea 15: usa il metodo begin dell’istanza vl per inizializzare la comunicazione con il sensore e verificarne il corretto collegamento;
linee 16-19: se il metodo begin non ti restituisce un risultato valido scrivi sul monitor seriale “Failed to find sensor” in caso di corretta comunicazione stabilita scrivi “Sensor found!”;
linea 23: definisci una variabile di tipo float il cui valore è dato dalla risposta del metodo readLux; a tale metodo puoi passare una serie di costanti la cui spiegazione è presente nello specchietto in basso;
linea 25: scrivi sul monitor seriale il valore di lux letto dal sensore;
linee 27-28: usando i metodi readRange e readRangeStatus leggi i due valori dal sensore VL6180X;
linee 30-32: se non ci sono errori scrivi sul monitor seriale il valore di range rilevato dal sensore;
linee 36-62: verifica i messaggi di errore e per ciascun errore scrivi sul monitor seriale il tipo di errore che hai rilevato;
linea 63: imposta il delay tra un ciclo di loop ed il successivo a 50 millisecondi;
Approfondimento modulo tof vl6180
Ecco uno specchietto riassuntivo, e non esaustivo, delle costanti che puoi utilizzare in fase di lettura con il metodo readLux:
Notice
Il metodo readLux restituisce una lettura dei lux presenti nell’ambiente semi-calibrata.
Puoi utilizzare diverse impostazioni di guadagno per migliorare le prestazioni del sensore e la precisione con cui rileva gli oggetti.
Con luce scarsa puoi utilizzare un guadagno elevato, al contrario, in persenza di grande quantità di luce è meglio utilizzare un guadagno più basso.
Di seguito la lista dei valori di GAIN che puoi utilizzare con il modulo tof vl6180
- VL6180X_ALS_GAIN_1 – gain of 1x
- VL6180X_ALS_GAIN_1_25 – gain of 1.25x
- VL6180X_ALS_GAIN_1_67 – gain of 1.67x
- VL6180X_ALS_GAIN_2_5 – gain of 2.5x
- VL6180X_ALS_GAIN_5 – gain of 5x
- VL6180X_ALS_GAIN_10 – gain of 10x
- VL6180X_ALS_GAIN_20 – gain of 20x
- VL6180X_ALS_GAIN_40 – gain of 40x
Come hai letto nello sketch in fase di test puoi partire da un valore medio 5x per provare valori di GAIN inferiori o superiori per raggiungere una lettura ottimale;
1 ping
[…] in passato avevo testato il VL6180 tipo di sensore e descritto la tecnologia utilizzata dai sensori ToF per rilevare gli oggetti posti […]