Skip to Content

TOF10120 Abstandssensor mit Arduino

TOF10120 Abstandssensor mit Arduino

In diesem Tutorial lernst du, wie du den TOF10120 Distanzsensor mit einem Arduino verwendest, um Entfernungen zu messen.

Der TOF10120 ist ein sehr kleiner Time-of-Flight Distanzsensor (ToF), der infrarotes Laserlicht verwendet, um die Entfernung zu einem Objekt zu messen. Er sendet einen Lichtimpuls aus und misst die Zeit, die das Licht für die Reflexion benötigt. Aus dieser Laufzeit berechnet er dann die Nähe eines Objekts mit einer Genauigkeit im Millimeterbereich. Seine kompakte Größe und der geringe Stromverbrauch machen ihn für eine Vielzahl von DIY-Projekten geeignet, darunter Robotik, Gestenerkennung und Näherungserkennung.

Benötigte Teile

Natürlich benötigst du einen TOF10120 Distanzsensor. Als Mikrocontroller habe ich für dieses Projekt einen Arduino Uno verwendet, aber jeder andere Arduino oder ESP32/ESP8266 funktioniert ebenfalls gut. Um die gemessenen Entfernungen anzuzeigen, habe ich ein OLED gewählt, aber du könntest auch ein LCD display verwenden.

TOF10120 Distanzsensor

Arduino

Arduino Uno

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Dupont wire set

Dupont-Kabelset

Half_breadboard56a

Breadboard

OLED display

OLED-Display

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.

Eigenschaften des TOF10120

Der TOF10120 Time-of-Flight Distanzsensor ist ein sehr kleiner (10mm x 13mm), hochpräziser Sensor, der Infrarotlicht zur Distanzmessung verwendet.

Dimensions of TOF10120
Abmessungen des TOF10120 (source)

Er basiert auf dem Time-of-Flight (ToF) Prinzip, bei dem der Sensor Lichtimpulse aussendet und die Zeit misst, die das Licht für die Reflexion benötigt, um die Entfernung zu berechnen. Der TOF10120 hat eine Reichweite von bis zu 180 cm und arbeitet bei einer Wellenlänge von 940 nm. Das Bild unten zeigt den Kegel der Laser-LED, die den Lichtimpuls aussendet, und den Sichtkegel des Detektors, der das reflektierte Licht registriert.

Working Principle of TOF10120
Funktionsprinzip des TOF10120 (source)

Der TOF10120 arbeitet mit 3V bis 5V und hat einen niedrigen durchschnittlichen Stromverbrauch von nur 35 mA. Die folgende Liste fasst seine Hauptmerkmale zusammen:

  • Arbeitsbereich: 100-1800mm
  • Messfehler: bis zu 5%
  • Hohe Messgeschwindigkeit: max. 30ms
  • Kommunikationsschnittstelle: UART / I2C
  • UART-Übertragungsparameter: 9600 8n1
  • Wellenlänge: 940 nm
  • Sichtfeld: 25°
  • Störlichtimmunität: 50k lux
  • Spannungsbereich: 3V bis 5V
  • Durchschnittlicher Stromverbrauch: 35 mA

Die obigen Spezifikationen und das Datenblatt geben an, dass die minimale messbare Entfernung 100 mm beträgt. Ich habe jedoch festgestellt, dass man tatsächlich Messungen bis auf 10 mm und bis zu 2000 mm erhalten kann, wobei die Werte unter 30 mm jedoch sehr ungenau werden.

Der TOF10120 kommuniziert mit Mikrocontrollern über eine I2C- oder UART-Schnittstelle. Das Bild unten zeigt das Pinout. SDA und SCL sind für die I2C-Schnittstelle, RxD und TxD für die UART-Kommunikation.

Pinout of TOF10120
Pinbelegung des TOF10120

Im nächsten Abschnitt lernst du, wie du den TOF10120 mit einem Arduino verbindest.

Anschluss des TOF10120

Wir verwenden die I2C-Schnittstelle, um den TOF10120 Sensor mit einem Arduino zu verbinden. Verbinde zuerst die SCL (6) und SDA (5) Pins des TOF10120 Breakout-Boards mit den entsprechenden Pins am Arduino-Board, wie unten gezeigt. Verbinde dann Masse mit Pin 1 und 3.3V mit Pin 2 des TOF10120.

Connecting TOF10120 with Arduino
Anschluss des TOF10120 an Arduino

Der TOF10120 Sensor läuft mit 5V oder 3.3V und du kannst entweder für VDD verwenden. In der obigen Verkabelung verwende ich 3.3V für VDD. Beachte, dass Pin 3 und 4 (RxD, TxD) des TOF10120 nicht verbunden sind, da wir die UART-Schnittstelle nicht verwenden, sondern I2C.

Als nächstes schreiben wir etwas Code, um die Funktion des TOF10120 Sensors zu testen.

Code zur Distanzmessung mit TOF10120

Das Auslesen der Distanzdaten vom TOF10120 über I2C ist recht einfach. Der folgende Code ist eine gekürzte und bereinigte Version, abgeleitet von der Supplier Documentation für den TOF10120.

int distance(int addr = 0x52) {
  unsigned short dist = 0;
  Wire.beginTransmission(addr);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);
  Wire.requestFrom(addr, 2);
  if (Wire.available() != 2)
    return -1;
  dist = Wire.read() << 8;
  dist |= Wire.read();
  return dist;
}

Zuerst wird die Leseadresse gesetzt, von der die Distanzdaten über Wire.write(0) gelesen werden. Dann werden zwei aufeinanderfolgende Bytes durch Aufruf von Wire.read() gelesen, der Distanzwert wird durch Setzen des High- und Low-Bytes konstruiert und der Distanzwert zurückgegeben.

Beachte, dass laut Datenblatt die 8-Bit I2C-Adresse des TOF10120 Sensors 0xA4 ist, du aber aufgrund der Wire library die entsprechende 7-Bit-Adresse 0x52 verwenden musst. Außerdem solltest du den Sensor nicht schneller als alle 30 ms abfragen.

Du könntest diesen Code so verwenden, aber ich habe eine kleine TOF10120 library implementiert, die dir das Leben erleichtern wird.

TOF10120 Bibliothek installieren

Um die TOF10120 Bibliothek zu installieren, gehe zum tof10120_arduino_lib repo here und klicke auf den grünen „Code“ Button. Dann klicke auf „Download Zip“, wie unten gezeigt:

Download TOF10120 library
TOF10120 Bibliothek herunterladen

Erstelle im Arduino IDE folgenden Testcode:

#include "TOF10120.h"

TOF10120 sensor = TOF10120();

void setup() {
  Serial.begin(9600);
  sensor.init();
}

void loop() {
  Serial.print("distance:");
  Serial.println(sensor.distance());
  delay(100);
}

Dann gehe zu „Sketch“ -> „Include Library“ -> „Add .Zip Library..“ und wähle die zuvor heruntergeladene Datei „tof10120_arduino_lib-main.zip“ aus:

Adding TOF10120 library to sketch
TOF10120 Bibliothek zum Sketch hinzufügen

Der Testcode ist sehr einfach. Zuerst wird die TOF10120 Bibliothek eingebunden und das TOF10120 sensor Objekt erstellt. In der setup() Funktion wird der Sensor initialisiert und in der loop() Funktion rufen wir schließlich sensor.distance() auf, um die vom Sensor gemessene Distanz auszulesen.

Wenn du den Sensor an andere SDA- und SCL-Pins anschließen möchtest, kannst du diese über sensor.begin(sda, scl) angeben; für ESP32 und ESP8266 Boards.

Testcode für TOF10120 ausführen sensor

Wenn du den Code auf deinen Arduino hochlädst, solltest du Distanzwerte im Serial Monitor sehen. Wenn kein Objekt vor dem Sensor ist, wird eine Distanz von 2000 mm angezeigt.

Distances printed on Serial Monitor
Entfernungen im Serial Monitor ausgegeben

Wenn du den Serial Plotter öffnest und deine Hand vor den Sensor hältst und näher oder weiter weg bewegst, solltest du eine Grafik ähnlich der unten gezeigten sehen.

Distances shown on Serial Plotter
Entfernungen im Serial Plotter angezeigt

Wenn du Probleme hast und der Sensor nicht zu funktionieren scheint, überprüfe, ob die Verkabelung korrekt ist und die richtigen SDA- und SCL-Pins verwendet werden. Du kannst auch die Laserdiode des Sensors überprüfen, indem du ein Foto mit einer Digitalkamera (Handy) machst. Während IR-Licht für das menschliche Auge unsichtbar ist, kann die Kamera es sehen. Das Bild unten zeigt den TOF10120 mit deutlich leuchtender IR-Diode:

Illuminated IR Diode of TOF10120
Leuchtende IR-Diode des TOF10120

Im nächsten Abschnitt fügen wir unserem Schaltkreis ein OLED hinzu.

OLED hinzufügen, um TOF10120 Daten anzuzeigen

Typischerweise möchten wir die gemessene Entfernung irgendwie anzeigen. Das könnte eine LED-Leiste sein oder in diesem Fall ein OLED. Da das OLED ebenfalls ein I2C-Gerät ist, ist der Anschluss einfach. Wir verbinden SDA und SCL mit denselben Pins, an denen der TOF10120 Sensor angeschlossen ist. Und da das OLED mit 3.3V läuft, können wir auch die Stromversorgungsleitungen teilen. Das Bild unten zeigt die komplette Verkabelung.

onnecting OLED and TOF10120 with Arduino
Anschluss von OLED und TOF10120 an Arduino

Wenn du Schwierigkeiten mit dem OLED hast, schau dir das Tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino an. Das Bild unten zeigt die komplette Verkabelung auf einem echten Breadboard:

Wiring of OLED and TOF10120 with Arduino
Verkabelung von OLED und TOF10120 mit Arduino

Code zur Anzeige der TOF10120 Daten auf OLED

In diesem Abschnitt schreiben wir den Code, um die vom TOF10120 Sensor gemessene Entfernung auf dem OLED-Display anzuzeigen. Zum Schreiben auf das OLED verwenden wir die Adafruit_SSD1306 Bibliothek. Du kannst sie mit dem Library Manager wie gewohnt installieren:

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

Der folgende Code liest die Messwerte vom TOF10120 Sensor aus und zeigt sie auf dem OLED an. Schau dir zuerst den kompletten Code an, dann gehen wir auf die Details ein.

// Measure distance with TOF10120 sensor and show on OLED
// by Makerguides
#include "Adafruit_SSD1306.h"
#include "TOF10120.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TOF10120 sensor = TOF10120();

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void display() {
  static char text[30];
  int dist = sensor.distance();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);

  int w = map(dist, 0, 2000, 0, 120);
  oled.drawFastHLine(4, 45, w, WHITE);
  oled.display();
}

void setup() {
  sensor.init();
  oled_init();  
}

void loop() {
  display();
  delay(100);
}

Bibliotheken und Display-Initialisierung

Wir beginnen mit dem Einbinden der Library für den TOF10120 Sensor- und der Adafruit_SSD1306 Library Bibliothek für das OLED-Display. Dann erstellen wir das oled Objekt und das sensor Objekt.

#include "Adafruit_SSD1306.h"
#include "TOF10120.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TOF10120 sensor = TOF10120();

oled_init Funktion

Die oled_init() Funktion initialisiert das Display, löscht es, setzt die Textgröße und die Textfarbe.

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Beachte, dass die I2C-Adresse für das OLED-Display in 0x3C auf oled.begin() gesetzt ist. Die meisten dieser kleinen OLEDs verwenden diese Adresse (or 0x27), aber deine könnte anders sein. Wenn du nichts auf dem OLED siehst, hat es höchstwahrscheinlich eine andere I2C-Adresse und du musst die Adresse ändern.

Wenn du die I2C-Adresse nicht kennst, schau dir das How to Interface the SSD1306 I2C OLED Graphic Display With Arduino Tutorial an, um sie zu finden. Auch das Use SSD1306 I2C OLED Display With Arduino Tutorial erklärt mehr darüber, wie man ein OLED verwendet.

display Funktion

Die display() Funktion ruft sensor.distance() auf, um die Distanzmessung vom TOF10120 Sensor zu erhalten. Dann löscht sie das Display und gibt die Distanz aus. Die sprintf() Funktion wird verwendet, um den Distanzwert in einen formatierten Text umzuwandeln.

void display() {
  static char text[30];
  int dist = sensor.distance();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);

  int w = map(dist, 0, 2000, 0, 120);
  oled.drawFastHLine(4, 45, w, WHITE);
  oled.display();
}

Zusätzlich zur Textausgabe zeichnet die display() Funktion eine horizontale Linie unter dem Text, deren Länge proportional zur gemessenen Entfernung ist. Wenn nichts vor dem Sensor ist (oder weiter als 2 m entfernt), zeigt das Display die maximale Entfernung von 2000 mm und eine volle Linienlänge an.

Maximum Distance shown on OLED
Maximale Entfernung auf OLED angezeigt

Wenn du ein Objekt vor den Sensor hältst, zeigt das Display die gemessene Entfernung in Millimetern und eine kürzere Linie an. Siehe folgendes Beispielausgabe unten.

Measured Distance shown on OLED
Gemessene Entfernung auf OLED angezeigt

Falls der Sensor aus irgendeinem Grund keine Distanzmessung erhält, gibt die distance() Funktion -1 zurück, und dieser Wert würde auf dem OLED angezeigt. Allerdings ist mir das nie begegnet.

setup Funktion

In der setup() Funktion rufen wir zuerst sensor.init() auf, um den TOF10120 Sensor zu initialisieren, und dann oled_init(), das das OLED initialisiert.

void setup() {
  sensor.init();
  oled_init();  
}

loop Funktion

Die loop() Funktion ruft einfach alle 100 ms die display() Funktion auf. Wie bereits erwähnt, solltest du nicht schneller als alle 30 ms abfragen, aber du kannst auch eine längere Verzögerung verwenden.

void loop() {
  display();
  delay(100);
}

Und das war’s. Jetzt hast du dein eigenes Distanzmessgerät, das Entfernungen zwischen 10 mm und 2000 mm genau messen kann.

Fazit

In diesem Tutorial hast du gelernt, wie du den TOF10120 Distanzsensor mit einem Arduino verwendest, um Entfernungen zu messen und sie auf einem OLED anzuzeigen.

Der TOF10120 Sensor ist ein sehr kleiner, schneller, hochpräziser Sensor, der infrarotes Laserlicht zur Distanzmessung verwendet. Konkret misst er die Time-of-Flight des reflektierten Laserimpulses, um die Entfernung zu einem Objekt zu berechnen. Wenn du eine Alternative suchst: Ein sehr ähnlicher Sensor mit vergleichbaren Spezifikationen ist der VL53L0X. Und wenn du einen Sensor mit größerer Reichweite brauchst, schau dir den TF Luna an, der Entfernungen bis zu 8 Metern messen kann.

Diese Sensoren unterscheiden sich von anderen Infrarot-Distanzsensoren wie dem GP2Y0A710K0F oder dem GP2Y0A21YK0F, die Triangulation verwenden, um die Entfernung basierend auf dem Winkel des reflektierten IR-Lichts zu bestimmen. Aber der TOF10120 und VL53L0X haben beide eine längere Reichweite und höhere Genauigkeit im Vergleich zu den GP2Y0A710K0F und GP2Y0A21YK0F Sensoren.

IR-Distanzsensoren können durch starkes Umgebungslicht beeinträchtigt werden. Eine Alternative sind Ultraschall-Distanzsensoren wie der verbreitete HC-SR04, die Schallwellen zur Distanzmessung verwenden. IR-Lasersensoren sind jedoch präziser und haben tendenziell eine größere Reichweite als Ultraschallsensoren, sind aber auch etwas teurer.

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

Viel Spaß beim Tüfteln ; )