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 |
5V | VCC |
GND | GND |
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.