W drugiej części artykułu poświęconemu dekodowaniu sygnału PPM, przedstawiłem sposób na pomiar impulsów kanałowch przy użyciu przerwań. Ta metoda jest idealna do dekodowania „kombinowanego” sygnału CPPM (lub PPM-Sum), a możliwość ustawienia takiej postaci sygnału ma coraz więcej współczesnych odbiorników pracujących w systemach 2,4Ghz.

Wróćmy do rysunku zamieszczonego w pierwszej części artykułu. Pokazuje on sposób, w jaki w systemach analogowych sygnał PPM po przesłaniu do odbiornika był deszyfrowany na kolejne kanały. Przebieg CPPM był już wtedy obecny w każdym odbiorniku (między modułem odbiorczym a dekoderem kanałowym), ale nie był wyprowadzany na zewnątrz. W cyfrowych systemach 2,4GHz transmisja odbywa się inaczej, praktycznie każdy producent robi to po swojemu, w związku z tym aby udostępnić tę postać sygnału użytkownikom, oprogramowanie odbiornika musi być wyposażone dodatkowo w taką funkcjonalność. Wraz ze wzrostem popularności dronów (a przy okazji różnego rodzaju stabilizatorów lotu, przeznaczonych również dla płatowców), producenci coraz częściej wyposażają odbiorniki w tę funkcję. Dzięki niej nie trzeba już łączyć kontrolera lotu z odbiornikiem wieloma kabelkami (każdy kanał = jeden kabel), wystarczy tylko jeden przewód, po którym przesyła się sumowany sygnał.

Schematy powyżej pokazują przebieg sygnału zmierzony na wyjściu odbiornika RX-F801, opisanego we wcześniejszym artykule, na tym przykładzie omówię przećwiczony przeze mnie sposób dekodowania. Grafika ilustruje kilka rzeczywistych pomiarów, umieszczonych na jednej planszy. Porównując to z wcześniejszym rysunkiem, można zauważyć, że mamy do czynienia z sygnałem CPPM „negatywnym”. Jeśli przyjrzeć się impulsowi odpowiadającemu kanałowi 1, to widać, że jego szerokość to 0,8msec, natomiast odległość do kolejnego impulsu (a technicznie rzecz biorąc okres) to 1,1msec. I takiej wartości się spodziewałem, bo w tym przypadku kanał 1 odpowiada przepustnicy ustawiona na minimum, czyli 1,1msec (z uwzględnieniem zapasu na trymer). Przy kanale 2 okres wynosi 1,51msec i to odpowiada drążkowi lotek w położeniu neutrum, z kolei przełącznik na kanale 6 ustawiłem na maksimum, co daje spodziewane 1,9msec (z uwzględnieniem zapasu na trymer). Wynika z tego jednoznacznie (tak jak i z pierwszego rysunku) że deszyfracja impulsów kanałowych będzie polegać nie na mierzeniu szerokości impulsu, tylko jego okresu (lub inaczej czasu pomiędzy wystąpieniem kolejnych impulsów). Natomiast pomiar szerokości impulsu jest konieczny do rozpoznania przerwy synchronizującej. Na schemacie impuls trwa 10,21msec, ale jego szerokość (przy założeniu że ramki są powtarzane ze stałą częstotliwością) jest zmienna i zależy od szerokości impulsów kanałowych, im więcej drążków i przełączników ustawionych „na max”, tym krótsza będzie przerwa synchronizująca. Ta przerwa jest niezbędna, do ustalenia, kiedy rozpocząć cykl dekodowania – pierwszy impuls po synchronizującym to kanał 1, a po nim kolejne kanały, aż do 8-go.

Algorytm pomiaru oparty o przerwanie jest bardzo podobny do opisanego wcześniej sposobu. W tym przypadku mierzymy zarówno szerokość impulsu jak i jego okres, sekwencję pomiarową dla kolejnych kanałów rozpoczynamy po wykryciu przerwy synchronizującej, czyli impulsu o szerokości istotnie większej niż „normalna” szerokość impulsu kanałowego, ja przyjąłem wartość 4msec. Dla tego konkretnego odbiornika można byłoby założyć więcej, ale w standardowym przypadku, kiedy sygnał jest powtarzany z częstotliwością 50Hz (ramka 20msec) i korzysta się z 8 kanałów, to w najbardziej niekorzystnym przypadku (wszystkie manipulatory na max + trymery na max) przerwa ta może zejść do 3msec (20-8x2,1=3,2). Warto zaznaczyć, że początek dekodowania można oprzeć zarówno o zbocze narastające jak i opadające, ja założyłem, że „t1” i ”t3” oznacza zbocze narastające. Do pomiaru czasu użyłem niestandardowej biblioteki <eRCaGuy_Timer2_Counter.h>, opisanej w poprzednim artykule. Zamiast dodatkowej funkcji ‘timer2.get_micros()’, można oczywiście użyć standardowej ‘micros()’.

Schemat połączeń jest bardzo prosty. Przy zwarciu w odbiorniku kanałów 1 i 3, na wyjściu kan4 jest wyprowadzony sygnał CPPM. Podajemy go jednym przewodem do irq0 - wejście D2 płytki UNO, prócz tego oczywiście zasilanie (+5V, GND). Program testowy ‘cppm1’ (pobierz) mierzy wartości sygnału dla 8 kanałów i drukuje je co 0,5 sek na ekran (terminal), na początku wiersza znajduje się długość impulsu synchronizującego („kanał 0”).

Tak wygląda stan ustalony pomiaru, drążek przepustnicy (kan1) na minimum, przełącznik na kanale 6 na maksimum, pozostałe kanały w neutrum. Liczby są wyrażone w postaci (kanał: wartość w mikrosekundach), przykładowo 1:1104 = 1,104msec na kanale 1.

Przy zmianie położenia drążka gazu z min na max widać zmianę wartości na kanale 1 z 1,1msec do 1,87msec, przy czym impuls synchronizujący zmniejsza się z 10,5msec do 9,7msec.

Z kolei kiedy więcej kanałów zostanie ustawionych na max (1,2,3,4,6,8), to przerwa synchronizująca skraca się do 8,2msec.

W odwrotnym przypadku - kanały (1,2,3,4,6,8) na min - przerwa synchronizująca wydłuża się do 12,8msec.

Przy okazji tych testów, udało mi się zilustrować działanie funkcji FailSafe (FS) w odbiorniku. Po wyłączeniu nadajnika, w momencie kiedy część drążków (w tym przepustnica – kan1) była ustawiona max, odbiornik samoczynnie zaczyna generować na kanale 1 (gaz) minimum - 1,1msec, a na pozostałych kanałach neutrum – 1,5msec.

Niestety stabilność odczytów przy tej metodzie dekodowania sygnału jest taka sobie. Problem ten, jak już sygnalizowałem w poprzednim artykule, jest niejako „wbudowany” w dekodowanie software’owe. I chociaż metoda jest jak najbardziej poprawna, to nie do końca mamy wpływ na to, co jeszcze procesor robi w tym czasie. Wydaje się, że tylko sprzętowy pomiar długości impulsów z użyciem timerów da „czysty”, stabilny odczyt. Przy metodzie programowej, kiedy porówna się jak działa serwo podłączone wprost do odbiornika w porównaniu z serwem podłączonym do tego samego kanału przez dekoder na Arduino, to widać, że serwo za odbiornikiem po prostu stoi w miejscu, a to za dekoderem drga dość często. Momentami pojedyncze drgnięcia są nawet dość spore. Niestabilność odczytu widać na zrzutach z ekranu, należy jednak pamiętać, że są to odczyty co 0,5sek, niektóre „piki” nie łapią się na ekran. Próbowałem trochę bawić się w rożne filtry, ale sens tego typu rozwiązań zawsze jest dyskusyjny, albowiem w większym lub mniejszym stopniu filtrowanie zmniejszyć czułość reakcji odbiornika również na sygnał użyteczny, nie tylko na „zakłócenia”.

Postanowiłem sprawdzić jak zachowuje się taki dekoder w praktyce, czyli w rzeczywistym locie. Zmodyfikowałem program ‘cppm2’ (pobierz), dodając prosty filtr, pomijający zmiany odczytu wartości poniżej 24 mikrosekund (0,024ms) i uśredniający sygnał użytkowy do 3 ostatnich próbek.

Załadowałem go do modułu SGM-ArDeck, który został zbudowany właśnie pod kątem tego rodzaju zastosowań. Do testów użyłem latającego skrzydła DWS sterowanego 3-ma kanałami (gaz i sterolotki z mikserem „delta”). Odbiornik jest połączony z SGM-ArDeck jednym kablem, dwa serwa i regler są wpięte do modułu Arduino. Zastosowanie filtra poprawiło nieco zachowanie serw. „Podrygiwanie” zamieniło się raczej w okresowe buczenie, które nieraz występuje w modelach i bez tego rodzaju elektroniki. Co chwilę sterolotki robiły pojedyncze minimalne drgnięcia, optycznie zauważalne, ale na tyle małe, że wydawało mi się, że nie powinny mieć większego wpływu na lot.

Ogólnie test praktyczny potwierdził tę hipotezę. Najpierw polatałem ok. 10 minut z zamontowanym dekoderem, a potem go zdemontowałem (serwa ponownie podłączone wprost do odbiornika) i polatałem następne 10 minut, żeby w porównywalnych warunkach na gorąco poczuć różnicę (gdyby taka miała wystąpić). Nie zauważyłem nic specjalnego, może za drugim razem lot wydawał się odrobinę płynniejszy. DWS jest modelem dość czułym na wychylenia sterolotek, sądzę więc, że gdyby niestabilności dekodowania miały istotny wpływ na sterowanie, powinienem to wyczuć. Podejrzewam też, że wrażenie lepszej płynności za drugim razem było raczej spowodowane warunkami - akurat podczas tego testu zrobiło się prawie bezwietrznie. Dekodowanie nie miało natomiast zdecydowanie żadnego wpływu na kanał gazu. W normalnych warunkach przesunięcie drążka gazu o 1 ząbek zwykle daje słyszalny (i zauważalny) efekt, tutaj niestabilności dekodowania musiały nie przeszkadzać, bo gaz zachowywał się tak, jakby między reglerem a odbiornikiem nie było dekodera. Wynika to oczywiście z fizyki – śmigło ma większą bezwładność w porównaniu do powierzchni sterowych, a i oprogramowanie w sterownikach silników dba o płynność zmiany obrotów.

 

Podsumowanie

Wiele moich wcześniejszych teoretycznych eksperymentów, jak i ostatnie próby w locie, utwierdzają mnie w przekonaniu, że proste programowe metody dekodowania sygnału RC nie nadają się do wszystkich zastosowań. Mimo wykorzystania lepszych bibliotek, pozwalających na precyzyjniejszy pomiar czasu, potrzeba więcej wiedzy programistycznej, aby uzyskać idealnie stabilne wartości kanałowe. Zaprezentowana metoda sprawdzi się przy wolniej poruszających się modelach (również latających), nie wymagających dużej precyzji (rozdzielczości) sterowania. Natomiast tam gdzie występuje szybkozmienne precyzyjne sterowanie, powinniśmy szukać innych rozwiązań. Metoda sprawdzi się też w różnych urządzeniach/gadżetach pomocniczych, nie związanych z płaszczyznami sterowymi. Z nielicznymi wyjątkami (np. wielowirnikowce wyposażone w dedykowane reglery) również obsługa kanału gazu tą metodą nie powinna stanowić problemu. A przy okazji – może to będzie dla młodszych modelarzy ciekawostką – w początkach zdalnie sterowanych amatorskich modeli latających, drgający ster kierunku był czymś zupełnie normalnym. Tak budowało się wtedy aparatury 1-kanałowe, miały one 2 stabilne położenia (prawo-lewo), natomiast neutrum polegało na tym, że ster po prostu wychylał się z częstotliwością kilka Hz na zmianę w jedną i drugą stronę na maksimum. Miniaturowe serwomechanizmy nie były jeszcze dostępne dla amatorów, a ich rolę spełniał elektromagnes ze sprężyną (sterowanie oczywiście nie było proporcjonalne).

Nie masz uprawnień aby komentować.

Publikowane tutaj materiały i zdjęcia stanowią własność ich autorów, nie mogą być kopiowane oraz wykorzystywane bez ich zgody.
Strona niekomercyjna.