En este tutorial aprenderás cómo usar el sensor de distancia TOF10120 con un Arduino para medir distancias.
El TOF10120 es un sensor de distancia Time-of-Flight (ToF) muy pequeño que utiliza luz láser infrarroja para medir la distancia a un objeto. Emite un pulso de luz y mide el tiempo que tarda en reflejarse. A partir de este tiempo de vuelo calcula la proximidad de un objeto con una precisión en milímetros. Su tamaño compacto y bajo consumo de energía lo hacen adecuado para una amplia variedad de proyectos DIY, incluyendo robótica, reconocimiento de gestos y detección de proximidad.
Partes necesarias
Obviamente, necesitarás un sensor de distancia TOF10120. En cuanto al microcontrolador, usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o cualquier ESP32/ESP8266 también funcionará bien. Para mostrar las distancias medidas, elegí un OLED, pero también podrías usar un LCD display.

Sensor de distancia TOF10120

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

Protoboard

Pantalla 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.
Características del TOF10120
El sensor de distancia Time-of-Flight TOF10120 es un sensor muy pequeño (10mm x 13mm) y de alta precisión que utiliza luz infrarroja para medir distancias.

Está basado en el principio Time-of-Flight (ToF), donde el sensor emite pulsos de luz y mide el tiempo que tarda la luz en reflejarse para calcular la distancia. El TOF10120 tiene un rango de hasta 180 cm y opera a una longitud de onda de 940nm. La imagen a continuación muestra el cono del LED láser que emite el pulso de luz y el cono de visión del detector que registra la luz reflejada.

El TOF10120 funciona con 3V a 5V, con un consumo medio bajo de solo 35 mA. La siguiente lista resume sus principales características:
- Rango de trabajo: 100-1800mm
- Error de medición: hasta 5%
- Medición rápida: máximo 30ms
- Interfaz de comunicación: UART / I2C
- Parámetros de transmisión UART: 9600 8n1
- Longitud de onda: 940 nm
- Campo de visión: 25°
- Inmunidad a luz ambiental: 50k lux
- Rango de voltaje: 3V a 5V
- Consumo medio de corriente: 35 mA
La especificación anterior y la hoja de datos indican que la distancia mínima que se puede medir es 100mm. Sin embargo, descubrí que en realidad se pueden obtener mediciones tan cercanas como 10mm y tan lejanas como 2000mm, aunque por debajo de 30mm las lecturas se vuelven muy inexactas.
El TOF10120 se comunica con microcontroladores mediante una interfaz I2C o UART. La imagen a continuación muestra el pinout. SDA y SCL son para la interfaz I2C y RxD y TxD para la comunicación UART.

En la siguiente sección aprenderás cómo conectar el TOF10120 a un Arduino.
Conectando el TOF10120
Vamos a usar la interfaz I2C para conectar el sensor TOF10120 a un Arduino. Primero, conecta los pines SCL (6) y SDA (5) de la placa breakout del TOF10120 a los pines correspondientes en la placa Arduino como se muestra abajo. Luego, conecta tierra al pin 1 y 3.3V al pin 2 del TOF10120.

El sensor TOF10120 funciona con 5V o 3.3V y puedes usar cualquiera para VDD. En el cableado mostrado, estoy usando 3.3V para VDD. Nota que los pines 3 y 4 (RxD, TxD) del TOF10120 no están conectados, ya que no estamos usando la interfaz UART sino I2C.
A continuación, escribamos algo de código para probar el funcionamiento del sensor TOF10120.
Código para medir distancia con TOF10120
Leer datos de distancia del TOF10120 vía I2C es bastante sencillo. El siguiente código es una versión abreviada y limpia derivada de la documentación del proveedor para el 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;
}
Primero establece la dirección de lectura desde donde se leen los datos de distancia vía Wire.write(0). Luego lee dos bytes consecutivos llamando a Wire.read(), construye el valor de distancia combinando el byte alto y bajo, y devuelve el valor de distancia.
Ten en cuenta que según la hoja de datos, la dirección I2C de 8 bits del sensor TOF10120 es 0xA4, pero dado que la librería Wire usa solo los 7 bits altos para la dirección I2C, debes usar la dirección de 7 bits correspondiente 0x52. También ten en cuenta que no debes consultar el sensor más rápido que cada 30 ms.
Podrías usar este código tal cual, pero implementé una pequeña TOF10120 library que te facilitará la vida.
Instalar la librería TOF10120
Para instalar la librería TOF10120 ve a la tof10120_arduino_lib repo aquí y haz clic en el botón verde «Code». Luego haz clic en «Download Zip» como se muestra a continuación:

En el IDE de Arduino crea el siguiente código de prueba:
#include "TOF10120.h"
TOF10120 sensor = TOF10120();
void setup() {
Serial.begin(9600);
sensor.init();
}
void loop() {
Serial.print("distance:");
Serial.println(sensor.distance());
delay(100);
}
Luego ve a «Sketch» -> «Include Library» -> «Add .Zip Library..» y selecciona el archivo «tof10120_arduino_lib-main.zip» que acabas de descargar:

El código de prueba es muy simple. Primero incluye la librería TOF10120 y crea el objeto TOF10120 sensor. En la función setup() se inicializa el sensor y en la función loop() finalmente llamamos a sensor.distance() para leer la distancia medida por el sensor.
Si quieres conectar el sensor a pines SDA y SCL diferentes, puedes especificarlos mediante sensor.begin(sda, scl); para placas ESP32 y ESP8266.
Ejecutar código de prueba para TOF10120 sensor
Si subes el código a tu Arduino deberías ver valores de distancia impresos en el Monitor Serial. Si no hay ningún objeto frente al sensor, verás impresa una distancia de 2000mm.

Si abres el Serial Plotter y colocas tu mano frente al sensor, moviéndola más cerca o más lejos, deberías ver un gráfico similar al que se muestra abajo.

Si tienes problemas y el sensor no parece funcionar, asegúrate de que el cableado sea correcto y que se usen los pines SDA y SCL correctos. También puedes comprobar el diodo láser del sensor tomando una foto con una cámara digital (teléfono móvil). Aunque la luz IR es invisible al ojo humano, la cámara puede verla. La imagen a continuación muestra el TOF10120 con el diodo IR claramente iluminado:

En la siguiente sección vamos a añadir un OLED a nuestro circuito.
Añadiendo un OLED para mostrar datos del TOF10120
Normalmente, queremos que la distancia medida se muestre de alguna forma. Podría ser una barra LED o, en este caso, un OLED. Dado que el OLED también es un dispositivo I2C, conectarlo es sencillo. Simplemente conectamos SDA y SCL a los mismos pines a los que está conectado el sensor TOF10120. Y como el OLED funciona a 3.3V, también podemos compartir las líneas de alimentación. La imagen a continuación muestra el cableado completo.

Si tienes dificultades con el OLED, echa un vistazo al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino. La imagen a continuación muestra el cableado completo en una protoboard real:

Código para mostrar datos del TOF10120 en OLED
En esta sección escribimos el código para mostrar la distancia medida por el sensor TOF10120 en la pantalla OLED. Para escribir en el OLED usaremos la librería Adafruit_SSD1306. Puedes instalarla vía el Library Manager como de costumbre:

El código a continuación lee las mediciones del sensor TOF10120 y las muestra en el OLED. Mira el código completo primero y luego analizamos sus detalles.
// 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);
}
Librerías e inicialización del display
Comenzamos incluyendo la TOF10120 Library y la Adafruit_SSD1306 Library para el display OLED. Luego creamos el objeto oled y el objeto sensor.
#include "Adafruit_SSD1306.h" #include "TOF10120.h" Adafruit_SSD1306 oled(128, 64, &Wire, -1); TOF10120 sensor = TOF10120();
oled_initFunción
La función oled_init() inicializa el display, lo limpia, establece el tamaño del texto y el color del texto.
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Ten en cuenta que la dirección I2C para el display OLED está configurada en 0x3C en oled.begin(). La mayoría de estos pequeños OLED usan esta dirección (or 0x27) pero la tuya podría ser diferente. Si no ves nada en el OLED, probablemente tenga una dirección I2C distinta y tendrás que cambiarla.
Si no sabes la dirección I2C, echa un vistazo al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino para encontrarla. También el tutorial Use SSD1306 I2C OLED Display With Arduino te enseñará más sobre cómo usar un OLED.
Función display
La función display() llama a sensor.distance() para obtener la lectura de distancia del sensor TOF10120. Luego limpia el display e imprime la distancia. La función sprintf() se usa para convertir el valor de distancia en un texto formateado.
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();
}
Además de la salida de texto, la función display() también dibuja una línea horizontal debajo del texto con una longitud proporcional a la distancia medida. Si no hay nada frente al sensor (o está más lejos de 2m), el display mostrará la distancia máxima de 2000mm y una línea de longitud completa.

Si colocas un objeto frente al sensor, el display mostrará la distancia medida en milímetros y una línea más corta. Mira el siguiente ejemplo de salida abajo.

Si por alguna razón el sensor no puede obtener una lectura de distancia, la función distance() devuelve -1 y este valor se mostraría en el OLED. Sin embargo, nunca me ha ocurrido esto.
Función setup
En la función setup() primero llamamos a sensor.init() para inicializar el sensor TOF10120, y luego llamamos a oled_init(), que inicializa el OLED.
void setup() {
sensor.init();
oled_init();
}
Función loop
La función loop() simplemente llama a la función display() cada 100 ms. Como se mencionó antes, no deberías ir más rápido que 30 ms, pero puedes usar un retardo mayor.
void loop() {
display();
delay(100);
}
Y eso es todo. Ahora tienes tu propia herramienta para medir distancias que puede medir con precisión entre 10mm y 2000mm.
Conclusiones
En este tutorial aprendiste cómo usar el sensor de distancia TOF10120 con un Arduino para medir distancias y mostrarlas en un OLED.
El sensor TOF10120 es un sensor muy pequeño, rápido y de alta precisión que utiliza luz láser infrarroja para medir distancias. Específicamente mide el tiempo de vuelo del impulso láser reflejado para calcular la distancia a un objeto. Si buscas una alternativa: un sensor muy similar con especificaciones comparables es el VL53L0X. Y si necesitas un sensor con un rango mayor, echa un vistazo al TF Luna que puede medir distancias de hasta 8 metros.
Estos sensores, a diferencia de otros sensores de distancia infrarrojos como el GP2Y0A710K0F o el GP2Y0A21YK0F, que usan triangulación para determinar la distancia basándose en el ángulo de la luz IR reflejada, tienen un rango más largo y mayor precisión comparados con los sensores GP2Y0A710K0F y GP2Y0A21YK0F.
Los sensores de distancia IR pueden verse afectados por luz ambiental intensa. Una alternativa son los sensores de distancia ultrasónicos como el común HC-SR04 que usan ondas sonoras para medir distancia. Sin embargo, los sensores láser IR son más precisos y tienden a tener un rango más largo comparados con los ultrasónicos, aunque también son un poco más caros.
Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.
¡Feliz bricolaje ; )

