Mozgatható gimbal - probléma és megoldás

A probléma

Tulajdonképpen egyre használhatatlanabbá vált az állítható szögű gimbal, ugyanis repülés közben folyton elállítódott a gombal pitch értéke. Vagyis, felszálláskor szépen beállítottam a távirányítóval, hogy milyen szögben nézzen le a kamera, felszálltam és néhány másodperc múlva fogta magát és anélkül, hogy bármelyik gombot megnyomtam volna elkezdett felfelé, vagy lefelé fordulni a kamera. Természetesen, hogy ne legyen egyszerű az élet, tesztelés közben azt asztalon állva nem produkálta ezt a hibát.

Elemzés

Azt gyorsan kiderítettem, hogy nem az Arduino küld magától hülyeséget, hanem a dróntól kap rossz utasításokat az Arduino. Ezt nem volt nehéz kideríteni, hiszen ha lehúztam az Arduino-ról a drónból érkező jelvezetéket, a probléma megszűnt. Mivel azonban csak repülés közben tapasztaltam ezt, elég nehéz lett volna valódi mérést csinálni a jelvezetéken. (Bár, nem lett volna kivitelezhetetlen, de nem lenne egyszerű sem oszcilloszkóppal mérni a PPM jelet, miközben a drón repül.)

Első próbálkozás

Biztos összeszed a jelvezeték valami zajt, hát árnyékoljuk le! Ez volt az első gondolatom, meg is valósítottam. A gyári 4 érből álló kábelköteget kicseréltem egy szintén 4 eres, de árnyékolt kábelre.
Még azt is megtettem, hogy bár a kábelen bekötöttem az összes ért, a B+ eret nem csatlakoztattam, hiszen ha ott van a zavaró jel, azt ezzel beviszem az árnyékolás alá... (Bár jobban belegondolva, a szabadon lógó kábelvég sem túl jó ötlet.) Használva úgy sincs, minden a videóhoz köthető elem saját akkumulátorról megy.
Semmilyen javulást nem sikerült ezzel elérnem, ezért tovább kellett keresnem a megoldást.

Szoftveres megoldás

Ekkor ismét elővettem az Arduino szoftvert, illetve ránéztem oszcilloszkóppal a drónból jövő PPM (Pulse Position Modulation) jelre és összevetettem a kettőt. Arra jöttem rá, hogy az eredetileg írt szoftver nagyon lazán kezeli a PPM jelet. Tulajdonképpen semmilyen hibaellenőrzés nincsen benne, abból indul ki, hogy tökéletes jelet kell feldolgoznia. Bár fórumokon nem láttam jelét, hogy másnak is ebből gondja lenne, nekem így mégsem működik jól. Nekiláttam hát, hogy sokkal robosztusabbra átírjam a szoftver PPM értelmező részét.
Ha valakit érdekelnek a részletek, az X21 kamera csatlakozóján egy 3 csatornás PPM jel jön ki. Készítettem a teljes ciklusról gyorsan egy ábrát, de mivel úgy sincs nagy olvasótáborom, nem erőltettem meg magam, ne röhögjetek!
A lényeg tehát:
  • Legalább 21ms magas szint után jön 3db 0,4ms-os alacsony jelszint, amik között 1,1ms magas jelszint van. (Ez utóbbi 2db magas érték tulajdonképpen a másik két, nem használt PPM csatorna értéke.) Majd ez után ott a nagy, piros X, ez az ami minket érdekel. Vagyis az az idő, amíg ott magas állapotban van a jel. Ebből lehet dekódolni, hogy megnyomták-e a Video, vagy Photo gombot a távirányítón. (Ami ugye a mi gimbal irányításunknál a fel-le iránynak felel meg.)
  • Szkópos mérések alapján az X lehet 0,5ms, 1,1ms, vagy 1,7ms. (Alapahelyzet, Photo gomb, illetve Video gomb.)
  • A szoftver ahogy már említettem, eddig nagyon lazán kezelte ezeket a szabályokat. Egyszerűen csak szinkronizáláshoz használta a jelszint fel-le változását, nem ellenőrizte, hogy a fenti értékeknek megfelelő impulzusok érkeznek-e.
  • Fontos, hogy valamely kérdéses gomb megnyomása nem egyetlen ciklusban jelenik meg, hanem egészen a következő gombnyomásig az az érték mérhető. A Video gomb működésén legegyszerűbb ezt megérteni: amennyiben megnyomjuk a Video gombot, az impulzushossz a Video gombnak megfelelő 1,7ms-ra áll be és egészen addig ez az érték mérhető, amíg újra meg nem nyomjuk a video gombot. Ekkor visszaáll Alaphelyzet értékre. (0,5ms-ra.) Ez érthető, hiszen a távirányítón is ennek megfelelően "világít" a kamera jel. (Megnyomjuk, világít, ismét megnyomjuk elalszik.) Az érdekesség az, hogy a Photo gomb is így működik: bár a távirányítón csak egy pillanatra villan fel a fényképező jel, az X értéke addig 1,1ms marad, amíg újra meg nem nyomjuk a Photo (vagy a Video) gombot. Emiatt nagyon fontos, hogy minden esetben jól értelmezzük az impulzushosszt, hiszen ha pl. Photo impulzushossz után Alaphelyzet impulzushosszt érzékelünk, azt két Photo gombnyomásnak értelmezzük. (Vagyis kétszeres sebességgel kezd felfelé mozogni a kamera.)
  • A legfontosabb hiányosság szerintem az volt, hogy a mért X értékből csak a Video és a Photo gombra próbálta illeszteni az impulzushosszt. Ha nem illett egyikre sem, akkor Alaphelyzetként értelmezte az impulzust, ami az előbbiek ismeretében nagy hiba. Csak akkor mondhatjuk, hogy Alaphelyzet impulzust kaptunk, ha valóban 0,5ms körüli értéket mértünk.
  • Ez lett tehát a legfontosabb módosítás: Nem csak azt vizsgálja most már a program, hogy az impulzushossz megfelel-e a Photo, illetve a Video gombhoz tartozó impulzushosszal, hanem azt is, hogy az Alaphelyzet értéknek megfelel-e. Ha annak sem, akkor a program figyelmen kívül hagyja a kapott értéket, nem módosít semmit. A következő ciklus úgy is megérkezik kb. 25ms múlva, csak ennyi késlekedéssel kell számolni, ami belátható, hogy semmiség.
  • Emellett a program megméri mind a 4 alacsony szint idejét is és amennyiben nagyon eltér a 0,4ms-tól, szintén eldobja a kapott értékeket. Illetve a másik két csatorna idejét sem fogadja el, ha nagyon eltér a 0,5-1,7ms tartománytól. Ilyenkor is figyelmen kívül hagyja a ciklust.
Látható tehát, hogy a program az eddigiekhez képest már nagyon szigorúan elvárja, hogy a ciklusban mért impulzusok illeszkedjenek az ideális jelalakra. Amennyiben túl nagy eltérést tapasztal, nem tesz semmit. Vagyis, nem fogja megmozdítani a kamerát akkor, amikor nem akarom. A cél ez volt. A sérült ciklusok eldobásából semmit nem veszünk észre, hiszen a teljes ciklusidő kevesebb, mint 30ms, ekkora késlekedéssel kell számolni, ha egy ciklus nem elfogadható. 10 rossz ciklus is csak 0,3s késlekedést okoz a kamera megmozdításában, belátható hogy ez is észrevehetetlen.

Eredmény

Az első teszt alapján elmondhatom, hogy teljesen jó lett így már a szoftver, egyszer sem kezdett el repülés közben felfelé vagy lefelé mozdulni a kamera, amikor nem akartam. (Persze, ha megnyomtam a megfelelő gombot, akkor arra mindig reagált a gimbal.)
A forráskód itt érhető el.

Megjegyzések

Népszerű bejegyzések ezen a blogon

Akkumulátor problémák

Kamera