In questo tutorial imparerai come utilizzare il sensore di distanza laser TF-Luna con un Arduino o qualsiasi altro microcontrollore comune (ESP32/ESP8266) per misurare distanze.
Il TF-Luna è un sensore LiDAR/di prossimità compatto e preciso che misura distanze fino a 8 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 TF-Luna per farlo funzionare con Arduino.
Componenti necessari
Ti servirà un sensore TF-Luna (elencato qui sotto). Per il microcontrollore, ho usato un Arduino Uno per questo progetto, ma va bene qualsiasi altro Arduino o ESP32/ESP8266. Useremo anche un display OLED per mostrare le distanze misurate dal TF-Luna.

Sensore di distanza TF-Luna

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 TF-Luna
Il sensore TF-Luna utilizza il principio del Time of Flight (TOF) per misurare le distanze. Emette periodicamente onde modulate nel vicino infrarosso e calcola il tempo misurando la differenza di fase tra
l’onda originale e quella riflessa. Vedi l’illustrazione seguente:

Il campo operativo (indoor) del sensore è da 0,2 m a 8 m con una precisione di ±6 cm (0,2-3 m) o ±2% (3-8 m) e una risoluzione di 1 cm. Il TF-Luna necessita di un’alimentazione da 3,7V a 5,2V e consuma in media circa 70 mA, con picchi fino a 150 mA. La comunicazione avviene via UART o I2C. Per maggiori dettagli consulta il datasheet linkato qui sotto:
TF-Luna come parte di un sistema LiDAR
Ci sono molte applicazioni per i sensori laser di distanza, come avvisi di prossimità per parcheggio, rilevamento intrusi, evitamento ostacoli in robotica e altro. Soprattutto, i sensori laser di distanza sono comunemente usati in LiDAR sistemi, che sta perLightDetection eRanging e sono usati per creare mappe e modelli 3D altamente precisi.
Oltre al sensore laser di distanza, un sistema LiDAR tipicamente include un’unità GPS e un’unità di misura inerziale (IMU). Lo scanner è un meccanismo che muove il raggio laser su un’ampia area, permettendo al sistema di acquisire dati da angolazioni e posizioni diverse. L’GPS unità fornisce dati di posizione precisi. Infine, l’IMU traccia l’orientamento e il movimento del sistema LiDAR, fondamentale per mantenere la precisione durante la scansione.
Mentre i impulsi laser vengono emessi e riflessi, il sistema registra continuamente le misure di distanza insieme agli angoli e alle posizioni corrispondenti. Questi dati vengono poi usati per creare una nuvola di punti che rappresenta la distribuzione spaziale degli oggetti nell’area scansionata.
Puoi costruire un semplice LiDAR da solo montando il sensore laser su un servo e usando il servo per scansionare l’ambiente, mentre il sensore misura le distanze. Tuttavia, in questo tutorial useremo solo il sensore laser, senza un dispositivo di scansione.
Pinout del TF-Luna
Il TF-Luna ha 6 pin. L’immagine sotto mostra il lato del sensore con il connettore e i suoi sei pin:

Il Pin 1 (5V) e il Pin 4 (GND) sono per l’alimentazione. I pin 2 e 3 sono per la comunicazione I2C o UART. Il protocollo usato dipende dallo stato del Pin 5 (CFG). Se collegato a massa, si abilita l’I2C. Il Pin 6 (MUX) fornisce un segnale data-ready se l’I2C è abilitato.
Nota che il cavo connettore che solitamente viene fornito con il sensore TF-Luna usa colori arbitrari. Non fare affidamento sui colori per capire quale filo va a quale pin Arduino.
Collegare il TF-Luna
Il sensore TF-Luna può comunicare via UART o I2C. Useremo l’interfaccia I2C. Prima collega il pin 1 (VCC) del TF-Luna all’uscita 5V dell’Arduino. Poi collega SDA (pin 2) del TF-Luna al pin SDA dell’Arduino. Infine collega SCL (pin 3) del TF-Luna al pin SCL dell’Arduino.
Infine, collega i pin 4 e 5 del TF-Luna a massa (GND). Il pin 6 resta scollegato. Vedi lo schema completo di cablaggio qui sotto:

La tabella seguente elenca tutte le connessioni da effettuare.
| TF-Luna | Arduino |
|---|---|
| Pin 1 (VCC) | 5V |
| Pin 2 (SDA) | SDA |
| Pin 3 (SCL) | SCL |
| Pin 4 (GND) | GND |
| Pin 5 (CFG) | GND |
| Pin 6 (MUX) | non collegato |
Nota che il TF-Luna richiede 5V come alimentazione. A differenza di molti altri piccoli sensori di distanza IR, non funziona a 3,3V.
Tuttavia, puoi usarlo con un microcontrollore a 3,3V, ad esempio un ESP32. Assicurati solo di usare l’uscita 5V o un’altra fonte di alimentazione a 5V. L’immagine sotto mostra come collegare il TF-Luna a un ESP32 C3 Mini, per esempio:

Nella prossima sezione scriveremo un codice semplice per testare il sensore.
Codice per misurare distanze con TF-Luna
Prima di poter misurare distanze con il sensore TF-Luna, devi installare una libreria. Useremo la TFL22C library by Bud Ryerson. Per installarla, apri il Library Manager, cerca “TFLuna”, trova la libreria di Bud Ryerson e installala premendo il pulsante “INSTALL”.

Con la libreria installata, proviamo il sensore. Il codice seguente legge le distanze misurate dal TF-Luna e le stampa sul monitor seriale.
#include "Wire.h"
#include "TFLI2C.h"
TFLI2C sensor;
void setup() {
Serial.begin(9600);
Wire.begin();
}
void loop() {
int16_t dist;
if (sensor.getData(dist, 0x10)) {
Serial.print("dist:");
Serial.println(dist);
}
delay(100);
}
Il codice inizia includendo le librerie necessarie per la comunicazione I2C e per il sensore TF-Luna.
#include "Wire.h" #include "TFLI2C.h"
La Wire.h libreria è usata per la comunicazione I2C, mentre TFLI2C.h è una libreria specifica per interfacciarsi con il sensore TF-Luna.
Successivamente, creiamo un’istanza della classe TFLI2C che rappresenta il nostro sensore di distanza.
TFLI2C sensor;
Funzione setup
Nella funzione setup() inizializziamo la comunicazione seriale e il bus I2C.
void setup() {
Serial.begin(9600);
Wire.begin();
}
Il comando Serial.begin(9600) inizializza il monitor seriale a 9600 bps, permettendoci di inviare e ricevere dati. Il comando Wire.begin() inizializza il bus I2C, abilitando la comunicazione con il sensore.
Funzione loop
Nella funzione loop() leggiamo continuamente i dati di distanza dal sensore.
void loop() {
int16_t dist;
if (sensor.getData(dist, 0x10)) {
Serial.print("dist:");
Serial.println(dist);
}
delay(100);
}
Qui dichiariamo una variabile dist di tipo int16_t per contenere il valore della distanza. La funzione sensor.getData(dist, 0x10) tenta di leggere i dati di distanza dal sensore. Se la chiamata getData() fallisce, puoi trovare il significato dei codici di errore error codes nel file header della libreria.
Il secondo parametro 0x10 è l’indirizzo I2C predefinito del sensore. Il TF-Luna ha un indirizzo I2C configurabile (0x08 … 0x77). Se vuoi cambiarlo puoi chiamare la funzione Set_I2C_Addr().
Se i dati vengono recuperati con successo, stampiamo il valore della distanza sul monitor seriale usando Serial.print() e Serial.println(). Il comando delay(100) introduce una pausa di 100 millisecondi prima della lettura successiva.
Questo ciclo gira indefinitamente, misurando e mostrando continuamente la distanza rilevata dal sensore TF-Luna. Se carichi ed esegui il codice, dovresti vedere le distanze misurate in centimetri stampate sul monitor seriale:

Il sensore TF-Luna può misurare distanze fino a 8 m (=800 cm). Oltre questo valore il codice stamperà 900, indicando che nessun oggetto è stato rilevato.
Qui sotto alcune misurazioni di distanza del TF-Luna mostrate sul Serial Plotter mentre avvicino e allontano la mano:

Nella prossima sezione aggiungeremo un OLED al nostro circuito per visualizzare le distanze su di esso, invece di stamparle sul monitor seriale.
Aggiungere un OLED per visualizzare i dati di distanza del TF-Luna
Poiché l’OLED è anch’esso un dispositivo I2C, collegarlo è semplice. Basta collegare SDA e SCL agli stessi pin a cui è collegato il sensore TF-Luna. E dato che l’OLED può funzionare a 5V, possiamo condividere anche le linee di alimentazione.

Codice per visualizzare le distanze misurate dal TF-Luna sull’OLED
Il codice seguente legge le misurazioni di distanza dal sensore TF-Luna e le visualizza sull’OLED. Dai un’occhiata veloce al codice completo, poi ne discuteremo i dettagli.
#include "Wire.h"
#include "TFLI2C.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TFLI2C sensor;
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void display() {
static char text[30];
static int16_t dist;
if (sensor.getData(dist, 0x10)) {
sprintf(text, "%4d cm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
oled.display();
}
}
void setup() {
Wire.begin();
oled_init();
}
void loop() {
display();
delay(100);
}
Librerie e inizializzazione del display
Iniziamo includendo la libreria Wire per la comunicazione I2C, TFL22C library per il sensore e la Adafruit_SSD1306 Library per il display OLED. Creiamo poi l’oggetto oled e l’oggetto sensor.
#include "Wire.h" #include "TFLI2C.h" #include "Adafruit_SSD1306.h" Adafruit_SSD1306 oled(128, 64, &Wire, -1); TFLI2C sensor;
Se non hai ancora installato la Adafruit_SSD1306 Library, dovrai 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 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 sensor.getData() per ottenere la lettura della distanza dal sensore TF-Luna. Poi pulisce il display e stampa la distanza. La funzione sprintf() è usata per convertire il valore della distanza in testo formattato.
void display() {
static char text[30];
static int16_t dist;
if (sensor.getData(dist, 0x10)) {
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 Wire.begin() per avviare la comunicazione I2C, poi chiamiamo oled_init(), che inizializza l’OLED.
void setup() {
Wire.begin();
oled_init();
}
Funzione loop
La funzione loop() chiama semplicemente la funzione display() ogni 100 ms.
void loop() {
display();
delay(100);
}
E questo è tutto. Con il TF-Luna puoi misurare distanze da 3 cm fino a 800 cm, anche se sotto i 20 cm la precisione non è molto alta.
Conclusioni
In questo tutorial hai imparato come usare il sensore di distanza TF-Luna con Arduino per misurare distanze e visualizzarle su un OLED.
A differenza di altri sensori Time-of-Flight come il VL53L0X, il VL53L1X o il TOF10120, il TF-Luna è più grande, richiede 5V per l’alimentazione, ma ha un range molto più ampio. Tuttavia, la risoluzione è solo in centimetri (non millimetri) e il sensore è più costoso. Se ti serve un range ancora maggiore e sei disposto a spendere di più, dai un’occhiata al TFmini-S, che arriva fino a 12 m!
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 e hanno un range molto più corto.
Il TF-Luna è più adatto per il rilevamento a lunga distanza di oggetti in ambienti esterni. Nota però che il retro del sensore non è incapsulato e dovrai proteggere l’elettronica se lo usi all’aperto.
Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Buon divertimento con il tuo progetto ; )

