Skip to Content

TFmini-Plus Abstandssensor mit Arduino

TFmini-Plus Abstandssensor mit Arduino

In diesem Tutorial lernst du, wie du den TFmini Plus Laser-Entfernungssensor mit einem Arduino verwendest, um Entfernungen zu messen.

Der TFmini Plus ist ein kleiner LiDAR-/Nähe-Sensor, der Entfernungen von bis zu 12 Metern messen kann. Er verwendet infrarotes Laserlicht und das Time-of-Flight (ToF)-Prinzip. Durch die Messung der Zeit, die das Licht benötigt, um von einem Objekt reflektiert zu werden, kann er Entfernungen mit hoher Genauigkeit und Geschwindigkeit berechnen.

In dieser Anleitung behandeln wir die Einrichtung, Verkabelung und Programmierung, die nötig sind, um deinen TFmini Plus mit Arduino zum Laufen zu bringen.

Benötigte Teile

Du benötigst einen TFmini Plus Sensor (siehe unten). Als Mikrocontroller habe ich für dieses Projekt einen Arduino Uno verwendet, aber jeder andere Arduino funktioniert ebenfalls. Außerdem verwenden wir ein OLED-Display, um die vom TFmini Plus zurückgegebenen Entfernungen und andere Informationen anzuzeigen.

TFmini Plus Entfernungssensor

Arduino

Arduino Uno

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Dupont wire set

Dupont-Kabelsatz

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 TFmini Plus

Der TFmini Plus ist ein Infrarot-Laser-Entfernungssensor, der das ToF (Time of Flight)-Prinzip zur Distanzmessung verwendet. Der Sensor sendet periodisch Infrarotlichtimpulse aus, die bei Kontakt mit einem Objekt reflektiert werden. Die Flugzeit wird durch Berechnung der Rundlauf-Phasendifferenz Δφ gemessen:

ToF Principle
ToF-Prinzip (source)

Der TFmini Plus kann Entfernungen von 0,1 bis 12 Metern mit einer Genauigkeit von ±5 cm im Bereich 0,1-6 m und ±1 % im Bereich 6-12 m messen. Die Totzone des Sensors beträgt 10 cm. Die Auflösung liegt bei 5 mm und die Messgeschwindigkeit (Bildrate) ist zwischen 1 und 1000 Hz einstellbar.

Die Erkennungsreichweite des TFmini Plus hängt auch von der Reflexion und der Größe des zu erfassenden Objekts ab. Das folgende Diagramm veranschaulicht dies:

Distance measurement characteristics of TFmini Plus
Entfernungsmesscharakteristik des TFmini Plus (source)

① Erkennungs-Totzone von 0-10 cm, innerhalb derer die Ausgabedaten unzuverlässig sind.
② Betriebsbereich zur Erkennung eines schwarzen Ziels mit 10 % Reflexion, 0,1-5 m.
③ Betriebsbereich zur Erkennung eines weißen Ziels mit 90 % Reflexion, 0,1-12 m.

Bemerkenswert ist, dass je reflektierender und größer das Objekt ist, desto größer ist die Reichweite, in der es erkannt werden kann. Für weitere Details siehe das Datenblatt und das Produktmanual des TFmini Plus, die unten verlinkt sind:

Pinbelegung des TFmini Plus

Der TFmini Plus kann je nach Softwarekonfiguration über UART, I2C oder IO kommunizieren. Das folgende Bild zeigt die Pinbelegung des TFmini Plus:

Pinout of TFmini Plus
Pinbelegung des TFmini Plus

Der TFmini Plus ist IP65-zertifiziert und verwendet daher ein geschirmtes Kabel mit einem GH1.25-4P-Stecker am Ende. Glücklicherweise wird er meist mit einem Dupont-Kabeladapter geliefert, der den Anschluss an Arduino oder Breadboard erleichtert. Hier ist eine Tabelle mit den Steckerkontakten, deren Kabelfarben und Funktionen:

Pin-NummerKabelfarbeFunktion
1Rot+5V
2WeißRX/SDA
3Grün/BlauTX/SCL/IO
4SchwarzMasse

Pin 1 ist Masse (GND) und Pin 2 die Versorgungsspannung von 5V±0,5V. Der durchschnittliche Strom liegt bei ≤110mA, der Spitzenstrom bei bis zu 500mA. Pin 3 und 4 arbeiten entweder als RX und TX für UART oder als SDA und SCL für I2C. Beachte, dass das TX/SCL-Kabel grün oder blau sein kann. Mein TFmini Plus Modell hat ein grünes Kabel für TX/SCL.

TFmini-S vs TFmini Plus

Es gibt einen TFmini, einen TFmini-S und den TFmini Plus. Das kann etwas verwirrend sein. Der TFmini wird nicht mehr produziert, der TFmini-S ist eine verbesserte Version des TFmini. Der TFmini Plus ist eine weitere Verbesserung mit geringerem Stromverbrauch, besserem Gehäuse und besserer Leistung bei starkem Umgebungslicht (z.B. im Freien). Die folgende Tabelle vergleicht die Hauptmerkmale des TFmini-S und des TFmini Plus:

Comparison TFmini-S vs TFmini Plus
Vergleich TFmini-S vs TFmini Plus (source)

In diesem Tutorial verwenden wir den TFmini Plus. Du kannst aber auch den TFmini-S nutzen, da Software und Verkabelung im Wesentlichen identisch sind.

Anschluss des TFmini Plus an Arduino

Wir verwenden die UART-Schnittstelle des TFmini Plus. Zuerst schließen wir aber die Stromversorgung an.

Verbinde das schwarze Kabel (Pin 4) des TFmini Plus mit GND des Arduino. Dann verbinde das rote Kabel (Pin 1 des TFmini Plus) mit dem 5V-Ausgang des Arduino.

Für UART verbinde das weiße Kabel (TX, Pin 2) des TFmini Plus mit Pin 3 des Arduino. Schließlich verbinde das grüne Kabel (RX, Pin 3) des TFmini Plus mit Pin 2 des Arduino. Siehe das vollständige Schaltbild unten:

Connecting TFmini Plus to Arduino
Anschluss TFmini Plus an Arduino

Beachte, dass die TX- und RX-Pins des TFmini und die vom Arduino verwendeten TX- und RX-Pins vertauscht sind, da die serielle Kommunikation so verdrahtet sein muss. Lass dich davon nicht verwirren.

TX and RX wiring
TX- und RX-Verkabelung

Im nächsten Abschnitt schreiben wir einfachen Code, um den Sensor zu testen.

Code zur Distanzmessung mit TFmini Plus

Um Entfernungen mit dem TFmini Plus zu messen, ist es am besten, eine Bibliothek zu verwenden. Ich habe die TFMPlus library by Bud Ryerson genutzt, die für den TFmini Plus und den TFmini-S funktioniert. Um sie zu installieren, öffne den Library Manager, suche nach „tfmini“, finde die TFMPlus Bibliothek von Bud Ryerson und installiere sie mit dem „INSTALL“-Button.

Install TFMPlus library
Installiere TFMPlus library

Mit der installierten Bibliothek testen wir den Sensor. Der folgende Code liest die vom TFmini Plus gemessenen Entfernungen aus und gibt sie im Serial Monitor aus.

#include "TFMPlus.h" 
#include "SoftwareSerial.h"

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);

void setup() {
  Serial.begin(9600);
  TFSerial.begin(115200);
  tfmini.begin(&TFSerial);
}

void loop() {
  int16_t dist = 0;
  int16_t strength = 0;
  int16_t temp = 0;

  if (tfmini.getData(dist, strength, temp)) {
    Serial.print("Distance ");
    Serial.print(dist);
    Serial.println(" cm");
    delay(200);
  }
}

Lass uns den Code im Detail aufschlüsseln.

Bibliothekseinbindung

Wir beginnen mit dem Einbinden der notwendigen Bibliotheken für unser Projekt. Die TFMPlus.h Bibliothek wird zur Kommunikation mit dem TFmini Plus Sensor verwendet, während die SoftwareSerial.h Bibliothek es ermöglicht, serielle Kommunikation über andere digitale Pins als die Standard-Hardware-Pins zu erstellen.

#include "TFMPlus.h" 
#include "SoftwareSerial.h"

Objekterstellung

Als nächstes erstellen wir Instanzen der benötigten Klassen. Das TFMPlus Objekt tfmini wird verwendet, um mit dem TFmini Plus Sensor zu interagieren. Außerdem erstellen wir ein SoftwareSerial Objekt namens TFSerial, das über die digitalen Pins 2 (RX) und 3 (TX) mit dem Sensor kommuniziert.

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);

Setup-Funktion

In der setup() Funktion initialisieren wir die serielle Kommunikation. Der Serial.begin(9600) Befehl richtet den Standard-Seriell-Port mit 9600 Baud für die Ausgabe im Serial Monitor ein. Der TFSerial.begin(115200) Befehl initialisiert den Software-Serial-Port mit einer höheren Baudrate von 115200, die vom TFmini Plus Sensor benötigt wird. Schließlich rufen wir tfmini.begin(&TFSerial) auf, um den Sensor mit dem Software-Serial-Port zu initialisieren.

void setup() {
  Serial.begin(9600);
  TFSerial.begin(115200);
  tfmini.begin(&TFSerial);
}

Loop-Funktion

In der loop() Funktion deklarieren wir drei Integer-Variablen: dist, strength und temp. Diese speichern die Distanzmessung, Signalstärke und Temperaturdaten vom Sensor.

Wir prüfen dann, ob der Sensor erfolgreich Daten mit der tfmini.getData(dist, strength, temp) Methode abruft. Wenn Daten verfügbar sind, geben wir die Entfernung mit Serial.print() im Serial Monitor aus. Die Entfernung wird in Zentimetern angezeigt. Nach der Ausgabe folgt eine Verzögerung von 200 Millisekunden bis zur nächsten Messung.

void loop() {
  int16_t dist = 0;
  int16_t strength = 0;
  int16_t temp = 0;

  if (tfmini.getData(dist, strength, temp)) {
    Serial.print("Distance ");
    Serial.print(dist);
    Serial.println(" cm");
    delay(200);
  }
}

In diesem Beispiel geben wir nur die Entfernung aus, aber du könntest auch Signalstärke und Temperaturdaten ausgeben, was wir beim Anschluss des OLED tun werden. Für jetzt wird nur die Entfernung ausgegeben, die du in Zentimetern im Serial Monitor sehen solltest:

Distances measured with TFmini Plus printed on Serial Monitor
Mit TFmini Plus gemessene Entfernungen im Serial Monitor ausgegeben

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

OLED hinzufügen, um TFmini Plus Distanzdaten anzuzeigen

Das Hinzufügen des OLED ist einfach. Verbinde einfach SDA und SCL des OLED mit den entsprechenden Pins des Arduino. Für die Stromversorgung: Da das OLED mit 5V läuft, können wir die Stromversorgungsleitungen teilen. Verbinde VCC mit 5V und GND mit GND. Das Bild unten zeigt die vollständige Verkabelung:

Connecting OLED and TFmini Plus with Arduino
Anschluss von OLED und TFmini Plus an Arduino

Beachte, dass der TFmini Plus nicht mit 3,3V funktioniert.

Code zur Anzeige der vom TFmini Plus gemessenen Entfernungen auf OLED

Der folgende Code liest Distanz-, Signalstärke- und Temperaturmessungen vom TFmini Plus Sensor aus und zeigt sie auf dem OLED an. Schau dir zuerst den kompletten Code an, danach besprechen wir die Details.

#include "TFMPlus.h" 
#include "SoftwareSerial.h"
#include "Adafruit_SSD1306.h"

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

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

void display() {
  static char text[30];
  static int16_t dist, strength, temp;

  if (tfmini.getData(dist, strength, temp)) {
    oled.clearDisplay();

    sprintf(text, " %d cm ", dist);
    oled.setTextSize(2);
    oled.setCursor(20, 15);
    oled.print(text);

    sprintf(text, " %d ", strength);
    oled.setTextSize(1);
    oled.setCursor(50, 40);
    oled.print(text);

    sprintf(text, " %d C ", temp);
    oled.setTextSize(1);
    oled.setCursor(50, 50);
    oled.print(text);    

    oled.display();
  }
}

void setup() {
  TFSerial.begin(115200);
  tfmini.begin(&TFSerial);
  oled_init();
}

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

Bibliotheken und Display-Initialisierung

Wir beginnen mit dem Einbinden der TFMPlus.h Bibliothek zur Kommunikation mit dem TFmini Plus Sensor. Die SoftwareSerial.h Bibliothek wird für die serielle Kommunikation verwendet und die Adafruit_SSD1306 Library ist für das OLED-Display zuständig.

Wir erstellen dann das tfmini Sensorobjekt, das TFSerial Objekt und das oled Objekt für das Display:

#include "TFMPlus.h" 
#include "SoftwareSerial.h"
#include "Adafruit_SSD1306.h"

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

Falls du die Adafruit_SSD1306 Library noch nicht installiert hast, musst du das tun. Installiere sie einfach wie gewohnt über den Library Manager:

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

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 wahrscheinlich eine andere I2C-Adresse, die du ändern musst.

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 herauszufinden. Auch das Use SSD1306 I2C OLED Display With Arduino Tutorial erklärt mehr zur Verwendung eines OLED.

display Funktion

Die display() Funktion ruft tfmini.getData auf, um die gemessenen Werte für Entfernung, Signalstärke und Temperatur vom TFmini Plus Sensor zu erhalten. Dann löscht sie das Display und gibt die verschiedenen Werte mit unterschiedlichen Schriftgrößen aus. Die sprintf() Funktion wird verwendet, um die Werte in formatierten Text umzuwandeln.

void display() {
  static char text[30];
  static int16_t dist, strength, temp;

  if (tfmini.getData(dist, strength, temp)) {
    oled.clearDisplay();

    sprintf(text, " %d cm ", dist);
    oled.setTextSize(2);
    oled.setCursor(20, 15);
    oled.print(text);

    sprintf(text, " %d ", strength);
    oled.setTextSize(1);
    oled.setCursor(50, 40);
    oled.print(text);

    sprintf(text, " %d C ", temp);
    oled.setTextSize(1);
    oled.setCursor(50, 50);
    oled.print(text);    

    oled.display();
  }
}

Wenn du ein Objekt vor den Sensor hältst, solltest du Entfernung, Signalstärke und Temperatur auf dem OLED sehen:

Distance, Strength and Temperature shown on OLED
Entfernung, Signalstärke und Temperatur auf OLED angezeigt

Die Entfernung wird in Zentimetern angezeigt. Wenn kein Objekt erkannt wird, wird der Wert 0 angezeigt.

Die Signalstärke (0-65535) zeigt an, wie viel des Infrarotsignals vom erfassten Objekt reflektiert wird. Wenn die Signalstärke unter 100 oder gleich 65535 liegt, ist die Erkennung unzuverlässig, und der TFmini Plus setzt den Entfernungswert auf 0.

Schließlich wird die interne Chip-Temperatur des TFmini Plus in Grad Celsius angezeigt. Es ist normal, dass der Sensor nach einer Weile ziemlich warm wird (bis zu 70 °C).

setup Funktion

In der setup() Funktion rufen wir zuerst TFSerial.begin() auf, um die serielle UART-Kommunikation zu initialisieren, dann tfmini.begin(), um den Sensor zu initialisieren, und schließlich oled_init(), um das OLED zu initialisieren.

void setup() {
  TFSerial.begin(115200);
  tfmini.begin(&TFSerial);
  oled_init();
}

loop Funktion

Die loop() Funktion ruft einfach alle 20 ms die display() Funktion auf.

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

Und das war’s. Mit diesem Code und dem TFmini Plus kannst du Entfernungen von bis zu 12 Metern messen.

Fazit

In diesem Tutorial hast du gelernt, wie du den TFmini Plus Entfernungssensor mit einem Arduino benutzt, um Entfernungen zu messen und sie auf einem OLED anzuzeigen.

Der TFmini-Plus ist dem TFmini-S sehr ähnlich. Beide laufen mit 5V, können Entfernungen bis zu 12 Metern messen und werden mit derselben Software gesteuert. Der TFmini-Plus kommt jedoch in einem IP65-Gehäuse, funktioniert besser im Freien und ist daher teurer. Wenn du nicht die volle Reichweite brauchst, ist eine günstigere Alternative der TF-Luna, der kleiner ist und eine Reichweite von 8 Metern hat.

Wenn du Millimeterauflösung brauchst, schau dir den VL53L0X, den VL53L1X oder den TOF10120 an. Diese haben auch den Vorteil, dass sie mit 3,3V betrieben werden können. Ihre Reichweiten sind jedoch deutlich kürzer.

Andere gängige Infrarot-Entfernungssensoren wie der GP2Y0A710K0F oder der GP2Y0A21YK0F sind ähnlich groß, verwenden aber Triangulation zur Distanzbestimmung basierend auf dem Winkel des reflektierten IR-Lichts. Sie sind noch günstiger, haben aber eine noch kürzere Reichweite.

Wenn du Fragen hast, hinterlasse sie gerne im Kommentarbereich.

Viel Spaß beim Tüfteln ; )