Лекција 78: Прикажи растојание од VL53L0X на LCD | Arduino Чекор по чекор курс


Овој водич покажува како да изградите прецизен ласерски мерач на растојание користејќи го VL53L0X сензорот за време на летот и 16x2 LCD дисплеј со I2C модул. Овој проект е совршен за творци кои сакаат да додадат точно, бесконтактно мерење на растојание во своите креации. VL53L0X користи ласер за мерење на растојание, што го прави идеален за апликации каде ултразвучните сензори може да имаат потешкотии, како што е мерење на нивото на полнење во резервоар или откривање на точната позиција на објект на подвижна лента.
Еве неколку практични начини на кои можете да го користите овој проект:
- Автоматска хранилка за миленичиња: Измерете го нивото на храна во контејнер за да активирате дополнување или да испратите известување.
- Паметна корпа за отпадоци: Откријте колку е полна корпата и ве предупреди кога треба да се испразни.
- DIY мерач на висина: Креирајте прецизна алатка за мерење на мали објекти или за следење на растот на дете.
- Помош за паркирање: Изградете сензорски систем за помош при прецизно паркирање во гаража или тесен простор.
- Роботика: Користете го во робот за откривање пречки или мерење на растојанието до ѕид за навигација.
Потребен хардвер
- Arduino плоча (на пр., Uno)
- VL53L0X ласерски сензор за растојание
- LCD 1602 дисплеј со I2C модул
- Поврзувачки жици
Водич за поврзување
Поврзувањето за овој проект е едноставно, благодарение на I2C протоколот, кој овозможува и LCD-то и сензорот да комуницираат преку истите две жици. VL53L0X сензорот бара напојување од 5V, кое се зема директно од 5V пинот на Arduino. За да се обезбеди стабилен извор на напојување за сензорот, дополнителен пин се користи како секундарен VCC. (во видеото на 00:27)
Еве го дијаграмот за поврзување:

Поврзувањата се следниве:
- VL53L0X VCC -> Arduino 5V и Pin 13 (Pin 13 е поставен како дигитален излез за да обезбеди дополнителна стабилност на напојувањето).
- VL53L0X GND -> Arduino GND.
- VL53L0X SCL -> Arduino SCL (A5).
- VL53L0X SDA -> Arduino SDA (A4).
- LCD I2C VCC -> Arduino 5V.
- LCD I2C GND -> Arduino GND.
- LCD I2C SCL -> Arduino SCL (A5).
- LCD I2C SDA -> Arduino SDA (A4).
Ако користите различен модел на Arduino, I2C пиновите може да се наоѓаат на друго место. SDA и SCL пиновите често се означени директно на плочата. (во видеото на 02:42)
Објаснување на кодот
Кодот е дизајниран да биде едноставен за конфигурирање. Главните делови што корисникот може да ги прилагоди се на самиот врв на скицата. (во видеото на 04:18)
Прво, дефинираме константа за дополнителниот пин за напојување. Ова се користи за да се обезбеди чисто напојување од 5V за сензорот.
const int vcc2 = 13; // Дополнителен VCC пин за VL53L0X сензорот
Следно, креираме инстанца на LCD библиотеката и ја дефинираме нејзината I2C адреса. Оваа адреса можете да ја најдете со стартување на I2C скенер скица, како што е прикажано во видеото. (во видеото на 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Поставете ја LCD адресата на 0x3F за дисплеј со 16 знаци и 2 линии
Конечно, постои променлива што ја контролира единицата за мерење. Можете да ја промените оваа вредност за да го прикажете растојанието во милиметри или сантиметри.
const int type = 1; // Поставете на 1 за милиметри, 2 за сантиметри
Во setup() функцијата, дополнителниот VCC пин е конфигуриран како излез и е поставен на HIGH за да обезбеди напојување на сензорот. Потоа LCD-то се иницијализира.
Главната логика во loop() функцијата го чита растојанието од сензорот, го чисти LCD-то и ја печати вредноста заедно со единицата. Кога type е поставен на 2, растојанието се конвертира од милиметри во float вредност во сантиметри за попрецизно читање. (во видеото на 06:47)
Демонстрација на живиот проект
Во демонстрацијата, сензорот се тестира против линијар за да се потврди неговата точност. Видеото покажува дека сензорот обезбедува многу прецизни читања, со само неколку милиметри отстапување. (во видеото на 08:32)
Важно е да се напомене дека сензорот има максимален опсег од околу 1,2 метри во континуиран режим на мерење. Кога целта е надвор од опсегот, дисплејот ќе покаже вредност од 8190. (во видеото на 09:53)
Друга клучна забелешка е дека сензорот може да дава неточни отчитувања на високо рефлективни површини. Насочувањето кон сјаен предмет може да предизвика значителни грешки, додека насочувањето кон мат површина дава точни резултати. (во видеото на 10:42)
Кодот е исто така компатибилен со различни варијанти на модулот VL53L0X и поголеми LCD екрани, како што е моделот 2004, без никакви промени во жичањето. (во видеото на 11:30)
Поглавја од видеото
- [00:05] Вовед во проектот VL53L0X и LCD
- [00:27] Дијаграм за жичање на VL53L0X и LCD
- [02:51] Детално жичање на вистинска Arduino плоча
- [03:26] Скенирање за I2C адреси
- [04:18] Објаснување на кодот и конфигурација
- [08:32] Жива демонстрација на мерење растојание
- [09:53] Тестирање на опсегот и ограничувањата на сензорот
- [10:42] Точност на различни површини
- [11:30] Тестирање со различен сензорски модул и поголем LCD
Images
/*
* Lesson 76-1: Using One single VL6180 Laser Distance Sensor with Arduino
* Adafruit code modified for this tutorial
* by Ahmad Shamshiri at 22:22 on
* March 10-11, 2021 in Ajax, ON, Canada
Please watch video instruction of this code: https://youtu.be/_H9D0czQpSI
View code for using two or more VL6180X sensors: https://robojax.com/course1/lecture76
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. *
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.print(range);
Serial.println("mm");
}
// if(range <=76)
// {
// //do something
// }
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
}
Things you might need
-
AmazonPurchase VL53L0X from Amazonamzn.to
-
eBayPurchase VL53l0x from eBayebay.us
Resources & references
-
ExternalArduino Library (GitHub)github.com
-
ExternalPurchase VL53l0x from eBayebay.us
-
ExternalVL53L0X datasheet (PDF)st.com
Files📁
Fritzing File
-
Adafruit VL6180X Time of Flight Distance SensorFritzing 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.fzpz0.02 MB