Záchrana neřiditelného RC modelu skrzevá Arduino

Dítko během posledních dvou let v modelářském klubu postavilo maketu říčního remorkéru ČSPLO „Bečva„. Bezmála metrový model pro soutěže v kategorii F2B (Naviga) vypadá moc hezky….

Jpeg

… jenže při prvním závodě se ukázala drobná chybička. Je to maketa říční lodi, takže má ploché dno a nemá žádný kýl. A na soutěžních modelech nesmí být kormidlo výrazně větší než maketové – takže je hodně malé. Výsledkem je, že loď se sice nechá ochotně sfouknout větrem ze svého směru, ale za to v podstatě nereaguje na kormidlo.

Sledoval jsem, jak se dítko v mírném větru snaží trefit alespoň do některých branek, ale loď se opravdu intenzivně bránila. A viděl jsem, že pokud s tím něco neudělám, při některém z dalších závodů asi model rozšlape vzteky a s modelářstvím skončí.

Loď je naštěstí poháněna dvěma lodními šrouby. Takže mi hned vytanula na mysl možnost řízení rozdílnými otáčkami motorů. Ale jak na to?

Nejprve jsem loď osadil dvěma nezávislými regulátory a strávil týden snahou naprogramovat vysílačku, aby to nějak uřídila. Principiálně by to šlo – je to variace na motýlkový mix, který všechny chytré vysílačky umí. Ale ďábel je jako obvykle schovaný v detailu. Například v tom, že tah lodního šroubu ve směru „dopředu“ je výrazně větší, než tah „dozadu“. Takže pro řízení při couvání je potřeba sčítat pokyny jiným způsobem, než při směru dopředu. A tam už jsem narazil. Takže všechno zahodit a znovu, je čas na Arduino.

Začneme výkonovým stupněm. Když stavět ručně, tak kompletně – nechci tedy použít modelářské ESC, radši si najdu něco, kde bude Arduino řídit motory samo. Pro obousměrné řízení motoru je potřeba „H-bridge“. Loď je osazena motorky, které sice velikostně odpovídají Speed 400, ale jsou tuším vykutané z pohonů ostřikovačů. Tedy jsou na 12 V a při napájení z 3S modelářské Li-Po baterky mají přes 100 W příkonu. To už nejde spínat ničím malinkým … takže jsem skončil u H-bridge normované na 43 A. A na rozdíl od běžné čínské produkce tohle vypadá na reálné číslo, chladič dole je velmi masivní.

2017-04-020

Jak motory řídit? Míchat kormidlo s motorem? Nakonec se ukázalo, že to není správná cesta. V běžném rybníku, na kterém se závodí, je spousta bordelu. Snadno se může stát, že se na jeden ze šroubů něco namotá a šroub přestane fungovat. Loď poháněná jen jedním šroubem jede plusmínus rovně … ale jen při plné výchylce kormidla směrem k běžícímu motoru. Přesně opačně, než bych v takovém případě dokázal uřídit s mixem kormidlo-motor. Takže je potřeba přidat další ovládací kanál. Nakonec jsme skončili s rozložením, kdy levá ruka řídí vektorování motorů (dopředu-dozadu je výkon, doprava-doleva směr) a pravá ruka řídí nezávisle kormidlo (doprava-doleva).

Tohle rozložení se ukázalo jako správné. Umožňuje bez omezení plného výkonu (oba motory 100 % dopředu) lehce řídit kormidlem, a zároveň při malých rychlostech či velkých zatáčkách přidat brutální manévrování rozdílem výkonu motorů (až extrémní režim, kdy jeden jede 100 % dopředu a druhý 100 % dozadu).

Ukázalo se, že motory se při plném výkonu (a při napájení z „leteckých“ 3S baterií s malým vnitřním odporem) odporně zahřívají. Takže bylo potřeba přidat chladič s ventilátorem, který na tyto motory přesně sedí.

2017-04-19 23.10.30

Ventilátor je třeba ovládat. Vykašlal jsem se na měření teploty motorů. Spotřeba ventilátoru není tak velká, aby to za to stálo. A udělal jsem nejjednodušší řízení – pokud je zapnutý motor, spustí se i ventilátor – a běží 30 sekund po vypnutí motoru.

Na spínání ventilátorů stačí jeden výkonový MOSFET – konkrétně IRL540N.

Celkové schema (zjednodušené, samozřejmě) je tedy zde:

2017-06-27 22.25.29

Zapojení v lodi:

2017-04-20 09.47.17

Jak vypadá software?

Vstupy z vysílačky (doleva-doprava, dopředu-dozadu) jsou připojené na vstupy D2 a D3. Vysílačka po nich posílá PWM signál – každých 10 msec se objeví kladný pulz délky 1 – 2 msec, jehož délka určuje požadovanou hodnotu. Délku pulzu měřím pomocí interruptů, aby se program moc nekomplikoval.

Naměřené hodnoty občas nepochopitelně poskočí – asi rušení (nebo jsem nepochopil něco na ISR v Arduinu). Takže zjevně špatné hodnoty (mimo rozsah 1000-2000 us) zahazuji rovnou. Zbytek kontroluji proti okolním hodnotám (když je hodnota výrazně odlišná od předešlé a následující, zahodí se). A výsledek průměruji exponenciálním klouzavým průměrem podle p. Kubáče. Tím získám spolehlivý zdroj dat z vysílačky, a kromě toho to dělá „přirozené“ (neskokové) doběhy motoru při prudké změně rychlosti/směru.

Mám vstupy z vysílačky. Ty zpracuji:

  1. Pokud jedu dopředu, pak k požadavku na tah (dopředu-dozadu) u jednoho motoru přičtu požadovaný směr (vpravo-vlevo) a u druhého totéž odečtu.
  2. Pokud jedu dozadu, provádím totéž, ale
    1. směr počítám opačně
    2. a pokud je výsledek motoru „dopředu“, tak ho jen vypnu (aby nepřetlačil motor táhnoucí dozadu a loď se nerozjela dopředu).

Tím získám požadavky na tah jednotlivých motorů a ty převedu na PWM výstupy do H-můstků. Elementary, my dear Watson.

Aplikace je ke stažení zde.

Výsledek? Loď reaguje na povely jak dobře vycvičený pejsek. Situace zachráněna, dítko spokojené.

Reklamy

komentáře 3

Filed under Mikrokontroléry - Arduino, ESP8266, Picaxe, ..., Počítače, vývoj HW a SW

3 responses to “Záchrana neřiditelného RC modelu skrzevá Arduino

  1. Štěpán

    Dobrý den,hezký článek ale kod mi píše,chybu“not_an_interrupt was not declared in this scope“,asi to chce nejakou knihovnu ale nikde ji nemohu najít.Díky

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s