Guia de uso do Sensor VL53L0X Tempo de Voo com Display OLED e 3 Leds no Arduino

Tempo de leitura: 7 minutes

Neste novo Guia continuação demonstrando o uso do VL53L0X em um display OLED 0.96″ além de explicação de como o código funciona

Aqui está um módulo típico

O emissor VCSEL de 940 nm do VL53L0X (Laser Emissor de Superfície de Cavidade Vertical), é totalmente invisível ao olho humano, juntamente com filtros infravermelhos físicos internos, permite distâncias de alcance mais longas, maior imunidade à luz ambiente e melhor robustez para cobrir crosstalk óptico de vidro.

Módulo VL53L0X:  Sensor de distância Flight of Time

Para começar a usar o sensor VL53L0X, você precisará de um módulo que o integre para facilitar a interface do microcontrolador. Este é o Módulo- Sensor de Distância de Tempo de Voo, baseado no VL53LOX, e faz exatamente isso!

Suas especificações:

CaracterísticasDetalhes
Tensão operacional3.3V / 5V
Temperatura de operação-20℃ – 70℃
Distância de medição recomendada30mm – 1000mm
(3cm – 100cm)
Resolução1mm
Emissor infravermelho940 nm
Taxa de ônibusBarramento serial de até 400kHz (modo FAST)
Endereço IIC0x29

Além de suas especificações, o Módulo – Distância do Voo do Tempo contém exatamente os mesmos recursos, possibilidades de aplicação e muito mais!

Hardware necessário:

  • Sensor VX5301XV2  ou Equivalente x 1
  • OLED  128×64 SSD1306 – 4 pinos
  • Arduino Uno Rev 3 ou Equivalente
  • Led Vermelho  x 1
  • Led Verde x 1
  • Resistor de 220Ω x 2
  • Protoboard
  • Conexão de fios
  • Computador / Laptop
  • Cabo USB tipo A/B × 1

Conheça os monitores OLED:

O termo OLED significa “diodo emissor de luz orgânico”  usa a mesma tecnologia usada na maioria das nossas televisões, mas com menos pixels comparado a eles. É realmente divertido ter esses módulos de exibição interessantes para interagir com o Arduino, pois isso fará com que nossos projetos pareçam interessantes.

O monitor OLED não requer luz de fundo, o que resulta em um contraste muito agradável em ambientes escuros. Além disso, seus pixels consomem energia somente quando estão ligados; portanto, a tela OLED consome menos energia quando comparada com outras telas.

O modelo que estamos usando aqui tem apenas quatro pinos e se comunica com o Arduino usando o protocolo de comunicação I2C. Existem modelos que vêm com um pino de RESET extra. Existem também outros monitores OLED que se comunicam usando a comunicação SPI.

Ligação dos pinos

Como o monitor OLED usa o protocolo de comunicação I2C, a fiação é muito simples. Você só precisa se conectar aos pinos do Arduino Uno I2C, conforme mostrado na tabela abaixo.

PinoLigação para o Arduino Uno
Vin5V
GNDGND
SCLA5
SDAA4

Se você estiver usando uma placa Arduino diferente, verifique os pinos I2C corretos:

Nano: SDA (A4); SCL (A5);

MEGA: SDA (20); SCL (21);

Leonardo: SDA (20); SCL (21);

 

Esquemas / Layout

Bibliotecas

Para controlar a exibição do OLED, você precisa das bibliotecas adafruit_SSD1306.h e adafruit_GFX.h. Siga as próximas instruções para instalar essas bibliotecas.

1. Abra o Arduino IDE e vá para Sketch > Include Library > Manage Libraries. O Gerenciador de bibliotecas deve abrir.

2. Digite “SSD1306” na caixa de pesquisa e instale a biblioteca SSD1306 da Adafruit.

P3

3. Após instalar a biblioteca SSD1306 a partir do Adafruit, digite “GFX” na caixa de pesquisa e instale a biblioteca.

P4

4. Após instalar as bibliotecas, reinicie o IDE do Arduino.

 

Dicas para escrever texto usando essas bibliotecas

Aqui estão algumas funções que ajudarão você a lidar com a biblioteca de displays OLED para escrever texto ou desenhar gráficos simples.

  • display.clearDisplay() – todos os pixels estão desativados
  • display.drawPixel(x,y, color) – traçar um pixel nas coordenadas x, y
  • display.setTextSize(n) – defina o tamanho da fonte, suporta tamanhos de 1 a 8
  • display.setCursor(x,y) – defina as coordenadas para começar a escrever o texto
  • display.print(“message”) – imprima os caracteres no local x, y
  • display.display() – chame esse método para que as alterações tenham efeito

 

 

VL53L0X Arduino Guide

Já falamos sobre o VL53L0X e agora é a hora do momento que você está esperando; Como emparelhar o VL53L0X com um Arduino? Aqui está um guia para ajudá-lo a começar imediatamente!

Código simples mostrando no Monitor Serial

#include "Adafruit_VL53L0X.h"
 
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
 
void setup() {
  Serial.begin(115200);
 
  // aguarde até a porta serial abrir para dispositivos USB nativos
  while (! Serial) {
    delay(1);
  }
 
  Serial.println("Adafruit VL53L0X teste");
  if (!lox.begin()) {
    Serial.println(F("Falha ao inicializar VL53L0X"));
    while(1);
  }
  Serial.println(F("Exemplo de VL53L0X API Simple Ranging\n\n")); 
}
 
void loop() {
  VL53L0X_RangingMeasurementData_t measure;
 
  Serial.print("Lendo uma medição... ");
  lox.rangingTest(&measure, false); // passe 'true' para obter a impressão dos dados de depuração!
 
  if (measure.RangeStatus != 4) {  // falhas de fase têm dados incorretos
    Serial.print("Distância (mm): "); 
    Serial.println(measure.RangeMilliMeter);
  } else {
    Serial.println(" fora de alcance ");
  }
 
  delay(100);
}

Resultado

Abra o monitor serial, mova o sensor para mais perto e mais longe de objetos, por exemplo, sua mão

Exemplo de VL53L0X API Simple Ranging

Lendo uma medição … Distância (mm): 70
Lendo uma medição … Distância (mm): 70
Lendo uma medição … Distância (mm): 71
Lendo uma medição … Distância (mm): 72
Lendo uma medição … Distância (mm): 71
Lendo uma medição … Distância (mm): 71
Lendo uma medição … Distância (mm): 70
Lendo uma medição … Distância (mm): 71
Lendo uma medição … Distância (mm): 67
Lendo uma medição … Distância (mm): 114

 

Código mais elevado mostrando o Resultado no LCD 16×2 e no no Monitor Serial

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <VL53L0X.h>

#define SCREEN_WIDTH 128 // Largura da tela OLED, em pixels
#define SCREEN_HEIGHT 64 // Altura da tela OLED, em pixels

// Declaração para um monitor SSD1306 conectado ao I2C (pinos SDA, SCL)
#define OLED_RESET     -1 // Redefinir número do pino (ou -1 se estiver compartilhando o pino de redefinição do Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

VL53L0X sensor;

void setup() { 
  Wire.begin();

  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
  
  Serial.println(F("Exemplo de VL53L0X API Simple Ranging\n\n"));
} 

void loop() { 

  Serial.print("Lendo uma medição... "); 
    
  // Limpe o buffer
  display.clearDisplay();
  
  display.setTextSize(1);      // Escala normal de 1:1 pixel
  display.setTextColor(WHITE); // Desenhar texto em branco
  display.setCursor(0, 0);     // Comece no canto superior esquerdo
  display.cp437(true);         // Use a fonte completa de 256 caracteres 'Code Page 437'

  Serial.print("Distância (mm): "); 
  Serial.println(sensor.readRangeSingleMillimeters()); 

  display.print(F("Distancia (mm): "));
  display.println(sensor.readRangeSingleMillimeters());

  display.display();
  delay(500); 
}

 

Abaixo você verá em duas fotos ele rodando com a demonstração no LCD

Quando bati a foto, ele mediu a distancia entre o celular e o sensor
Quando tampei ele marcou a distancia não precisa de 74, mais se usar sem fechar ele mede mais correto.

 

 

Código mais elevado mostrando o Resultado no LCD 16×2 com 2 Led e no no Monitor Serial

Quando neste exemplo a distancia chegar a igual ou inferior a 90 (mm) ele acenderá o led VERDE, quando a distancia chegar for entre 170 e 300 ele irá acender o VERMELHO, e quando ele não tiver obstáculos próximo acima de 8000 ele acende o AZUL .

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <VL53L0X.h>

#define SCREEN_WIDTH 128 // Largura da tela OLED, em pixels
#define SCREEN_HEIGHT 64 // Altura da tela OLED, em pixels

// Declaração para um monitor SSD1306 conectado ao I2C (pinos SDA, SCL)
#define OLED_RESET     -1 // Redefinir número do pino (ou -1 se estiver compartilhando o pino de redefinição do Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

VL53L0X sensor;

void setup() { 
  Wire.begin();

  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
  
  Serial.println(F("Exemplo de VL53L0X API Simple Ranging\n\n"));

  pinMode(13,OUTPUT); // Led Vermelho 
  pinMode(12,OUTPUT); // Led Verde
  pinMode(11,OUTPUT); // Led Azul
} 

void loop() { 

  Serial.print("Lendo uma medição... "); 
    
  // Limpe o buffer
  display.clearDisplay();
  
  display.setTextSize(1);      // Escala normal de 1:1 pixel
  display.setTextColor(WHITE); // Desenhar texto em branco
  display.setCursor(0, 0);     // Comece no canto superior esquerdo
  display.cp437(true);         // Use a fonte completa de 256 caracteres 'Code Page 437'

  if (sensor.readRangeSingleMillimeters() <= 90) { 
      digitalWrite(13,LOW); 
      digitalWrite(12,HIGH); 
      digitalWrite(11,LOW);
  } 
  
  if (sensor.readRangeSingleMillimeters() >= 170 && sensor.readRangeSingleMillimeters() <= 300) 
  { 
    digitalWrite(13,HIGH); 
    digitalWrite(12,LOW); 
    digitalWrite(11,LOW);
  }

  if (sensor.readRangeSingleMillimeters() >= 8000) 
  { 
    digitalWrite(13,LOW); 
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH); 
  }
  
  Serial.print("Distância (mm): "); 
  Serial.println(sensor.readRangeSingleMillimeters()); 

  display.print(F("Distancia (mm): "));
  display.println(sensor.readRangeSingleMillimeters());

  display.display();
  delay(500); 
}

 

 

Abaixo você verá em duas fotos ele rodando com a demonstração no OLED com 3 leds (Azul, Vermelho e Verde).

 

Documentação Útil

Datasheet (aqui) (aqui)

Conclusão

Neste guia, mostrei como usar um sensor VL53L0X Tempo de Voo com OLED 0.96 com algumas opções de teste com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esses Sensores VL53L0X. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.