Skip to Content

Sensor de distancia TFmini-S con Arduino

Sensor de distancia TFmini-S con Arduino

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

El TFmini-S 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-S con Arduino.

Piezas necesarias

Necesitarás un sensor TFmini-S (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 medidas por el TFmini-S en una pequeña pantalla.

Sensor de distancia TFmini-S

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-S

El TFmini-S 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-S puede medir distancias desde 0.1 hasta 12 metros con una precisión de ±6 cm para 0.1-6 m y ±1% para el rango de 6 a 12 m. La zona ciega del sensor es de 10 cm. La resolución es de 1 cm y la velocidad de medición (frecuencia de cuadros) es ajustable entre 1 y 1000 Hz.

El alcance y la precisión dependen de la reflectividad del objeto y las condiciones de luz. Generalmente, el alcance en exteriores es mucho menor que en interiores. Para más detalles, consulta el manual y la hoja de datos del TFmini-S enlazados abajo:

Pinout del TFmini-S

El TFmini-S puede comunicarse vía UART o I2C, según la configuración del software. Usaremos el sensor con UART. La siguiente imagen muestra el pinout del TFmini-S con su interfaz UART/I2C y pines de alimentación.

Pinout of TFmini-S
Pinout del TFmini-S

Los pines 3 y 4 funcionan como RX y TX para UART, o como SDA y SCL para I2C. El pin 1 es tierra (GND) y el pin 2 es la alimentación de 5V±0.1V. La corriente media es ≤140mA con un pico de 200mA.

TFmini-S vs TFmini

Como dato adicional: el TFmini-S es una versión mejorada del TFmini. Se parecen mucho, pero sus características de rendimiento son diferentes. Mira la comparación a continuación:

Comparison TFmini vs TFmini-S

Si compras un TFmini, asegúrate de que sea el TFmini-S y no la versión antigua TFmini, ya que el TFMini-Plus Library que usaremos no es compatible con el TFmini (pero sí con el TFmini-S y el TFmini Plus).

Conectando el TFmini-S al Arduino

Como mencionamos, usaremos la interfaz UART del TFmini-S. Pero primero conectemos la alimentación.

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

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

Connecting TFmini-S to Arduino
Conectando TFmini-S 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 cablearse 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-S

Para medir distancias con el TFmini-S, es mejor usar una librería. Probé varias y me gustó la TFMPlus library by Bud Ryerson. A pesar de su nombre, esta librería funciona con el TFmini-S y el TFmini-Plus. 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-S 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-S, 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-S. 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-S. 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 medición de distancia, la intensidad de la señal y la temperatura del sensor, respectivamente.

Luego verificamos si el sensor obtiene datos correctamente usando el método tfmini.getData(dist, strength, temp). Si hay datos disponibles, imprimimos la distancia en el Monitor Serial usando Serial.print(). La distancia se muestra en centímetros. Después de imprimir, 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. La intensidad indica cuánto de la señal infrarroja se refleja en el objeto detectado y la temperatura es la interna del sensor, usada para compensación térmica.

Si subes y ejecutas el código, deberías ver las distancias medidas en centímetros impresas en el Monitor Serial:

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

En la siguiente sección añadiremos un OLED a nuestro circuito para mostrar las distancias ahí, en lugar de imprimirlas en el Monitor Serial.

Añadiendo un OLED para mostrar datos de distancia del TFmini-S

Añadir un OLED es sencillo. Simplemente conecta SDA y SCL del OLED a los pines correspondientes del Arduino. Para 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-S with Arduino
Conectando OLED y TFmini-S con Arduino

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

Código para mostrar distancias medidas por TFmini-S en OLED

El siguiente código lee las distancias medidas por el sensor TFmini-S y las muestra en el OLED. El código es una extensión simple del código anterior. Echa un vistazo rápido al código completo primero, luego discutiremos los 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.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);
}

Librerías e inicialización de la pantalla

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

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

#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

oled_initFunción setup

La función oled_init() inicializa la pantalla, la 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 la pantalla OLED está configurada a 0x3C en oled.begin(). La mayoría de estos pequeños OLED usan esta dirección, 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, consulta el tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.

Función display

La función display() llama a tfmini.getData para obtener la lectura de distancia del sensor TFmini-S. Luego limpia la pantalla y muestra la distancia. La función sprintf() se usa para convertir el valor de distancia en texto formateado.

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

Si colocas un objeto frente al sensor, la pantalla debería mostrar la distancia medida en centímetros. Mira el ejemplo de salida a continuación.

Measured Distance shown on OLED
Distancia medida mostrada en OLED

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-S puedes medir distancias entre 0.1 y 12 metros.

Conclusiones

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

El TFmini-S es similar al TF-Luna pero el TFmini-S es un poco más grande y puede medir distancias de hasta 12 metros, mientras que el TF-Luna está limitado a 8 metros. El TFmini-S también es un poco más preciso (y más caro), pero ambos sensores tienen una resolución de 1 cm.

Si un rango más corto es suficiente pero necesitas resolución en milímetros, echa un vistazo al VL53L0X, al VL53L1X o al TOF10120. También tienen la ventaja de funcionar a 3.3V y son mucho más baratos.

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 con un alcance aún más corto.

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

¡Feliz bricolaje ; )