[PRZYKŁAD] Akcelerometr i magnetometr KAmodLSM303 + Arduino

Mając przygotowany i połączony sprzęt możemy można przejść do oprogramowania Arduino (pełny kod źródłowy znajduje się w sekcji „Do pobrania”). W pierwszym kroku dołączamy biblioteki sterujące wyświetlaczem LCD oraz czujnikiem LSM303. Następnie deklarujemy wszystkie niezbędne zmienne oraz funkcje. Krótkie omówienie ich roli znajduje się w komentarzach do kodu.

Funkcja klawiatura() umożliwia odczyt stanów przycisków na nakładce. Warto zauważyć, że wszystkie przyciski są połączone z jedną linią analogową mikrokontrolera. W związku z tym napięcie na tej linii informuje nas o tym, który przycisk został naciśnięty. Zalecane wartości dla poszczególnych przycisków zostały podane m.in. w przykładzie producenta. W naszym przykładzie, przyciski UP i DOWN zmieniają rodzaj wyświetlanych wartości, zaś przyciskiem SELECT włączamy procedurę kalibracji odczytów akcelerometru. Wartości wskazujące na naciśnięcie któregoś z tych przycisków limitowane są zarówno od góry, jak i od dołu tak, aby przyciski nieużywane w przykładzie (tj. LEFT i RIGHT) nie powodowały żadnej reakcji przyrządu. Obsługa zmiany wyświetlanych wartości polega na odwoływaniu się do bufora kołowego wskaźników do funkcji. W przypadku naciśnięcia przycisku UP do wskaźnika wskaznikFunkcji wpisywany jest wskaźnik na następną funkcję, w przypadku naciśnięcia przycisku DOWN – na poprzednią. W funkcji loop() aktualna funkcja wywoływana jest już przez wskaźnik. Takie rozwiązanie pozwala na szybkie i niezawodne przejście przez procedurę wyboru aktualnie wyświetlanej funkcji, zwłaszcza dla przypadku, gdy żaden przycisk nie jest wciśnięty.

W funkcji kalibracja() odbywa się kalibracja odczytów akcelerometru. Funkcja jest wywoływana raz na początku każdego użycia przyrządu. Można ją wywołać w każdej chwili przez naciśnięcie przycisku SELECT. Funkcja wypisuje na wyświetlaczu komunikat o ustawieniu w pozycji płaskiej. Pozycja płaska to taka pozycja, gdy płytka jest równolegle do ziemi, a czujnik znajduje się na górnej powierzchni płytki. Wtedy oś Z akcelerometru skierowana jest pionowo do ziemi. Tak ułożony jest czujnik na zdjęciu ukazującym podłączenie przyrządów. Funkcja informuje o rozpoczęciu procedury kalibracji, a także o jej zakończeniu. Wartości offset wyznaczone w tej procedurze pozwalają na dokładniejszy odczyt z akcelerometru.

Funkcja wyswietlPrzyspieszenie() odczytuje oraz wyświetla na ekranie wskazania akcelerometru w trzech kierunkach: X, Y i Z. Wyświetlane wartości są skalowane w zakresie ±2G (dwukrotność przyspieszenia ziemskiego), który jest domyślnie ustawiany w bibliotece. Wartości przyspieszenia są ułożone na ekranie w sposób intuicyjny: na górze od lewej X i Y, na dole od lewej Z i napis przypominający jakie wartości są obserwowane.

Funkcja wyswietlMagnetometr() działa podobnie jak funkcja poprzednia z tą różnicą, że wyświetla wskazania magnetometru. Warto zauważyć, że wskazania magnetometru nie są w tym przyrządzie kalibrowane. Domyślnym zakresem pomiarowym przy korzystaniu z biblioteki Pololu jest ±4 Gausy i do tej wartości skalowane są wyniki.

Funkcja wyswietlKompas() wyświetla odchylenie wektora X od bieguna N w stopniach, czyli działa jak prosty kompas. Wykorzystywana jest tu funkcja biblioteczna heading(). Kompas najlepiej sprawuje się, gdy leży równolegle do ziemi. Wszelkie odchylenia od tej pozycji znacznie zakłamują jego odczyt.

W funkcji setup() inicjalizowane są: ekran LCD, czujnik LSM303 oraz transmisja I2C. Wywoływana jest także procedura kalibracja(), aby skalibrować odczyty akcelerometru jeszcze przed jakimikolwiek pomiarami.

W funkcji loop() wywoływana jest procedura obsługi klawiatury, a następnie przez wskaźnik funkcja wyświetlająca odczyty zgodnie z aktualnymi potrzebami.

Działanie projektu przedstawione jest na poniższym filmie:

Do pobrania

O autorze