Skip to Content

Sensor de Distância TF-Luna com Arduino

Sensor de Distância TF-Luna com Arduino

Neste tutorial, vais aprender a usar o Sensor de Distância a Laser TF-Luna com um Arduino ou qualquer outro microcontrolador comum (ESP32/ESP8266) para medir distâncias.

O TF-Luna é um sensor LiDAR/Proximidade compacto e preciso que mede distâncias até 8 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 TF-Luna a funcionar com Arduino.

Peças Necessárias

Vais precisar de um Sensor TF-Luna (listado abaixo). Quanto ao microcontrolador, usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou ESP32/ESP8266 também serve. Também vamos usar um OLED para mostrar as distâncias medidas pelo TF-Luna num pequeno ecrã.

Sensor de Distância TF-Luna

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 TF-Luna

O sensor TF-Luna usa o princípio do Tempo de Voo (TOF) para medir distâncias. Emite periodicamente ondas moduladas em infravermelho próximo e calcula o tempo medindo a diferença de fase entre a
onda original e a onda refletida. Vê a ilustração abaixo:

Time of Flight (TOF) principle
Princípio do Tempo de Voo (TOF) (source)

O alcance de operação (interior) do sensor é de 0,2m a 8m com uma precisão de ±6cm@ (0,2-3m) ou ±2%@ (3m-8m) e uma resolução de 1 cm. O TF-Luna necessita de 3,7V-5,2V como fonte de alimentação e a corrente média é cerca de 70mA, com picos até 150mA. A comunicação é via UART ou I2C. Para mais detalhes, consulta a folha de dados abaixo:

TF-Luna como parte de um sistema LiDAR

Existem muitas aplicações para sensores de distância a laser, como aviso de proximidade em estacionamento, deteção de intrusos, desvio de obstáculos em robótica e mais. O mais importante é que sensores de distância a laser são usados frequentemente em LiDAR sistemas, que significa Luz Deteção e Rangeamento e são usados para criar mapas e modelos 3D altamente precisos.

Além do sensor de distância a laser, um sistema LiDAR normalmente inclui uma unidade GPS e uma unidade de medição inercial (IMU). O scanner é um mecanismo que move o feixe laser por uma área ampla, permitindo ao sistema captar dados de diferentes ângulos e posições. A unidade GPS fornece dados de localização precisos. Finalmente, a IMU acompanha a orientação e o movimento do sistema LiDAR, crucial para manter a precisão durante a varredura.

À medida que os pulsos laser são emitidos e refletidos, o sistema regista continuamente as medições de distância juntamente com os seus ângulos e posições correspondentes. Estes dados são usados para criar uma nuvem de pontos, que representa a distribuição espacial dos objetos na área escaneada.

Podes construir um LiDAR simples tu mesmo, fixando o sensor de distância a laser num servo e usar o servo para escanear o ambiente, enquanto o sensor mede as distâncias. Contudo, neste tutorial vamos usar apenas o sensor de distância a laser, sem dispositivo de varredura.

Pinout do TF-Luna

O TF-Luna tem 6 pinos. A imagem abaixo mostra o lado do sensor com o conector e os seus seis pinos:

Pinout of TF Luna
Pinout do TF-Luna

O Pino 1 (5V) e o Pino 4 (GND) são para a alimentação. Os pinos 2 e 3 são para comunicação I2C ou UART. O protocolo usado depende do estado do Pino 5 (CFG). Se ligado a terra, o I2C é ativado. O Pino 6 (MUX) fornece um sinal de dados prontos, se o I2C estiver ativado.

Nota que o cabo do conector que normalmente acompanha o sensor TF-Luna usa cores arbitrárias. Não confies nas cores para deduzir qual fio vai para qual pino do Arduino.

Ligação do TF-Luna

O sensor TF-Luna pode comunicar via UART ou I2C. Vamos usar a interface I2C. Primeiro, liga o pino 1 (VCC) do TF-Luna à saída 5V do Arduino. Depois liga o SDA (pino 2) do TF-Luna ao pino SDA do Arduino. Em seguida, liga o SCL (pino 3) do TF-Luna ao SCL do Arduino.

Finalmente, precisas de ligar os pinos 4 e 5 do TF-Luna ao terra (GND). O pino 6 fica sem ligação. Vê o diagrama completo de ligações abaixo:

Connecting TF-Luna with Arduino
Ligação do TF-Luna ao Arduino

A tabela seguinte lista todas as ligações que precisas de fazer.

TF-LunaArduino
Pino 1 (VCC)5V
Pino 2 (SDA)SDA
Pino 3 (SCL)SCL
Pino 4 (GND)GND
Pino 5 (CFG)GND
Pino 6 (MUX)sem ligação

Nota que o TF-Luna requer 5V para alimentação. Ao contrário de muitos outros pequenos sensores IR de distância, não funciona com 3,3V.

No entanto, podes usá-lo com um microcontrolador de 3,3V, por exemplo um ESP32. Só tens de garantir que usas a saída de 5V ou outra fonte de alimentação de 5V. A imagem abaixo mostra como ligar o TF-Luna a um ESP32 C3 Mini, por exemplo:

Connecting TF-Luna with ESP32 C3 Mini
Ligação do TF-Luna com ESP32 C3 Mini

Na próxima secção vamos escrever um código simples para testar o sensor.

Código para medir distâncias com TF-Luna

Antes de poderes medir distâncias com o sensor TF-Luna, terás de instalar uma biblioteca. Vamos usar a TFL22C library by Bud Ryerson. Para a instalar, abre o Library Manager, procura por “TFLuna”, encontra a biblioteca do Bud Ryerson e instala-a clicando no botão “INSTALL”.

Installing TFL22C library by Bud Ryerson via Library Manager
Instalação da biblioteca TFL22C por Bud Ryerson via Library Manager

Com a biblioteca instalada, vamos testar o sensor. O código seguinte lê as distâncias medidas pelo sensor TF-Luna e imprime-as no monitor serial.

#include "Wire.h"    
#include "TFLI2C.h"  

TFLI2C sensor;

void setup() {
  Serial.begin(9600);  
  Wire.begin();          
}

void loop() {
  int16_t dist; 
  if (sensor.getData(dist, 0x10)) {
    Serial.print("dist:");
    Serial.println(dist);
  }
  delay(100);
}

O código começa por incluir as bibliotecas necessárias para comunicação I2C e para o sensor TF-Luna.

#include "Wire.h"    
#include "TFLI2C.h"  

A Wire.h biblioteca é usada para comunicação I2C, enquanto a TFLI2C.h é uma biblioteca específica para interface com o sensor TF-Luna.

De seguida, criamos uma instância da classe TFLI2C que representa o nosso sensor de distância.

TFLI2C sensor;

Função setup

Na função setup(), inicializamos a comunicação Serial e o barramento I2C.

void setup() {
  Serial.begin(9600);  
  Wire.begin();          
}

O comando Serial.begin(9600) inicializa o Monitor Serial a uma taxa de 9600 bps, permitindo enviar e receber dados. O comando Wire.begin() inicializa o barramento I2C, permitindo a comunicação com o sensor.

Função loop

Na função loop(), lemos continuamente os dados de distância do sensor.

void loop() {
  int16_t dist; 
  if (sensor.getData(dist, 0x10)) {
    Serial.print("dist:");
    Serial.println(dist);
  }
  delay(100);
}

Aqui, declaramos uma variável dist do tipo int16_t para guardar o valor da distância. A função sensor.getData(dist, 0x10) tenta ler os dados de distância do sensor. Se a chamada getData() falhar, podes consultar os significados dos códigos error codes no ficheiro header da biblioteca.

O segundo parâmetro 0x10 é o endereço I2C padrão do sensor. O sensor TF-Luna tem um endereço I2C configurável (0x080x77). Se quiseres alterá-lo, podes usar a função Set_I2C_Addr().

Se os dados forem obtidos com sucesso, imprimimos o valor da distância no Monitor Serial usando Serial.print() e Serial.println(). O comando delay(100) introduz uma pausa de 100 milissegundos antes da próxima leitura.

Este ciclo corre indefinidamente, medindo e mostrando continuamente a distância detetada pelo sensor TF-Luna. Se carregares e executares o código, deverás ver as distâncias medidas em centímetros impressas no Monitor Serial:

Distances measured with TF Luna printed on Serial Monitor
Distâncias medidas com TF-Luna impressas no Monitor Serial

O sensor TF-Luna pode medir distâncias até 8 m (=800 cm). Para além disso, o código imprime uma distância de 900, indicando que nenhum objeto foi detetado.

Abaixo algumas medições de distância do TF-Luna mostradas no Serial Plotter ao mover a minha mão mais perto e mais longe:

Distances measured with TF-Luna on Serial Plotter
Distâncias medidas com TF-Luna no Serial Plotter

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 TF-Luna

Como o OLED também é um dispositivo I2C, a ligação é simples. Ligamos o SDA e o SCL aos mesmos pinos onde o sensor TF-Luna está ligado. E como o OLED pode funcionar a 5V, podemos também partilhar as linhas de alimentação.

Connecting OLED and TF-Luna with Arduino
Ligação do OLED e TF-Luna ao Arduino

Código para mostrar distâncias medidas pelo TF-Luna no OLED

O código seguinte lê as medições de distância do sensor TF-Luna e mostra-as no OLED. Dá uma vista de olhos ao código completo primeiro, depois discutimos os detalhes.

#include "Wire.h"
#include "TFLI2C.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TFLI2C sensor;

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void display() {
  static char text[30];
  static int16_t dist;
  if (sensor.getData(dist, 0x10)) {
    sprintf(text, "%4d cm", dist);

    oled.clearDisplay();
    oled.setCursor(20, 25);
    oled.print(text);

    oled.display();
  }
}

void setup() {
  Wire.begin();
  oled_init();
}

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

Bibliotecas e Inicialização do Ecrã

Começamos por incluir a biblioteca Wire para comunicação I2C, a TFL22C library para o sensor e a Adafruit_SSD1306 Library para o ecrã OLED. Depois criamos o objeto oled e o objeto sensor.

#include "Wire.h"
#include "TFLI2C.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TFLI2C sensor;

Se ainda não instalaste a Adafruit_SSD1306 Library, terás de o fazer. Basta instalar via 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 ecrã, 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);
}

Nota que o endereço I2C para o ecrã 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 alterar o endereço.

Se não souberes o endereço I2C, consulta 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 te ensinará mais sobre como usar um OLED.

Função display

A função display() chama sensor.getData() para obter a leitura de distância do sensor TF-Luna. Depois limpa o ecrã 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;
  if (sensor.getData(dist, 0x10)) {
    sprintf(text, "%4d cm", dist);

    oled.clearDisplay();
    oled.setCursor(20, 25);
    oled.print(text);

    oled.display();
  }
}

Se colocares um objeto à frente do sensor, o ecrã 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(), primeiro chamamos Wire.begin() para iniciar a comunicação I2C, e depois chamamos oled_init(), que inicializa o OLED.

void setup() {
  Wire.begin();
  oled_init();
}

Função loop

A função loop() simplesmente chama a função display() a cada 100 ms.

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

E é tudo. Com o TF-Luna podes medir distâncias entre 3 cm e 800 cm, embora distâncias abaixo de 20 cm não sejam muito precisas.

Conclusões

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

Ao contrário de outros sensores Time-of-Flight como o VL53L0X, o VL53L1X, ou o TOF10120, o TF-Luna é maior, precisa de 5V para alimentação, mas tem um alcance muito maior. No entanto, a resolução é apenas em centímetros (não milímetros) e o sensor é mais caro. Se precisares de ainda mais alcance e estiveres disposto a gastar mais, dá uma vista de olhos no TFmini-S, que tem um alcance até 12 m!

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 e têm um alcance muito mais curto.

O TF-Luna é mais adequado para deteção de objetos a longa distância em ambientes exteriores. Nota, porém, que a parte traseira do sensor não é encapsulada e terás de proteger a sua eletrónica quando o usares ao ar livre.

Se tiveres alguma dúvida, sente-te à vontade para deixar nos comentários.

Boas experiências ; )