Sensor de distância laser VL53L0x

Posted by

O assunto de hoje é o sensor de distância a laser VL53L0x da ST semiconductos. É um sensor de distância que usa laser (não visível) e é capaz de medir até dois (2) metros. Se você quiser ler seu datasheet, ele está aqui.

sensor de distância laser VL53L0x
Sensor de distância VL53L0x na protoboard

Ele tem uma tecnologia que quase não importa a cor e a refletância do objeto alvo a ser medido, provavelmente funcionará. A “advertência” é que ele só pode ser usado para detectar objetos bem na sua frente.

Além disso, “tempo de voo” significa que ele mede o tempo que a luz leva para ir embora e voltar do alvo.

O circuito

Não há segredo no que estamos fazendo aqui, tudo o que você precisa são os dois pinos para i2c (SDA, SCL), 3V3 e GND.

Circuito de teste do VL53L0x
Circuito de teste do VL53L0x

Montá-lo em uma breadboard resultou no circuito abaixo, muito compacto mesmo. Você pode ignorar a placa de circuito roxa à direita, é um conversor de 5V para 3V3 AMS1117-3.3 não usado agora.

VL53

A biblioteca necessária para que este teste funcione no Arduino IDE é “VL53L0x by Pololu”. Para instalá-la vá em “Sketch > Include library > Manage library …” e digite “VL53L0x by Pololu”.

Testando o código

Após instalar a biblioteca no Arduino IDE, abri o exemplo “Continuous” em “File > Examples > VL53L0x > Continuous”. Ele é visto abaixo. Não houve necessidade de alterar nada no código.

/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

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

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  // Start continuous back-to-back mode (take readings as
  // fast as possible).  To use continuous timed mode
  // instead, provide a desired inter-measurement period in
  // ms (e.g. sensor.startContinuous(100)).
  sensor.startContinuous();
}

void loop()
{
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}

Posicionei uma caneca a 160-170 mm do sensor (veja abaixo) e as medições do VL53L0x estavam em torno de 184-187 mm. Não é tão ruim, mas não é exatamente preciso.

A mug close to the VL53L0x distance sensor
A mug close to the VL53L0x distance sensor
ESP32-C6 output on Arduino serial monitor, distance in mm
ESP32-C6 output on Arduino serial monitor, distance in mm

Usar a biblioteca Adafruit no Arduino IDE me deu resultados semelhantes, então não vou mostrar isso para você aqui. Em relação às diferenças de medidas, aparentemente o sensor tem seu próprio erro que não pode ser corrigido. Eu não usaria o sensor como uma régua digital, por exemplo, mas para medidas pequenas e menos precisas, seria apenas um ajuste.

Pra finalizar

Por mais barato que esse sensor seja, ele fornece medições bastante constantes e concisas. Como vimos, ele não é 100% preciso, mas pode ser corrigido manualmente, se necessário (no esboço).

Se você quiser saber mais sobre sensores de “distância”, leia sobre este de presença que escrevi há algum tempo. Caso queira comprar o sensor usado neste artigo (VL53L0x), clique no meu link de afiliado aqui.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *