Search Code

Măsurarea distanței cu un senzor laser cu timp de zbor VL53L0X folosind Arduino

Măsurarea distanței cu un senzor laser cu timp de zbor VL53L0X folosind Arduino

În acest tutorial, vom explora cum să măsurăm distanțe folosind senzorul laser cu timp de zbor VL53L0X cu un Arduino. Acest senzor permite măsurători precise ale distanței și poate fi integrat în diverse proiecte, cum ar fi sisteme de robotică sau automatizare. Până la sfârșitul acestui tutorial, veți putea configura senzorul, să-l conectați corect și să scrieți codul necesar pentru a obține citiri ale distanței.

Vom acoperi componentele hardware necesare, instrucțiunile de cablare și o explicație detaliată a codului care operează senzorul VL53L0X. Pentru o reprezentare mai vizuală a procesului, asigurați-vă că urmăriți videoclipul asociat (în videoclip la 00:15).

Hardware Explicat

Componenta principală a acestui proiect este senzorul VL53L0X. Acesta este un senzor de distanță cu timp de zbor care funcționează prin emiterea unui fascicul laser și măsurarea timpului necesar pentru ca lumina reflectată să revină la senzor. Oferă măsurători ale distanței în milimetri și este capabil să funcționeze pe o gamă de distanțe, făcându-l potrivit pentru diverse aplicații.

În plus față de VL53L0X, veți avea nevoie de o placă Arduino pentru a procesa datele senzorului. Arduino va comunica cu senzorul prin protocolul I2C, care permite integrare și control ușor. Veți avea nevoie, de asemenea, de fire de legătură pentru a stabili conexiunile între senzor și Arduino.

Detalii din Fișa Tehnică

Producător STMicroelectronics
Număr de piesă VL53L0X
Tensiune logică/IO 1,8 V până la 3,6 V
Tensiune de alimentare 2,6 V până la 3,6 V
Curent de ieșire (pe canal)
Curent de vârf (pe canal)
Ghid de frecvență PWM
Praguri logice de intrare
Cădere de tensiune / RDS(on) / saturație
Limite termice -40 °C până la 85 °C
Pachet QFN-16
Note / variante Senzor cu timp de zbor, interfață I2C

 

  • Asigurați niveluri de tensiune adecvate pentru a evita deteriorarea senzorului.
  • Utilizați rezistențe de pull-up pe liniile I2C dacă este necesar.
  • Păstrați senzorul curat și fără obstacole pentru citiri precise.
  • Calibrați senzorul pentru medii specifice pentru a îmbunătăți precizia.
  • Verificați erorile de timeout în cod pentru a gestiona problemele de măsurare.

Instrucțiuni de Cablare

Pentru a conecta senzorul VL53L0X la Arduino, începeți prin conectarea pinului VCC de pe senzor la pinul de 5V de pe Arduino. Acest lucru este sigur deoarece senzorul are un regulator intern care îi permite să funcționeze cu o alimentare de 5V, funcționând totuși la niveluri de 3,3V. Apoi, conectați pinul GND de pe senzor la pinul de masă de pe Arduino.

Acum, conectați pinul SDA de pe senzor la pinul A4 de pe Arduino, care este linia implicită de date I2C. Apoi, conectați pinul SCL de pe senzor la pinul A5 de pe Arduino, care este linia implicită de ceas I2C. Pentru alte modele de Arduino, pinii SDA și SCL pot varia; de exemplu, pe Arduino Mega, utilizați pinii 20 și 21, respectiv. Asigurați-vă că toate conexiunile sunt sigure înainte de a alimenta sistemul.

Exemple de Cod & Explicație

În codul Arduino, începem prin includerea bibliotecilor necesare și inițializarea senzorului VL53L0X. În funcția setup(), configurăm comunicarea serială și inițializăm senzorul:

void setup() {
  Serial.begin(9600);
  Wire.begin();
  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();
}

Acest fragment inițializează senzorul și pornește modul de măsurare continuă. Funcția setTimeout(500) asigură că senzorul nu se va bloca la nesfârșit dacă nu reușește să citească o distanță.

În funcția loop(), citim distanța și o afișăm în monitorul serial:

void loop() {
  int distance = sensor.readRangeContinuousMillimeters();
  distance = distance - 55; // Compensează eroarea
  Serial.print("Distanța: ");
  Serial.print(distance);
  Serial.print("mm");
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
}

Această secțiune a codului preia măsurarea distanței și compensează orice eroare sistematică prin scăderea unei constante. De asemenea, verifică apariția timeout-urilor în cazul în care senzorul nu reușește să obțină o citire.

Demonstrație / Ce să Vă Așteptați

Când rulați programul, ar trebui să vedeți actualizări continue ale distanței măsurate de senzorul VL53L0X în monitorul serial. Citirile vor fi afișate în milimetri. Dacă mutați un obiect mai aproape sau mai departe de senzor, valorile distanței se vor schimba în consecință. Dacă apare un timeout, veți vedea un mesaj "TIMEOUT" care indică faptul că senzorul nu a reușit să citească distanța (în videoclip la 05:30).

Marcaje Temporale din Videoclip

  • 00:00 - Introducere
  • 00:15 - Prezentarea componentelor
  • 01:00 - Instrucțiuni de cablare
  • 02:30 - Explicația codului
  • 05:30 - Demonstrație
16-Source code for the VL523L0X distance measurement module for Arduino
Limba: C++
/* 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. 

Original source: https://github.com/pololu/vl53l0x-arduino
Modified by Ahmad Shamshiri for RoboJax.com
Date modified: Sep 26, 2017
*/


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

VL53L0X sensor;

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

  sensor.init();
  sensor.setTimeout(500);

  // 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()
{
  int distance =sensor.readRangeContinuousMillimeters();
 distance = distance -55;// -55 is to compensate for error. Change or set it to zero to make it work for your sensor
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.print("mm");
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}
17-Source code for VL53L0X distance measurement using two sensor modules for Arduino
Limba: C++
++
/* This example shows how to use continuous mode to take
range measurements with two VL53L0X sensors. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. 

Original source: https://github.com/pololu/vl53l0x-arduino
Modified by Ahmad Shamshiri for RoboJax.com
Date modified: June 06, 2018
Dennis from YouTube requested this code on June 06, 2018
*/


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

VL53L0X sensor1;// define object for sensor 1
VL53L0X sensor2;// define object for sensor 2

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

  sensor1.init();// initialize sensor 1
  sensor1.setTimeout(500);// set time out for sensor 1
  
  sensor2.init();// initialize sensor 2
  sensor2.setTimeout(500);// set time out for sensor 2
  

  // 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)).
  sensor1.startContinuous();// measure continuously for sensor 1
  sensor2.startContinuous();// measure continuously for sensor 2  
}

void loop()
{
  int distance1 =sensor1.readRangeContinuousMillimeters();// get distance for sensor 1
  int distance2 =sensor2.readRangeContinuousMillimeters();// get distance for sensor 2
  
 distance1 = distance1 -55;// -55 is to compensate for error. Change or set it to zero to make it work for your sensor
 distance2 = distance2 -34;// -35 is to compensate for error. Change or set it to zero to make it work for your sensor
 
  Serial.print("Distance 1: ");
  Serial.print(distance1);// print distance from sensor 1
  Serial.print("mm Distance 2: ");  
  Serial.print(distance2);// print distance from sensor 2 
  Serial.print("mm");
  if (sensor1.timeoutOccurred()) { Serial.print(" TIMEOUT 1"); }
  if (sensor2.timeoutOccurred()) { Serial.print(" TIMEOUT 2"); }  

  Serial.println();
}

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Fișier Fritzing

  • Adafruit VL6180X Time of Flight Distance Sensor
    Fritzing part for the Adafruit VL6180X Time of Flight distance sensor. This sensor measures absolute distance up to 100mm and ambient light, communicating via I2C. Includes the sensor breakout board and pin connections for use in Fritzing projects.
    Adafruit VL6180X Time of Flight Distance Sensor-1.fzpz 0.02 MB
  • Adafruit VL6180X Time of Flight Distance Sensor
    Fritzing part file for the Adafruit VL6180X Time of Flight distance sensor. This module measures absolute distance up to 100mm and ambient light, communicating over I2C. Includes the sensor breakout board with pins for power, ground, SDA, SCL, and interrupt.
    Adafruit VL6180X Time of Flight Distance Sensor.fzpz 0.02 MB

Alte fișiere