- Bazuje na akcelerometrze LM9S oraz na mikrokontrolerze 8-bitowym (ATmega8 lub ATmega168).
- Współpracuje z dowolną aparaturą do zdalnego sterowania.
- Wykorzystanie dwóch kanałów do sterowania ruchem dwóch serwomechanizmów.
- Wariant podstawowy jest przeznaczony do modeli samolotów.
Prezentowane przeze mnie rozwiązania mają charakter hobbystyczny, stąd wiele osób mądrzejszych ode mnie odbierze je jako niekompletne lub nadmiernie uproszczone. Sądzę jednak, iż taka forma prezentacji będzie lepiej przyswajalna dla osób, które podobnie jak ja, na co dzień nie zajmują się elektroniką lub modelami matematycznymi. Mam nadzieję, że uda mi się w prosty sposób pokazać krok po kroku zasadę działania systemu sterowania typu Head Tracking (podążanie za ruchem głowy). Istotne jest także to, że przedstawione techniki programowania oparte na timerach programowych oraz algorytmy takie jak filtr Kalmana będą miały zastosowanie w wielu innych projektach.
Artykuł ten jest przeznaczony dla osób mających choćby minimalną wiedzę na temat programowania w języku C systemów wbudowanych. Tak więc zaczynamy budować własny headtracker do zastosowań w lotnictwie, jednak tym razem nie będziemy sterowali karabinem maszynowym, ale kamerą podczepioną do samolotu RC.
Zasada działania
Kamera podczepiona do samolotu będzie sterowana w 2 płaszczyznach: oś pionowa Z (rozglądanie się w prawo i lewo) oraz oś poprzeczna X (spoglądanie do dołu i do góry). Pomijamy wzdłużną oś Y, ponieważ nie będziemy pochylali kamery na boki. Mimo tego finalne rozwiązanie umożliwi w prosty sposób dodanie tej funkcjonalności. Jest ona użyteczna w przypadku multikopterów i śmigłowców, które w odróżnieniu od samolotów poruszają się wzdłuż osi poprzecznej. Zatem zbudujemy urządzenie pomiarowe, które przyczepione do gogli z wbudowanym wyświetlaczem z dużą dokładnością wskaże nam kierunek patrzenia oraz pochylenie głowy. Informacje te przekażemy poprzez sterownik do urządzeń wykonawczych, które ustawią kamerę w żądanym kierunku.
Do osiągnięcia celu wykorzystamy cyfrowy układ IMU (Inertial Measurement Unit) zawierający żyroskop, akcelerometr oraz magnetometr. Jak się przekonamy w dalszej części artykułu, wszystkie 3 elementy muszą ze sobą współgrać, aby dokładne określić zwrot i kierunek w przestrzeni. W sprzedaży dostępnych jest wiele układów IMU, jednak do naszych celów musimy zaopatrzyć się w układ zawierający 3-osiowy żyroskop, 3-osiowy akcelerometr oraz 3-osiowy magnetometr.
Krótko przypomnę, iż żyroskop mierzy prędkość kątową (nie mylić z pomiarem kątów), akcelerometr przyspieszenie, a magnetometr wielkość pola magnetycznego. Przypuszczam, że użycie aż 3 pomiarów do uzyskania informacji o kątach, które możemy odczytać z samego żyroskopu może budzić wątpliwości. Niestety, rozwiązanie oparte jedynie na żyroskopie jest nieefektywne i nie jest zależne od jakości (i ceny) żyroskopu. W naszym wypadku możemy zaopatrzyć się nawet w tańszy układ, mający rozdzielczość niższą niż 16 bitów, co będzie bez znaczącego wpływu na efekt finalny. Stracimy przy tym na płynności poruszania kamerą, lecz błędy pomiarów zostaną zniwelowane dzięki wykorzystaniu odpowiedniego filtrowania.
Układy o rozdzielczości 16-bitowej mogą okazać się konieczne przy budowie różnego rodzaju stabilizatorów.
Nasze urządzenie zbudujemy na bazie układu LSM9DS0, który jest dostępny jako moduł z zamontowanym układem. Pojawia się kolejne pytanie: w jakim celu i w jaki sposób połączyć odczyty żyroskopu, akcelerometru i kompasu?
Wykorzystamy do tego celu Filtr Komplementarny oraz Filtr Kalmana. Definicja filtru Kalmana dostępna w Wikipedii jest następująca: „algorytm rekurencyjnego wyznaczania minimalno-wariancyjnej estymaty wektora stanu modelu liniowego dyskretnego układu dynamicznego na podstawie pomiarów wyjścia oraz wejścia tego układu”. Mogę obiecać, że to trudne do wypowiedzenia jednym tchem zdanie będzie zrozumiałe po przeczytaniu tego artykułu.
Kolejny element układanki to przekaźnik, który będzie wysyłał sygnały sterujące do urządzeń wykonawczych. W samolocie zdalnie sterowanym jest to nadajnik radiowy, poprzez który będziemy sterować serwami na pokładzie samolotu. Nadajnik będzie odbierał cyfrowy sygnał w modulacji PPM (Pulse Position Modulation) generowany przez nasz headtracker i przekazywał go drogą radiową do odbiornika znajdującego się w samolocie. Zatem niezbędne jest zapoznanie się z charakterystyką sygnału PPM wykorzystywanego w kontrolerze RC. Istotne dla nas informacje to:
- całkowity czas ramki PPM: 22500 μs,
- czas pauzy pomiędzy kanałami: 300 μs,
- czas dla pozycji centralnej: 1200 μs,
- czasy skrajnych wychyleń: ±512 μs (czyli od 668 μs do 1712 μs).
Czas pojedynczego kanału należy rozumieć jako sumę czasów poziomu wysokiego i pauzy, czyli przykładowo: dla pozycji centralnej czas wynosi 1500 μs (1200 μs + 300 μs). Na rysunku pokazano przykładową, 8-kanałową ramkę PPM, w której kanały 1 i 2 zostały ustawione w pozycjach skrajnych, natomiast pozostałe pozostawione zostały w pozycjach centralnych.
Niezależnie od czasów poszczególnych kanałów, całkowita długość ramki pozostaje stała poprzez odpowiednie dobranie czasu wypełnienia (sygnał synchronizacji). Serwomechanizm przyłączony do kanału 1 zostanie wychylone w jedną skrajną pozycję, na do kanału 2 w przeciwną skrajną pozycję. Pozostałe serwomechanizmy zostałyby ustawione w pozycji centralnej. My będziemy sterowali tylko dwoma serwomechanizmami poprzez dowolnie wybrane dwa spośród ośmiu kanałów. Do pojedynczego serwomechanizmu nie dociera pełna ramka PPM, a jedynie sygnał PWM (Pulse Width Modulation).
Konwersją ramki PPM do PWM i rozesłaniem sygnałów do poszczególnych serwomechanizmów zajmuje się odbiornik zdalnego sterowania.