Rozšíření ArduPilota o FrSky telemetrii.
-----------------------------------------------
V předchozím článku jsem popsal hardware a software ArduPilota.
V dnešním článku bych popsal jak jsem se popral s přenosem jeho telemetrických údajů
pomocí FrSky.
autor: CzechUavGuy
pripravil: Janko O.
Rozšíření ArduPilota o FrSky telemetrii
ArduPilot počítá s tím, že pokud má pilot zájem o telemetrické údaje, pořídí si telemtrické rádio jako toto od 3DR, které nezávisle na vysílačce přenáší telemetrii. To má samozřejmě výhodu v tom, že je to do jisté míry redundantní možnost kontroly letadla. Jako hlavní nevýhody tohoto řešení vidím cenu (19EUR a víc za klon na ebay), hmotnost, neveliký dosah a aerodynamický odpor antény. Vzhledem k tomu, že díky FrSky mám vlastní telemetrii zadarmo, rozhodl jsem se jí využít pro tento účel.
Má to dva háčky: ArduPilot používá k přenosu telemetrie vlastní (otevřený) protokol - MavLink a aby měla telemetrie smysl musí být přenos poměrně rychlý (56700bps ideálně). FrSky toto nepodporuje - má jiný protokol, navíc efektivní rychlost pro uživatelská data je jen cca 2400bps. Proto jsem se rozhodl že si vyrobím vlastní převodník MavLinku do FrSky. Použil jsem Arduino Pro Mini, které čte telemetrii z UARTu ArduPilota, má vlastní buffer ve kterém zprávy parsuje a po FrSky posílá vlastním formátem vyselektovaná zajímavá data (GPS polohu, výšku, náklon letadla, rychlost vůči zemi, napětí baterie, ...). Na zemi mám na vysílačce přidělané podobné Arduino, které přijímá tato data, konvertuje je zpět do protokolu MavLink a USBčkem je připojeno k pozemní stanici (notebook nebo androidí zařízení).
Popis HW řešení
ArduPilot má pro telemetrii dedikovaný UART port. Bohužel je to speciální konektor, který jsem si musel opatřit z ebay. Nestál moc, ale chvíli trvalo než dorazil. V ArduPilotovi jsou i další UART-y na plošňáku, ale nechtělo se mi tam nic pájet napevno. Z telemetrického portu vedou čtyři dráty - RX, TX, 5V, GND. Čiliže ideální kobinace pro napájení Arduina. Rozhodl jsem se použít to nejlevnější ($3), nejmenší (34x18mm) a nejlehčí (3.5g) Arduino - Arduino Pro Mini. To nemá vlastní USB převodník. Místo toho má 6 pinů pro připojení FTDI modulu. Těmito piny jej programuji a když je v letadle, tak do těchto pinů akorát krásně zapadne kabel s telemetrií včetně napájení - není tedy třeba pájet příliš mnoho pinů. Na druhé straně Arduina jsem musel přeci jen ještě jeden pin napájet - sem se připojí drát k FrSky přijímači, který mu bude posílat vyselektované a zkomprimované telemetrické údaje.
Na stranu vysílačky jsem opět použil Arduino jako převodník mé telemetrie získané z FrSky modulu. Z modulu přímo vedou dráty RX, TX, 5V, GND. Opět ideální pro Arduino. Zde se vyplatí použít Arduino Nano, protože nás již velikost netrápí, ale za to chceme mít převodník na USB. Alternativně by zde šlo použít druhé Arduino Pro Mini s FTDI programátorem. Já mám momentálně rozchozené Arduino mini s FTDI z toho důvodu, že všechna Arduino Nano co mám nemají FTDI převodník, ale nějaký jiný, levnější, s kterým si nerozumí Android.
Vzhledem k tomu, že FrSky používá invertovaný sériový port, tak je třeba signál invertovat, a to v obou Arduinech. Zde se opět hodí, že využíváme platformu Arduino, která umí používat softwarový sériový port, u kterého umí nastavit invertování. Takže není třeba ani žádný invertor. Softwarový sériový port s přehledem stíhá těch 9600bps, na kterých se odehrává přenos FrSky telemetrie.
Popis MavLinku
MavLink je opensource protokol, který je využíván nejenom ArduPilotem, ale i většinou konkurenčních projektů (Paparazzi, Parrot AR Drone, ...). Přesné typy zpráv se v jednotlivých systémech mohou lišit, systém jejich parsování je však stejný. O MavLinku více zde.
Popis mého protokolu
Můj program vychází z opensource projektu, který konvertuje MavLink do protokolu FrSky, viz github. Program jsem upravil, protože nevěřím tomu, že by stíhal vysílat data takovou rychlostí jakou slibuje. Pokud máte zobrazovadlo FrSky telemetrie např. DHT-U nebo ochytřený firmware ve vysílačce, vyzkoušejte zda přeci jen tento projekt nestačí pro Vaše potřeby.
Já žádné takové zobrazovadlo nevlastním, a navíc jsem chtěl přeci jen trochu lepší vizualizaci - mapu atd. Proto jsem se rozhodl, že přijatá data zkonvertuji zpět do MavLinku. Je tedy jedno, jakým protokolem jsou mezi přijímačem a vysílačkou předávána. Protokol je založen na 10ti bitové telemetrii, tak jak je popisována na zdejším serveru.
Princip vysílací strany je tento: přijmu z MavLinku packet a upravím podle něj globální stav, ve kterém držím všechny sledované parametry. S definovanou frekvencí pošlu o tomto globálním stavu informaci dál. Například s frekvencí 5Hz posílám údaje o náklonu letadla ve všech třech osách, s frekvencí 1Hz posílám údaje o GPS souřadnici atd.
Princip přijímací strany je tento: přijmu dvojbajtový packet, zjistím jakou informaci obsahuje, upravím podle toho globální stav a okamžitě o této změně pošlu MavLinkovou zprávu. Zde tedy občas dochází k artefaktům se souřadnicí GPS: Ta se nevejde do 10ti bitů a tak se musí rozpadnout do víc paketů. Na přijímací straně zatím chybí hlídání stavu, zda jsme obdrželi souřadnici celou, nebo jen její část - zbytek se totiž pamatuje z minule přijaté souřadnice. Takto se stává, když letadlo přeletí z jednoho stupně do druhého, že zobrazovadlo dostane informaci o minutách z předchozí souřadnice ale o stupních z aktuální. Neděje se to příliš často, a při dalším přenosu souřadnice problém zmizí. Opravit by to šlo např. heuristikou, časem to mám určitě v plánu.
Možnosti zlepšení
Bylo by krásné, kdyby vůbec nebylo potřeba Arduino pro vysílací stranu - kdyby byla filtrace a komprese dat provedena přímo v ArduPilotovi. Výkonu na to má dost. Problém je velmi rozsáhlý zdrojový kód a vůbec nesnadnost kompilace tohoto projektu.
Bohužel se mi zatím nepodařilo rozchodit uplink přes FrSky. Funguje tedy přenos informací pouze z letadla na zem, nikoliv naopak - a to i přes to, že jak modul ve vysílači tak přijímací modul mají vývody RX i TX.
Zatím se mi nedaří na přijímacím konci pro všechny druhy zpráv generovat správné MavLinkové commandy - ne každá hodnota bude zobrazena ve správně pojmenovaném parametru.
Zdrojové kódy pro obě Arduina jsou volně dostupné na GitHubu, viz
https://github.com/CzechUavGuy/APM-Mavlink-to-FrSky
Ve zdrojových kódech je k dispozici i "demoverze" tohoto projektu (receiving_part_test), která ukazuje možnosti tohoto projektu. Stačí nahrát tento projekt do libovolného Arduina, to posléze připojit k počítači nebo pomocí OTG kabelu k telefonu s Androidem, a spustit MissionPlanner nebo DroidPlanner. Po spojení s Arduinem by měl počítač/telefon zobrazovat "umělá" telemetrická data z virtuálního letadla letícího nad Prahou.