Neste tutorial, vais aprender a usar o Sensor de Distância TOF10120 com um Arduino para medir distâncias.
O TOF10120 é um sensor de distância Time-of-Flight (ToF) muito pequeno que usa luz laser infravermelha para medir a distância a um objeto. Envia um pulso de luz e mede o tempo que demora a ser refletido. A partir deste tempo de voo calcula a proximidade de um objeto com uma precisão em milímetros. O seu tamanho compacto e baixo consumo de energia tornam-no adequado para uma ampla gama de projetos DIY, incluindo robótica, reconhecimento de gestos e deteção de proximidade.
Peças Necessárias
Obviamente, vais precisar de um Sensor de Distância TOF10120. Quanto ao microcontrolador, usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou qualquer ESP32/ESP8266 também funcionará bem. Para mostrar as distâncias medidas, escolhi um OLED, mas também poderias usar um LCD ecrã.

Sensor de Distância TOF10120

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 TOF10120
O Sensor de Distância Time-of-Flight TOF10120 é um sensor muito pequeno (10mm x 13mm), de alta precisão, que usa luz infravermelha para medir distâncias.

Baseia-se no princípio Time-of-Flight (ToF), onde o sensor emite pulsos de luz e mede o tempo que a luz demora a refletir para calcular a distância. O TOF10120 tem um alcance de até 180 cm e opera a um comprimento de onda de 940nm. A imagem abaixo mostra o cone do LED laser que emite o pulso de luz e o cone de visão do detector que regista a luz refletida.

O TOF10120 funciona entre 3V e 5V, com um consumo médio de corrente baixo de apenas 35 mA. A lista seguinte resume as suas principais características:
- Alcance de funcionamento: 100-1800mm
- Erro de medição: até 5%
- Medição rápida: máximo 30ms
- Interface de comunicação: UART / I2C
- Parâmetros de transmissão UART: 9600 8n1
- Comprimento de onda: 940 nm
- Campo de visão: 25°
- Imunidade à luz ambiente: 50k lux
- Faixa de tensão: 3V a 5V
- Consumo médio de corrente: 35 mA
A especificação acima e a folha de dados indicam que a distância mínima que pode ser medida é 100mm. No entanto, descobri que é possível obter medições tão próximas quanto 10mm e até 2000mm, mas abaixo de 30mm as leituras tornam-se muito imprecisas.
O TOF10120 comunica com microcontroladores via interface I2C ou UART. A imagem abaixo mostra o pinout. SDA e SCL são para a interface I2C e RxD e TxD para comunicação UART.

Na próxima secção vais aprender como ligar o TOF10120 a um Arduino.
Ligação do TOF10120
Vamos usar a interface I2C para ligar o sensor TOF10120 ao Arduino. Primeiro, liga os pinos SCL (6) e SDA (5) da placa breakout do TOF10120 aos pinos correspondentes no Arduino conforme mostrado abaixo. Depois, liga o terra ao pino 1 e 3.3V ao pino 2 do TOF10120.

O sensor TOF10120 funciona com 5V ou 3.3V e podes usar qualquer um para o VDD. Na ligação acima, estou a usar 3.3V para o VDD. Nota que os pinos 3 e 4 (RxD, TxD) do TOF10120 não estão ligados, pois não estamos a usar a interface UART, mas sim a I2C.
De seguida, vamos escrever algum código para testar o funcionamento do sensor TOF10120.
Código para medir distância com TOF10120
Ler dados de distância do TOF10120 via I2C é bastante fácil. O código seguinte é uma versão simplificada e limpa derivada da documentação do fornecedor para o TOF10120.
int distance(int addr = 0x52) {
unsigned short dist = 0;
Wire.beginTransmission(addr);
Wire.write(0);
Wire.endTransmission();
delay(1);
Wire.requestFrom(addr, 2);
if (Wire.available() != 2)
return -1;
dist = Wire.read() << 8;
dist |= Wire.read();
return dist;
}
Primeiro define o endereço de leitura onde os dados de distância são lidos via Wire.write(0). Depois lê dois bytes consecutivos chamando Wire.read(), constrói o valor da distância juntando o byte alto e baixo, e retorna o valor da distância.
Note que, segundo a folha de dados, o endereço I2C de 8 bits do sensor TOF10120 é 0xA4, mas como a biblioteca Wire usa apenas os 7 bits mais altos para o endereço I2C, tens de usar o endereço de 7 bits correspondente 0x52. Também nota que não deves consultar o sensor mais rápido do que a cada 30 ms.
Poderias usar este código tal como está, mas implementei uma pequena TOF10120 library que vai facilitar-te a vida.
Instalar a biblioteca TOF10120
Para instalar a biblioteca TOF10120 vai a tof10120_arduino_lib repo aqui e clica no botão verde “Code”. Depois clica em “Download Zip” como mostrado abaixo:

No Arduino IDE cria o seguinte código de teste:
#include "TOF10120.h"
TOF10120 sensor = TOF10120();
void setup() {
Serial.begin(9600);
sensor.init();
}
void loop() {
Serial.print("distance:");
Serial.println(sensor.distance());
delay(100);
}
Depois vai a “Sketch” -> “Include Library” -> “Add .Zip Library..” e seleciona o ficheiro “tof10120_arduino_lib-main.zip” que acabaste de descarregar:

O código de teste é muito simples. Primeiro inclui a biblioteca TOF10120 e cria o objeto TOF10120 sensor. Na função setup() o sensor é inicializado e na função loop() chamamos finalmente sensor.distance() para ler a distância medida pelo sensor.
Se quiseres ligar o sensor a pinos SDA e SCL diferentes, podes especificá-los via sensor.begin(sda, scl); para placas ESP32 e ESP8266.
Executar código de teste para TOF10120sensor
Se carregares o código no teu Arduino, deverás ver valores de distância impressos no Monitor Serial. Se não houver nenhum objeto à frente do sensor, verás uma distância de 2000mm impressa.

Se abrires o Serial Plotter e colocares a mão à frente do sensor, movendo-a para mais perto ou mais longe, deverás ver um gráfico semelhante ao mostrado abaixo.

Se tiveres problemas e o sensor não parecer funcionar, certifica-te de que a ligação está correta e que os pinos SDA e SCL corretos estão a ser usados. Também podes verificar o diodo laser do sensor tirando uma foto com uma câmara digital (telemóvel). Embora a luz IR seja invisível ao olho humano, a câmara consegue vê-la. A imagem abaixo mostra o TOF10120 com o diodo IR claramente iluminado:

Na próxima secção vamos adicionar um OLED ao nosso circuito.
Adicionar um OLED para mostrar dados do TOF10120
Normalmente, queremos que a distância medida seja mostrada de alguma forma. Pode ser uma barra de LEDs ou, neste caso, um OLED. Como o OLED também é um dispositivo I2C, a ligação é simples. Ligamos SDA e SCL aos mesmos pinos onde o sensor TOF10120 está ligado. E como o OLED funciona a 3.3V, podemos também partilhar as linhas de alimentação. A imagem abaixo mostra a ligação completa.

Se tiveres dificuldades com o OLED, dá uma vista de olhos ao tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino. A imagem abaixo mostra a ligação completa numa breadboard real:

Código para mostrar dados do TOF10120 no OLED
Nesta secção escrevemos o código para mostrar a distância medida pelo sensor TOF10120 no ecrã OLED. Para escrever no OLED vamos usar a biblioteca Adafruit_SSD1306. Podes instalá-la via o Library Manager como de costume:

O código abaixo lê as medições do sensor TOF10120 e mostra-as no OLED. Vê o código completo primeiro e depois explicamos os detalhes.
// Measure distance with TOF10120 sensor and show on OLED
// by Makerguides
#include "Adafruit_SSD1306.h"
#include "TOF10120.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
TOF10120 sensor = TOF10120();
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void display() {
static char text[30];
int dist = sensor.distance();
sprintf(text, "%4d mm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
int w = map(dist, 0, 2000, 0, 120);
oled.drawFastHLine(4, 45, w, WHITE);
oled.display();
}
void setup() {
sensor.init();
oled_init();
}
void loop() {
display();
delay(100);
}
Bibliotecas e Inicialização do Ecrã
Começamos por incluir a TOF10120 Library e a Adafruit_SSD1306 Library para o ecrã OLED. Depois criamos o objeto oled e o objeto sensor.
#include "Adafruit_SSD1306.h" #include "TOF10120.h" Adafruit_SSD1306 oled(128, 64, &Wire, -1); TOF10120 sensor = TOF10120();
oled_initfunção
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 tens de alterar o endereço.
Se não souberes o endereço I2C, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino para o encontrar. Também o tutorial Use SSD1306 I2C OLED Display With Arduino te vai explicar mais sobre como usar um OLED.
função display
A função display() chama sensor.distance() para obter a leitura de distância do sensor TOF10120. 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];
int dist = sensor.distance();
sprintf(text, "%4d mm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
int w = map(dist, 0, 2000, 0, 120);
oled.drawFastHLine(4, 45, w, WHITE);
oled.display();
}
Além da saída de texto, a função display() também desenha uma linha horizontal abaixo do texto com um comprimento proporcional à distância medida. Se não houver nada à frente do sensor (ou mais longe que 2m), o ecrã mostrará a distância máxima de 2000mm e uma linha de comprimento total.

Se colocares um objeto à frente do sensor, o ecrã mostrará a distância medida em milímetros e uma linha mais curta. Vê o exemplo abaixo.

Se por algum motivo o sensor não conseguir obter uma leitura de distância, a função distance() retorna -1 e este valor será mostrado no OLED. No entanto, nunca me deparei com esta situação.
função setup
Na função setup() chamamos primeiro sensor.init() para inicializar o sensor TOF10120, e depois chamamos oled_init(), que inicializa o OLED.
void setup() {
sensor.init();
oled_init();
}
função loop
A função loop() simplesmente chama a função display() a cada 100 ms. Como mencionado antes, não deves ir mais rápido do que 30 ms, mas podes usar um atraso maior.
void loop() {
display();
delay(100);
}
E é tudo. Agora tens a tua própria ferramenta de medição de distância que pode medir com precisão distâncias entre 10mm e 2000mm.
Conclusões
Neste tutorial aprendeste a usar o Sensor de Distância TOF10120 com um Arduino para medir distâncias e mostrá-las num OLED.
O Sensor TOF10120 é um sensor muito pequeno, rápido e de alta precisão que usa luz laser infravermelha para medir distâncias. Especificamente, mede o tempo de voo do impulso laser refletido para calcular a distância a um objeto. Se procuras uma alternativa: um sensor muito semelhante com especificações comparáveis é o VL53L0X. E se precisares de um sensor com maior alcance, vê o TF Luna que pode medir distâncias até 8 metros.
Estes sensores, ao contrário de outros sensores de distância infravermelhos como o GP2Y0A710K0F ou o GP2Y0A21YK0F, que usam triangulação para determinar a distância com base no ângulo da luz IR refletida, têm um alcance maior e maior precisão comparados com os sensores GP2Y0A710K0F e GP2Y0A21YK0F.
Sensores de distância IR podem ser afetados por luz ambiente forte. Uma alternativa são os sensores de distância ultrassónicos, como o comum HC-SR04, que usam ondas sonoras para medir distância. No entanto, sensores laser IR são mais precisos e tendem a ter maior alcance comparado com sensores ultrassónicos, mas também são um pouco mais caros.
Se tiveres alguma dúvida, sente-te à vontade para deixar nos comentários.
Boas experiências ; )

