W artykule przedstawiamy opis wykonania elektronicznej, dwuosiowej poziomicy wykorzystującej w roli sensora popularny akcelerometr MEMS, która służyć będzie do pomiaru kąta względem powierzchni Ziemi, na podstawie uzyskanych danych mikrokontroler obrazować będzie wynik pomiaru na wyświetlaczu TFT w postaci efektownej libelli (pęcherzyka powietrza).

 

 

W przykładzie posłużymy się 3 osiowym akcelerometrem LIS35 firmy STMicroelectronics, który za pośrednictwem magistrali I2C komunikuje się z mikrokontrolerem STM32F103 z zestawu ZL27ARM. Do zestawu podłączono również wyświetlacz KAmodTFT2 prezentujący dane z czujnika. Schemat połączeń pokazano na rysunku 1.

 

Rys. 1. Schemat połączeń zestawu testowego (nie pokazano podłączenia diody LED D8, sterowanej z linii PB15, połączonych na płytce zestawu)

Rys. 1. Schemat połączeń zestawu testowego (nie pokazano podłączenia diody LED D8, sterowanej z linii PB15, połączonych na płytce zestawu)

 

Po konfiguracji sygnałów taktujących samego procesora program przygotowuje do pracy czujnik LIS35 (na module KAmodMEMS2) oraz wyświetlacz TFT. Na wyświetlaczu graficznym na czas inicjalizacji akcelerometru widnieje napis „Inicjalizacja”, w przypadku gdy LIS35 nie zostanie poprawnie wykryty przez urządzenie, obraz na LCD zmienia kolor na czerwony co sygnalizuje błąd akcelerometru.

 

Gdy wszystko jest w porządku, na ekranie wyświetlona zostaje bitmapa z rysunkiem tła dla poziomicy, na którym widnieją okręgi określające przechył KAmodMEMS2 względem osi X oraz Y.

Następnie w nieskończonej pętli odczytywane są rejestry x oraz y zawierające wartość przyspieszenia liniowego za pomocą funkcji:

która jako argument przyjmuje adres rejestru do odczytania.

Jako że współrzędne kulki na ekranie są bezpośrednio odczytane z rejestrów czujnika LIS35, program ogranicza wartość przyspieszenia w każdej z osi jeśli przekroczy ono pewien zakres, aby nasz wirtualny bąbelek powietrza nie znalazł się poza renderowanym obrazem.

Dosyć skomplikowana wydawać się może poniższa funkcja, która ma za zadanie w miejsce wcześniej narysowanego bąbelka powietrza przerysować wycinek z tła poziomicy, aby wyczyścić ekran.

Można by przerysowywać całą bitmapę tła ale strasznie długo to trwa, dlatego odświeżana jest tylko używana część ekranu. Funkcja przyjmuje następujące parametry:

*buffer – wskaźnik do tablicy z tłem poziomicy
*bufferball – wskaźnik do tablicy z rysunkiem stalowej kulki
xPos oraz  yPos – to pozycja wspomnianej kuleczki na tle
xSize oraz  ySize – określa wymiar bitmapy kulki do wyświetlenia.

Sama funkcja wygląda następująco:

W miejscu wyznaczonym przez akcelerometr rysowana zostaje bitmapa kulki z tym, że kolor czarny nie jest renderowany, a na jego miejsce jest przerysowywana piksel po pikselu bitmapa tła, aby kulka wyglądała profesjonalnie a nie jako kwadrat z rysunkiem kuli.

W momencie gdy uzyskamy poziom w osi x oraz y, kulka znajdzie się w środku najmniejszego okręgu narysowanego na tle, a buzzer wyda dźwięk informując nas dodatkowo o tym fakcie. Jako że bitmapa kulki jest na przemian usuwana oraz przerysowywana na nowo uzyskujemy efekt przeźroczystości, i zwykła bitmapa uzyskuje efekt bąbelka powietrza w wodzie.
Marcin Maszlanka, KAMAMI.pl