Skip to Content

Sensor de Distância TFmini-S com Arduino

Sensor de Distância TFmini-S com Arduino

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

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de Fios Dupont

Half_breadboard56a

Breadboard

OLED display

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 Δφ:

ToF Principle
Princípio ToF (source)

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.

Pinout of TFmini-S
Pinout do TFmini-S

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:

Comparison TFmini vs TFmini-S

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:

Connecting TFmini-S to Arduino
Ligação do TFmini-S ao Arduino

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.

TX and RX wiring
Ligação dos pinos TX e RX

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”.

Install TFMPlus library
Instalar TFMPlus library

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:

Distances measured with TFmini-S printed on Serial Monitor
Distâncias medidas com TFmini-S 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:

Connecting OLED and TFmini-S with Arduino
Ligação do OLED e TFmini-S ao Arduino

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:

Adafruit_SSD1306 library installed in Library Manager
Biblioteca Adafruit_SSD1306 instalada no Library Manager

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.

Measured Distance shown on OLED
Distância medida mostrada no OLED

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