Skip to Content

Iniziare con il sensore 3D ToF Gravity 8×8 Matrix

Iniziare con il sensore 3D ToF Gravity 8×8 Matrix

Il sensore di distanza 3D Gravity 8×8 Matrix ToF è un modulo compatto per la rilevazione della profondità progettato per progetti embedded e maker. Utilizza la tecnologia Time-of-Flight (ToF) per misurare la distanza analizzando i segnali di luce riflessa.

A differenza dei sensori di distanza a singolo punto, questo modulo fornisce una matrice 8×8 di misurazioni. Offre 64 valori di distanza indipendenti contemporaneamente, formando una mappa di profondità 3D di base della scena.

Il sensore integra un microcontrollore RP2040 a bordo per l’elaborazione dei dati. Supporta interfacce comuni come I2C, UART e USB. La portata di rilevamento arriva fino a circa 3,5 metri con un campo visivo di circa 60 gradi.

In questo tutorial imparerai come collegare il sensore a un ESP32 o Arduino per recuperare e visualizzare la matrice di distanza 8×8 misurata dal sensore.

Parti Necessarie

Puoi acquistare il sensore Gravity 8×8 Matrix ToF su Amazon o DFRobot. Ti servirà anche un Arduino o un ESP32. In questo tutorial uso un Arduino R4 WiFi e un ESP32 Lite.

Ho scelto l’Arduino R4 WiFi per questo progetto, poiché ha una matrice LED integrata, che useremo per visualizzare le misurazioni del sensore 8×8 Matrix ToF.

In alternativa, puoi usare un ESP32 o un altro Arduino e un display OLED. Ti mostrerò anche come fare.

Infine, una breadboard e alcuni cavi Dupont per i collegamenti saranno utili.

Sensore Gravity 8×8 Matrix ToF

ESP32 lite Lolin32

ESP32 lite

Arduino R4 WiFi

Cavo USB C

OLED display

Display OLED

Dupont wire set

Set di cavi Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Hardware del sensore Gravity 8×8 Matrix ToF

Il sensore di distanza 3D Gravity 8×8 Matrix ToF è costruito attorno a un dispositivo di misurazione Time-of-Flight multi-zona. Utilizza il VL53L7CX sensore, che integra una matrice di zone ottiche di misurazione. Ogni zona agisce come un canale di distanza indipendente. L’intera matrice forma una griglia 8×8 con 64 punti di misurazione. L’immagine sotto mostra il fronte e il retro della scheda del sensore:

Front and Back of Gravity 8x8 Matrix ToF Sensor Board
Fronte e retro della scheda del sensore Gravity 8×8 Matrix ToF

Nella parte superiore del fronte della scheda si vede il sensore vero e proprio (evidenziato in giallo). Sul retro c’è il connettore Gravity per collegare la scheda e un interruttore DIP per impostare la modalità di comunicazione (UART/I2C) e l’indirizzo I2C.

Nota che l’elemento sensore è coperto da una pellicola di plastica gialla che devi rimuovere prima dell’uso. La foto seguente mostra l’elemento sensore con e senza pellicola:

Un microcontrollore RP2040 a bordo gestisce l’elaborazione del segnale e l’aggregazione dei dati. Questo riduce il carico computazionale sul microcontrollore host. Il sensore fornisce valori di distanza già elaborati invece di dati temporali grezzi.

Il sistema opera in modalità di misurazione continua. Ciò significa che le misurazioni di distanza vengono aggiornate a una frequenza fissa senza trigger esterni. La frequenza di aggiornamento tipica varia da 15 Hz fino a 60 Hz a seconda della configurazione.

Caratteristiche di Misurazione

Il sensore misura la distanza usando impulsi di luce infrarossa e analisi temporale. Supporta un intervallo di misurazione da circa 20 mm fino a 3,5 metri.

La precisione dipende dalla distanza e dalla riflettività del bersaglio. A breve distanza tra 20 mm e 200 mm, l’errore è tipicamente intorno a ±11-12 mm. A distanze maggiori, l’errore è espresso in percentuale e varia da circa ±5% a ±6%.

Il campo visivo è definito da una copertura angolare ampia. È di circa 60 gradi orizzontalmente e verticalmente, con un angolo diagonale vicino a 90 gradi. Questo permette al sensore di catturare una scena ampia in un singolo frame.

Ognuna delle 64 zone riporta un valore di distanza indipendente. Questi valori insieme formano una mappa di profondità a bassa risoluzione. Ciò consente una percezione 3D di base senza elaborazioni complesse delle immagini.

Caratteristiche Elettriche

Il sensore funziona con una tensione di alimentazione tra 3,3 V e 5 V. Questo lo rende direttamente compatibile con la maggior parte delle schede Arduino e ESP32.

Il consumo di corrente è inferiore a 80 mA durante il funzionamento. Questo permette l’uso in sistemi embedded a basso consumo.

Il modulo è conforme agli standard di sicurezza laser di Classe 1. Questo garantisce un funzionamento sicuro in condizioni normali senza precauzioni speciali.

Interfacce di Comunicazione

Il sensore supporta più interfacce di comunicazione. Può operare tramite I2C, UART o USB.

La comunicazione USB è principalmente usata per lo streaming diretto dei dati e aggiornamenti firmware.

L’interfaccia I2C offre quattro indirizzi selezionabili: 0x30, 0x31, 0x32 e 0x33. L’interfaccia UART usa una velocità fissa di 115200 bps. Vedi la sezione successiva su come cambiare interfaccia di comunicazione e impostare l’indirizzo I2C.

Impostazione dell’indirizzo I2C e della modalità di comunicazione

Puoi cambiare la modalità di comunicazione del sensore tra UART e I2C usando un interruttore DIP. Per la comunicazione I2C puoi inoltre scegliere tra quattro diversi indirizzi I2C. Sul retro della scheda trovi 3 interruttori DIP (evidenziati in giallo) etichettati A1, A0 e I2C come mostrato sotto:

DIP switch to set UART/I2C and I2C address
Interruttore DIP per impostare UART/I2C e indirizzo I2C

Nota che su una scheda nuova l’interruttore DIP è coperto da una pellicola di plastica gialla che devi rimuovere se vuoi cambiare l’impostazione.

Ho usato le impostazioni di default mostrate sopra. Indicano che la modalità di comunicazione è impostata su I2C e l’indirizzo I2C è 0x33.

L’indirizzo I2C è determinato dagli interruttori A0 e A1 e la tabella sul retro della scheda indica quale combinazione di A0 e A1 corrisponde a quale indirizzo I2C:

Table for I2C address settings
Tabella per le impostazioni dell’indirizzo I2C

Nel mio caso (default), A0=1 e A1=1 corrisponde all’indirizzo I2C 0x33. Troverai che questo indirizzo è usato nel codice. Se dovesse entrare in conflitto con l’indirizzo I2C del tuo OLED, puoi cambiarlo qui.

Pinout

L’immagine sotto mostra il pinout del sensore Gravity 8×8 Matrix ToF. Troverai il connettore Gravity bianco a 4 pin (PH2.0-4P) sul retro della scheda come mostrato:

Pinout del sensore Gravity 8×8 Matrix ToF

Ha pin per l’alimentazione (VCC, GND) e per I2C (SDA, SCL) o UART (TX, RX), dove la modalità di comunicazione dipende dall’impostazione dell’interruttore DIP descritta prima.

Specifiche Tecniche

La tabella seguente riassume i principali parametri tecnici del sensore di distanza 3D Gravity 8×8 Matrix ToF.

Parametro Valore
Modello sensore VL53L7CX
MCU di elaborazione RP2040
Griglia di misurazione Matrice 8 × 8 (64 zone)
Modalità di misurazione Misurazione continua
Frequenza di aggiornamento 15 Hz a 60 Hz
Intervallo di misurazione 20 mm a 3,5 m
Precisione (corto raggio) ±11 a ±12 mm (20–200 mm)
Precisione (lungo raggio) ±5% a ±6% (>200 mm)
Campo visivo 60° × 60° (90° diagonale)
Tensione di alimentazione 3,3 V a 5 V
Consumo di corrente < 80 mA
Interfacce I2C, UART, USB
Indirizzi I2C 0x30, 0x31, 0x32, 0x33
Velocità UART 115200 bps
Tipo di connettore PH2.0-4P (Gravity)
Classe di sicurezza laser Classe 1

Collegare il sensore Gravity 8×8 Matrix ToF ad Arduino R4

Collegare il sensore Gravity 8×8 Matrix ToF a un Arduino R4 è semplice. Inizia collegando VIN al 5V o 3.3V dell’Arduino. Poi collega GND a GND. Infine, collega l’interfaccia I2C collegando SCL e SDA del sensore ai pin corrispondenti sull’R4. L’immagine sotto mostra il cablaggio completo:

Collegare il sensore mmWave C4001 a un Arduino

Per comodità, ecco una tabella con i collegamenti da effettuare:

Sensore Arduino R4
VIN 5V o 3.3V
GND GND
SCL SCL
SDA SDA

Collegare il sensore Gravity 8×8 Matrix ToF a ESP32

Collegare il sensore a un ESP32 è altrettanto semplice. L’interfaccia I2C di default dell’ESP32 lite si trova sui pin 19 (SDA) e 23 (SCL). Colleghiamo quindi SCL del sensore al pin 23 e SDA al pin 19.

Poi colleghiamo VCC del sensore al pin 3V, che fornisce 3.3V. Infine colleghiamo GND del sensore al pin G (Ground) dell’ESP32. L’immagine sotto mostra il cablaggio completo:

Connecting the Gravity 8×8 Matrix ToF Sensor to an ESP32
Collegare il sensore Gravity 8×8 Matrix ToF a un ESP32

Per comodità, ecco una tabella con i collegamenti da effettuare:

Sensore ESP32 Lite
VIN 3.3V
GND G
C/R 23 (SCL)
D/T 19 (SDA)

L’ESP32 non ha una matrice LED integrata, quindi collegheremo un OLED per visualizzare le distanze misurate dal sensore Gravity 8×8 Matrix ToF. Aggiungere l’OLED al circuito è semplice, poiché possiamo collegarlo in parallelo al sensore. Basta collegare SDA, SCL e le linee di alimentazione in parallelo:

Connecting the OLED to an ESP32
Collegare l’OLED a un ESP32

Installazione della libreria DFRobot_MatrixLidar

Prima di scrivere codice, dobbiamo installare la DFRobot_MatrixLidar libreria. Per installarla vai al DFRobot_MatrixLidar repository, clicca sul pulsante verde “<> Code” e poi su “Download ZIP” per scaricare la libreria come file ZIP come mostrato sotto:

Poi crea un nuovo sketch Arduino, vai su Sketch -> Include Library -> Add .ZIP Library … per installare la libreria ZIP scaricata (DFRobot_MatrixLidar-master.zip):

Esempio di codice: Misurare e stampare la matrice di distanza 8×8

Il codice seguente dimostra come usare il sensore di distanza 3D Gravity 8×8 Matrix ToF con un ESP32 o Arduino. Misura le distanze in formato matrice 8×8 e stampa i valori di distanza per ogni punto della matrice sul monitor seriale.

// www.makerguides.com
// Libraries:
// - DFRobot_MatrixLidar V 1.0.0
//   https://github.com/DFRobot/DFRobot_MatrixLidar
// - ESP32 Core V 3.3.8

#include "DFRobot_MatrixLidar.h"

DFRobot_MatrixLidar_I2C tof(0x33);
uint16_t buf[64];

void setup(void){
  Serial.begin(115200);
  
  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }
  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }
}

void loop(void){
  tof.getAllData(buf);
  for(uint8_t i = 0; i < 8; i++){
    for(uint8_t j = 0; j < 8; j++){
      uint16_t dist = buf[i * 8 + j];
      Serial.print(dist);
      Serial.print(",");
    }
    Serial.println("");
  }
  Serial.println("------------------------------");
  delay(100);
}

Importazioni

Il codice inizia includendo la DFRobot_MatrixLidar libreria, che fornisce le funzioni necessarie per interfacciarsi con il sensore Gravity 8×8 Matrix ToF tramite I2C.

#include "DFRobot_MatrixLidar.h"

Oggetti e Variabili

Successivamente, viene creato un oggetto tof della classe DFRobot_MatrixLidar_I2C con l’indirizzo I2C 0x33. Questo oggetto sarà usato per comunicare con il sensore.

Inoltre, viene dichiarato un array buffer buf di 64 interi senza segno a 16 bit. Questo buffer conterrà le misurazioni di distanza per ciascuno dei 64 punti nella matrice 8×8.

DFRobot_MatrixLidar_I2C tof(0x33);
uint16_t buf[64];

Funzione Setup

Nella funzione setup() la comunicazione seriale viene inizializzata a 115200 baud per permettere la stampa dei dati sul monitor seriale.

Il sensore viene quindi inizializzato chiamando tof.begin(). Se l’inizializzazione fallisce (ritorna un valore diverso da zero), il codice stampa un messaggio di errore e riprova ogni 100 millisecondi finché non ha successo.

Dopo l’inizializzazione riuscita, la modalità di misurazione del sensore viene impostata su eMatrix_8X8, che configura il sensore per misurare distanze in formato matrice 8×8. Come per l’inizializzazione, se l’impostazione fallisce, viene stampato un messaggio di errore e il codice riprova finché non riesce.

void setup(void){
  Serial.begin(115200);

  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }
  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }
}

Funzione Loop

La funzione loop() legge continuamente i dati di distanza dal sensore e li stampa sul monitor seriale.

Prima, tof.getAllData(buf) riempie l’array buf con le ultime misurazioni di distanza per tutti i 64 punti nella matrice 8×8.

Due cicli for annidati iterano sulle righe (i) e colonne (j) della matrice. Per ogni punto, il valore di distanza corrispondente viene estratto dal buffer usando la formula buf[i * 8 + j].

Ogni valore di distanza viene stampato seguito da una virgola per separare i valori nella riga. Dopo aver stampato tutte le colonne di una riga, viene stampato un a capo per iniziare una nuova riga.

Dopo aver stampato l’intera matrice 8×8, viene stampata una linea di separazione con trattini per distinguere visivamente ogni frame di dati. Infine, il codice attende 100 millisecondi prima di ripetere il processo.

void loop(void){
  tof.getAllData(buf);
  for(uint8_t i = 0; i < 8; i++){
    for(uint8_t j = 0; j < 8; j++){
      uint16_t dist = buf[i * 8 + j];
      Serial.print(dist);
      Serial.print(",");
    }
    Serial.println("");
  }
  Serial.println("------------------------------");
  delay(100);
}

Esempio di output

Lo screenshot seguente mostra cosa dovresti vedere stampato sul monitor seriale:

Puoi vedere la matrice 8×8 dei valori di distanza misurati. Se non c’è nessun oggetto davanti al sensore o è troppo lontano, viene stampata la distanza massima di 4000 mm (=400 cm). Se avvicini qualcosa abbastanza al sensore, vedrai distanze più piccole.

Esempio di codice: Visualizzare la matrice di distanza 8×8 su matrice LED

Il prossimo esempio di codice mostra come usare il sensore di distanza 3D Gravity 8×8 Matrix ToF per misurare distanze in formato matrice 8×8 e visualizzare i risultati sulla matrice LED di un Arduino R4.

Il sensore fornisce dati di distanza per ciascuno dei 64 punti della matrice, e il codice visualizza questi dati accendendo i LED corrispondenti alle distanze rilevate entro una soglia specificata. Di seguito un esempio di output:

Dai prima un’occhiata al codice completo e poi ne discuteremo i dettagli:

// www.makerguides.com
// Libraries:
// - DFRobot_MatrixLidar V 1.0.0
//   https://github.com/DFRobot/DFRobot_MatrixLidar

#include "Arduino_LED_Matrix.h"
#include "DFRobot_MatrixLidar.h"

ArduinoLEDMatrix leds;
DFRobot_MatrixLidar_I2C tof(0x33);

void displayMatrix(uint16_t maxDist=200) {
  static uint16_t buf[64];
  static uint8_t frame[8][12] = {0};

  tof.getAllData(buf);
  for(uint8_t i = 0; i < 8; i++){
    for(uint8_t j = 0; j < 8; j++){
      uint16_t dist = buf[i * 8 + j];
      frame[i][j] = dist > maxDist ? 0 : 1;
    }
  }
  leds.renderBitmap(frame, 8, 12);  
}

void setup(void){
  Serial.begin(115200);
  leds.begin();
  
  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }
  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }
  Serial.println("running...");
}

void loop(void){
  displayMatrix(100); // 100 mm =10cm
  delay(50);
}

Importazioni

Il codice inizia includendo due librerie essenziali. La Arduino_LED_Matrix gestisce il display della matrice LED, mentre la DFRobot_MatrixLidar gestisce la comunicazione con il sensore Gravity 8×8 Matrix ToF.

#include "Arduino_LED_Matrix.h"
#include "DFRobot_MatrixLidar.h"

Oggetti

Successivamente, vengono creati due oggetti. L’oggetto leds controlla il display della matrice LED, e l’oggetto tof rappresenta il sensore ToF collegato via I2C all’indirizzo 0x33.

ArduinoLEDMatrix leds;
DFRobot_MatrixLidar_I2C tof(0x33);

Funzione displayMatrix

La funzione displayMatrix() è responsabile di leggere i dati di distanza dal sensore e aggiornare la matrice LED di conseguenza. Accetta un parametro opzionale maxDist che imposta la soglia massima di distanza in millimetri per accendere i LED. Il valore predefinito è 200 mm.

All’interno della funzione, un buffer statico buf di 64 interi senza segno a 16 bit memorizza i dati grezzi di distanza per ogni punto nella matrice 8×8. Un altro array 2D statico frame rappresenta gli stati dei LED da visualizzare.

La funzione chiama tof.getAllData(buf) per riempire il buffer con le misurazioni correnti. Poi itera su ogni punto della matrice 8×8, controllando se la distanza misurata è minore o uguale a maxDist. Se sì, il LED corrispondente viene acceso impostando il valore a 1; altrimenti viene spento (0).

Infine, viene chiamato il metodo leds.renderBitmap() per aggiornare il display della matrice LED con il frame preparato.

void displayMatrix(uint16_t maxDist=200) {
  static uint16_t buf[64];
  static uint8_t frame[8][12] = {0};

  tof.getAllData(buf);
  for(uint8_t i = 0; i < 8; i++){
    for(uint8_t j = 0; j < 8; j++){
      uint16_t dist = buf[i * 8 + j];
      frame[i][j] = dist > maxDist ? 0 : 1;
    }
  }
  leds.renderBitmap(frame, 8, 12);  
}

Funzione Setup

La funzione setup() inizializza la comunicazione seriale a 115200 baud per scopi di debug e avvia la matrice LED chiamando leds.begin().

Poi tenta di inizializzare il sensore ToF chiamando tof.begin() in un ciclo finché non ha successo. Se l’inizializzazione fallisce, stampa un messaggio di errore e riprova dopo un breve ritardo.

Una volta inizializzato il sensore, il codice imposta la modalità di misurazione su eMatrix_8X8, che configura il sensore per fornire dati di distanza in formato matrice 8×8. Anche questa operazione è fatta in un ciclo con controllo errori.

Dopo l’impostazione riuscita, viene stampato sul monitor seriale il messaggio di conferma “running…”

void setup(void){
  Serial.begin(115200);
  leds.begin();

  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }
  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }
  Serial.println("running...");
}

Funzione Loop

La funzione loop() chiama continuamente displayMatrix(100), che aggiorna la matrice LED per mostrare i punti dove la distanza è di 100 millimetri (10 centimetri) o meno. Questo crea una visualizzazione in tempo reale degli oggetti rilevati entro quella distanza.

Viene aggiunto un breve ritardo di 50 millisecondi tra gli aggiornamenti per controllare la frequenza di refresh ed evitare di sovraccaricare il sensore o il display.

void loop(void){
  displayMatrix(100); // 100 mm =10cm
  delay(50);
}

Demo di output

Il breve video qui sotto dimostra come funziona il sensore e come movimenti e oggetti appaiono sulla matrice LED:

Esempio di codice: Visualizzare la matrice di distanza 8×8 su OLED

Per quest’ultimo progetto colleghiamo il sensore a un ESP32, aggiungiamo un piccolo OLED al circuito e visualizziamo la matrice di distanza sull’OLED. L’OLED ha il vantaggio di poter rappresentare le distanze relative tramite la dimensione dei quadrati della matrice.

Per controllare l’OLED devi installare la Adafruit_SSD1306 libreria. Puoi installarla tramite il Library Manager come al solito:

Adafruit_SSD1306 library installed in Library Manager
Libreria Adafruit_SSD1306 installata nel Library Manager

Il sensore fornisce misurazioni di distanza in formato griglia, e l’OLED visualizza queste distanze come quadrati pieni di dimensioni variabili, offrendo una chiara rappresentazione spaziale dell’ambiente misurato. Vedi l’esempio di output sotto:

Dai prima un’occhiata al codice completo e poi ne discuteremo i dettagli:

// www.makerguides.com
// Libraries:
// - DFRobot_MatrixLidar V 1.0.0
//   https://github.com/DFRobot/DFRobot_MatrixLidar
// - Adafruit_SSD1306 V 2.5.16
//   https://github.com/adafruit/adafruit_ssd1306
// - ESP32 Core V 3.3.8

#include "Adafruit_SSD1306.h"
#include "DFRobot_MatrixLidar.h"

const int sw = 128;
const int sh = 64;

Adafruit_SSD1306 display(sw, sh, &Wire, -1);
DFRobot_MatrixLidar_I2C tof(0x33);

void displayMatrix(uint16_t maxDist = 400) {
  const int cs = 8;  // cell size
  static uint16_t buf[64];

  display.clearDisplay();
  tof.getAllData(buf);

  for (uint8_t i = 0; i < 8; i++) {
    for (uint8_t j = 0; j < 8; j++) {
      uint16_t dist = buf[i * 8 + j];
      if (dist < maxDist) {
        int fillSize = map(dist, 0, maxDist, cs, 0);
        int x = (cs - fillSize) / 2;
        int y = (cs - fillSize) / 2;
        display.fillRect((j * cs) + x + sh / 2,
                         sh - (i * cs) + y,
                         fillSize, fillSize, WHITE);
      }
    }
  }
  display.display();
}

void setup(void) {
  Serial.begin(115200);

  while (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Can't init display!"));
    delay(100);
  }

  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }

  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }

  display.clearDisplay();
  display.display();

  Serial.println("running...");
}

void loop(void) {
  displayMatrix(500);  // 500mm
  delay(50);
}

Importazioni

Il codice inizia includendo le librerie necessarie. Adafruit_SSD1306 viene usata per controllare il display OLED, mentre DFRobot_MatrixLidar gestisce la comunicazione con il sensore 8×8 Matrix ToF.

#include "Adafruit_SSD1306.h"
#include "DFRobot_MatrixLidar.h"

Costanti e Oggetti

Due costanti sw e sh definiscono la larghezza e l’altezza del display OLED in pixel, impostate rispettivamente a 128 e 64. Un oggetto Adafruit_SSD1306 chiamato display viene creato con queste dimensioni e collegato al bus I2C. L’oggetto sensore ToF tof viene istanziato con il suo indirizzo I2C 0x33.

const int sw = 128;
const int sh = 64;

Adafruit_SSD1306 display(sw, sh, &Wire, -1);
DFRobot_MatrixLidar_I2C tof(0x33);

Funzione displayMatrix

La funzione displayMatrix() è responsabile di leggere i dati di distanza dal sensore e visualizzarli sull’OLED. Accetta un parametro opzionale maxDist che di default è 400 millimetri e rappresenta la distanza massima da considerare per la visualizzazione.

All’interno della funzione, una costante cs definisce la dimensione di ogni cella nella griglia 8×8 come 8 pixel. Un array buffer statico buf di 64 elementi memorizza le misurazioni di distanza per ogni cella.

Il display viene prima pulito, poi i dati del sensore vengono caricati in buf usando tof.getAllData(). La funzione itera su ogni cella della matrice 8×8, recuperando il valore di distanza. Se la distanza è inferiore a maxDist, calcola una dimensione di riempimento per un quadrato che rappresenta visivamente la distanza. Più l’oggetto è vicino, più grande è il quadrato.

La posizione di ogni quadrato viene calcolata per centrarlo all’interno della cella, e display.fillRect() disegna il quadrato sull’OLED. Infine, display.display() aggiorna l’OLED con la nuova grafica.

void displayMatrix(uint16_t maxDist = 400) {
  const int cs = 8;  // cell size
  static uint16_t buf[64];

  display.clearDisplay();
  tof.getAllData(buf);

  for (uint8_t i = 0; i < 8; i++) {
    for (uint8_t j = 0; j < 8; j++) {
      uint16_t dist = buf[i * 8 + j];
      if (dist < maxDist) {
        int fillSize = map(dist, 0, maxDist, cs, 0);
        int x = (cs - fillSize) / 2;
        int y = (cs - fillSize) / 2;
        display.fillRect((j * cs) + x + sh / 2,
                         sh - (i * cs) + y,
                         fillSize, fillSize, WHITE);
      }
    }
  }
  display.display();
}

Funzione Setup

La funzione setup() inizializza la comunicazione seriale a 115200 baud per scopi di debug. Poi tenta di inizializzare il display OLED con l’indirizzo I2C 0x3C. Se l’inizializzazione fallisce, stampa un messaggio di errore e riprova.

Successivamente, il sensore ToF viene inizializzato. Se il sensore non parte, il codice stampa un errore e riprova. Dopo l’inizializzazione riuscita, il sensore viene impostato in modalità di misurazione 8×8 usando tof.setRangingMode(eMatrix_8X8). Qualsiasi errore qui attiva un messaggio di errore e un ciclo di ritentativi.

Infine, il display viene pulito e aggiornato, e viene stampato sul monitor seriale il messaggio “running…” per indicare che la configurazione è completa.

void setup(void) {
  Serial.begin(115200);

  while (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Can't init display!"));
    delay(100);
  }

  while (tof.begin() != 0) {
    Serial.println("Can't init sensor!");
    delay(100);
  }

  while (tof.setRangingMode(eMatrix_8X8) != 0) {
    Serial.println("Can't set mode!");
    delay(100);
  }

  display.clearDisplay();
  display.display();

  Serial.println("running...");
}

Funzione Loop

La funzione loop() chiama continuamente displayMatrix() con una distanza massima di 500 millimetri, aggiornando il display OLED con le ultime misurazioni di distanza dal sensore. Viene aggiunto un breve ritardo di 50 millisecondi per controllare la frequenza di aggiornamento.

void loop(void) {
  displayMatrix(500);  // 500mm
  delay(50);
}

Demo di output

Il breve video qui sotto dimostra come funziona il sensore e come movimenti e oggetti appaiono sull’OLED:

Conclusioni

In questo tutorial hai imparato come collegare il sensore Gravity 8×8 Matrix ToF a un Arduino o a un ESP32 per misurazioni spaziali di distanza.

Rispetto ai sensori laser di distanza a singolo punto come il TFmini-Plus, il GP2Y0E03 o il VL53L1X, per esempio, il sensore di distanza 3D Gravity 8×8 Matrix ToF offre un grande vantaggio nella consapevolezza spaziale.

Invece di misurare un solo valore di distanza, fornisce 64 punti di distanza contemporaneamente, permettendo una mappatura di profondità di base e il rilevamento della direzione.

Questo riduce la necessità di scansioni meccaniche o di più sensori. Tuttavia, i sensori a singolo punto sono tipicamente più semplici, più piccoli e più precisi per una specifica direzione di misura.

In generale, l’approccio a matrice è migliore per la comprensione della scena, mentre i sensori a singolo fascio sono migliori per misurazioni di distanza precise.

Le applicazioni tipiche del sensore Gravity 8×8 Matrix ToF sono nella robotica per il rilevamento ostacoli e la navigazione di base. Nei sistemi di smart home può essere usato per il riconoscimento gestuale, il rilevamento di presenza, il tracciamento del movimento e il controllo basato sulla prossimità.

Se hai domande, sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il tinkering ; )