Skip to Content

Sensor de distancia TFmini-Plus con Arduino

Sensor de distancia TFmini-Plus con Arduino

En este tutorial aprenderás a usar el sensor de distancia láser TFmini Plus con un Arduino para medir distancias.

El TFmini Plus es un pequeño sensor LiDAR/de proximidad que puede medir distancias de hasta 12 metros. Utiliza luz láser infrarroja y el principio de Tiempo de Vuelo (ToF). Midiendo el tiempo que tarda la luz en reflejarse en un objeto, puede calcular distancias con alta precisión y rapidez.

En esta guía cubriremos la configuración, el cableado y la programación necesarios para poner en marcha tu TFmini Plus con Arduino.

Piezas necesarias

Necesitarás un sensor TFmini Plus (listado abajo). Para el microcontrolador, usé un Arduino Uno para este proyecto, pero cualquier otro Arduino también funcionará. Además, usaremos un OLED para mostrar las distancias y otra información que devuelve el TFmini Plus en una pequeña pantalla.

Sensor de distancia TFmini Plus

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

OLED display

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 TFmini Plus

El TFmini Plus es un sensor de distancia láser infrarrojo que usa el principio ToF (tiempo de vuelo) para medir distancias. El sensor emite pulsos de luz infrarroja periódicamente, que se reflejan al contactar con un objeto. El tiempo de vuelo se mide calculando la diferencia de fase de ida y vuelta Δφ:

ToF Principle
Principio ToF (source)

El TFmini Plus puede medir distancias desde 0.1 hasta 12 metros con una precisión de ±5 cm para 0.1-6 m y ±1% para el rango de 6-12 m. La zona ciega del sensor es de 10 cm. La resolución es de 5 mm y la velocidad de medición (frecuencia de cuadros) es ajustable entre 1 y 1000 Hz.

El rango de detección del TFmini Plus también depende de la reflectividad y el tamaño del objeto a detectar. El siguiente diagrama ilustra esto:

Distance measurement characteristics of TFmini Plus
Características de medición de distancia del TFmini Plus (source)

① Zona ciega de detección de 0-10 cm, dentro de la cual los datos de salida no son fiables.
② Rango operativo para detectar un objetivo negro con 10% de reflectividad, 0.1-5 m.
③ Rango operativo para detectar un objetivo blanco con 90% de reflectividad, 0.1-12 m.

Curiosamente, cuanto más reflectante y más grande es el objeto, mayor es el rango en el que puede ser detectado. Para más detalles consulta la hoja de datos y el manual del producto del TFmini Plus enlazados abajo:

Pinout del TFmini Plus

El TFmini Plus puede comunicarse vía UART, I2C o IO, dependiendo de la configuración del software. La siguiente imagen muestra el pinout del TFmini Plus:

Pinout of TFmini Plus
Pinout del TFmini Plus

El TFmini Plus tiene clasificación IP65 y por ello usa un cable sellado con conector GH1.25-4P al final. Por suerte, normalmente viene con un adaptador de cable Dupont que permite conectarlo fácilmente a un Arduino o a una protoboard. Aquí tienes una tabla con los pines del conector, sus colores de cable y funciones:

Número de PinColor del CableFunción
1Rojo+5V
2BlancoRX/SDA
3Verde/AzulTX/SCL/IO
4NegroMasa

El pin 1 es masa (GND) y el pin 2 es la alimentación de 5V±0.5V. La corriente media es ≤110mA y la corriente pico puede llegar hasta 500mA. Los pines 3 y 4 funcionan como RX y TX para UART, o como SDA y SCL para I2C. Nota que el cable TX/SCL puede ser verde o azul. Mi modelo del TFmini Plus tiene el cable verde para TX/SCL.

TFmini-S vs TFmini Plus

Existen TFmini, un TFmini-S y el TFmini Plus. Puede ser un poco confuso. El TFmini ya no se produce y el TFmini-S es una versión mejorada del TFmini. El TFmini Plus es una mejora adicional, con menor consumo, mejor carcasa y mejor rendimiento bajo luz ambiental fuerte (por ejemplo, al aire libre). La siguiente tabla compara las características principales del TFmini-S y el TFmini Plus:

Comparison TFmini-S vs TFmini Plus
Comparación TFmini-S vs TFmini Plus (source)

En este tutorial usaremos el TFmini Plus. Pero también podrías usar el TFmini-S, ya que el software y el cableado son esencialmente idénticos.

Conectando el TFmini Plus al Arduino

Vamos a usar la interfaz UART del TFmini Plus. Pero primero conectemos la alimentación.

Conecta el cable negro (pin 4) del TFmini Plus al GND del Arduino. Luego conecta el cable rojo (pin 1) del TFmini Plus a la salida de 5V del Arduino.

Para UART, conecta el cable blanco (TX, pin 2) del TFmini Plus al pin 3 del Arduino. Finalmente, conecta el cable verde (RX, pin 3) del TFmini Plus al pin 2 del Arduino. Mira el diagrama completo de cableado abajo:

Connecting TFmini Plus to Arduino
Conectando TFmini Plus al Arduino

Ten en cuenta que los pines TX y RX del TFmini y los pines TX y RX usados por el Arduino están invertidos porque así debe ser el cableado para la comunicación serial. No te confundas con esto.

TX and RX wiring
Cableado TX y RX

En la siguiente sección escribiremos un código simple para probar el sensor.

Código para medir distancias con TFmini Plus

Para medir distancias con el TFmini Plus, es mejor usar una librería. Yo usé la TFMPlus library by Bud Ryerson, que funciona para el TFmini Plus y el TFmini-S. Para instalarla, abre el Library Manager, busca «tfmini», encuentra la librería TFMPlus de Bud Ryerson y presiona el botón «INSTALL» para instalarla.

Install TFMPlus library
Instalar TFMPlus library

Con la librería instalada, probemos el sensor. El siguiente código lee las distancias medidas por el sensor TFmini Plus y las imprime en el monitor serial.

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

Vamos a desglosar el código para entender sus componentes en detalle.

Inclusión de librerías

Comenzamos incluyendo las librerías necesarias para nuestro proyecto. La librería TFMPlus.h se usa para comunicarse con el sensor TFmini Plus, mientras que la librería SoftwareSerial.h permite crear una comunicación serial en pines digitales distintos a los pines hardware por defecto.

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

Creación de objetos

Luego, creamos instancias de las clases necesarias. El objeto TFMPlus tfmini se usará para interactuar con el sensor TFmini Plus. También creamos un objeto SoftwareSerial llamado TFSerial que se comunicará con el sensor usando los pines digitales 2 (RX) y 3 (TX).

TFMPlus tfmini;       
SoftwareSerial TFSerial(2, 3);

Función setup

En la función setup() inicializamos la comunicación serial. El comando Serial.begin(9600) configura el puerto serial por defecto a 9600 bps para imprimir en el Monitor Serial. El comando TFSerial.begin(115200) inicializa el puerto serial por software a una velocidad mayor de 115200 bps, requerida por el sensor TFmini Plus. Finalmente, llamamos a tfmini.begin(&TFSerial) para inicializar el sensor con el puerto serial por software.

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

Función loop

En la función loop() declaramos tres variables enteras: dist, strength y temp. Estas almacenarán la distancia medida, la intensidad de la señal y la temperatura del sensor, respectivamente.

Luego comprobamos si el sensor recupera datos con éxito usando el método tfmini.getData(dist, strength, temp). Si los datos están disponibles, imprimimos la distancia en el Monitor Serial usando Serial.print(). La distancia se muestra en centímetros. Después de imprimir los datos, introducimos un retardo de 200 milisegundos antes de la siguiente lectura.

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

En este ejemplo solo imprimimos la distancia, pero también podrías imprimir la intensidad de la señal y la temperatura, y lo haremos cuando conectemos el OLED. Por ahora, solo imprimimos la distancia y deberías verla en centímetros en el Monitor Serial:

Distances measured with TFmini Plus printed on Serial Monitor
Distancias medidas con TFmini Plus impresas en el Monitor Serial

En la siguiente sección añadiremos un OLED a nuestro circuito.

Añadiendo un OLED para mostrar los datos de distancia del TFmini Plus

Añadir un OLED es sencillo. Simplemente conecta SDA y SCL del OLED a los pines correspondientes del Arduino. En cuanto a la alimentación: como el OLED puede funcionar a 5V, podemos compartir las líneas de alimentación. Conecta VCC a 5V y GND a GND. La imagen abajo muestra el cableado completo:

Connecting OLED and TFmini Plus with Arduino
Conectando OLED y TFmini Plus con Arduino

Ten en cuenta que el TFmini Plus no funciona con 3.3V.

Código para mostrar distancias medidas por TFmini Plus en OLED

El siguiente código lee las mediciones de distancia, intensidad y temperatura del sensor TFmini Plus y las muestra en el OLED. Echa un vistazo rápido al código completo primero, luego discutiremos sus detalles.

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

Librerías e inicialización del display

Comenzamos incluyendo la librería TFMPlus.h para comunicarnos con el sensor TFmini Plus. La librería SoftwareSerial.h se usa para crear la comunicación serial y la Adafruit_SSD1306 Library es para el display OLED.

Luego creamos el objeto sensor tfmini, el objeto TFSerial y el objeto oled para el display:

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

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

Si aún no has instalado la Adafruit_SSD1306 Library, tendrás que hacerlo. Solo instálala vía el Library Manager como siempre:

Adafruit_SSD1306 library installed in Library Manager
Librería Adafruit_SSD1306 instalada en Library Manager

Función oled_init

La función oled_init() inicializa el display, lo limpia, establece el tamaño y 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 a 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 tfmini.getData para obtener los valores medidos de distancia, intensidad y temperatura del sensor TFmini Plus. Luego limpia el display e imprime los diferentes valores con distintos tamaños de fuente. La función sprintf() se usa para convertir los valores en texto formateado.

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

Si colocas un objeto frente al sensor, deberías ver la distancia, intensidad y temperatura mostradas en el OLED:

Distance, Strength and Temperature shown on OLED
Distancia, intensidad y temperatura mostradas en OLED

La distancia se muestra en centímetros. Si no se detecta ningún objeto, se mostrará un valor de 0.

La intensidad de la señal (0-65535) indica cuánto de la señal infrarroja se refleja en el objeto detectado. Cuando la intensidad es menor a 100 o igual a 65535, la detección no es fiable y el TFmini Plus establecerá la distancia a 0.

Finalmente, se muestra la temperatura interna del chip del TFmini Plus en grados centígrados. Es normal que el sensor se caliente bastante después de un rato (70 °C).

Función setup

En la función setup() primero llamamos a TFSerial.begin() para inicializar la comunicación serial UART, luego a tfmini.begin() para inicializar el sensor, y finalmente a oled_init() para inicializar el OLED.

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

Función loop

La función loop() simplemente llama a la función display() cada 20 ms.

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

Y eso es todo. Con este código y el TFmini Plus puedes medir distancias de hasta 12 metros.

Conclusiones

En este tutorial aprendiste a usar el sensor de distancia TFmini Plus con un Arduino para medir distancias y mostrarlas en un OLED.

El TFmini-Plus es muy similar al TFmini-S. Ambos funcionan a 5V, pueden medir distancias de hasta 12 metros y se controlan con el mismo software. Sin embargo, el TFmini-Plus viene en una carcasa IP65, funciona mejor al aire libre y por ello es más caro. Si no necesitas el rango completo, una alternativa más económica a ambos sensores es el TF-Luna, que es más pequeño y tiene un rango de 8 metros.

Si necesitas resolución en milímetros, echa un vistazo al VL53L0X, al VL53L1X o al TOF10120. También tienen la ventaja de poder funcionar a 3.3V. Sin embargo, sus rangos son mucho más cortos.

Otros sensores comunes de distancia infrarrojos como el GP2Y0A710K0F o el GP2Y0A21YK0F son similares en tamaño pero usan triangulación para determinar la distancia basándose en el ángulo de la luz IR reflejada. Son aún más baratos pero también tienen un rango aún más corto.

Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.

¡Feliz bricolaje ; )