Zaloguje się
or
Tel +48 698 615 740

Laserowy czujnik odległości vl53l1x z funkcją wyświetlania wartości na ekranie LCD

10 lutego, 2022

W tym artykule wykorzystamy wyświetlacz LCD z poprzedniego artykułu do wyświetlania wartości odległości z laserowego czujnika vl53l1x. Do komunikacji z mikrokontrolerem w przypadku tego czujnika posłuży nam interfejs komunikacyjny I2C.

Spis treści

  • Krótki opis
  • Specyfikacja
  • Kod programu
  • Pliki źródłowe

Krótki opis

Działanie laserowego czujnika odległości opiera się na wysłaniu wiązki lasera, która po napotkaniu przeszkody odbija się od niej wracając do odbiornika. Znając prędkość wiązki oraz czas jaki minął od wysłania do powrotu do odbiornika, jesteśmy w stanie w prosty sposób wyznaczyć odległość. Do wyświetlenia wartości otrzymanych z czujnika posłużymy się wyświetlaczem LCD, którego opis połączenia i zaprogramowania znajdziecie tutaj

Specyfikacja

Czujnik posiada 10 wyprowadzeń, z czego na potrzeby projektu użyjemy jedynie 4. Możliwa jest komunikacja czujnika za pomocą interfejsu UART, natomiast standardową magistralą komunikacyjną dla tego typu urządzeń jest I2C i z niej skorzystamy. Schemat połączeń jest bardzo prosty i przedstawia się następująco:

Arduino Czujnik
5VVCC
GNDGND
A5(SCL)SCL
A4(SDA)SDA

Użyta w projekcie płytka to Arduino Nano, należy pamiętać że dla każdej płytki piny obsługujące SCL i SDA mogą się różnić, dlatego w przypadku użycia innej płytki należy najpierw sprawdzić które piny spełniają dodatkową funkcję dla interfejsu I2C.

Schemat połączeń

Kod programu

W porównaniu do poprzedniego został urozmaicony o dodanie kilku funkcji do obsługi czujnika oraz zmianę wyświetlanego tekstu.

#include <SparkFun_VL53L1X.h> // Biblioteka do obsługi czujnika
#include <U8g2lib.h> // Biblioteka do obsługi wyświetlacza LCD
#include <SPI.h> // Biblioteka do obsługi komunikacji SPI
/* Zdefiniowanie pinów do komunikacji przez interfejs SPI */
#define SCL 13
#define SI 11
#define CS 10
#define RS 9
#define RSE 8
/*-------------*/
int odleglosc = 0; // Zmienna służąca do odczytania odległosci w mm
U8G2_ST7565_ERC12864_1_4W_SW_SPI u8g2(U8G2_R0, SCL, SI, CS, RS, RSE); // Stworzenie obiektu odpowiadającemu ekranowi LCD GMG12864-06D SPI v2.0
SFEVL53L1X czujnik; // Stworzenie obiektu do obsługi czujnika odległości

Początkowo dodano bibliotekę obsługującą czujnik oraz stworzono obiekt umożliwiający uruchomienie czujnika. Dodatkowo zainicjowano zmienna odleglosc służącą do przetrzymywania aktualnej wartości odległości.

int pomiar() // Funkcja realizująca pomiar odległości
{
  czujnik.startRanging(); // Konfiguracja czujnika
  odleglosc = czujnik.getDistance(); // Przypisanie do zmiennej odleglość dystansu dzielącego czujnik od najbliższej przeszkody w mm
  czujnik.clearInterrupt(); // Wyczyszczenie buforu
  czujnik.stopRanging(); // Zatrzymanie kalibracji
  return odleglosc; // Zwrócenie odległości
}

Funkcja pomiar() realizuje wszystkie działania niezbędne do poprawnego odczytu odległości. Za pomocą metody getDistance() otrzymujemy aktualny dystans w mm, a następnie po wyczyszczeniu bufora za pomocą komendy return odleglosc, zwracamy wartość odległości czujnika od przeszkody.

void setup(void) {
  u8g2.begin(); // Inicjalizacja ekranu
  u8g2.setContrast (10); // Ustawienie kontrastu na 10
  u8g2.enableUTF8Print(); // Urochomienie możliwości wyświetlania
  czujnik.begin(); // Inicjalizacja czujnika
  
}

Funkcje do obsługi wyświetlacza opisane zostały w poprzednim artykule, więc jedyną zmianą jaka zaszła jest dodanie inicjalizacji czujnika.

void loop(void) {
  u8g2.firstPage(); // Stworzenie pierwszej strony na wyświetlaczu
  do {  // Wyświetlaj dopóki
    u8g2.setFont(u8g2_font_pcsenior_8r); // Ustawienie czcionki Codeman38 o rozmiarze 8 pikseli
    u8g2.setCursor(30, 25); // Ustawienie kursora na pozycję x = 30, y = 25
    u8g2.print("Aktualna "); // Wyświetlenie napisu
    u8g2.setCursor(6, 35); // Ustawienie kursora na pozycję x = 6, y = 35
    u8g2.print("odleglosc w mm: "); // Wyświetlenie napisu
    u8g2.setFont(u8g2_font_luBS10_tf); // Ustawienie czcionki Luicida o rozmiarze 10 pikseli
    u8g2.setCursor(45, 55); // Ustawienie kursora na pozycję x = 45, y = 55
    u8g2.print(pomiar()); // Wyświetlenie wyniku pomiaru
    } while ( u8g2.nextPage() ); // Pętla wykonująca się dopóki funkcja zwraca wartość 1
  delay(1000); // Czekaj 1000ms 
}

Ze względu na długość napisów, czcionka została zmniejszona do 8 pikseli. Pozostałe ustawienia kursora zostały dobrane doświadczalnie, w celu uzyskania przejrzystego i dobrze spozycjonowanego napisu. Wyświetlanie aktualnej wartości odbywa się za pomocą wywołania funkcji pomiar(), która zwraca aktualny dystans w mm.

 

Pliki źródłowe

Sticky
Możliwość komentowania Laserowy czujnik odległości vl53l1x z funkcją wyświetlania wartości na ekranie LCD została wyłączona
Mateusz Pacia

Mateusz Pacia

Skończyłem studia na politechnice Wrocławskiej na kierunku Mechatronika. Zajmuje się tworzeniem i programowaniem układów z wykorzystaniem mikrokontrolerów STM32 i Arduino. W wolnych chwilach programuje w języku PHP i Java.

Comments are closed.

Strona korzysta z plików cookies w celu realizacji usługi i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.