Neste tutorial, vais aprender a usar o Sensor de Distância a Laser TFmini-S com um Arduino para medir distâncias.
O TFmini-S é um pequeno sensor LiDAR/Proximidade que pode medir distâncias até 12 metros. Utiliza luz laser infravermelha e o princípio do Tempo de Voo (ToF). Ao medir o tempo que a luz demora a refletir num objeto, consegue calcular distâncias com alta precisão e rapidez.
Neste guia, vamos abordar a configuração, a ligação e a programação necessárias para pôr o teu TFmini-S a funcionar com Arduino.
Peças Necessárias
Vais precisar de um Sensor TFmini-S (listado abaixo). Quanto ao microcontrolador, usei um Arduino Uno para este projeto, mas qualquer outro Arduino também serve. Vamos usar também um OLED para mostrar as distâncias medidas pelo TFmini-S num pequeno ecrã.

Sensor de Distância TFmini-S

Arduino Uno

Cabo USB para Arduino UNO

Conjunto de Fios Dupont

Breadboard

Ecrã 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 do TFmini-S
O TFmini-S é um sensor de distância a laser infravermelho que usa o princípio ToF (tempo de voo) para medir distâncias. O sensor emite pulsos de luz infravermelha periodicamente, que são refletidos ao contactar com um objeto. O tempo de voo é medido calculando a diferença de fase de ida e volta Δφ:

O TFmini-S pode medir distâncias de 0,1 a 12 metros com uma precisão de ±6 cm para 0,1-6 m e ±1% para o intervalo de 6 m a 12 m. A zona cega do sensor é de 10 cm. A resolução é de 1 cm e a velocidade de medição (taxa de frames) é ajustável entre 1 e 1000 Hz.
O alcance e a precisão dependem da refletividade do objeto e das condições de luz. Geralmente, o alcance ao ar livre é muito menor do que em ambientes interiores. Para mais detalhes, consulta o manual do produto e a folha de dados do TFmini-S ligados abaixo:
Pinout do TFmini-S
O TFmini-S pode comunicar via UART ou I2C, dependendo da configuração do software. Vamos usar o sensor com UART. A imagem seguinte mostra o pinout do TFmini-S com a sua interface UART/I2C e os pinos de alimentação.

Os pinos 3 e 4 funcionam como RX e TX para UART, ou como SDA e SCL para I2C. O pino 1 é terra (GND) e o pino 2 é a tensão de alimentação de 5V±0,1V. A corrente média é ≤140mA com pico de 200mA.
TFmini-S vs TFmini
A título de curiosidade: O TFmini-S é uma versão melhorada do TFmini. São muito parecidos, mas as suas características de desempenho são diferentes. Vê a comparação abaixo:

Se comprares um TFmini, certifica-te que é o TFmini-S e não a versão mais antiga TFmini, pois o TFMini-Plus Library que vamos usar não é compatível com o TFmini (mas sim com o TFmini-S e o TFmini Plus).
Ligando o TFmini-S ao Arduino
Como mencionado, vamos usar a interface UART do TFmini-S. Mas primeiro, vamos ligar a alimentação.
Liga o fio preto (pino 1) do TFmini-S ao GND do Arduino. Depois, liga o fio vermelho (pino 2) do TFmini-S à saída de 5V do Arduino.
Para UART, liga o fio branco (TX, pino 3) do TFmini-S ao pino 3 do Arduino. Finalmente, liga o fio verde (RX, pino 4) do TFmini-S ao pino 2 do Arduino. Vê o diagrama completo de ligações abaixo:

Note que os pinos TX e RX do TFmini e os pinos TX e RX usados pelo Arduino estão invertidos porque é assim que a comunicação serial deve ser ligada. Não te confundas com isso.

Na próxima secção vamos escrever um código simples para testar o sensor.
Código para medir distâncias com TFmini-S
Para medir distâncias com o TFmini-S, é melhor usar uma biblioteca. Experimentei várias e gostei da TFMPlus library by Bud Ryerson. Apesar do nome, esta biblioteca funciona com o TFmini-S e o TFmini-Plus. Para a instalar, abre o Library Manager, procura por “tfmini”, encontra a biblioteca TFMPlus do Bud Ryerson e instala-a clicando no botão “INSTALL”.

Com a biblioteca instalada, vamos testar o sensor. O código seguinte lê as distâncias medidas pelo sensor TFmini-S e imprime-as no 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 analisar o código para entender os seus componentes em detalhe.
Inclusão de Bibliotecas
Começamos por incluir as bibliotecas necessárias para o nosso projeto. A biblioteca TFMPlus.h é usada para comunicar com o sensor TFmini-S, enquanto a biblioteca SoftwareSerial.h permite criar uma comunicação serial em pinos digitais diferentes dos pinos de hardware padrão.
#include "TFMPlus.h" #include "SoftwareSerial.h"
Criação de Objetos
De seguida, criamos instâncias das classes necessárias. O objeto TFMPlus tfmini será usado para interagir com o sensor TFmini-S. Também criamos um objeto SoftwareSerial chamado TFSerial que comunicará com o sensor usando os pinos digitais 2 (RX) e 3 (TX).
TFMPlus tfmini; SoftwareSerial TFSerial(2, 3);
Função Setup
Na função setup(), inicializamos a comunicação serial. O comando Serial.begin(9600) configura a porta serial padrão a 9600 bps para imprimir no Monitor Serial. O comando TFSerial.begin(115200) inicializa a porta serial por software a uma velocidade maior de 115200 bps, que é requerida pelo sensor TFmini-S. Finalmente, chamamos tfmini.begin(&TFSerial) para inicializar o sensor com a porta serial por software.
void setup() {
Serial.begin(9600);
TFSerial.begin(115200);
tfmini.begin(&TFSerial);
}
Função Loop
Na função loop() declaramos três variáveis inteiras: dist, strength e temp. Estas vão armazenar a medição de distância, a intensidade do sinal e a temperatura do sensor, respetivamente.
Depois verificamos se o sensor obteve dados com sucesso usando o método tfmini.getData(dist, strength, temp). Se os dados estiverem disponíveis, imprimimos a distância no Monitor Serial usando Serial.print(). A distância é mostrada em centímetros. Após imprimir os dados, introduzimos um atraso de 200 milissegundos antes da próxima leitura.
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);
}
}
Neste exemplo, imprimimos apenas a distância, mas poderias imprimir também a intensidade do sinal e a temperatura. A intensidade do sinal indica quanto do sinal infravermelho é refletido pelo objeto detectado e a temperatura é a temperatura interna do sensor, usada para compensação térmica.
Se carregares e executares o código, deverás ver as distâncias medidas em centímetros impressas no Monitor Serial:

Na próxima secção vamos adicionar um OLED ao nosso circuito e mostrar as distâncias nele, em vez de imprimir no Monitor Serial.
Adicionar um OLED para mostrar os dados de distância do TFmini-S
Adicionar o OLED é simples. Basta ligar o SDA e o SCL do OLED aos pinos correspondentes do Arduino. Quanto à alimentação: como o OLED pode funcionar a 5V, podemos partilhar as linhas de alimentação. Liga o VCC a 5V e o GND ao GND. A imagem abaixo mostra a ligação completa:

Note que o TFmini-S não funciona com 3,3V.
Código para mostrar distâncias medidas pelo TFmini-S no OLED
O código seguinte lê as medições de distância do sensor TFmini-S e mostra-as no OLED. O código é uma extensão simples do código anterior. Dá uma vista de olhos ao código completo primeiro, depois discutimos os detalhes.
#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);
}
Bibliotecas e Inicialização do Display
Começamos por incluir a biblioteca TFMPlus.h para comunicar com o sensor TFmini-S. A biblioteca SoftwareSerial.h é usada para criar a comunicação serial e a Adafruit_SSD1306 Library é usada para o display OLED.
De seguida, criamos o objeto sensor tfmini, o objeto TFSerial e o objeto oled para o display:
#include "TFMPlus.h" #include "SoftwareSerial.h" #include "Adafruit_SSD1306.h" TFMPlus tfmini; SoftwareSerial TFSerial(2, 3); Adafruit_SSD1306 oled(128, 64, &Wire, -1);
Se ainda não instalaste a Adafruit_SSD1306 Library, terás de o fazer. Basta instalar via o Library Manager como habitual:

oled_initFunção setup
A função oled_init() inicializa o display, limpa-o, define o tamanho do texto e a cor do texto.
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Note que o endereço I2C do display OLED está definido para 0x3C em oled.begin(). A maioria destes pequenos OLEDs usa este endereço, mas o teu pode ser diferente. Se não vês nada no OLED, provavelmente tem um endereço I2C diferente e terás de o alterar. Se não souberes o endereço I2C, consulta o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Função display
A função display() chama tfmini.getData para obter a leitura de distância do sensor TFmini-S. Depois limpa o display e imprime a distância. A função sprintf() é usada para converter o valor da distância num texto formatado.
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();
}
}
Se colocares um objeto à frente do sensor, o display deverá mostrar a distância medida em centímetros. Vê o exemplo de saída abaixo.

Função setup
Na função setup() chamamos primeiro TFSerial.begin() para inicializar a comunicação serial UART, depois chamamos tfmini.begin() para inicializar o sensor, e finalmente chamamos oled_init() para inicializar o OLED.
void setup() {
TFSerial.begin(115200);
tfmini.begin(&TFSerial);
oled_init();
}
Função loop
A função loop() simplesmente chama a função display() a cada 20 ms.
void loop() {
display();
delay(20);
}
E é tudo. Com este código e o TFmini-S podes medir distâncias entre 0,1 e 12 metros.
Conclusões
Neste tutorial aprendeste a usar o Sensor de Distância TFmini-S com um Arduino para medir distâncias e mostrá-las num OLED.
O TFmini-S é semelhante ao TF-Luna mas o TFmini-S é um pouco maior e pode medir distâncias até 12 metros, enquanto o TF-Luna está limitado a 8 metros. O TFmini-S é também um pouco mais preciso (e mais caro), mas ambos os sensores têm uma resolução de 1 cm.
Se um alcance mais curto for suficiente mas precisares de resolução em milímetros, dá uma vista de olhos ao VL53L0X, ao VL53L1X ou ao TOF10120. Eles também têm a vantagem de poderem funcionar a 3,3V e são muito mais baratos.
Outros sensores comuns de distância infravermelhos, como o GP2Y0A710K0F ou o GP2Y0A21YK0F, são semelhantes em tamanho mas usam triangulação para determinar a distância com base no ângulo da luz IR refletida. São ainda mais baratos, mas têm um alcance ainda mais curto.
Se tiveres alguma dúvida, não hesites em deixar nos comentários.
Boas experiências ; )

