Skip to Content

Sensore di Distanza TFmini-Plus con Arduino

Sensore di Distanza TFmini-Plus con Arduino

In questo tutorial imparerai come utilizzare il sensore di distanza laser TFmini Plus con un Arduino per misurare le distanze.

Il TFmini Plus è un piccolo sensore LiDAR/di prossimità che può misurare distanze fino a 12 metri. Utilizza luce laser a infrarossi e il principio del Time-of-Flight (ToF). Misurando il tempo impiegato dalla luce per riflettersi su un oggetto, può calcolare distanze con alta precisione e velocità.

In questa guida vedremo come configurare, cablare e programmare il TFmini Plus per farlo funzionare con Arduino.

Componenti necessari

Ti servirà un sensore TFmini Plus (elencato qui sotto). Per il microcontrollore ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino andrà bene. Useremo anche un display OLED per mostrare le distanze e altre informazioni restituite dal TFmini Plus.

Sensore di distanza TFmini Plus

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

OLED display

Display OLED

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.

Caratteristiche del TFmini Plus

Il TFmini Plus è un sensore di distanza laser a infrarossi che utilizza il principio ToF (time of flight) per misurare le distanze. Il sensore emette impulsi di luce infrarossa a intervalli regolari, che vengono riflessi quando incontrano un oggetto. Il tempo di volo viene misurato calcolando la differenza di fase del viaggio di andata e ritorno Δφ:

ToF Principle
Principio ToF (source)

Il TFmini Plus può misurare distanze da 0,1 a 12 metri con una precisione di ±5 cm per 0,1-6 m e ±1% per l’intervallo 6-12 m. La zona cieca del sensore è di 10 cm. La risoluzione è di 5 mm e la velocità di misura (frame rate) è regolabile tra 1 e 1000 Hz.

La portata di rilevamento del TFmini Plus dipende anche dalla riflettività e dalla dimensione dell’oggetto da rilevare. Il diagramma seguente lo illustra:

Distance measurement characteristics of TFmini Plus
Caratteristiche di misura della distanza del TFmini Plus (source)

① Zona cieca di rilevamento da 0 a 10 cm, entro la quale i dati in uscita non sono affidabili.
② Intervallo operativo per il rilevamento di un bersaglio nero con riflettività del 10%, 0,1-5 m.
③ Intervallo operativo per il rilevamento di un bersaglio bianco con riflettività del 90%, 0,1-12 m.

Nota che, sorprendentemente, più l’oggetto è riflettente e grande, maggiore è la distanza a cui può essere rilevato. Per maggiori dettagli consulta il datasheet e il manuale del prodotto TFmini Plus linkati qui sotto:

Pinout del TFmini Plus

Il TFmini Plus può comunicare tramite UART, I2C o IO, a seconda della configurazione software. L’immagine seguente mostra il pinout del TFmini Plus:

Pinout of TFmini Plus
Pinout del TFmini Plus

Il TFmini Plus ha grado di protezione IP65 e quindi utilizza un cavo sigillato con connettore GH1.25-4P all’estremità. Fortunatamente, di solito viene fornito con un adattatore cavo Dupont che permette di collegarlo facilmente a un Arduino o a una breadboard. Ecco una tabella con i pin del connettore, i colori dei fili e le loro funzioni:

Numero PinColore filoFunzione
1Rosso+5V
2BiancoRX/SDA
3Verde/BluTX/SCL/IO
4NeroMassa

Il pin 1 è massa (GND) e il pin 2 è l’alimentazione a 5V±0,5V. La corrente media è ≤110mA e la corrente di picco può arrivare fino a 500mA. I pin 3 e 4 funzionano come RX e TX per UART, oppure come SDA e SCL per I2C. Nota che il filo TX/SCL può essere verde o blu. Il mio modello di TFmini Plus ha il filo verde per TX/SCL.

TFmini-S vs TFmini Plus

Esistono TFmini, TFmini-S e TFmini Plus. Può essere un po’ confuso. Il TFmini non è più prodotto, il TFmini-S è una versione aggiornata del TFmini. Il TFmini Plus è un ulteriore miglioramento, con consumi più bassi, una migliore custodia e prestazioni migliori in condizioni di luce ambientale intensa (es. all’aperto). La tabella seguente confronta le caratteristiche principali di TFmini-S e TFmini Plus:

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

In questo tutorial useremo il TFmini Plus. Ma potresti anche usare il TFmini-S, dato che software e cablaggio sono essenzialmente identici.

Collegare il TFmini Plus ad Arduino

Useremo l’interfaccia UART del TFmini Plus. Ma prima colleghiamo l’alimentazione.

Collega il filo nero (pin 4) del TFmini Plus al GND di Arduino. Poi collega il filo rosso (pin 1) del TFmini Plus all’uscita 5V di Arduino.

Per UART, collega il filo bianco (TX, pin 2) del TFmini Plus al pin 3 di Arduino. Infine collega il filo verde (RX, pin 3) del TFmini Plus al pin 2 di Arduino. Vedi lo schema completo di cablaggio qui sotto:

Connecting TFmini Plus to Arduino
Collegamento TFmini Plus ad Arduino

Nota che i pin TX e RX del TFmini e i pin TX e RX usati da Arduino sono invertiti perché così deve essere cablata la comunicazione seriale. Non farti confondere.

TX and RX wiring
Cablaggio TX e RX

Nella sezione successiva scriveremo un codice semplice per testare il sensore.

Codice per misurare distanze con TFmini Plus

Per misurare distanze con il TFmini Plus è meglio usare una libreria. Io ho usato la TFMPlus library by Bud Ryerson, che funziona sia per il TFmini Plus che per il TFmini-S. Per installarla, apri il Library Manager, cerca “tfmini”, trova la libreria TFMPlus di Bud Ryerson e installala premendo il pulsante “INSTALL”.

Install TFMPlus library
Installa TFMPlus library

Con la libreria installata, proviamo il sensore. Il codice seguente legge le distanze misurate dal sensore TFmini Plus e le stampa sul monitor seriale.

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

Analizziamo il codice per capire i suoi componenti nel dettaglio.

Inclusione delle librerie

Iniziamo includendo le librerie necessarie per il progetto. La libreria TFMPlus.h serve per comunicare con il sensore TFmini Plus, mentre la libreria SoftwareSerial.h permette di creare una comunicazione seriale su pin digitali diversi da quelli hardware predefiniti.

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

Creazione degli oggetti

Successivamente creiamo le istanze delle classi necessarie. L’oggetto TFMPlus tfmini sarà usato per interagire con il sensore TFmini Plus. Creiamo anche un oggetto SoftwareSerial chiamato TFSerial che comunicherà con il sensore usando i pin digitali 2 (RX) e 3 (TX).

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);

Funzione setup

Nella funzione setup() inizializziamo la comunicazione seriale. Il comando Serial.begin(9600) imposta la porta seriale di default a 9600 bps per la stampa sul Monitor Serial. Il comando TFSerial.begin(115200) inizializza la porta seriale software a 115200 bps, velocità richiesta dal sensore TFmini Plus. Infine chiamiamo tfmini.begin(&TFSerial) per inizializzare il sensore con la porta seriale software.

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

Funzione loop

Nella funzione loop() dichiariamo tre variabili intere: dist, strength e temp. Queste conterranno rispettivamente la distanza misurata, la forza del segnale e la temperatura rilevate dal sensore.

Verifichiamo poi se il sensore ha recuperato correttamente i dati usando il metodo tfmini.getData(dist, strength, temp). Se i dati sono disponibili, stampiamo la distanza sul Monitor Serial con Serial.print(). La distanza è mostrata in centimetri. Dopo la stampa introduciamo un ritardo di 200 millisecondi prima della lettura successiva.

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 questo esempio stampiamo solo la distanza, ma potresti anche stampare la forza del segnale e la temperatura, cosa che faremo quando collegheremo l’OLED. Per ora stampiamo solo la distanza, che vedrai in centimetri sul Monitor Serial:

Distances measured with TFmini Plus printed on Serial Monitor
Distanze misurate con TFmini Plus stampate sul Monitor Serial

Nella sezione successiva aggiungeremo un OLED al nostro circuito.

Aggiungere un OLED per visualizzare i dati di distanza del TFmini Plus

Aggiungere l’OLED è semplice. Basta collegare SDA e SCL dell’OLED ai pin corrispondenti di Arduino. Per l’alimentazione: dato che l’OLED può funzionare a 5V, possiamo condividere le linee di alimentazione. Collega VCC a 5V e GND a GND. L’immagine sotto mostra il cablaggio completo:

Connecting OLED and TFmini Plus with Arduino
Collegamento OLED e TFmini Plus con Arduino

Nota che il TFmini Plus non funziona a 3,3V.

Codice per visualizzare le distanze misurate dal TFmini Plus sull’OLED

Il codice seguente legge distanza, forza e temperatura dal sensore TFmini Plus e li visualizza sull’OLED. Dai un’occhiata veloce al codice completo, poi ne discuteremo i dettagli.

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

Librerie e inizializzazione display

Iniziamo includendo la libreria TFMPlus.h per comunicare con il sensore TFmini Plus. La libreria SoftwareSerial.h serve per creare la comunicazione seriale e la Adafruit_SSD1306 Library è usata per il display OLED.

Creiamo poi l’oggetto sensore tfmini, l’oggetto TFSerial e l’oggetto oled per il display:

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

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

Se non hai ancora installato la Adafruit_SSD1306 Library, dovrai farlo. Basta installarla tramite il Library Manager come al solito:

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

Funzione oled_init

La funzione oled_init() inizializza il display, lo pulisce, imposta la dimensione del testo e il colore.

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

Nota che l’indirizzo I2C per il display OLED è impostato a 0x3C in oled.begin(). La maggior parte di questi piccoli OLED usa questo indirizzo (or 0x27) ma il tuo potrebbe essere diverso. Se non vedi nulla sull’OLED, probabilmente ha un indirizzo I2C differente e dovrai cambiarlo.

Se non conosci l’indirizzo I2C dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino per scoprirlo. Anche il tutorial Use SSD1306 I2C OLED Display With Arduino ti spiegherà come usare un OLED.

Funzione display

La funzione display() chiama tfmini.getData per ottenere i valori di distanza, forza e temperatura misurati dal sensore TFmini Plus. Poi pulisce il display e stampa i diversi valori con dimensioni di font differenti. La funzione sprintf() è usata per convertire i valori in testo formattato.

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

Se metti un oggetto davanti al sensore, dovresti vedere distanza, forza e temperatura visualizzati sull’OLED:

Distance, Strength and Temperature shown on OLED
Distanza, Forza e Temperatura mostrati sull’OLED

La distanza è mostrata in centimetri. Se nessun oggetto viene rilevato, verrà mostrato il valore 0.

La forza del segnale (0-65535) indica quanta parte del segnale infrarosso viene riflessa dall’oggetto rilevato. Quando la forza del segnale è inferiore a 100 o uguale a 65535, il rilevamento non è affidabile e il TFmini Plus imposta la distanza a 0.

Infine, viene mostrata la temperatura interna del chip del TFmini Plus in gradi centigradi. È normale che il sensore si scaldi abbastanza dopo un po’ (70°C).

Funzione setup

Nella funzione setup() chiamiamo prima TFSerial.begin() per inizializzare la comunicazione seriale UART, poi tfmini.begin() per inizializzare il sensore, e infine oled_init() per inizializzare l’OLED.

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

Funzione loop

La funzione loop() chiama semplicemente la funzione display() ogni 20 ms.

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

E questo è tutto. Con questo codice e il TFmini Plus puoi misurare distanze fino a 12 metri.

Conclusioni

In questo tutorial hai imparato come usare il sensore di distanza TFmini Plus con Arduino per misurare distanze e visualizzarle su un OLED.

Il TFmini-Plus è molto simile al TFmini-S. Entrambi funzionano a 5V, possono misurare distanze fino a 12 metri e sono controllabili con lo stesso software. Tuttavia, il TFmini-Plus ha una custodia IP65, funziona meglio all’aperto ed è quindi più costoso. Se non ti serve tutta la portata, un’alternativa più economica a entrambi è il TF-Luna, che è più piccolo e ha una portata di 8 metri.

Se ti serve risoluzione millimetrica dai un’occhiata al VL53L0X, al VL53L1X o al TOF10120. Hanno anche il vantaggio di poter funzionare a 3,3V. Tuttavia, le loro portate sono molto più brevi.

Altri comuni sensori di distanza a infrarossi come il GP2Y0A710K0F o il GP2Y0A21YK0F sono simili per dimensioni ma usano la triangolazione per determinare la distanza basandosi sull’angolo della luce IR riflessa. Sono ancora più economici ma hanno una portata ancora più corta.

Se hai domande sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il tinkering ; )