In questo articolo userai un ESP32 Matrix VL6180 ossia il sensore ToF ( Time of Fly ) unito ad una ESP32 Firebeetle ed alla Cover 24×8 della DFRobot per misurare e visualizzare una distanza.
Il sensore che usi è il vl6180 dell’Adafruit che ho acquistato da robotics-3d.com in quanto questa tipologia di sensori è in grado di rilevare con buona precisione anche oggetti trasparenti come i bicchieri di vetro.
Il vetro e le superfici trasparenti sono, spesso, attraversate dagli infrarossi usati da altre tipologie di sensori e non vengono rilevati, inoltre la riflessione non aiuta per nulla il loro rilevamento da parte dei sensori tradizionali.
Il sensore VL6180
Già in passato avevo testato il VL6180 tipo di sensore e descritto la tecnologia utilizzata dai sensori ToF per rilevare gli oggetti posti loro difronte.
In questo esperimento ho unito ESP32 Matrix VL6180 per visualizzare sulla matrice a led 24×8 i valori di distanza ( D: ) rilevati dal sensore:
Molti degli sketch disponibili sul web utilizzano e ti mostrano le informazioni rilevate con arduino ed ho voluto sperimentare con una FireBeetle ESP32 e la sual shield matrix per mostrarti le differenze da applicare al codice.
Collegamenti dell’ESP32 Matrix VL6180
Lo schema dei collegamenti è molto semplice in quanto il sensore utilizza solo 4 contatti:
Sensore VL6180 | Funzione | ESP32 |
Vin | Alimentazione +5v | Vcc |
Gnd | Gnd o Massa o Comune | Gnd |
SDA | I2C SDA | SDA |
SCL | I2C SCL | SCL |
Come vedi nelle foto precedenti e leggi nella tabella il sensore funziona in I2C su indirizzo 0x29 che è indicato nella libreria Adafruit_VL6180X come default address.
Sketch di esempio
ESP32 Matrix VL6180
#include "DFRobot_HT1632C.h" #include <Wire.h> #include "Adafruit_VL6180X.h" #if defined( ESP_PLATFORM ) || defined( ARDUINO_ARCH_FIREBEETLE8266 ) //FireBeetle-ESP32 FireBeetle-ESP8266 #define DATA D6 #define CS D2 #define WR D7 //#define RD D8 #else #define DATA 6 #define CS 2 #define WR 7 //#define RD 8 #endif // Adafruit VL6180 Adafruit_VL6180X vl = Adafruit_VL6180X(); // FireBeetle Led Matrix DFRobot_HT1632C ht1632c = DFRobot_HT1632C(DATA, WR,CS); char str[] = ""; 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!"); ht1632c.begin(); ht1632c.isLedOn(true); ht1632c.clearScreen(); ht1632c.setCursor(0,0); ht1632c.setPwm(0); ht1632c.print("Found VL6180x"); } 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); } ht1632c.clearScreen(); ht1632c.setCursor(0,0); sprintf(str,"D:%03d", range); ht1632c.drawText(str, 0, 0, FONT_8X4, FONT_8X4_END, FONT_8X4_HEIGHT); ht1632c.writeScreen(); delay(50); }
lo sketch del progetto ESP32 Matrix VL6180 unisce la lettura della distanza da parte del sensore alla visualizzazione sul display a matrice di le 24×8.
Descrizione dello sketch
La descrizione dello sketch ti serve per comprendere il programma in ogni sua parte ed avere chiaro quali parti di codice modificare per adattare questo esperimento al tuo progetto.
Iniziando dalle linee 01-03: includi le librerie necessarie al controllo della matrice di led ed al sensore VL6180, le riconosci dal nome del componente che controlla ogni libreria. La libreria Wire.h serve a supporto della libreria Adafruit_VL6180.h per la comunicazione i2c;
linee 05-15: in funzione della piattaforma che utilizzi ( ESP, Arduino o altre ) puoi definire i pin che devono essere utilizzati come DATA, CS e WR, nello sketch sono presenti due set preimpostati;
linea 18: definisci l’istanza vl della libreria Adafruit VL6180 in modo da poter dialogare con il sensore;
linea 20: definisci l’istanza ht1632c come istanza della omonima libreria della DfRobot per il controllo della matrice cover 24×8;
linea 22: definsci una variabile di tipo char array in cui memorizzerai la stringa da visualizzare sul display ad ogni lettura;
linee 28-30: sono definite per impedire che tu possa avviare il programma prima che il monitor seriale sia attivo, otterrai, in questa fase di test del sensore, che l’inizio del programma sarà solo successivo alla connessione seriale ed al serial monitor attivo;
linee 32-37: sono utili per eseguire un test tra la ESP32 e il VL6180, in questo modo potrai essere certo che sia possibile leggerne i valori di distanza rilevati;
Analizza il blocco di istruzioni seguenti:
ht1632c.begin(); ht1632c.isLedOn(true); ht1632c.clearScreen(); ht1632c.setCursor(0,0); ht1632c.setPwm(0); ht1632c.print("Found VL6180x");
linea 39: inizializza il display e la comunizcazione verso la matrice di led;
linea 40: verifica ed imposta l’accensione dei led;
linee 41-42: pulisci lo schermo spegnendo tutti i led e posizionati al pixel 0,0;
linea 43: imposta il PWM del led a 0 nel range 0,15 possibile;
linea 44: scrivi sul display la frase “Found VL6180x” per inicarti che il sensore è stato correttamente rilevato;
Passa ad analizzare la funzione loop():
linea 49: richiede al sensore il valore dei Lux presenti nella stanza impostando una soglia di guadagno ( GAIN ) a 5, circa la metà nella scala dei possibili valori:
adafruit_vl6180x.ALS_GAIN_1
– 1x gainadafruit_vl6180x.ALS_GAIN_1_25
– 1.25x gainadafruit_vl6180x.ALS_GAIN_1_67
– 1.67x gainadafruit_vl6180x.ALS_GAIN_2_5
– 2.5x gainadafruit_vl6180x.ALS_GAIN_5
– 5x gainadafruit_vl6180x.ALS_GAIN_10
– 10x gainadafruit_vl6180x.ALS_GAIN_20
– 20x gainadafruit_vl6180x.ALS_GAIN_40
– 40x gain
riportati sul sito del produttore del sensore e della libreria;
linee 53-54: leggi i valori di range e di status dal sensore mediante i metodi preposti della libreria;
linea 56: verifica lo stato restituito dal sensore confrontandolo con la costante VL6180X_ERROR_NONE. Tale costante definisce l’assenza di errori.
linea 57: scrivi sul monitor seriale il valore di range rilevato;
linee 60-61: pulisci nuovamente il display e posizionati alle coordinate 0,0;
linea 62: usando il comando sprintf componi la linea da scrivere sul display “D:000” in cui la sequenza “000” viene sostituita dal valore range letto dal sensore;
linee 63-64: prepara la stringa da scrivere usando il metodo drawText passandogli la stringa, le coordinate a cui scrivere e la grandezza dei font;
linea 65: attendi che passino 50 millisecondi prima dell’esecuzione del successivo ciclo di loop();
Video dimostrativo ESP32 Matrix VL6180
Trasferisci lo sketch alla FireBeetle ESP32 Matrix VL6180, o al micro controllore scelto per il tuo progetto, e vedrai:
Grazie alla capacità di questo sensore puoi rilevare oggetti trasparenti e/o riflettenti, come, ad esempio, dei bicchieri, nei tuoi progetti.