Skip to Content

Erste Schritte mit dem Gravity 8×8 Matrix ToF 3D Sensor

Erste Schritte mit dem Gravity 8×8 Matrix ToF 3D Sensor

Der Gravity 8×8 Matrix ToF 3D Distanzsensor ist ein kompaktes Tiefensensormodul, das für Embedded- und Maker-Projekte entwickelt wurde. Er nutzt Time-of-Flight (ToF)-Technologie, um Entfernungen durch Analyse reflektierter Lichtsignale zu messen.

Im Gegensatz zu Einpunkt-Abstandssensoren liefert dieses Modul eine 8×8 Matrix von Messwerten. Es liefert gleichzeitig 64 unabhängige Distanzwerte und bildet so eine einfache 3D-Tiefenkarte der Szene.

Der Sensor integriert einen onboard RP2040 Mikrocontroller zur Datenverarbeitung. Er unterstützt gängige Schnittstellen wie I2C, UART und USB. Die Erfassungsreichweite beträgt bis zu etwa 3,5 Meter bei einem Sichtfeld von ca. 60 Grad.

In diesem Tutorial lernst du, wie du den Sensor an einen ESP32 oder Arduino anschließt, um die vom Sensor gemessene 8×8 Distanzmatrix auszulesen und anzuzeigen.

Benötigte Teile

Den Gravity 8×8 Matrix ToF Sensor kannst du bei Amazon oder DFRobot erwerben. Außerdem benötigst du einen Arduino oder einen ESP32. In diesem Tutorial verwende ich einen Arduino R4 WiFi und einen ESP32 Lite.

Ich habe den Arduino R4 WiFi für dieses Projekt gewählt, da er eine eingebaute LED-Matrix besitzt, die wir zur Anzeige der Messwerte des 8×8 Matrix ToF Sensors nutzen werden.

Alternativ kannst du einen ESP32 oder einen anderen Arduino verwenden und ein OLED-Display als Anzeige anschließen. Ich zeige dir auch, wie das funktioniert.

Schließlich sind ein Breadboard und einige Dupont-Kabel zum Verdrahten nützlich.

Gravity 8×8 Matrix ToF Sensor

ESP32 lite Lolin32

ESP32 lite

Arduino R4 WiFi

USB C Kabel

OLED display

OLED Display

Dupont wire set

Dupont Kabelsatz

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 des Gravity 8×8 Matrix ToF Sensors

Der Gravity 8×8 Matrix ToF 3D Distanzsensor basiert auf einem Multi-Zonen Time-of-Flight Messgerät. Er verwendet den VL53L7CX Sensor, der ein Array optischer Messzonen integriert. Jede Zone fungiert als unabhängiger Distanzkanal. Das gesamte Array bildet ein 8×8 Raster mit 64 Messpunkten. Das Bild unten zeigt Vorder- und Rückseite der Sensorplatine:

Front and Back of Gravity 8x8 Matrix ToF Sensor Board
Vorder- und Rückseite der Gravity 8×8 Matrix ToF Sensorplatine

Oben auf der Vorderseite der Platine sieht man den eigentlichen Sensor (gelb markiert). Auf der Rückseite befindet sich der Gravity-Anschluss zur Verbindung der Platine sowie ein DIP-Schalter zur Einstellung des Kommunikationsmodus (UART/I2C) und der I2C-Adresse.

Beachte, dass das Sensorelement von einer gelben Kunststofffolie bedeckt ist, die vor der Nutzung entfernt werden muss. Das folgende Foto zeigt das Sensorelement mit und ohne Folie:

Ein onboard RP2040 Mikrocontroller übernimmt die Signalverarbeitung und Datenaggregation. Dadurch wird die Rechenlast für den Host-Mikrocontroller reduziert. Der Sensor liefert bereits verarbeitete Distanzwerte statt roher Zeitmessdaten.

Das System arbeitet im kontinuierlichen Messmodus. Das bedeutet, dass Distanzmessungen in einem festen Rhythmus ohne externes Triggern aktualisiert werden. Die typische Bildwiederholrate liegt je nach Konfiguration zwischen 15 Hz und 60 Hz.

Messmerkmale

Der Sensor misst Entfernungen mittels Infrarotlichtimpulsen und Zeitmessung. Er unterstützt einen Messbereich von ca. 20 mm bis 3,5 m.

Die Genauigkeit hängt von der Distanz und der Reflexion des Ziels ab. Im Nahbereich zwischen 20 mm und 200 mm liegt der Fehler typischerweise bei ±11 bis ±12 mm. Bei größeren Entfernungen wird der Fehler prozentual angegeben und liegt zwischen ±5 % und ±6 %.

Das Sichtfeld ist durch eine breite Winkelabdeckung definiert. Es beträgt etwa 60 Grad horizontal und vertikal, mit einem diagonalen Winkel von knapp 90 Grad. So kann der Sensor eine breite Szene in einem Bild erfassen.

Jede der 64 Zonen liefert einen unabhängigen Distanzwert. Diese Werte bilden zusammen eine niedrig aufgelöste Tiefenkarte. Das ermöglicht eine einfache 3D-Wahrnehmung ohne komplexe Bildverarbeitung.

Elektrische Eigenschaften

Der Sensor arbeitet mit einer Versorgungsspannung zwischen 3,3 V und 5 V. Damit ist er direkt kompatibel mit den meisten Arduino- und ESP32-Boards.

Der Stromverbrauch liegt während des Betriebs unter 80 mA. Das erlaubt den Einsatz in stromsparenden Embedded-Systemen.

Das Modul entspricht der Laser-Sicherheitsklasse 1. Das gewährleistet einen sicheren Betrieb unter normalen Bedingungen ohne besondere Vorsichtsmaßnahmen.

Kommunikationsschnittstellen

Der Sensor unterstützt mehrere Kommunikationsschnittstellen. Er kann über I2C, UART oder USB betrieben werden.

Die USB-Kommunikation wird hauptsächlich für direkten Datenstrom und Firmware-Updates verwendet.

Die I2C-Schnittstelle bietet vier wählbare Adressen: 0x30, 0x31, 0x32 und 0x33. Die UART-Schnittstelle arbeitet mit einer festen Baudrate von 115200 bps. Im nächsten Abschnitt wird erklärt, wie man zwischen den Schnittstellen wechselt und die I2C-Adresse einstellt.

Einstellung der I2C-Adresse und des Kommunikationsmodus

Du kannst den Kommunikationsmodus des Sensors zwischen UART und I2C mit einem DIP-Schalter umschalten. Für die I2C-Kommunikation kannst du außerdem zwischen vier verschiedenen I2C-Adressen wählen. Auf der Rückseite der Platine findest du 3 DIP-Schalter (gelb markiert) mit den Bezeichnungen A1, A0 und I2C, wie unten gezeigt:

DIP switch to set UART/I2C and I2C address
DIP-Schalter zur Einstellung von UART/I2C und I2C-Adresse

Beachte, dass bei einer neuen Sensorplatine der DIP-Schalter von einer gelben Kunststofffolie bedeckt ist, die du entfernen musst, wenn du die Einstellung ändern möchtest.

Ich habe die oben gezeigten Standardeinstellungen verwendet. Diese zeigen, dass der Kommunikationsmodus auf I2C und die I2C-Adresse auf 0x33 eingestellt ist.

Die I2C-Adresse wird durch die Schalter A0 und A1 bestimmt, und die Tabelle auf der Rückseite der Platine zeigt, welche Einstellung von A0 und A1 welcher I2C-Adresse entspricht:

Table for I2C address settings
Tabelle für I2C-Adresseneinstellungen

In meinem Fall (Standard) entspricht A0=1 und A1=1 der I2C-Adresse 0x33. Diese Adresse wird auch im Code verwendet. Sollte sie jedoch mit der I2C-Adresse deines OLED-Displays kollidieren, kannst du sie hier ändern.

Pinbelegung

Das Bild unten zeigt die Pinbelegung des Gravity 8×8 Matrix ToF Sensors. Du findest den weißen 4-poligen Gravity-Anschluss (PH2.0-4P) auf der Rückseite der Platine, wie unten dargestellt:

Pinbelegung des Gravity 8×8 Matrix ToF Sensors

Er verfügt über Pins für die Stromversorgung (VCC, GND) sowie für I2C (SDA, SCL) oder UART (TX, RX), wobei der Kommunikationsmodus vom zuvor beschriebenen DIP-Schalter abhängt.

Technische Daten

Die folgende Tabelle fasst die wichtigsten technischen Parameter des Gravity 8×8 Matrix ToF 3D Distanzsensors zusammen.

Parameter Wert
Sensormodell VL53L7CX
Verarbeitungs-MCU RP2040
Messraster 8 × 8 Matrix (64 Zonen)
Messmodus Kontinuierliche Messung
Bildwiederholrate 15 Hz bis 60 Hz
Messbereich 20 mm bis 3,5 m
Genauigkeit (Nahbereich) ±11 bis ±12 mm (20–200 mm)
Genauigkeit (Fernbereich) ±5 % bis ±6 % (>200 mm)
Sichtfeld 60° × 60° (90° diagonal)
Versorgungsspannung 3,3 V bis 5 V
Stromverbrauch < 80 mA
Schnittstellen I2C, UART, USB
I2C-Adressen 0x30, 0x31, 0x32, 0x33
UART-Baudrate 115200 bps
Anschlusstyp PH2.0-4P (Gravity)
Laser-Sicherheitsklasse Klasse 1

Anschluss des Gravity 8×8 Matrix ToF Sensors an Arduino R4

Der Anschluss des Gravity 8×8 Matrix ToF Sensors an einen Arduino R4 ist einfach. Verbinde zuerst VIN mit 5V oder 3,3V des Arduino. Dann verbinde GND mit GND. Schließlich verbindest du die I2C-Schnittstelle, indem du SCL und SDA des Sensors mit den entsprechenden Pins am R4 verbindest. Das Bild unten zeigt die komplette Verdrahtung:

Anschluss des mmWave C4001 Sensors an einen Arduino

Zur Übersicht hier eine Tabelle mit den notwendigen Verbindungen:

Sensor Arduino R4
VIN 5V oder 3,3V
GND GND
SCL SCL
SDA SDA

Anschluss des Gravity 8×8 Matrix ToF Sensors an ESP32

Der Anschluss des Sensors an einen ESP32 ist ebenso einfach. Die Standard-I2C-Schnittstelle des ESP32 lite befindet sich an den Pins 19 (SDA) und 23 (SCL). Wir verbinden daher SCL des Sensors mit Pin 23 und SDA mit Pin 19.

Als nächstes verbinden wir VCC des Sensors mit dem 3V-Pin, der 3,3 V liefert. Schließlich verbinden wir GND des Sensors mit dem G (Ground)-Pin des ESP32. Das Bild unten zeigt die komplette Verdrahtung:

Connecting the Gravity 8×8 Matrix ToF Sensor to an ESP32
Anschluss des Gravity 8×8 Matrix ToF Sensors an einen ESP32

Zur Übersicht hier eine Tabelle mit den notwendigen Verbindungen:

Sensor ESP32 Lite
VIN 3,3V
GND G
C/R 23 (SCL)
D/T 19 (SDA)

Der ESP32 hat keine eingebaute LED-Matrix, daher schließen wir ein OLED an, um die vom Gravity 8×8 Matrix ToF Sensor gemessenen Distanzen zu visualisieren. Das Hinzufügen des OLED zum Schaltkreis ist einfach, da wir das OLED parallel zum Sensor anschließen können. Verbinde einfach SDA, SCL und die Stromleitungen parallel:

Connecting the OLED to an ESP32
Anschluss des OLED an einen ESP32

Installation der DFRobot_MatrixLidar Bibliothek

Bevor wir Code schreiben können, müssen wir die DFRobot_MatrixLidar Bibliothek installieren. Um diese Bibliothek zu installieren, gehe zum DFRobot_MatrixLidar Repository, klicke auf den grünen „<> Code“-Button und dann auf „Download ZIP“, um die Bibliothek als ZIP-Datei herunterzuladen, wie unten gezeigt:

Erstelle dann einen neuen Arduino Sketch, gehe zu Sketch -> Include Library -> Add .ZIP Library … und installiere die heruntergeladene ZIP-Bibliothek (DFRobot_MatrixLidar-master.zip):

Code-Beispiel: Messen und Ausgeben der 8×8 Distanzmatrix

Der folgende Code zeigt, wie man den Gravity 8×8 Matrix ToF (Time-of-Flight) 3D Distanzsensor mit einem ESP32 oder Arduino verwendet. Er misst Entfernungen in einem 8×8 Matrix-Format und gibt die Distanzwerte für jeden Punkt der Matrix im seriellen Monitor aus.

// 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);
}

Imports

Der Code beginnt mit dem Einbinden der DFRobot_MatrixLidar Bibliothek, die die notwendigen Funktionen zur Kommunikation mit dem Gravity 8×8 Matrix ToF Sensor über I2C bereitstellt.

#include "DFRobot_MatrixLidar.h"

Objekte und Variablen

Als nächstes wird ein Objekt tof der Klasse DFRobot_MatrixLidar_I2C mit der I2C-Adresse 0x33 erstellt. Dieses Objekt wird zur Kommunikation mit dem Sensor verwendet.

Zusätzlich wird ein Pufferarray buf mit 64 unsigned 16-Bit Ganzzahlen deklariert. Dieser Puffer hält die Distanzmessungen für jeden der 64 Punkte in der 8×8 Matrix.

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

Setup-Funktion

In der setup() Funktion wird die serielle Kommunikation mit 115200 Baud initialisiert, um Daten im seriellen Monitor auszugeben.

Der Sensor wird dann durch Aufruf von tof.begin() initialisiert. Falls die Initialisierung fehlschlägt (gibt einen Wert ungleich Null zurück), wird eine Fehlermeldung ausgegeben und alle 100 Millisekunden ein neuer Versuch gestartet, bis die Initialisierung erfolgreich ist.

Nach erfolgreicher Initialisierung wird der Messmodus des Sensors auf eMatrix_8X8 gesetzt, was den Sensor konfiguriert, Entfernungen im 8×8 Matrix-Format zu messen. Wie bei der Initialisierung wird bei einem Fehler eine Fehlermeldung ausgegeben und der Vorgang wiederholt, bis er gelingt.

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);
  }
}

Loop-Funktion

Die loop() Funktion liest kontinuierlich Distanzdaten vom Sensor aus und gibt sie im seriellen Monitor aus.

Zuerst füllt tof.getAllData(buf) das buf Array mit den neuesten Distanzmessungen für alle 64 Punkte der 8×8 Matrix.

Zwei verschachtelte for Schleifen iterieren über die Zeilen (i) und Spalten (j) der Matrix. Für jeden Punkt wird der entsprechende Distanzwert aus dem Puffer mit der Formel buf[i * 8 + j] entnommen.

Jeder Distanzwert wird ausgegeben, gefolgt von einem Komma zur Trennung der Werte in einer Zeile. Nach allen Spalten einer Zeile wird ein Zeilenumbruch ausgegeben, um eine neue Zeile zu beginnen.

Nach Ausgabe der gesamten 8×8 Matrix wird eine Trennlinie aus Bindestrichen ausgegeben, um die einzelnen Datenframes visuell zu unterscheiden. Anschließend wartet der Code 100 Millisekunden, bevor der Vorgang wiederholt wird.

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);
}

Ausgabe-Beispiel

Der folgende Screenshot zeigt, was im seriellen Monitor ausgegeben werden sollte:

Du siehst die 8×8 Matrix der gemessenen Distanzwerte. Befindet sich kein Objekt vor dem Sensor oder ist es zu weit entfernt, wird die maximale Distanz von 4000 mm (=400 cm) ausgegeben. Wenn du etwas nah genug an den Sensor hältst, siehst du kleinere Entfernungen.

Code-Beispiel: Anzeige der 8×8 Distanzmatrix auf der LED-Matrix

Das nächste Code-Beispiel zeigt, wie man den Gravity 8×8 Matrix ToF (Time-of-Flight) 3D Distanzsensor verwendet, um Entfernungen in einem 8×8 Matrix-Format zu messen und die Ergebnisse auf der LED-Matrix eines Arduino R4 anzuzeigen.

Der Sensor liefert Distanzdaten für jeden der 64 Punkte in der Matrix, und der Code visualisiert diese Daten, indem LEDs entsprechend der erfassten Entfernungen innerhalb eines definierten Bereichs eingeschaltet werden. Unten ein Ausgabe-Beispiel:

Schau dir zuerst den kompletten Code an, danach besprechen wir die Details:

// 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);
}

Imports

Der Code beginnt mit dem Einbinden zweier wichtiger Bibliotheken. Die Arduino_LED_Matrix Bibliothek steuert die LED-Matrix-Anzeige, während die DFRobot_MatrixLidar Bibliothek die Kommunikation mit dem Gravity 8×8 Matrix ToF Sensor übernimmt.

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

Objekte

Als nächstes werden zwei Objekte erstellt. Das leds Objekt steuert die LED-Matrix-Anzeige, und das tof Objekt repräsentiert den ToF-Sensor, der über I2C an der Adresse 0x33 angeschlossen ist.

ArduinoLEDMatrix leds;
DFRobot_MatrixLidar_I2C tof(0x33);

DisplayMatrix-Funktion

Die displayMatrix() Funktion liest Distanzdaten vom Sensor aus und aktualisiert die LED-Matrix entsprechend. Sie akzeptiert einen optionalen Parameter maxDist, der die maximale Distanzschwelle in Millimetern für das Einschalten der LEDs setzt. Standard ist 200 mm.

Innerhalb der Funktion speichert ein statischer Puffer buf mit 64 unsigned 16-Bit Ganzzahlen die Rohdistanzdaten für jeden Punkt der 8×8 Matrix. Ein weiteres statisches 2D-Array frame repräsentiert die LED-Zustände, die angezeigt werden sollen.

Die Funktion ruft tof.getAllData(buf) auf, um den Puffer mit aktuellen Distanzmessungen zu füllen. Anschließend wird jeder Punkt der 8×8 Matrix überprüft, ob die gemessene Distanz kleiner oder gleich maxDist ist. Ist das der Fall, wird die entsprechende LED durch Setzen auf 1 eingeschaltet, andernfalls ausgeschaltet (0).

Zum Schluss wird die Methode leds.renderBitmap() aufgerufen, um die LED-Matrix-Anzeige mit dem vorbereiteten Frame zu aktualisieren.

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);  
}

Setup-Funktion

Die setup() Funktion initialisiert die serielle Kommunikation mit 115200 Baud für Debugging-Zwecke und startet die LED-Matrix durch Aufruf von leds.begin().

Anschließend versucht sie, den ToF-Sensor durch Aufruf von tof.begin() in einer Schleife zu initialisieren, bis dies erfolgreich ist. Bei Fehlern wird eine Fehlermeldung ausgegeben und nach kurzer Verzögerung erneut versucht.

Nach erfolgreicher Initialisierung wird der Messmodus des Sensors auf eMatrix_8X8 gesetzt, was den Sensor konfiguriert, Distanzdaten im 8×8 Matrix-Format zu liefern. Auch dies erfolgt in einer Schleife mit Fehlerprüfung.

Nach erfolgreichem Setup wird die Bestätigung „running…“ im seriellen Monitor ausgegeben.

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...");
}

Loop-Funktion

Die loop() Funktion ruft kontinuierlich displayMatrix(100) auf, die die LED-Matrix aktualisiert, um Punkte anzuzeigen, bei denen die Distanz 100 Millimeter (10 Zentimeter) oder weniger beträgt. So entsteht eine Echtzeit-Visualisierung von Objekten in diesem Bereich.

Zwischen den Aktualisierungen wird eine kurze Verzögerung von 50 Millisekunden eingefügt, um die Bildwiederholrate zu steuern und Sensor oder Anzeige nicht zu überlasten.

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

Ausgabe-Demo

Das kurze Video unten zeigt, wie der Sensor funktioniert und wie Bewegungen und Objekte auf der LED-Matrix erscheinen:

Code-Beispiel: Anzeige der 8×8 Distanzmatrix auf OLED

Für dieses letzte Projekt verbinden wir den Sensor mit einem ESP32, fügen ein kleines OLED-Display hinzu und zeigen die Distanzmatrix auf dem OLED an. Das OLED hat den Vorteil, dass wir relative Entfernungen durch die Größe der Matrixfelder darstellen können.

Zur Steuerung des OLED musst du die Adafruit_SSD1306 Bibliothek installieren. Du kannst sie wie gewohnt über den Library Manager installieren:

Adafruit_SSD1306 library installed in Library Manager
Adafruit_SSD1306 Bibliothek im Library Manager installiert

Der Sensor liefert Distanzmessungen im Rasterformat, und das OLED visualisiert diese Entfernungen als gefüllte Quadrate unterschiedlicher Größe, was eine klare räumliche Darstellung der gemessenen Umgebung ermöglicht. Siehe das Ausgabe-Beispiel unten:

Schau dir zuerst den kompletten Code an, danach besprechen wir die Details:

// 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);
}

Imports

Der Code beginnt mit dem Einbinden der notwendigen Bibliotheken. Adafruit_SSD1306 wird zur Steuerung des OLED-Displays verwendet, während DFRobot_MatrixLidar die Kommunikation mit dem 8×8 Matrix ToF Sensor übernimmt.

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

Konstanten und Objekte

Zwei Konstanten sw und sh definieren die Breite und Höhe des OLED-Displays in Pixeln, jeweils 128 mal 64. Ein Adafruit_SSD1306 Objekt namens display wird mit diesen Abmessungen erstellt und an den I2C-Bus gebunden. Das ToF-Sensorobjekt tof wird mit seiner I2C-Adresse 0x33 instanziiert.

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

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

displayMatrix-Funktion

Die displayMatrix() Funktion liest die Distanzdaten vom Sensor aus und visualisiert sie auf dem OLED. Sie akzeptiert einen optionalen Parameter maxDist, der standardmäßig 400 Millimeter beträgt und die maximale Distanz für die Anzeige definiert.

Innerhalb der Funktion definiert eine Konstante cs die Größe jeder Zelle im 8×8 Raster als 8 Pixel. Ein statisches Pufferarray buf mit 64 Elementen speichert die Distanzmessungen für jede Zelle.

Das Display wird zuerst gelöscht, dann werden die Sensordaten mit tof.getAllData() in buf geladen. Die Funktion durchläuft jede Zelle der 8×8 Matrix und liest den Distanzwert aus. Ist die Distanz kleiner als maxDist, wird eine Füllgröße für ein Quadrat berechnet, das die Distanz visuell darstellt. Je näher das Objekt, desto größer das Quadrat.

Die Position jedes Quadrats wird so berechnet, dass es zentriert in der Zelle liegt, und display.fillRect() zeichnet das Quadrat auf dem OLED. Abschließend aktualisiert display.display() das OLED mit der neuen Grafik.

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();
}

Setup-Funktion

Die setup() Funktion initialisiert die serielle Kommunikation mit 115200 Baud für Debugging-Zwecke. Dann versucht sie, das OLED-Display mit der I2C-Adresse 0x3C zu initialisieren. Bei Fehlern wird eine Fehlermeldung ausgegeben und ein erneuter Versuch gestartet.

Anschließend wird der ToF-Sensor initialisiert. Scheitert der Start, gibt der Code eine Fehlermeldung aus und versucht es erneut. Nach erfolgreicher Initialisierung wird der Sensor auf den 8×8 Messmodus mit tof.setRangingMode(eMatrix_8X8) gesetzt. Auch hier führt ein Fehler zu einer Fehlermeldung und Wiederholung.

Zum Schluss wird das Display gelöscht und aktualisiert, und die Meldung „running…“ wird im seriellen Monitor ausgegeben, um anzuzeigen, dass das Setup abgeschlossen ist.

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...");
}

Loop-Funktion

Die loop() Funktion ruft kontinuierlich displayMatrix() mit einer maximalen Distanz von 500 Millimetern auf und aktualisiert das OLED-Display mit den neuesten Distanzmessungen vom Sensor. Eine kurze Verzögerung von 50 Millisekunden steuert die Aktualisierungsrate.

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

Ausgabe-Demo

Das kurze Video unten zeigt, wie der Sensor funktioniert und wie Bewegungen und Objekte auf dem OLED erscheinen:

Fazit

In diesem Tutorial hast du gelernt, wie man den Gravity 8×8 Matrix ToF Sensor an einen Arduino oder ESP32 anschließt, um räumliche Distanzmessungen durchzuführen.

Im Vergleich zu Einpunkt-Laser-Distanzsensoren wie dem TFmini-Plus, dem GP2Y0E03 oder dem VL53L1X bietet der Gravity 8×8 Matrix ToF 3D Distanzsensor einen großen Vorteil in der räumlichen Wahrnehmung.

Anstatt nur einen Distanzwert zu messen, liefert er 64 Distanzpunkte gleichzeitig, was eine einfache Tiefenabbildung und Richtungsbestimmung ermöglicht.

Das reduziert den Bedarf an mechanischem Scannen oder mehreren Sensoren. Allerdings sind Einpunkt-Sensoren meist einfacher, kleiner und präziser für eine einzelne Messrichtung.

Generell ist der Matrix-Ansatz besser für das Szenenverständnis, während Einstrahl-Sensoren besser für präzise Distanzmessungen geeignet sind.

Typische Anwendungen des Gravity 8×8 Matrix ToF Sensors liegen in der Robotik für Hinderniserkennung und einfache Navigation. In Smart-Home-Systemen kann er für Gestenerkennung, Anwesenheitserkennung, Bewegungsverfolgung und proximale Steuerung eingesetzt werden.

Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Viel Spaß beim Tüfteln ; )