In questo tutorial imparerai come utilizzare il sensore di distanza TOF10120 con un Arduino per misurare le distanze.
Il TOF10120 è un sensore di distanza Time-of-Flight (ToF) molto piccolo che utilizza un laser a infrarossi per misurare la distanza da un oggetto. Emana un impulso luminoso e misura il tempo impiegato per essere riflesso. Da questo tempo di volo calcola la prossimità di un oggetto con una precisione in millimetri. Le sue dimensioni compatte e il basso consumo energetico lo rendono adatto a una vasta gamma di progetti fai-da-te, inclusi robotica, riconoscimento gestuale e rilevamento di prossimità.
Componenti necessari
Ovviamente, ti servirà un sensore di distanza TOF10120. Per quanto riguarda il microcontrollore, ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino o ESP32/ESP8266 funzionerà altrettanto bene. Per visualizzare le distanze misurate, ho scelto un display OLED, ma potresti anche optare per un LCD display.

Sensore di distanza TOF10120

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 TOF10120
Il sensore di distanza Time-of-Flight TOF10120 è un sensore molto piccolo (10mm x 13mm) e ad alta precisione che utilizza luce infrarossa per misurare le distanze.

Si basa sul principio Time-of-Flight (ToF), dove il sensore emette impulsi luminosi e misura il tempo impiegato dalla luce per riflettersi e calcolare la distanza. Il TOF10120 ha un raggio d’azione fino a 180 cm e opera a una lunghezza d’onda di 940nm. L’immagine sottostante mostra il cono del LED laser che emette l’impulso luminoso e il cono di visuale del rilevatore che registra la luce riflessa.

Il TOF10120 funziona da 3V a 5V, con un consumo medio di corrente molto basso di soli 35 mA. La lista seguente riassume le sue principali caratteristiche:
- Campo di misura: 100-1800mm
- Errore di misura: fino al 5%
- Misurazione ad alta velocità: max 30ms
- Interfaccia di comunicazione: UART / I2C
- Parametri di trasmissione UART: 9600 8n1
- Lunghezza d’onda: 940 nm
- Campo visivo: 25°
- Immunità alla luce ambientale: 50k lux
- Gamma di tensione: 3V a 5V
- Consumo medio di corrente: 35 mA
Le specifiche sopra e il datasheet indicano che la distanza minima misurabile è 100mm. Tuttavia, ho scoperto che è possibile ottenere misurazioni fino a 10mm e fino a 2000mm, ma sotto i 30mm le letture diventano molto imprecise.
Il TOF10120 comunica con i microcontrollori tramite interfaccia I2C o UART. L’immagine sottostante mostra il pinout. SDA e SCL sono per l’interfaccia I2C, mentre RxD e TxD per la comunicazione UART.

Nella sezione successiva imparerai come collegare il TOF10120 a un Arduino.
Collegamento del TOF10120
Useremo l’interfaccia I2C per collegare il sensore TOF10120 a un Arduino. Per prima cosa, collega i pin SCL (6) e SDA (5) della scheda breakout TOF10120 ai corrispondenti pin sull’Arduino come mostrato sotto. Poi collega la massa al pin 1 e il 3.3V al pin 2 del TOF10120.

Il sensore TOF10120 funziona a 5V o 3.3V e puoi usare uno dei due per VDD. Nel cablaggio sopra, sto usando 3.3V per VDD. Nota che i pin 3 e 4 (RxD, TxD) del TOF10120 non sono collegati, poiché non stiamo usando l’interfaccia UART ma l’I2C.
Ora scriviamo un po’ di codice per testare il funzionamento del sensore TOF10120.
Codice per misurare la distanza con TOF10120
Leggere i dati di distanza dal TOF10120 via I2C è abbastanza semplice. Il codice seguente è una versione ridotta e pulita derivata dalla documentazione del fornitore per il 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;
}
Prima imposta l’indirizzo di lettura da cui leggere i dati di distanza tramite Wire.write(0). Poi legge due byte consecutivi chiamando Wire.read(), costruisce il valore della distanza impostando il byte alto e basso, e restituisce il valore della distanza.
Nota che secondo il datasheet l’indirizzo I2C a 8 bit del sensore TOF10120 è 0xA4, ma poiché la libreria Wire usa solo i 7 bit più alti per l’indirizzo I2C, devi usare l’indirizzo a 7 bit corrispondente 0x52. Nota anche che non dovresti interrogare il sensore più velocemente di ogni 30 msec.
Potresti usare questo codice così com’è, ma ho implementato una piccola TOF10120 library che ti renderà la vita più facile.
Installa la libreria TOF10120
Per installare la libreria TOF10120 vai al tof10120_arduino_lib repo qui e clicca sul pulsante verde “Code”. Poi clicca su “Download Zip” come mostrato sotto:

Nell’IDE Arduino crea il seguente codice di test:
#include "TOF10120.h"
TOF10120 sensor = TOF10120();
void setup() {
Serial.begin(9600);
sensor.init();
}
void loop() {
Serial.print("distance:");
Serial.println(sensor.distance());
delay(100);
}
Poi vai su “Sketch” -> “Include Library” -> “Add .Zip Library..” e seleziona il file “tof10120_arduino_lib-main.zip” che hai appena scaricato:

Il codice di test è molto semplice. Prima include la libreria TOF10120 e crea l’oggetto TOF10120 sensor. Nella funzione setup() il sensore viene inizializzato e nella funzione loop() chiamiamo infine sensor.distance() per leggere la distanza misurata dal sensore.
Se vuoi collegare il sensore a pin SDA e SCL diversi, puoi specificarli tramite sensor.begin(sda, scl); per le schede ESP32 e ESP8266.
Esegui il codice di test per TOF10120 sensor
Se carichi il codice sul tuo Arduino dovresti vedere i valori di distanza stampati sul Monitor Seriale. Se non c’è nessun oggetto davanti al sensore, vedrai stampata una distanza di 2000mm.

Se apri il Serial Plotter e metti la mano davanti al sensore, spostandola più vicino o più lontano, dovresti vedere un grafico simile a quello mostrato sotto.

Se hai problemi e il sensore sembra non funzionare, assicurati che il cablaggio sia corretto e che i pin SDA e SCL usati siano quelli giusti. Puoi anche controllare il diodo laser del sensore scattando una foto con una fotocamera digitale (telefono cellulare). Mentre la luce IR è invisibile all’occhio umano, la fotocamera può vederla. L’immagine sotto mostra il TOF10120 con il diodo IR chiaramente illuminato:

Nella sezione successiva aggiungeremo un OLED al nostro circuito.
Aggiungere un OLED per visualizzare i dati del TOF10120
Tipicamente, vogliamo che la distanza misurata venga visualizzata in qualche modo. Potrebbe essere una barra LED o, in questo caso, un OLED. Poiché l’OLED è anch’esso un dispositivo I2C, il collegamento è semplice. Colleghiamo semplicemente SDA e SCL agli stessi pin a cui è collegato il sensore TOF10120. E poiché l’OLED funziona a 3.3V, possiamo anche condividere le linee di alimentazione. L’immagine sotto mostra il cablaggio completo.

Se hai difficoltà con l’OLED, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino. L’immagine sotto mostra il cablaggio completo su una breadboard reale:

Codice per visualizzare i dati TOF10120 su OLED
In questa sezione scriviamo il codice per mostrare la distanza misurata dal sensore TOF10120 sullo schermo OLED. Per scrivere sull’OLED useremo la libreria Adafruit_SSD1306. Puoi installarla tramite il Library Manager come al solito:

Il codice qui sotto legge le misurazioni dal sensore TOF10120 e le visualizza sull’OLED. Dai un’occhiata al codice completo prima, poi ne analizziamo i dettagli.
// 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);
}
Librerie e inizializzazione del display
Iniziamo includendo la TOF10120 Library e la Adafruit_SSD1306 Library per il display OLED. Creiamo poi l’oggetto oled e l’oggetto sensor.
#include "Adafruit_SSD1306.h" #include "TOF10120.h" Adafruit_SSD1306 oled(128, 64, &Wire, -1); TOF10120 sensor = TOF10120();
oled_initFunzione
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 devi 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.distance() per ottenere la lettura della distanza dal sensore TOF10120. Poi pulisce il display e stampa la distanza. La funzione sprintf() viene usata per convertire il valore della distanza in un testo formattato.
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();
}
Oltre all’output testuale, la funzione display() disegna anche una linea orizzontale sotto il testo con una lunghezza proporzionale alla distanza misurata. Se non c’è nulla davanti al sensore (o oltre i 2m), il display mostrerà la distanza massima di 2000mm e una linea a tutta lunghezza.

Se metti un oggetto davanti al sensore, il display mostrerà la distanza misurata in millimetri e una linea più corta. Vedi l’esempio di output qui sotto.

Se per qualche motivo il sensore non riesce a ottenere una lettura della distanza, la funzione distance() restituisce -1 e questo valore verrebbe mostrato sull’OLED. Tuttavia, non mi è mai capitato.
Funzione setup
Nella funzione setup() chiamiamo prima sensor.init() per inizializzare il sensore TOF10120, poi chiamiamo oled_init(), che inizializza l’OLED.
void setup() {
sensor.init();
oled_init();
}
Funzione loop
La funzione loop() chiama semplicemente la funzione display() ogni 100 msec. Come detto prima, non dovresti andare più veloce di 30 msec, ma puoi usare un ritardo maggiore.
void loop() {
display();
delay(100);
}
E questo è tutto. Ora hai il tuo strumento per misurare distanze che può misurare con precisione distanze tra 10mm e 2000mm.
Conclusioni
In questo tutorial hai imparato come usare il sensore di distanza TOF10120 con un Arduino per misurare distanze e visualizzarle su un OLED.
Il sensore TOF10120 è un sensore molto piccolo, veloce e ad alta precisione che utilizza un laser a infrarossi per misurare distanze. In particolare misura il Time-of-Flight dell’impulso laser riflesso per calcolare la distanza da un oggetto. Se cerchi un’alternativa: un sensore molto simile con specifiche comparabili è il VL53L0X. E se ti serve un sensore con un raggio più ampio, dai un’occhiata al TF Luna che può misurare distanze fino a 8 metri.
Questi sensori, a differenza di altri sensori di distanza a infrarossi come il GP2Y0A710K0F o il GP2Y0A21YK0F, che usano la triangolazione per determinare la distanza basandosi sull’angolo della luce IR riflessa, hanno un raggio più lungo e una precisione maggiore rispetto ai sensori GP2Y0A710K0F e GP2Y0A21YK0F.
I sensori di distanza IR possono essere influenzati da luce ambientale intensa. Un’alternativa sono i sensori di distanza a ultrasuoni come il comune HC-SR04 che usano onde sonore per misurare la distanza. Tuttavia, i sensori laser IR sono più precisi e tendono ad avere un raggio più lungo rispetto ai sensori a ultrasuoni, ma sono anche un po’ più costosi.
Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Buon divertimento con il fai-da-te ; )

