Guia de uso do Sensor VL53L0X Tempo de Voo com Display OLED e 3 Leds no Arduino
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.
Conteudo
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ísticas | Detalhes |
---|---|
Tensão operacional | 3.3V / 5V |
Temperatura de operação | -20℃ – 70℃ |
Distância de medição recomendada | 30mm – 1000mm (3cm – 100cm) |
Resolução | 1mm |
Emissor infravermelho | 940 nm |
Taxa de ônibus | Barramento serial de até 400kHz (modo FAST) |
Endereço IIC | 0x29 |
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 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.
Pino | Ligação para o Arduino Uno |
Vin | 5V |
GND | GND |
SCL | A5 |
SDA | A4 |
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.
3. Após instalar a biblioteca SSD1306 a partir do Adafruit, digite “GFX” na caixa de pesquisa e instale a biblioteca.
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
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
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.