In questo tutorial imparerai come utilizzare il sensore di distanza laser TFmini-S con un Arduino per misurare le distanze.
Il TFmini-S è 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-S per farlo funzionare con Arduino.
Parti necessarie
Ti servirà un sensore TFmini-S (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 misurate dal TFmini-S.

Sensore di distanza TFmini-S

Arduino Uno

Cavo USB per Arduino UNO

Set di fili Dupont

Breadboard

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-S
Il TFmini-S è 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:

Il TFmini-S può misurare distanze da 0,1 a 12 metri con una precisione di ±6 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 1 cm e la velocità di misura (frame rate) è regolabile tra 1 e 1000 Hz.
La portata e la precisione dipendono dalla riflettività dell’oggetto e dalle condizioni di luce. Generalmente la portata all’aperto è molto più corta che all’interno. Per maggiori dettagli consulta il manuale e la scheda tecnica del TFmini-S linkati qui sotto:
Pinout del TFmini-S
Il TFmini-S può comunicare via UART o I2C, a seconda della configurazione software. Useremo il sensore con UART. L’immagine seguente mostra il pinout del TFmini-S con le interfacce UART/I2C e i pin di alimentazione.

I pin 3 e 4 funzionano come RX e TX per UART, oppure come SDA e SCL per I2C. Il pin 1 è massa (GND) e il pin 2 è l’alimentazione a 5V±0,1V. La corrente media è ≤140mA con un picco di 200mA.
TFmini-S vs TFmini
A titolo informativo: il TFmini-S è una versione migliorata del TFmini. Sono molto simili nell’aspetto ma hanno caratteristiche di prestazione diverse. Vedi il confronto qui sotto:

Se acquisti un TFmini assicurati che sia il TFmini-S e non la versione più vecchia TFmini, perché il TFMini-Plus Library che useremo non è compatibile con il TFmini (ma lo è con il TFmini-S e il TFmini Plus).
Collegare il TFmini-S ad Arduino
Come detto useremo l’interfaccia UART del TFmini-S. Ma prima colleghiamo l’alimentazione.
Collega il filo nero (pin 1) del TFmini-S al GND di Arduino. Poi collega il filo rosso (pin 2) del TFmini-S all’uscita 5V di Arduino.
Per UART, collega il filo bianco (TX, pin 3) del TFmini-S al pin 3 di Arduino. Infine collega il filo verde (RX, pin 4) del TFmini-S al pin 2 di Arduino. Vedi lo schema completo qui sotto:

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

Nella sezione successiva scriveremo un codice semplice per testare il sensore.
Codice per misurare distanze con TFmini-S
Per misurare distanze con il TFmini-S è meglio usare una libreria. Ne ho provate diverse e mi è piaciuta la TFMPlus library by Bud Ryerson. Nonostante il nome, questa libreria funziona con il TFmini-S e il TFmini-Plus. Per installarla, apri il Library Manager, cerca “tfmini”, trova la libreria TFMPlus di Bud Ryerson e installala premendo il pulsante “INSTALL”.

Con la libreria installata, proviamo il sensore. Il codice seguente legge le distanze misurate dal TFmini-S 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.
Inclusione librerie
Iniziamo includendo le librerie necessarie per il progetto. La libreria TFMPlus.h serve per comunicare con il sensore TFmini-S, 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 oggetti
Creiamo le istanze delle classi necessarie. L’oggetto TFMPlus tfmini sarà usato per interagire con il sensore TFmini-S. 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-S. 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.
Controlliamo poi se il sensore ha recuperato correttamente i dati con 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. La forza del segnale indica quanta parte del segnale infrarosso è riflessa dall’oggetto rilevato, mentre la temperatura è quella interna del sensore, usata per la compensazione termica.
Se carichi ed esegui il codice vedrai le distanze misurate in centimetri stampate sul Monitor Serial:

Nella sezione successiva aggiungeremo un OLED al circuito per mostrare le distanze su display invece che sul Monitor Serial.
Aggiungere un OLED per visualizzare i dati di distanza del TFmini-S
Aggiungere un 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:

Nota che il TFmini-S non funziona a 3,3V.
Codice per visualizzare le distanze misurate dal TFmini-S su OLED
Il codice seguente legge le distanze dal sensore TFmini-S e le mostra sull’OLED. È una semplice estensione del codice precedente. Dai un’occhiata al codice completo e 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.setTextSize(2);
oled.setTextColor(WHITE);
}
void display() {
static char text[30];
static int16_t dist, strength, temp;
if (tfmini.getData(dist, strength, temp)) {
sprintf(text, "%4d cm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
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-S. La libreria SoftwareSerial.h serve per 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 libreria Adafruit_SSD1306 Library, devi farlo. Basta installarla tramite il Library Manager come al solito:

oled_initFunzione setup
La funzione oled_init() inizializza il display, lo pulisce, imposta la dimensione e il colore del testo.
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Nota che l’indirizzo I2C per l’OLED è impostato a 0x3C in oled.begin(). La maggior parte di questi piccoli OLED usa questo indirizzo, 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.
Funzione display
La funzione display() chiama tfmini.getData per ottenere la lettura della distanza dal sensore TFmini-S. Poi pulisce il display e stampa la distanza. La funzione sprintf() serve a convertire il valore della distanza in testo formattato.
void display() {
static char text[30];
static int16_t dist, strength, temp;
if (tfmini.getData(dist, strength, temp)) {
sprintf(text, "%4d cm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
oled.display();
}
}
Se metti un oggetto davanti al sensore, il display dovrebbe mostrare la distanza misurata in centimetri. Vedi l’esempio di output qui sotto.

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-S puoi misurare distanze da 0,1 a 12 metri.
Conclusioni
In questo tutorial hai imparato come usare il sensore di distanza TFmini-S con Arduino per misurare distanze e visualizzarle su un OLED.
Il TFmini-S è simile al TF-Luna ma è un po’ più grande e può misurare distanze fino a 12 metri, mentre il TF-Luna è limitato a 8 metri. Il TFmini-S è anche un po’ più preciso (e più costoso), ma entrambi i sensori hanno una risoluzione di 1 cm.
Se ti basta una portata più corta ma ti serve risoluzione millimetrica, dai un’occhiata al VL53L0X, al VL53L1X o al TOF10120. Hanno anche il vantaggio di poter funzionare a 3,3V e sono molto più economici.
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 fai-da-te ; )

