Lekcja 78: Wyświetlanie odległości z VL53L0X na LCD | Kurs Arduino Krok po Kroku


Ten przewodnik pokazuje, jak zbudować precyzyjny laserowy miernik odległości z wykorzystaniem czujnika czasu przelotu VL53L0X oraz wyświetlacza LCD 16x2 z modułem I2C. Ten projekt jest idealny dla twórców, którzy chcą dodać dokładny, bezdotykowy pomiar odległości do swoich konstrukcji. VL53L0X używa lasera do pomiaru odległości, co czyni go idealnym do zastosowań, w których czujniki ultradźwiękowe mogą mieć trudności, takich jak pomiar poziomu napełnienia zbiornika lub wykrywanie dokładnej pozycji obiektu na taśmie przenośnika.
Oto kilka praktycznych sposobów wykorzystania tego projektu:
- Automatyczny podajnik dla zwierząt: Mierz poziom karmy w pojemniku, aby wyzwolić doładowanie lub wysłać powiadomienie.
- Inteligentny kosz na śmieci: Wykrywaj, jak pełny jest kosz, i ostrzegaj, gdy wymaga opróżnienia.
- Domowy miernik wzrostu: Stwórz precyzyjne narzędzie pomiarowe dla małych przedmiotów lub do śledzenia wzrostu dziecka.
- Asystent parkowania: Zbuduj system czujników, który pomoże w precyzyjnym parkowaniu w garażu lub w ciasnym miejscu.
- Robotyka: Użyj go w robocie do wykrywania przeszkód lub pomiaru odległości do ściany w celu nawigacji.
Wymagany sprzęt
- Płytka Arduino (np. Uno)
- Czujnik odległości laserowej VL53L0X
- Wyświetlacz LCD 1602 z modułem I2C
- Przewody połączeniowe
Schemat połączeń
Okablowanie tego projektu jest proste dzięki protokołowi I2C, który pozwala zarówno wyświetlaczowi LCD, jak i czujnikowi komunikować się przez te same dwa przewody. Czujnik VL53L0X wymaga zasilania 5V, które jest pobierane bezpośrednio z pinu 5V Arduino. Aby zapewnić czujnikowi stabilne źródło zasilania, dodatkowy pin jest używany jako drugie VCC. (na filmie o 00:27)
Oto schemat połączeń:

Połączenia są następujące:
- VL53L0X VCC -> Arduino 5V i Pin 13 (Pin 13 jest ustawiony jako wyjście cyfrowe, aby zapewnić dodatkową stabilność zasilania).
- 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).
Jeśli używasz innego modelu Arduino, piny I2C mogą znajdować się w innym miejscu. Piny SDA i SCL są często oznaczone bezpośrednio na płytce. (na filmie o 02:42)
Wyjaśnienie kodu
Kod został zaprojektowany tak, aby był prosty w konfiguracji. Główne części konfigurowalne przez użytkownika znajdują się na samym początku szkicu. (na filmie o 04:18)
Najpierw definiujemy stałą dla dodatkowego pinu zasilania. Służy on do zapewnienia czystego zasilania 5V dla czujnika.
const int vcc2 = 13; // Dodatkowy pin VCC dla czujnika VL53L0X
Następnie tworzymy instancję biblioteki LCD i definiujemy jej adres I2C. Możesz znaleźć ten adres, uruchamiając szkic skanera I2C, jak pokazano na filmie. (na filmie o 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Ustaw adres LCD na 0x3F dla wyświetlacza 16 znaków i 2 linii
Na koniec znajduje się zmienna kontrolująca jednostkę miary. Możesz zmienić tę wartość, aby wyświetlać odległość w milimetrach lub centymetrach.
const int type = 1; // Ustaw na 1 dla milimetrów, 2 dla centymetrów
W funkcji setup() dodatkowy pin VCC jest skonfigurowany jako wyjście i ustawiony na HIGH, aby zapewnić zasilanie czujnika. Następnie inicjalizowany jest wyświetlacz LCD.
Główna logika w funkcji loop() odczytuje odległość z czujnika, czyści wyświetlacz LCD i wyświetla wartość wraz z jednostką. Gdy type jest ustawione na 2, odległość jest konwertowana z milimetrów na wartość zmiennoprzecinkową w centymetrach, aby uzyskać bardziej precyzyjny odczyt. (na filmie o 06:47)
Prezentacja działania projektu
W demonstracji czujnik jest testowany względem linijki w celu weryfikacji jego dokładności. Film pokazuje, że czujnik zapewnia bardzo precyzyjne odczyty, z odchyleniem zaledwie kilku milimetrów. (na filmie o 08:32)
Ważne jest, aby zauważyć, że czujnik ma maksymalny zasięg około 1,2 metra w trybie ciągłego pomiaru. Gdy cel jest poza zasięgiem, wyświetlacz pokaże wartość 8190. (na filmie o 09:53)
Kolejną kluczową obserwacją jest to, że czujnik może podawać niedokładne odczyty na silnie odblaskowych powierzchniach. Skierowanie go na błyszczący przedmiot może powodować znaczne błędy, podczas gdy skierowanie na matową powierzchnię daje dokładne wyniki. (na filmie w 10:42)
Kod jest również kompatybilny z różnymi wariantami modułów VL53L0X oraz większymi wyświetlaczami LCD, takimi jak model 2004, bez żadnych zmian w okablowaniu. (na filmie w 11:30)
Rozdziały filmu
- [00:05] Wprowadzenie do projektu VL53L0X i LCD
- [00:27] Schemat połączeń dla VL53L0X i LCD
- [02:51] Szczegółowe okablowanie na rzeczywistej płytce Arduino
- [03:26] Skanowanie adresów I2C
- [04:18] Wyjaśnienie kodu i konfiguracja
- [08:32] Demonstracja na żywo pomiaru odległości
- [09:53] Testowanie zakresu i ograniczeń czujnika
- [10:42] Dokładność na różnych powierzchniach
- [11:30] Testowanie z innym modułem czujnika i większym wyświetlaczem LCD
Obrazy
/*
* 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);
}
Rzeczy, których możesz potrzebować
-
AmazonPurchase VL53L0X from Amazonamzn.to
-
AllegroPurchase VL53l0x from eBayebay.us
Zasoby i odniesienia
-
ZewnętrznyArduino Library (GitHub)github.com
-
ZewnętrznyPurchase VL53l0x from eBayebay.us
-
ZewnętrznyVL53L0X datasheet (PDF)st.com
Pliki📁
Plik Fritzing
-
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