Skip to Content

Sensor de Distância TFmini-Plus com Arduino

Sensor de Distância TFmini-Plus com Arduino

Neste tutorial, vais aprender a usar o Sensor de Distância a Laser TFmini Plus com um Arduino para medir distâncias.

O TFmini Plus é 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 Plus a funcionar com Arduino.

Peças Necessárias

Vais precisar de um Sensor TFmini Plus (listado abaixo). Quanto ao microcontrolador, usei um Arduino Uno para este projeto, mas qualquer outro Arduino também serve. Vamos também usar um OLED para mostrar as distâncias e outras informações fornecidas pelo TFmini Plus num pequeno ecrã.

Sensor de Distância TFmini Plus

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 Plus

O TFmini Plus é 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 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 Plus pode medir distâncias de 0,1 a 12 metros com uma precisão de ±5cm para 0,1-6m e ±1% para o intervalo de 6m-12m. A zona cega do sensor é de 10 cm. A resolução é de 5mm e a velocidade de medição (taxa de frames) é ajustável entre 1 e 1000 Hz.

O alcance de deteção do TFmini Plus também depende da refletividade e do tamanho do objeto a detetar. O diagrama seguinte ilustra isto:

Distance measurement characteristics of TFmini Plus
Características da medição de distância do TFmini Plus (source)

① Zona cega de deteção de 0-10cm, dentro da qual os dados de saída não são fiáveis.
② Alcance operacional para detetar um alvo preto com 10% de refletividade, 0,1-5m.
③ Alcance operacional para detetar um alvo branco com 90% de refletividade, 0,1-12m.

Note que, surpreendentemente, quanto mais refletivo e maior o objeto, maior é o alcance em que pode ser detetado. Para mais detalhes, consulte o datasheet e o manual do produto do TFmini Plus ligados abaixo:

Pinout do TFmini Plus

O TFmini Plus pode comunicar via UART, I2C ou IO, dependendo da configuração do software. A imagem seguinte mostra o pinout do TFmini Plus:

Pinout of TFmini Plus
Pinout do TFmini Plus

O TFmini Plus tem classificação IP65 e, por isso, usa um cabo selado com um conector GH1.25-4P na extremidade. Felizmente, normalmente vem com um adaptador de cabo Dupont que permite ligá-lo facilmente a um Arduino ou breadboard. Aqui está uma tabela com os pinos do conector, as cores dos fios e as suas funções:

Número do PinoCor do FioFunção
1Vermelho+5V
2BrancoRX/SDA
3Verde/AzulTX/SCL/IO
4PretoTerra

O pino 1 é terra (GND) e o pino 2 é a tensão de alimentação de 5V±0,5V. A corrente média é ≤110mA e a corrente de pico pode chegar a 500mA. Os pinos 3 e 4 funcionam como RX e TX para UART, ou como SDA e SCL para I2C. Note que o fio TX/SCL pode ser verde ou azul. O meu modelo do TFmini Plus tem o fio verde para TX/SCL.

TFmini-S vs TFmini Plus

Existe um TFmini, um TFmini-S e o TFmini Plus. Pode ser um pouco confuso. O TFmini já não é produzido e o TFmini-S é uma versão melhorada do TFmini. O TFmini-Plus é uma atualização adicional, com menor consumo de energia, melhor caixa e melhor desempenho sob luz ambiente forte (ex: ao ar livre). A tabela seguinte compara as principais características do TFmini-S e do TFmini Plus:

Comparison TFmini-S vs TFmini Plus
Comparação TFmini-S vs TFmini Plus (source)

Neste tutorial vamos usar o TFmini Plus. Mas também poderias usar o TFmini-S, pois o software e a ligação são essencialmente idênticos.

Ligação do TFmini Plus ao Arduino

Vamos usar a interface UART do TFmini Plus. Mas primeiro, vamos ligar a alimentação.

Liga o fio preto (pino 4) do TFmini Plus ao GND do Arduino. Depois, liga o fio vermelho (pino 1 do TFmini Plus) à saída de 5V do Arduino.

Para UART, liga o fio branco (TX, pino 2) do TFmini Plus ao pino 3 do Arduino. Finalmente, liga o fio verde (RX, pino 3) do TFmini Plus ao pino 2 do Arduino. Vê o diagrama completo de ligações abaixo:

Connecting TFmini Plus to Arduino
Ligação do TFmini Plus 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 isto.

TX and RX wiring
Ligação 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 Plus

Para medir distâncias com o TFmini Plus, é melhor usar uma biblioteca. Eu usei a TFMPlus library by Bud Ryerson, que funciona para o TFmini Plus e o TFmini-S. 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 Plus 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 Plus, 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 Plus. 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 de software a uma velocidade mais alta de 115200 bps, necessária pelo sensor TFmini Plus. Finalmente, chamamos tfmini.begin(&TFSerial) para inicializar o sensor com a porta serial de 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 também poderias imprimir a intensidade do sinal e a temperatura, e faremos isso ao ligar o OLED. Por agora, imprimimos só a distância e deverás vê-la em centímetros no Monitor Serial:

Distances measured with TFmini Plus printed on Serial Monitor
Distâncias medidas com TFmini Plus impressas no Monitor Serial

Na próxima secção vamos adicionar um OLED ao nosso circuito.

Adicionar um OLED para mostrar os dados de distância do TFmini Plus

Adicionar o OLED é simples. Basta ligar o SDA e 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 Plus with Arduino
Ligação do OLED e TFmini Plus ao Arduino

Note que o TFmini Plus não funciona a 3,3V.

Código para mostrar distâncias medidas pelo TFmini Plus no OLED

O código seguinte lê as medições de distância, intensidade e temperatura do sensor TFmini Plus e mostra-as no OLED. Dá uma vista rápida 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.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);
}

Bibliotecas e Inicialização do Display

Começamos por incluir a biblioteca TFMPlus.h para comunicar com o sensor TFmini Plus. 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

Função oled_init

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 (or 0x27), 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, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino para o descobrir. Também o tutorial Use SSD1306 I2C OLED Display With Arduino explica mais sobre como usar um OLED.

Função display

A função display() chama tfmini.getData para obter os valores medidos de distância, intensidade e temperatura do sensor TFmini Plus. Depois limpa o display e imprime os diferentes valores com tamanhos de fonte diferentes. A função sprintf() é usada para formatar os valores em texto.

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

Se colocares um objeto à frente do sensor, deverás ver a distância, intensidade e temperatura mostradas no OLED:

Distance, Strength and Temperature shown on OLED
Distância, Intensidade e Temperatura mostradas no OLED

A distância é mostrada em centímetros. Se nenhum objeto for detetado, será mostrado o valor 0.

A intensidade do sinal (0-65535) indica quanto do sinal infravermelho é refletido pelo objeto detetado. Quando a intensidade do sinal é inferior a 100 ou igual a 65535, a deteção não é fiável, e o TFmini Plus define a distância para 0.

Finalmente, a temperatura interna do chip do TFmini Plus é mostrada em graus Celsius. É normal que o sensor aqueça bastante após algum tempo (70ºC).

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() chama simplesmente a função display() a cada 20 ms.

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

E é tudo. Com este código e o TFmini Plus podes medir distâncias até 12 metros.

Conclusões

Neste tutorial aprendeste a usar o Sensor de Distância TFmini Plus com um Arduino para medir distâncias e mostrá-las num OLED.

O TFmini-Plus é muito semelhante ao TFmini-S. Ambos funcionam a 5V, podem medir distâncias até 12 metros e são controlados pelo mesmo software. No entanto, o TFmini-Plus vem numa caixa IP65, funciona melhor ao ar livre e é por isso mais caro. Se não precisares do alcance total, uma alternativa mais barata a ambos os sensores é o TF-Luna, que é mais pequeno e tem um alcance de 8 metros.

Se 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. No entanto, os seus alcances são muito mais curtos.

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