Stavíme kvadrokoptéru #2: Arduino a řízení otáček motoru

Adam Štrauch 22. 3. 2013

První díl seriálu o stavbě kvadrokoptéry měl nečekaný ohlas. Ozvala se řada lidí, že podle seriálu také začínají stavět, jiní se inspirovali a staví podle vlastních požadavků. Každopádně máme radost, že článek vyvolal takovou odezvu. Dnešní díl už bude praktičtější, protože se podíváme na řízení otáček motorů.

Pod minulým dílem se rozjela velmi inspirující diskuse. Bohužel jsem neměl dost času, abych na všechny příspěvky reagoval. Děkuji všem, kteří první díl v diskusi chválí i těm ostatním, kteří přinesli zajímavé podněty ke zlepšení. Rád bych reagoval alespoň na některé důležité věci, které v diskusi zazněly.

Jednou ze zmíněných věcí byla legislativa. Něco málo jsem si na toto téma přečetl, když dorazily první kousky kvadrokoptéry, ale od té doby jsem otázku jak lítat podle pravidel neřešil. V současné fázi není projekt v takovém stavu, aby se zvedl ze země, natož aby mohl dělat nějaké problémy. Videa, z minulého článku, natočili jednotlivci, kteří jsou za své chování zodpovědní a když jsem na ně odkázal, nechtěl jsem někoho lákat k porušování pravidel. Zatím bych tedy uvedl odkaz na web úřadu pro civilní letectví, kde je o legislativě napsáno mnohé a seriál jí budu věnovat přibližně někde úplně na konci, až bude mít kvadrokoptéra schopnost ohrožovat své okolí.

Druhý důležitý bod, který byl v diskusi zmíněn, je ovládání. Rozhodl jsem se pro Raspberry Pi, protože jsem ho chtěl dostat do vzduchu a protože to je deska, která ještě ledasco ukáže. Pokud na kvadrokoptéře sedí Raspberry Pi, je úplně jedno, čím bude ovládaná. Může to být program na vašem notebooku, nějaký algoritmus nebo v diskusi doporučovaná vysílačka. Rozhodl jsem se pro WiFi a telefon, protože to jsou známé technologie za směšnou cenu, lze přes ně přenášet libovolná data a dosah je pro potřeby vývoje i samotné létání více než dostačující. V seznamu komponent v prvním díle WiFi nenajdete. Je to možnost, ale pro vývoj bohatě postačí i ethernetový kabel. Seriál budu ovládání věnovat, až bude stát kvadrokoptéra alespoň trochu stabilně ve vzduchu.

Pak byla v diskusi zmíněna další věc, a to flashování regulátorů. Ty jsou totiž naprogramovány tak, aby pracovaly se vstupem od člověka, který má řádově jiné reakce než Arduino. Regulátory průměrují signál, který je řídí a tím komplikují programovou stabilizaci. Některé zdroje ale uvádí, že stačí s regulátorem komunikovat na frekvenci 400 Hz a tento vliv zmizí nebo se alespoň značně omezí. Některé regulátory toho schopny nejsou, ale TURNIGY Plush ze seznamu z minulého článku s tím problémy nemá. Regulátorům je věnován dnešní díl seriálu, ale k frekvenci 400 Hz se dostaneme až jindy.

Pájení konektorů

Regulátor je zařízení napájené z baterie, které je schopné regulovat proud tekoucí do motoru. V dnešní době se používají střídavé motory kvůli jejich účinnosti a výkonu, takže regulátor si ještě musí poradit se správně načasovaným spínáním jedné ze třech cívek. Nicméně tuto část můžeme vynechat, protože regulátor je pro nás teď černá krabice, do které nevidíme. Nás zajímá hlavně, jak ho připojit k motoru, k baterii a jakým způsobem mu posílat signál, aby začal manipulovat s motorem. Další důležitou části regulátoru je tzv. BEC (Battery Eliminator Circuit). Jde o obvod, ze kterého dostaneme zdroj napětí a proudu pro elektroniku. Ten není součástí všech regulátorů, ale těch vybraných v minulém článku ano.

Z regulátoru vede celkem osm vodičů. Dva tlusté vodiče slouží k napájení a připojují se přímo na baterii. Poslední tři vodiče jsou součástí konektoru pro přijímač. Ten obsahuje bílý signálový vodič, červený napájecí vodič z obvodu BEC a černý vodič se zemí. Když připojujete regulátor k baterii, dejte si pozor na polaritu. Regulátory sice mají ochranu proti přepólování, ale když vodiče prohodíte, regulátor samozřejmě nenaběhne. U motoru zapojení vodičů ovlivní směr jeho otáčení, takže pokud se motor náhodou točí obráceně, stačí prohodit zapojení dvou libovolných vodičů.

Kromě konektoru pro přijímač nejsou vodiče vybaveny ničím, co by je pomohlo někam připojit, proto najdete v seznamu z minulého dílu dva typy konektorů. Jedná se o pozlacené 4 mm a 3,5 mm konektory. Stejné konektory používá vybraná Power Distribution Board. Baterie vám pravděpodobně přijde již s konektorem, který bude jiný než tyto pozlacené. Konektor je třeba odstranit a napájet místo něj zmíněné 4 mm konektory. U baterie se běžně používá samice na mínus a samec na plus. Opačné konce pak napájejte na Power Distribution Board. Berte na vědomí, že držíte v ruce baterii, která je schopna nastartovat auto, takže si při pájení dejte pozor, aby nedošlo ke zkratu. Kladný vodič baterie (se samcem) také nechte kratší a na napájené konektory použijte teplem stahovanou bužírku.

Motory vám dorazí již s 3,5 mm samci, takže na stranu regulátoru napájejte samice a opět použijte bužírku. Vybraný regulátor je schopen dát 28 A a možná i víc, než v něm shoří tranzistory, takže si opět dejte pozor, aby po spojení regulátoru s motorem někde nedošlo ke zkratu, například o rám kvadrokoptéry.

Máte-li vše spájené, můžete zapojit dohromady baterii, Power Distribution Board, regulátor a motor. Nyní je čas připojit a naprogramovat Arduino.

Řízení regulátoru

Na první pokusy nemusíte mít žádný plošný spoj, ale vystačíte si s nepájivým polem a několika vodiči. Plošný spoj vyžaduje určitou opatrnost v umísťování jednotlivých prvků a dokud nemáte představu o tom, jakým způsobem budou jednotlivé komponenty rozmístěny, nemá smysl začínat. Já jsem nyní ve fázi, kdy jsem se rozhodl použít univerzální desku plošného spoje a rozmístění prvků na něm odhadl podle oka. I když to není úplně špatné, dokázal bych si nyní představit lepší. Ukázalo se totiž, že mít hromadu drátů u vrtulí s 10 000 otáčkami za minutu není úplně dobrý nápad, takže i když desku uděláte špatně, je pro potřeby dalších dílů seriálu lepší ji mít. Jak na ni si tedy řekneme příště.

Nyní se přesuneme k Arduinu. Na něm je řada pinů, z nichž nás budou zajímat hlavně piny označené 5V, GND a čtyři piny s popisem začínajícím na D, což jsou digitální vstupy/výstupy Arduina. Osobně jsem si vybral piny s D9 až D12, aby bylo snadnější připojit všechny čtyři regulátory. Jsou to totiž poslední čtyři piny na desce Arduina. Regulátor s Arduinem připojíme podle následujícího obrázku:

Arduino je nyní napájené z BEC obvodu regulátoru a na pinu D9 nyní můžeme generovat signál, který se bude regulátoru zamlouvat. V souvislosti s regulátory a servy můžete narazit na termíny PWM (Pulse Width Modulation) a PPM (Pulse Position Modulation). Jedná se o modulace, pomocí kterých přenášíme různé informace. V našem případě jde o množství proudu, které má regulátor pouštět do motoru. PWM modulace spočívá v tom, že řídící prvek generuje pulsy a ty když se objeví, tak regulátor sepne. Tento způsob funguje dobře na tranzistory a dá se s ním regulovat například jas LED diod nebo i motor. Náš regulátor PWM modulaci nebude rozumět. Druhou zmíněnou modulací je PPM, která spočívá v tom, že řídící prvek posílá stále stejné pulsy, mezi kterými mění mezery dle potřeby. Tento způsob se používá u optických přenosů nebo třeba dálkových ovládání i IR diodou.

Náš regulátor se řídí modulací blíže k PWM, ale čisté PWM to není. Tato modulace spočívá v tom, že řídící prvek pošle jednou za čas impulz o délce 1 ms, což si regulátor přeloží jako 0 % výkonu. Naopak když má pulz šířku 2 ms, bere to regulátor jako 100 % výkonu. Výhodou této modulace je, že regulátor je schopen nějaký čas fungovat s poslední hodnotou i přes to, že se nějaký impulz ztratí. Pokud přestanete regulátoru posílat impulzy, poběží ještě několik sekund, dokud se nevypne. Úplně nejlepší představu o tom, co má Arduino posílat do regulátoru za signál, získáte z osciloskopu nějakého už fungujícího řešení. Nemám sice osciloskop, ale pár uživatelů YouTube má a podělili se s námi o průběhu signálu z vysílačky, resp. přijímače.

Pulz by měl přicházet každých 20 ms, ale pokud regulátor podporuje 400 Hz režim, je možné mu pulzy posílat jednou za 2,5 ms, což je pro potřeby automatické stabilizace, jak jsme si řekli výše, vhodnější.

Základní představu bychom měli. Teď je třeba ji přenést do programu. O programování Arduina vyšel na Rootu seriál, takže doporučuji začít tam. Pro Arduino se programuje v jazyce Wiring, který má velmi blízko k Cčku a možná i trochu k C++ (třídy). Sice jsem v Cčku nenapsal moc kódu, ale programování pro Arduino mi nedělalo sebemenší problémy a pokud znáte Cčko alespoň trochu, budete na tom podobně.

Pro Arduino existuje IDE a i když nemá některé funkce, pomůže vám vaše Arduino snadno naprogramovat. IDE je k dispozici i pro Linux a stáhnete ho z webu arduino.cc. IDE už obsahuje vše, co potřebujete pro napsání kódu, jeho zkompilování a odeslání zkompilované binárky do mikročipu.

Součástí IDE jsou i nějaké knihovny, mezi kterými se schovává důležitá knihovna Servo. Ta dokáže generovat přesně takový signál, jaký potřebujeme. Navíc je implementovaná na nižší úrovni. Využívá přerušení procesoru, takže pulzování na vybraných pinech možnosti běhu hlavního smyčky. Stačí vytvořit Servo objekt, přichytit ho na vybraný pin a nastavit šířku pulzu v mikrosekundách. Na Arduinu pak může běžet program, který čte údaje ze senzorů, počítá různé hodnoty a občas je jeho běh automaticky přerušen, aby regulátor dostal potřebný pulz o nastavené šířce.

Vzhledem k použité knihovně není kód pro ovládání motoru nějak komplikovaný:

#include <Servo.h>

// Servo objekt s regulátorem
Servo esc;
// Regulátor najdeme na pinu D9
int esc_pin = 9;
// Minimální hodnota pulzu
int arm = 1000;
// arm + steady = od jaké hodnoty začíná reagovat motor
int steady = 250;

void setup() {
  // Připojíme Servo objekt na pin D9
  esc.attach(esc_pin);
  // Nastavíme pulz 1000 microsekund na výstupu
  esc.writeMicroseconds(arm);
  // a počkáme 1 sekundu
  delay(1000);
  // Regulátor by měl rozpoznat náš 1 ms pulz a tak začneme pomalu roztáčet motor
  // Toto nesmíme udělat moc rychle, jinak dojde k chybovému stavu jako na videu níže
  throttle_up();
}

void loop() {
int i;
// Postupně budeme do regulátoru posílat pulzy o šířce 1250 mikrosekund až 1350 mikrosekund
for(i = 0; i < 20; i++) {
  esc.writeMicroseconds(arm + steady + 5 * i);
  delay(500);
}
delay(2000);
// a zase motor zpomalíme
for(i = 19; i >= 0; i--) {
  esc.writeMicroseconds(arm + steady + 5 * i);
  delay(500);
}
delay(2000);
}

// funkce pro postupné nastavení šířky pulzu na 1250 mikrosekund
void throttle_up() {
  for(int i = 0; i <= steady; i++) {
esc.writeMicroseconds(arm + i);
delay(20);
  }
} 

Kód je dostatečně okomentovaný, ale rád bych ještě vysvětlil kalibraci regulátoru. Než začneme s regulátorem komunikovat, je třeba mu posílat nějaký čas 1 ms pulz, tedy nulu. Tomuto procesu se říká arming a regulátor se díky tomu přizpůsobí vašemu Arduinu. V některých návodech se doporučuje kromě nulového stavu prvních pár stovek milisekund posílat nějaký čas i maximální stav. Časy se mohou lišit dle zkušeností lidí. Nicméně s vybranými regulátory nic takového není potřeba a nemusíte tak zdržovat celý proces. Pokud se vám vše podařilo, tak byste před sebou měli mít motor, který se točí podobně jako motor na následujícím videu:

Shrnutí

To by bylo pro dnešek vše. Část článku o řízení by asi nevznikla, kdyby uživatel navillus5 z fóra forum.sparkfun.com neprováděl své pokusy. Vzhledem k tomu, že jsem neměl žádné zkušenosti s řízením čehokoli na této úrovni a netušil jsem, jak se má takový regulátor chovat a jak bude reagovat na různé situace, byly pokusy a hlavně ukázkový kód navilluse5 více než přínosné.

Příští týden se podíváme na čtení údajů z akcelerometru na gyru a připojíme ho přímo na otáčky motoru. Zatím si můžete vyzkoušet, jakým způsobem reaguje regulátor na různé hodnoty šířky pulzu a jaká je hranice, kdy začne pulzy ignorovat.

Našli jste v článku chybu?
Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

Měšec.cz: Co když na dovolené přijdete o kartu?

Co když na dovolené přijdete o kartu?

Podnikatel.cz: Infolinka k EET? Poskytne až 100 úředníků

Infolinka k EET? Poskytne až 100 úředníků

Vitalia.cz: Syfilis: To není „nemoc z lásky“

Syfilis: To není „nemoc z lásky“

Měšec.cz: Se stavebkem k soudu už (většinou) nemusíte

Se stavebkem k soudu už (většinou) nemusíte

Lupa.cz: Samořídicí taxíky jsou tu. Začíná s nimi Uber

Samořídicí taxíky jsou tu. Začíná s nimi Uber

120na80.cz: Lepší poporodní sexuální život? Žádný problém

Lepší poporodní sexuální život? Žádný problém

Podnikatel.cz: Zajímavý paradox: Daří se vedle konkurence

Zajímavý paradox: Daří se vedle konkurence

Podnikatel.cz: Salón na maloměstě? Funguje skvěle

Salón na maloměstě? Funguje skvěle

Lupa.cz: Nechcete datacentrum? Jsou na prodej

Nechcete datacentrum? Jsou na prodej

DigiZone.cz: Sky Deutschland: dvakrát fotbal ve 4K

Sky Deutschland: dvakrát fotbal ve 4K

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

Lupa.cz: Co najdete uvnitř kosmické sondy?

Co najdete uvnitř kosmické sondy?

Měšec.cz: Investiční pasti. Děláte to, co ostatní, ale proděláváte

Investiční pasti. Děláte to, co ostatní, ale proděláváte

120na80.cz: Využijte léčivé vlastnosti měsíčku

Využijte léčivé vlastnosti měsíčku

DigiZone.cz: Skylink přepracoval web

Skylink přepracoval web

Podnikatel.cz: OSA zdraží, ale taky přidá nový poplatek

OSA zdraží, ale taky přidá nový poplatek

DigiZone.cz: Fotbal na O2 TV Sport posiluje

Fotbal na O2 TV Sport posiluje

Root.cz: Čína má nejvýkonnější počítač světa

Čína má nejvýkonnější počítač světa

Podnikatel.cz: Česká pošta vycouvala ze služby ČP Cloud

Česká pošta vycouvala ze služby ČP Cloud