Projeto com Sensor de Distância Vl53l0x Arduino para Alta Precisão é uma excelente aplicação para makers que buscam uma solução eficiente para aplicação em seus projetos de desenvolvimento robótico, apresentando resultados com alto grau de precisão quando comparado a modelos comuns.
A precisão em projetos de controle e automação é a chave para bons resultados. Tendo isso em vista, o módulo traz consigo uma incrível capacidade de fazer medidas minuciosas, aliado a um excelente custo/benefício.
Suas aplicações são inúmeras, desde simples medições com finalidades de detectar obstáculos, implementar triggers e fazer médias estatísticas até controlar precisamente atuadores em equipamentos. Também pode ser usado para projetos de Internet das Coisas devido ao seu baixo consumo de energia (aproximadamente 20 mW), tornando-o excelente para Green IoT.
Dentre suas principais características, podemos citar a tensão de 3 a 5v e uma distância de medição absoluta de 2m, além da comunicação por I2C que permite a ligação de mais módulos.
Biblioteca Vl53l0x
A biblioteca Vl53l0x a ser utilizada é fornecida pela Adafruit. Ela contem diversas funções já implementadas para acesso aos dados que são gerados no sensor.
Para instala-la na IDE do Arduino, basta acessar o menu Ferramentas > Gerenciar Bibliotecas, pesquisar por “VL53L0X” e instalar a versão mais recente.
Esquemático Projeto com Sensor de Distância Vl53l0x
A comunicação com o Arduino é feita através de I2C. Além das conexões relativas a alimentação do módulo, em 5v, também devemos conectar o SDA (em amarelo) e SCL (em verde) do módulo na placa do Arduino.
Além das portas já citadas, o módulo também disponibiliza duas portas adicionais:
- GPIOI: este é um pino que é usado pelo sensor para indicar que os dados estão prontos. A biblioteca que usamos (Adafruit) não faz uso deste pino, mas para usuários avançados pode vir a ser útil.
- XSHUT: o pino de desligamento do sensor. Por padrão é definido como HIGH. Quando a tensão no pino é LOW, o sensor entra no modo de desligamento.
Importante lembrar que o módulo pode vir com uma película de proteção sobre o sensor. Você pode usar uma pinça para removê-la, conforme o gif abaixo. Nele, utilizei a YX-11ESD da Yaxun. Para que a leitura seja precisa, é necessário remover a película (VERIFIQUE SE O SEU SENSOR VEIO COM PELÍCULA).
Código Arduino Vl53l0x
A biblioteca utilizada abstrai diversos aspectos de leitura dos registro do sensor, simplificando muito a maneira de obter a medição realizada. Segue o código:
O início contém a rotina .begin do módulo, inicializando as funções internas necessárias do sensor e verificando se o mesmo está funcionando. Em seguida, criamos uma variável “measure”, declarada como um tipo intrínseco aquela classe, para armazenar o valor da leitura do registro do sensor. É por esse motivo que em seguida, na função .rangingTest, ela é passada com o símbolo &, pois está se apontando para o endereço de memória daquela variável, e não do valor em si da variável.
Na estrutura de controle if, a função RangeStatus retorna um valor diferente de 4 caso a leitura dos dados do sensor tenha sido concluída com sucesso. Na sequência, exibimos na Serial as informações obtidas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); void setup() { Serial.begin(115200); // wait until serial port opens for native USB devices while (! Serial) { delay(1); } Serial.println("Adafruit VL53L0X test"); if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while(1); } // power Serial.println(F("VL53L0X API Simple Ranging example\n\n")); } void loop() { VL53L0X_RangingMeasurementData_t measure; Serial.print("Reading a measurement... "); lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(100); } |
Como podemos verificar, a distância retornada pela função .RangeMilliMeter é data em milímetros. O delay também pode ser ajustado, porém o tempo de leitura do sensor não é controlado pela biblioteca da Adafruit.
Esse sensor proporciona um suporte consistente para montar diversos projetos, sensores de estacionamento, contador de passagem de pessoas, acionamento de servomotores, etc. No projeto abaixo, vamos integrar esse sensor junto a um display 16×2 através do I2C.
Projeto com Display 16×2 I2C
De forma a visualizar a distância do sensor, fora da IDE do Arduino, iremos utilizar o display 16×2. Primeiramente, como a comunicação com ele é feita através de Módulo I2C, devemos soldar uma conexão de endereçamento para poder ligar ele junto com o VL53L0XV2. Na figura abaixo, foi utilizado o A2 para alterar o endereço, tornando-o agora localizável no endereço 0x23.
Após ter soldado essa conexão, precisamos montar o circuito. Dessa vez conectando o SDA e SCL do Arduino juntamente com as respectivas conexões dos módulos, conforme diagrama abaixo.
Com essa configuração, o display estará no endereço 0x23, enquanto o sensor de distância estará no endereço 0x27. Em seguida, após terminar de montar o circuito, podemos integrar o código do display juntamente com o código anterior, do sensor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); LiquidCrystal_I2C lcd(0x23,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display void setup() { if (!lox.begin()) { while(1); } lcd.init(); lcd.backlight(); lcd.clear(); } void loop() { lcd.clear(); VL53L0X_RangingMeasurementData_t measure; lox.rangingTest(&measure, false); if (measure.RangeStatus != 4) { lcd.setCursor(2,0); lcd.print(measure.RangeMilliMeter); lcd.setCursor(5,0); lcd.print("mm"); lcd.setCursor(2,1); lcd.print(measure.RangeMilliMeter/10); lcd.setCursor(4,1); lcd.print("cm"); } else { lcd.print(" fora de alcance!"); } lcd.setCursor(5,0); lcd.print("mm"); delay(500); } |
A biblioteca LiquidCrystal_I2C pode ser instalada no menu de gerenciamento de bibliotecas. A rotina do void loop é muito parecida com a que usamos anteriormente, diferenciando-se pela inclusão das funções de exibição de dados no display. Por fim, como o sensor retorna a distância em milímetros, basta dividirmos o valor por 10 de forma a obter a distância em centímetros.
Conclusão
Nesse artigo foram apresentadas as características do módulo VL53L0XV2, além da maneira de conectar ele ao Arduino e usar a biblioteca da Adafruit para realizar a leitura da distância. Além disso, integramos o sensor a um display utilizando a comunicação I2C. A partir disso, é possível embasar-se nesses códigos e então desenvolver outros projetos.
Conheça toda linha de produtos Arduino no site da UsinaInfo.
Olá,
Gostaria de montar um projeto com esse Sensor de Distância Vl53l0x.
O projeto seria para usar ele no meu Throttle(acelerador) do meu simulador de vôo.
Tenho as seguintes placas Atmega 32 U4 5v 16MHZ e Teensy 2.0.
Por favor busco orientação !
Obrigado !
Humberto
Bom Dia Humberto! Caso opte por utilizar o Arduino Pro Micro ATmega32U4, que acredito ser o produto o qual se refere, você pode desenvolver este mesmo projeto de forma bem simples utilizando os pinos 2 e 3, observe apenas a distinção dos pinos SCL e SDA. Quanto ao código, deverá alterar os pinos de maneira compatível e realizar as devidas alterações, lembre também que na hora de compilar o código deve selecionar o módulo e a COM correspondentes.
Boa Matheus!
Estou utilizando um Arduino Pro Mico Atmega32U4 com o VL53L0X e estava tentando usar os pinos A2 e A3. Porém os pinos 2 e 3 se mostraram a solução!!
Obrigado pelo insight.
Sabe de algum sensor que consigo medir uns 20 metros +ou- de distancia??
Bom Dia Galba! Infelizmente até o momento não trabalhei com nenhum sensor com tanta distância e desconheço algum sensor Arduino que poça lhe satisfazer.
Gostaria de usar dois desses sensores em um projeto, você sabe me dizer como ficaria em relação ao endereço de memoria deles, tem alguma maneira de mudar? talvez usando um modulo i2c?
Boa Tarde Lucas! Existem métodos de alterar o endereço destes dispositivos sem a necessidade de outro módulo ou dispositivo através do pino XSHUT, um pino para parâmetro de configuração via código.