Skip to Content

Sensor de Distância VL6180X com Arduino

Sensor de Distância VL6180X com Arduino

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

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

VL6180X Chip
Chip VL6180X (source)

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

Working Principle of VL6180X
Princípio de Funcionamento do VL6180X (source)

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

Features of VL6180X
Características do VL6180X (source)

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.

Application schematic for VL6180X
Esquema de aplicação para VL6180X (source)

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.

Breakout board for VL53L1X
Placa breakout para VL6180X (source)

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.

Connecting VL6180X with Arduino
Ligação do VL6180X com Arduino

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:

Installing VL6180X Library by Pololu via Library Manager
Instalar Biblioteca VL6180X da Pololu via Library Manager

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:

Distance Measurements of VL6180X on Serial Monitor
Medições de Distância do VL6180X 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.

Connecting OLED and VL6180X with Arduino
Ligação do OLED e VL6180X ao Arduino

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:

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

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:

Output of VL6180X on OLED
Saída do VL6180X no OLED

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:

Distance measurements with VL6180X sensor
Medições de distância com o sensor VL6180X

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