Za lot quadrocoptera, bądź każdego innego sprzętu zdalnie sterowanego, odpowiada całe mnóstwo, często bardzo złożonej elektroniki i oprogramowania, które tym steruje. Samoloty RC wykorzystują serwa podłączone wprost do odbiornika, które sterują lotkami i pojedyncze ESC do kontrolowania obrotów silnika. Nawet w tak prostej konfiguracji wykorzystujemy parę schematów komunikacji pomiędzy:
- aparaturą i odbiornikiem
- odbiornikiem i serwem
- odbiornikiem i ESC
W kopterach pojawia się dodatkowo kontroler lotu, który jednocześnie "rozmawia" z odbiornikiem, ESC, OSD, czy nadajnikiem FPV lub GPS. Do każdego rodzaju komunikacji może wykorzystywać inny sposób kodowania danych. Oczywiście, aby nasz kopter latał wystarczy często ustawić po obu stronach ten sam protokół i w ogóle się nie przejmować, ale jeśli chcemy zrozumieć trochę lepiej, co dzieje się "pod maską" to warto przeanalizować sposoby wymiany informacji pomiędzy modułami. Zaczynamy na razie od najprostszych, czyli PWM, PPM i cPPM.
Wprowadzenie
Czas ma znaczenie
Zanim zaczniemy musimy przypomnieć sobie parę jednostek czasu, które będą nam towarzyszyły w tym artykule. Sekunda składa się z 1000 milisekund (1s = 1000ms). Z kolei 1 milisekunda to 1000 mikrosekund (1ms = 1000us). Oznacza to, że w jednej sekundzie mieści się 1.000.000 mikrosekund (1s = 1000000us). Skoro już to wiemy, to proste przypomnienie z arytmetyki. Jeśli pojedyncza ramka będzie trwała 100ms to w jednej sekundzie zmieści się ich 10 (10 * 100ms = 1000ms = 1s). A jeśli ramka będzie trwała 50ms? Wtedy w ciągu sekundy wyślemy ich 20 (20 * 50 ms = 1000ms = 1s). Jeżeli nie jest to jasne, czytajcie do skutku, bo to musi być dla Was oczywiste zanim pójdziemy dalej.
Podstawy sygnałów - od napięcia do informacji
Aby zrozumieć omawiane dalej protokoły, musimy zgłębić nieco podstawy sygnałów cyfrowych. W elektronice informacje przenosi się wykorzystując poziomy napięcia. W momencie, gdy mierzymy je na uziemieniu, odczytujemy 0.0V. Podłączając się do zasilania na ogół uzyskujemy 3.3V albo 5V, zależnie od układu. W najprostszym ujęciu, strona odbiorcza jest w stanie odczytać przynajmniej dwa stany - jest napięcie (3.3V lub 5V) albo go nie ma (0.0V).
Popatrzmy teraz na bardzo prosty wykres, który przy okazji uporządkuje nam nazewnictwo. Poziom 0V nazywa się najczęściej stanem niskim, zaś 3.3V, czy 5V - stanem wysokim. Zmiana napięcia następuje bardzo szybko, dlatego na wykresach sygnałów najczęściej używa się pionowej linii sygnalizującej przeskok z jednej wartości na drugą, choć oczywiście w rzeczywistości dokładnie tak się nie dzieje, to czas ten jest tak nieznaczny, że w zasadzie w naszych rozważaniach pomijalny. Moment przejścia ze stanu niskiego (0V) do wysokiego (3.3V, 5V) to tzw. narastające zbocze. Z kolei spadek napięcia z wysokiego do niskiego nazywamy opadającym zboczem. Całość pokazuje rysunek poniżej.
W technice analogowej polegało się na pomiarze poziomów napięcia w kolejnych odstępach czasu. Powiedzmy, że były one w stanie ocenić wartość napięcia od 0V do 5V z dokładnością do 0.1V. Oznacza to, że możemy zakodować 51 różnych wartości (0V, 0.1V, 0.2V, 0.3V, ... 4.7V, 4.8V, 4.9V, 5.0V). Gdybyśmy zwiększyli dokładność do 0.05V, uzyskalibyśmy 101 wartości (0V też się wlicza, dlatego nie 100). Jak nietrudno zauważyć, wystarczyłoby to do przesłania wartości procentowej z dokładnością do 1%. Swego czasu OSD (kiedy były jeszcze osobną płytką - np. minimOSD) oczekiwały RSSI (siły odbieranego sygnału) w postaci analogowego poziomu napięcia 0-3.3V.
Metoda samego ustalania napięcia po jednej stronie i dokładnego pomiaru po drugiej nie jest bez wad, ponieważ na jego wartość wpływa np. rodzaj, jakość i długość przewodu. Aby tego efektu uniknąć, zdecydowano się pójść w nieco inną stronę. W technice cyfrowej założono, że wartość napięcia będzie wynosić wyłącznie 0V i 3.3V lub 5V zależnie od tego, jakiej wartości spodziewa się zasilany moduł, ale w zamian będzie się liczył czas, jaki minął od ostatniej zmiany sygnału. To akurat układy elektroniczne są w stanie bardzo dokładnie mierzyć.
PWM - Pulse Width Modulation
Tłumacząc nieco angielski skrót, PWM oznacza modulację szerokości impulsu. Modulacja to nic innego jak sterowanie (zmiana) daną wartością, zaś szerokość impulsu to jego czas trwania. W PWM wartości określamy mierząc okres pomiędzy narastającym zboczem sygnału, a opadającym. Im krócej utrzymuje się stan wysoki, tym niższa wartość.
W modelarstwie pojedyncza ramka PWM trwa 20ms. Co taki okres pojawia się impuls o długości od 1ms (1000us) do 2ms (2000us). Jak nietrudno policzyć, w ciągu sekundy jesteśmy w stanie dostarczyć 50 różnych wartości sygnału, ponieważ tyle ramek PWM mieści się w tym okresie czasu. Policzmy: 1s = 1000ms. 1000ms / 20ms = 50. To, dlatego właśnie pierwsze ESC odbierały sygnał sterujący właśnie 50 razy na sekundę, by potem wprowadzić tzw. FastPWM, który zwiększał rozdzielczość do 400Hz (czyli 400 razy na sekundę).
Jego wykorzystanie zaczęło się od serwomechanizmów zwanych potocznie po prostu serwami. Jest to niewielki silniczek, wraz z układem elektronicznym, który poprzez przekładnię pozwala sterować ramieniem na jego końcu. Sygnał PWM decydował o pozycji ramienia. Pracowało ono w zakresie wychyleń od 0 do 180 stopni i skrajne pozycje odpowiadały właśnie sygnałom 1000us i 2000us. Aby serwo było w stanie opierać się zewnętrznym siłom, sygnał musiał być podawany w sposób ciągły, aby pozostawało ono w zadanej pozycji. Zmiana sygnału powodowała także zmianę wychylenia serwa. Jak nietrudno się domyślić, serwa były stosowane m.in. w samolotach, aby sterować pozycją lotek, oraz śmigłowcach RC, w których serwa decydowały o wychyleniu płatów głównego wirnika.
Aby uprościć sprawę, odbiorniki RC dawały na wyjściu sygnał PWM oraz wyprowadzały zasilanie 5V i GND. Zupełnie "przypadkowo" serwo miało 3-pinową wtyczkę i aby działać potrzebowało zasilania (5V) oraz właśnie sygnału sterującego PWM. Tym samym, do starszych odbiorników (zanim pojawił się cPPM, iBus, SBUS itd.) można było bezpośrednio podłączyć serwo, aby nim sterować. To powodowało, że przeciętny samolot nie potrzebował kontrolera lotu, a jedynie odbiornik i podłączone do niego serwomechanizmy. Nie to, co dzisiaj - autopiloty, GPS, itd. :)
PPM - Pulse Position Modulation
Alternatywą dla wydłużania czasu trwania stanu wysokiego (PWM) jest wykorzystanie momentu czasu, w którym impuls się pojawił. Jak sama nazwa mówi, w schemacie PPM mierzymy czas, jaki upłynął od poprzedniego impulsu i na tej podstawie określamy, jaka była przesłana wartość sygnału. Im dłużej czekamy, tym wyższa. Sam impuls PPM jest zawsze tej samej długości, a zmiana wartości jest określana poprzez odstęp pomiędzy kolejnymi stanami wysokimi.
W podstawowym wariancie pik PPM trwa zawsze 0.5ms, zaś cała ramka od 1ms (najniższa wartość sygnału - 1000us) aż do 2ms (najwyższa - 2000us). Zaletą w stosunku do PWM jest krótszy czas ramki (2ms zamiast 50ms), a więc i częstsza możliwość wysłania informacji w tej samej jednostce czasu.
1000-2000 - skąd wzięły się te wartości w Betaflight?
Kiedy zaczynałem zabawę kopterami, nie mogłem pojąć dlaczego w zakładce Receiver w Betaflight aparatura pokazuje poszczególne wartości kanałów w zakresie 1000 do 2000. Nie lepiej już od 0 do 1000, albo od 0 do 100? Byłoby chyba czytelniej prawda? Tak jak umawianie się, że przełącznik 3-pozycyjny na aparaturze w pozycji dolnej wysyla 1000, w środkowej 1500, a w górnej 2000. Jaki to ma sens? Historyczny!
Zauważyliście, że w sygnale PPM, długość trwania sygnału dla poszczególnych kanałów waha się w granicach 1 milisekundy do 2 milisekund? A teraz przypomnijcie sobie co mówiliśmy o mikrosekundach. Tak właśnie - 1 milisekunda (ms) to 1000 mikrosekund (us) - dokładnie tyle wynosi minimalna długość sygnału dla pojedynczego kanału w PPM. Z kolei maksymalnie jest to 2ms, czyli właśnie 2000us. Te wartości pokazuje przecież Betaflight i nie tylko! Mimo, iż dziś sygnał jest przesyłany innymi protokołami i te wartości pozostały już tylko umowne, to tak naprawdę czerpiemy z historii, kiedy było to dokładne przełożenie 1:1. Aparatura widząc maksymalnie opuszczony manipulator wysyłała sygnał, który w PPM trwał 1.0ms, czyli 1000us. I to właśnie pokazuje nam Betaflight. Oczywiście stąd też wzięły się wartości środkowe. Manipulator pracując w zakresie 1000-2000 jest w połowie zakresu dokładnie przy wartości 1500. Tym samym taki kanał zakodowany by został jako impulsy PPM trwające w sumie dokładnie 1.5ms, czyli 1500us. Ot cała tajemnica!
Jak przesłać więcej kanałów na raz?
Dotychczas omawialiśmy przesyłanie sygnałów tak naprawdę dla pojedynczego kanału. Pamiętamy jednak, że sterując kopterem wysyłamy dane np. dla 8 na raz. Każdy manipulator pracuje w 2 osiach - poziomej i pionowej, a więc jego pozycję określamy dwoma parametrami i na to potrzebujemy dwóch kanałów (np. pitch i roll, lub throttle i yaw). Oprócz tego każdy przełącznik i pokrętło to osobny kanał, bo np. przełącznik 2-pozycyjny wysyła sygnał 1000us i 2000us (zależnie od pozycji). 3-pozycyjny domyślnie wykorzystuje 1000,1500 i 2000us. Oczywiście w aparaturze można zmienić wartość wysyłanych sygnałów, ale mówimy o pewnym bazowym przypadku. A więc wróćmy do tematu - jak właściwie wysyła się wiele sygnałów do kontrolera lotu poprzez odbiornik?
W przypadku PWM i PPM (ponownie w uproszczeniu - tutaj jest ich sporo) każdy kanał idzie osobnym przewodem. Jeszcze parę lat temu był to standard, dziś wyparty przez SBUS, i-Bus, czy DSMX, ale chcemy się na razie nauczyć, na jakiej bazie one powstały. A więc - odbiornik, który dostarcza sygnał PWM do kontrolera lotu na każdym przewodzie podaje pojedynczy kanał, wprowadzając pomiędzy każdym kolejnym pewne opóźnienie, aby kontroler lotu mógł odczytać wszystkie wartości z osobna, po prostu czekając na nie po kolei.
Teraz nasze wykresy zaczynają przypominać już bardziej realnie, co tak naprawdę zwykł widzieć kontroler lotu połączony z odbiornikiem PPM lub PWM. Przypominam, że w świecie kopterów praktycznie już się od tego odeszło, ale nie znaczy to, że nie powinniśmy rozumieć, jak to niegdyś było :) Ponadto jest to wstęp do analizowania kolejnych protokołów.
Inwersja sygnału - co takiego?
Mieliśmy o tym podyskutować przy okazji SBUS, ale najwyraźniej, żeby przeanalizować cPPM i tak musimy się z tym zmierzyć. Przypomnijmy sobie, jak wyglądały wspomniane już protokoły - np. PPM. A teraz wyobraźmy sobie, że wszędzie, gdzie był stan niski, teraz jest wysoki, zaś stan wysoki zastąpiliśmy niskim. Jest to dokładne odbicie sygnału wzdłuż osi poziomej. Popatrzmy na schemat:
Jak widzimy na ilustracji, dochodzi do lustrzanego odbicia poziomów napięcia. Często w takim przypadku spoczynkowym stanem jest wysoki, czyli napięcie jest cały czas obecne pomiędzy danym wyjściem, a masą. Początek sygnału zwiastuje więc spadek do 0, czyli stan niski. Ma to swoje uzasadnienie, ponieważ możemy łatwo rozróżnić sytuację odcięcia zasilania od braku sygnału. W tym pierwszym przypadku na pinie będzie cały czas stan niski, bo bez zasilania nie będzie on miał skąd się wziąć. Z kolei odbiornik może być zasilany, ale po prostu nie podawać sygnału, wtedy z kolei zobaczymy cały czas wysoki stan. Ot, proste rozwiązanie problemu.
cPPM - collective PPM
No dobrze, ustaliliśmy już, jak działa pojedynczy PPM i to bez inwersji sygnału, czyli wtedy, gdy pojedynczy pik w stan wysoki jest początkiem wartości. Tak jednak być nie musi. Równie dobrze cały czas możemy mieć stan wysoki, a spadek do 0 może rozpoczynać kolejną przesyłaną wartość. Właśnie w tym celu mówiłem o inwersji sygnału, ponieważ tutaj właśnie mamy tego typu przykład.
Wspominałem też o przesyłaniu więcej, niż jednego kanału na raz. Wystarczy wysłać je kolejno, a po przejściu wszystkich, powtórzyć cykl. Łącząc więc stan wysoki jako początkowy oraz przesyłanie wszystkich kanałów na jednej linii, przyjrzyjmy się sygnałowi cPPM, czyli collective PPM. W tłumaczeniu na nasz język jest to zbiorczy PPM i nazwa pochodzi właśnie od tego, że możemy przesyłać dane jednym tylko przewodem - wszystkie kanały razem, następująco po sobie.
Powyższy schemat jest trochę bardziej rozbudowany, niż poprzednie, ale w zamian przedstawia prawdziwą ramkę cPPM - dokładnie tak odbiornik skonfigurowany w cPPM będzie dostarczał dane kontrolerowi lotu.
Zacznijmy od tego, że ramka cPPM trwa dokładnie 20ms i to niezależnie od tego, co będziemy wysyłali. Musi się w niej zmieścić 8 kanałów, z czego każdy będzie zajmował od 1.0ms (1000us) do 2.0ms (2000us). Czas trwania dla pojedynczego kanału nie zmienił się w stosunku do PPM - wynosi od 1.0ms do 2.0ms zależnie od wartości sygnału. W sumie do przesłania mamy ich 8, czyli w skrajnym wypadku, gdyby każda z wartości była maksymalna (na każdym kanale mamy 2.0ms) to przesłanie danych zajęłoby nam 16ms (8 * 2ms = 16ms). Ramka cPPM ma, jak wspomnieliśmy wcześniej, stałą długość. Wynosi ona 20ms. Z uwagi na to, że dane zawsze będą wysyłane krócej, resztę czasu wypełnia się stanem wysokim.
Ramka cPPM zaczyna się impulsem synchronizacyjnym, który, jak pozostałe kończące każdy kanał, trwa 0.5ms. Po nim następuje pierwszy kanał. Ponownie mamy 0.5ms, a potem zależnie od pozycji manipulatora, czy przełącznika, stan wysoki utrzyma się od 0.5ms (0%) do 1.5ms (100%). Pojawienie się stanu niskiego oznacza koniec danego kanału. Strona czytająca sygnał cPPM orientuje się, że ramka się skończyła widząc wypełnienie, czyli długo trwający stan wysoki. Gdyby go nie było, albo był zbyt krótki, nie dałoby się określić który kanał właśnie czytamy i gdzie zaczyna się właściwie kolejna ramka. Taki problem występował w odbiornikach FrSky lata temu, ale został później poprawiony. Pamiętajmy o tym, że nie wszystkie dane dotrą do odbiornika, który wystawi je dalej, więc taki margines jest potrzebny. Impuls synchronizacyjny stanowi więc rozpoczęcie danych (tutaj wiadomo, że po nim nastąpi 8 kanałów, a więc 8 impulsów takich samych jak ten początkowy, po czym będzie dłuższa przerwa wypełniająca to 20 milisekund. Będzie to koniec poprzedniej i początek następnej ramki.
Jak widać, w ciągu sekundy jesteśmy w stanie przesłać 50 ramek cPPM (50 * 20ms = 1000ms = 1s). W praktyce oznacza to, że wykorzystując cPPM jesteśmy w tym okresie czasu w stanie przesłać 50 różnych wartości np. wychylenia poszczególnych manipulatorów.
Gdy teoria spotyka się z praktyką
Jeżeli chcecie zobaczyć, jak wygląda faktycznie sygnał cPPM na oscyloskopie to zapraszam do obejrzenia go w rzeczywistości poniżej - warto! Możecie też trochę lepiej zobaczyć, że to, co omawialiśmy sucho na wykresach, tutaj zaczyna ożywać. Tak, jeszcze parę lat temu tak właśnie się sterowało! :)
Co dalej?
Zapewne teraz drapiecie się w głowę i zastanawiacie po co właściwie wyjaśniałem protokoły, które niełatwo spotkać w dobie Crossfire (CSRF), SBUS, DSMX, R9, czy i-BUS. Bez tego rysu historycznego i zrozumienia rzeczy łatwych, trudniej byłoby przeanalizować, co stało za wprowadzeniem nowych, lepszych rozwiązań. Zrozumieliśmy też przy okazji skąd sygnał ma wartości o 1000 do 2000, co widzimy w zakładkach Receiver w każdym konfiguratorze kontrolera lotu. Będziemy więc na tej wiedzy budować nasze rozeznanie w kolejnych, tym razem współczesnych rozwiązaniach.
A póki co, szczęśliwych lotów i oby Was Failsafe nie opanował ;)