Neste tutorial, vais aprender a usar o Sensor de Distância a Laser VL6180X com um Arduino ou qualquer outro microcontrolador comum (ESP32/ESP8266) para medir distâncias até 100 mm.
O VL6180X é um sensor de distância Time-of-Flight (ToF) muito pequeno que usa luz laser infravermelha para medir a proximidade de um objeto. Ao medir o tempo que a luz demora a ser refletida por um objeto, consegue calcular distâncias com alta precisão. Devido ao seu alcance relativamente curto, é especialmente adequado como sensor de proximidade ou para reconhecimento simples de gestos.
Peças Necessárias
Obviamente, vais precisar de um Sensor de Distância VL6180X. Quanto ao microcontrolador, usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou ESP32/ESP8266 também serve, já que o sensor funciona com 5V ou 3.3V. Também vamos usar um OLED para mostrar as distâncias medidas pelo VL6180X num ecrã.

Sensor de Distância VL6180X

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 VL6180X
O VL6180X é um chip minúsculo (4.8 x 2.8 x 1.0 mm) com vários orifícios no topo. Um é para o emissor de luz laser, outro para o detector de luz laser e há também um detector de luz ambiente. Vê a imagem abaixo:

O VL6180X funciona emitindo um pulso de luz laser pelo emissor, recebendo a luz refletida de um objeto no detector e, com base no tempo que demorou (time-of-flight), calcula a distância até o objeto. A imagem abaixo mostra os cones do emissor (iluminação) e do detector (visão).

Aqui estão as principais características e especificações técnicas do VL6180X segundo o datasheet:

Nota que, embora o datasheet indique um alcance de 100 mm, consegui medir distâncias até 170 mm. Por outro lado, se o objeto estiver mais próximo que 10 mm, as leituras tornam-se imprecisas.
Esquema de Aplicação do VL6180X
O esquema de aplicação seguinte mostra a ligação externa necessária para usar o chip VL6180X. Podes ver os resistores pull-up para a interface I2C que liga o VL6180X a um microcontrolador, e dois condensadores que estabilizam a linha de alimentação de 2.8V.

SDA e SCL são os pinos para a interface I2C. GPIO0 é o pino de ativação do chip. Em sensores de distância laser semelhantes como VL53L1X ou VL53L0X este pino é chamado XSHUT (shutdown), que permite desligar o sensor quando puxado para baixo. Isto é útil se quiseres ligar vários sensores à mesma linha I2C. GPIO1 é um pino de interrupção que pode sinalizar ao microcontrolador que os dados estão prontos.
Em vez de usar diretamente o pequeno chip VL6180X, é melhor adquirir uma placa breakout que já integra a eletrónica acima e é muito mais fácil de ligar.
Placa breakout para VL6180X
A imagem seguinte mostra a placa breakout para o VL6180X. O chip retangular no centro é o VL6180X. A placa também tem um regulador de tensão e conversores de nível, para que possas ligar a placa a microcontroladores de 5V ou 3.3V.

O pinout corresponde em grande parte aos pinos mostrados no esquema de aplicação. SDA, SCL para I2C, VIN e GND para alimentação e GPIO1 como sinal de interrupção. SHDN (= GPIO0, XSHUT) é o pino de ativação/desligamento do chip. Finalmente, 2v8 é a saída de 2.8V do regulador de tensão a bordo, que pode fornecer até 100mA.
Ligação do VL6180X ao Arduino
Graças à interface I2C do VL6180X, ligá-lo a um Arduino é simples. Primeiro, liga os pinos SCL e SDA da placa breakout do VL6180X aos pinos correspondentes no Arduino conforme mostrado abaixo. Depois, liga o terra ao GND e 3.3V ao VIN do VL6180X e está feito.

A placa breakout do VL6180X funciona com 5V ou 3.3V e podes usar qualquer um para o VIN. A seguir, vamos escrever algum código para testar a função do sensor VL6180X.
Código para medir distância com VL6180X
Antes de poderes medir distâncias com o sensor VL6180X, terás de instalar uma biblioteca. As mais comuns são a Adafruit VL6180X Library e a VL6180X library by Pololu. No entanto, tive problemas com as bibliotecas da Adafruit ao escrever o tutorial para o VL53L0X Distance Sensor, por isso vou usar a VL6180X library by Pololu.
Instalar a Biblioteca VL6180X da Pololu
Para instalar a VL6180X library by Pololu, basta procurar por VL6180X, encontrar a da Pololu e instalá-la usando o Library Manager. A imagem abaixo mostra como fica depois de instalada a biblioteca:

Com a biblioteca instalada, vamos testar o sensor. O código seguinte lê as distâncias medidas pelo VL6180X e imprime-as no monitor serial.
#include "Wire.h"
#include "VL6180X.h"
VL6180X sensor;
void setup() {
Serial.begin(9600);
Wire.begin();
sensor.init();
sensor.configureDefault();
sensor.setTimeout(500);
}
void loop() {
Serial.println(sensor.readRangeSingleMillimeters());
delay(1000);
}
Vamos analisar o código de exemplo acima.
Inclusão de Bibliotecas
A primeira parte do código inclui as bibliotecas necessárias para a comunicação com o sensor.
#include "Wire.h" #include "VL6180X.h"
A biblioteca Wire.h é usada para comunicação I2C, que é como o Arduino comunica com o sensor VL6180X. A biblioteca VL6180X.h contém as funções e definições específicas para o sensor VL6180X, facilitando a interação com ele.
Criação de um Objeto Sensor
De seguida, criamos uma instância da classe VL6180X.
VL6180X sensor;
Esta linha declara uma variável chamada sensor que usaremos para aceder aos métodos fornecidos pela biblioteca VL6180X.
Função Setup
Na função setup(), inicializamos a comunicação serial e o sensor.
void setup() {
Serial.begin(9600);
Wire.begin();
sensor.init();
sensor.configureDefault();
sensor.setTimeout(500);
}
Serial.begin(9600)inicializa a comunicação serial a uma taxa de 9600 bits por segundo, permitindo enviar dados para o Monitor Serial.Wire.begin()inicializa o barramento I2C, permitindo a comunicação com o sensor.sensor.init()inicializa o sensor VL6180X, preparando-o para operação.sensor.configureDefault()configura o sensor com as definições padrão, garantindo que está corretamente configurado para medir distâncias.sensor.setTimeout(500)define um tempo limite para as leituras do sensor de 500 milissegundos. Se o sensor não responder dentro deste tempo, retorna um erro.
Função Loop
A função loop() lê continuamente a distância do sensor e imprime-a no Monitor Serial.
void loop() {
Serial.println(sensor.readRangeSingleMillimeters());
delay(1000);
}
A função readRangeSingleMillimeters() lê a distância medida pelo sensor e retorna-a em milímetros. Este valor é então impresso no Monitor Serial. Se o sensor não detectar nenhum objeto (fora do alcance), será impresso o valor 255. A captura de ecrã seguinte mostra algumas medições de exemplo no Monitor Serial:

A função delay(1000) pausa o programa por 1000 milissegundos (1 segundo) antes da próxima leitura, desacelerando as leituras do sensor.
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 do VL6180X
Como o OLED também é um dispositivo I2C, ligá-lo é simples. Basta ligar SDA e SCL aos mesmos pinos onde o sensor VL6180X está ligado. E como o OLED funciona a 3.3V, podemos também partilhar as linhas de alimentação.

Código para mostrar distâncias medidas pelo VL6180X no OLED
O código seguinte lê as medições de distância do sensor VL6180X e mostra-as no OLED. Dá uma vista rápida ao código completo primeiro, depois discutiremos os detalhes.
#include "Wire.h"
#include "VL6180X.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
VL6180X sensor;
void sensor_init() {
Wire.begin();
sensor.init();
sensor.configureDefault();
sensor.setTimeout(500);
}
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void display() {
static char text[30];
int dist = sensor.readRangeSingleMillimeters();
sprintf(text, "%4d mm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
oled.display();
}
void setup() {
oled_init();
sensor_init();
}
void loop() {
display();
}
Vamos dividir o código nas suas partes para melhor compreensão.
Bibliotecas Incluídas
No início do código, incluímos as bibliotecas necessárias para comunicação I2C (Wire), o sensor VL6180X e o ecrã OLED Adafruit SSD1306.
#include "Wire.h" #include "VL6180X.h" #include "Adafruit_SSD1306.h"
Se ainda não instalaste a Adafruit_SSD1306 Library, terás de o fazer. Basta instalar via Library Manager como de costume:

Inicialização de Objetos
Criamos instâncias do ecrã OLED e do sensor VL6180X. O ecrã OLED é inicializado com uma largura de 128 pixels e altura de 64 pixels.
Adafruit_SSD1306 oled(128, 64, &Wire, -1); VL6180X sensor;
Função de Inicialização do Sensor
A função sensor_init() inicializa a comunicação I2C e configura o sensor VL6180X com as definições padrão. Também define um tempo limite de 500 milissegundos para as leituras do sensor.
void sensor_init() {
Wire.begin();
sensor.init();
sensor.configureDefault();
sensor.setTimeout(500);
}
Função de Inicialização do OLED
A função oled_init() inicializa o ecrã OLED. Define o ecrã para usar a bomba de carga interna e especifica o endereço I2C (0x3C). O tamanho do texto é definido para 2 e a cor do texto para branco.
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Nota que o endereço I2C do ecrã 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 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.
Função de Exibição
A função display() lê a distância do sensor em milímetros e formata-a numa string. Depois limpa o ecrã OLED, define a posição do cursor, imprime a distância e atualiza o ecrã.
void display() {
static char text[30];
int dist = sensor.readRangeSingleMillimeters();
sprintf(text, "%4d mm", dist);
oled.clearDisplay();
oled.setCursor(20, 25);
oled.print(text);
oled.display();
}
Se o sensor não conseguir detetar um objeto, por estar fora do alcance, será mostrado no OLED o valor 255 mm:

Função Setup
Na função setup(), chamamos as funções de inicialização tanto do ecrã OLED como do sensor para os preparar para uso.
void setup() {
oled_init();
sensor_init();
}
Função Loop
Finalmente, a função loop() chama continuamente a função display(), permitindo que as leituras de distância sejam atualizadas no ecrã OLED em tempo real.
void loop() {
display();
}
O vídeo curto seguinte mostra o sensor VL6180X e o ecrã em ação:

Conclusões
Neste tutorial aprendeste a usar o Sensor de Distância VL6180X com um Arduino para medir distâncias e mostrá-las num OLED.
O Sensor VL6180X é um sensor muito pequeno que usa luz laser infravermelha para medir distâncias. O VL6180X é semelhante aos sensores VL53L1X, VL53L0X e TOF10120 mas tem um alcance mais curto. Se precisares de um sensor para um alcance muito maior, vê o TF Luna que pode medir distâncias até 8 metros.
É mais adequado como sensor de proximidade ou para reconhecimento simples de gestos do que como medidor de distância de longo alcance. Também inclui um sensor de luz ambiente integrado, embora eu não tenha conseguido obter leituras do sensor de luz usando a Biblioteca VL6180X da Pololu.
Se tiveres alguma dúvida, não hesites em deixar nos comentários.
Boas experiências ; )

