Măsurarea distanței folosind un senzor micro LIDAR VL53L0/1XV2
Azi am avut plăcerea să mă joc cu o plăcuță micro LIDAR VL53L0/1XV2, iar rezultatul măsurătorilor l-am trimis și pe bluetooth (just for fun).
Acestă plăcuță conține senzorul de rază laser VL53L0X de la ST, care măsoară distanța până la un obiect țintă aflat la o distanță de până la 2 m.
VL53L0X folosește măsurători ale timpului de zbor "time-of-flight" ale impulsurilor infraroșii (920 nm) pentru măsurare, permițându-i să ofere rezultate precise, independent de culoarea și suprafața țintei.
Măsurătorile distanței pot fi citite printr-o interfață digitală I²C. Placa are un regulator liniar de 2,8 V și schimbătoare de nivel "level-shifter" integrate care îi permit să funcționeze într-un interval de tensiune de intrare de la 2,6 V la 5,5 V.
Mai multe informații palpitante despre acest senzor se pot găsi pe website-ul pololu.
Componente
- ESP32 Development Board WiFi+bluetooth ULPower Consumption Dual Cores
- Senzor de distanta VL53L0X, Tehnologie ToF, Precis pana la 2 m, Interfata I2C, 20 x 15 mm, Multicolor
Schema electronica/sistem
Cod de test
/* | |
Florin Simedru | |
Complete project details at https://automatic-house.blogspot.com | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files. | |
The above copyright notice and this permission notice shall be included in all | |
copies or substantial portions of the Software. | |
*/ | |
/* | |
; PlatformIO Project Configuration File | |
; | |
; Build options: build flags, source filter | |
; Upload options: custom upload port, speed and extra flags | |
; Library options: dependencies, extra library storages | |
; Advanced options: extra scripting | |
; | |
; Please visit documentation for the other options and examples | |
; https://docs.platformio.org/page/projectconf.html | |
[platformio] | |
default_envs = esp32doit-devkit-v1 | |
[env] | |
monitor_port = COM7 | |
[env:esp32doit-devkit-v1] | |
platform = espressif32 | |
board = esp32doit-devkit-v1 | |
framework = arduino | |
monitor_speed = 115200 | |
upload_port = COM7 | |
lib_deps = | |
mbed-components/BluetoothSerial@0.0.0+sha.cf4d7779d9d6 | |
pololu/VL53L0X@^1.3.1 | |
*/ | |
#include <Arduino.h> | |
#include "BluetoothSerial.h" | |
#include<Wire.h> | |
#include <VL53L0X.h> | |
// Check if Bluetooth configs are enabled | |
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) | |
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it | |
#endif | |
#define LED_PIN LED_BUILTIN | |
void blink_test(); | |
// Bluetooth Serial object | |
BluetoothSerial SerialBT; | |
// Handle received and sent messages | |
String message = ""; | |
String distanceString; | |
char incomingChar; | |
// Timer: auxiliar variables | |
unsigned long previousMillis = 0; // Stores last time temperature was published | |
const long interval = 10000; // interval at which to publish sensor readings | |
uint16_t Distance_ui16; | |
VL53L0X sensor; | |
void setup() | |
{ | |
// Initialise I2C communication as MASTER | |
Wire.begin(); | |
// Initialise serial communication, set baud rate = 115200 | |
Serial.begin(115200); | |
// Bluetooth device name | |
SerialBT.begin("ESP32_DISTANCE_SENZOR"); | |
/* Initialize Buildin led pin (D2) for output */ | |
pinMode(LED_PIN,OUTPUT); | |
delay(300); | |
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() | |
{ | |
unsigned int data[2]; | |
unsigned long currentMillis = millis(); | |
Distance_ui16 = sensor.readRangeContinuousMillimeters() - 40; | |
// Output data to serial monitor | |
distanceString = "Distance : "+String(Distance_ui16)+" mm"; | |
if(Distance_ui16 <100) | |
{ | |
blink_test(); | |
distanceString += " Warning !!"; | |
} | |
Serial.println(distanceString); | |
// Send light luminance readings | |
if (currentMillis - previousMillis >= interval){ | |
previousMillis = currentMillis; | |
SerialBT.println(distanceString); | |
} | |
// Read received messages (LED control command) | |
if (SerialBT.available()){ | |
char incomingChar = SerialBT.read(); | |
if (incomingChar != '\n'){ | |
message += String(incomingChar); | |
} | |
else{ | |
message = ""; | |
} | |
} | |
if(message.isEmpty()==false) | |
{ | |
// Check received message and control output accordingly | |
if (message.equals("led_on") && message.endsWith("n")) | |
{ | |
digitalWrite(LED_PIN, HIGH); | |
Serial.println(message); | |
} | |
else if (message.equals("led_off")&& message.endsWith("f")) | |
{ | |
digitalWrite(LED_PIN, LOW); | |
Serial.println(message); | |
} | |
} | |
delay(500); | |
} | |
void blink_test() | |
{ | |
digitalWrite(LED_PIN, HIGH); | |
delay(500); | |
digitalWrite(LED_PIN, LOW); | |
} |
Rezultat
Conectarea dintre ESP32 si micro LIDAR VL53L0/1XV2
- VIN -> 5 V ESP32
- GND -> GND ESP32
- SCL -> D22 ESP32
- SDA -> D21 ESP32
Pentru testare am folosit o riglă din China și mâna stângă :). Se poate observa în poză distanța măsurată este de aproximativ 10 cm. Din ce am observat senzorul adaugă cam 40 mm la distanța măsurată. Probabil e o eroare internă de măsurare sau nu se face corect calibrarea. Sper să nu se amplifice pentru distanțe mai mari. Senzorul trimite valoare 8150 mm dacă nu vede nici un obiect în față pe o distanță de 2 m.
Mai jos se observă datele primite de la senzor afișate de aplicația Serial Bluetooth terminal. Am implementat și afișare unui warning dacă distanța scade sub 100mm.
Documentație proiect
- https://www.pololu.com/product/2490
- https://www.pololu.com/file/0J1187/vl53l0x.pdf
- https://randomnerdtutorials.com/esp32-bluetooth-classic-arduino-ide/
Afiliere eMag
Linkurile de la secțiunea "Componente" conțin adresa mea de afiliere la eMag.ro, iar dacă cumperi folosind aceste linkuri vei susține blogul meu. Mulțumesc!eMag Genius:
Hai și tu în Genius! Abonează-te la Genius 12 luni și primești beneficii premium și 20 lei card cadou eMAG. Profită acum! eMag Genius
Mulțumesc pentru atenție!
Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog mai jos în secțiunea de comentarii sau pe email simedruflorin@automatic-house.ro. O zi plăcută tuturor !