Kluk v bundě s kapucí sedí na louce v trávě s batohem poblíž, čelí vzdálené městské skrýši pod oblačnou oblohou a před ním letí dron.

Jak náš student postavil
dron s vlastní řídicí
deskou

Když se řekne „dron“, většina lidí si představí hotový výrobek z obchodu. Ale co kdybyste si mohli navrhnout nejen samotný stroj, ale i jeho mozek – řídicí jednotku, která udržuje let v rovnováze? Přesně to se podařilo jednomu z našich studentů v kroužku programování. Po několika letech učení, experimentů a vytrvalosti vznikla kvadrokoptéra, která létá na vlastnoručně navržené řídicí desce a originálním firmwaru, který Filip naprogramoval od základu, aby se v praxi naučil, jak drony létají.

Toto je druhá část vyprávění o Filipově cestě k vlastnímu dronu. Jak to celé začalo během studia střední školy, si přečtěte v článku níže:

Protože to začalo jako projekt středoškolského studenta, museli jsme začít opravdu jednoduše a spoustu věcí se naučit a vyzkoušet si je krok po kroku. Začali jsme s tím, co jsme znali a měli po ruce, postavili první řídicí desku, abychom mohli rychle začít experimentovat. Ale jak jsme o dronech a jejich řízení věděli čím dál víc, začalo nám docházet, že s modernějším procesorem a rychlejšími senzory by se nám pracovalo lépe. A tak ještě dřív, než dron poprvé vzlétl, jsme se pustili do nové řídicí desky.

Proč jsme vyměnili mozek dronu za RP2040

Ne, že by neexistovaly jiné procesory, ale nový jednočip od autorů Raspberry Pi byl zajímavým překvapením a lákadlem. Je rychlý, má víc paměti a je přátelský pro začátečníky. Navíc kolem něj existuje velká komunita. Na internetu najdeš spoustu návodů, videí a fór, kde se o své zkušenosti dělí další nadšenci a programátoři. To znamená, že nikdy nejsi sám, když narazíš na problém.

A kromě toho, že má všeho víc, tak má ještě jednu docela unikátní vlastnost, která se nám na našeho droníčka náramně hodila. Motory totiž potřebují dostávat pokyny o tom, jak se mají točit, velice rychle a proto mluví tzv. DSHOT protokolem. To je zvláštní jazyk, kterým většina procesorů nevládne přímo a musí úkol řešit složitě v hlavním programu, což je zpomaluje.

Podrobnosti o DSHOT protokolu 🧠

Procesory umí snadno přenášet data sériově přes UART, to využijeme pro příjem dat z vysílačky nebo po I2C sběrnici, ke které jsou připojena mnohá čidla vč. gyroskopu. Na oboje má snad každý jednočipový mikrokontroler zabudované hardwarové rozhraní, kterému stačí dodat zásobu dat a on je sám odešle nebo přijme a hlavní program se musí postarat až když je celý přenos hotový. DSHOT je ale jiný, není to běžný standardizovaný protokol, tak ho procesory neumí.

Signál je vidět na obrázku níže, délka každého bitu je stejná, ale nuly a jedničky se signalizují tím, jak dlouho zůstane signál v horní poloze. Celkem se přenese 16 bitů rychlostí 300, 600 nebo až 1200 kilobitů za sekundu. Rychlost otáčení motorů má rozlišení 2000 kroků od nulové po maximální rychlost a zbytek je signalizace a kontrolní součet. Takhle složitý způsob se používá asi hlavně kvůli ochraně před elektrickým rušením, kterého je při spínání obrovských proudů do výkonných motorů požehnaně.

Protože protokol vyžaduje přesné načasování, kdy se jednička mění na nulu a naopak, musel ho Filip na Atmelu vytvářet assemblerovým programem, kde počítal s délkou každé jednotlivé instrukce, aby vytvaroval přesně signál. Tomu se říká bit banging a spotřebuje to mnoho drahocenného času, který potřebujeme na řízení letu.

Počítačový monitor zobrazující editor s C++ s programem na nastavování rychlosti mmotoru pro Pico a logickým analyzátorem s tvarem průběhu DSHOT komunikace.

RP2040 ale umí něco speciálního – má malé pomocné „pracovníky“, kterým se říká PIO programy, které dokáží vykonávat jednoduché činnosti samostatně. Díky nim může procesor svěřit některé úkoly těmto pomocníkům a sám se soustředit na řízení letu. To znamená, že náš dron reaguje rychleji a letí plynuleji.

Vybíráme součástky

RP2040 ale není ručně pájitelný, proto jsme našli Arduino Nano RP2040 Connect, která má neuvěřitelnou hromadu periferií na sobě, mj. docela výkonný gyroskop a akcelerometr, tedy dvojici klíčových senzorů pro řízení letu a zároveň i dostatek vývodů. Ta je dělaná buď do nepájivého pole, anebo se dá přiletovat na vlastní plošný spoj, což jsme využili, protože řídicí deska na dronu musí mít specifický rozměr a otvory, aby se dala na dron přidělat.

{"mainImage":{"id":1757,"url":"https:\/\/kapsa.cz\/wp-content\/uploads\/2025\/07\/arduino-rp2040-2-1024x406.jpeg","size":"large"},"dots":[{"position":{"x":51.00516858951066,"y":46.4928290755245},"wcProduct":{"productId":null,"productName":"","productPermalink":"","productShortDescription":"","productFeaturedImage":{"url":"","size":"large"},"productStockStatus":"","productPrice":""},"customProduct":{"productName":"RP2040","productPermalink":"","productShortDescription":"Mozek cel\u00e9ho dronu, dvouj\u00e1drov\u00fd procesor, na kter\u00e9m b\u011b\u017e\u00ed program ovl\u00e1daj\u00edc\u00ed let.","productFeaturedImage":{"url":"","size":"large"},"productPrice":""},"tooltip":{"direction":"row","style":{"position":"top","layout":"horizontal","width":"300px","height":"auto","background":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}},"triangle":true},"containers":[{"type":"container","style":{"gridSize":"0px","padding":{"left":0,"top":0,"right":0,"bottom":0}},"blocks":[{"type":"media","source":"productFeaturedImage","options":{"size":"large"},"style":{"backgroundPosition":"center"}}]},{"type":"container","style":{"gridSize":"1fr","padding":{"left":16,"top":16,"right":16,"bottom":16}},"blocks":[{"type":"text","source":"productName","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":24,"fontWeight":600,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productShortDescription","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productPrice","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}}]}]},"style":{"pulsating":"always","opacity":1,"background":{"hex":"#d9e3f0","rgb":{"r":217,"g":227,"b":240,"a":1}},"size":"16px","borderWidth":"1px","borderColor":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}}}},{"position":{"x":43.098191845324614,"y":23.5},"wcProduct":{"productId":null,"productName":"","productPermalink":"","productShortDescription":"","productFeaturedImage":{"url":"","size":"large"},"productStockStatus":"","productPrice":""},"customProduct":{"productName":"LSM6DSOXTR","productPermalink":"","productShortDescription":"T\u0159\u00edos\u00fd gyroskop a akcelerometr se vzorkovac\u00ed rychlost\u00ed a\u017e 6,66 kHZ.","productFeaturedImage":{"url":"","size":"large"},"productPrice":""},"tooltip":{"direction":"row","style":{"position":"top","layout":"horizontal","width":"300px","height":"auto","background":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}},"triangle":true},"containers":[{"type":"container","style":{"gridSize":"0px","padding":{"left":0,"top":0,"right":0,"bottom":0}},"blocks":[{"type":"media","source":"productFeaturedImage","options":{"size":"large"},"style":{"backgroundPosition":"center"}}]},{"type":"container","style":{"gridSize":"1fr","padding":{"left":16,"top":16,"right":16,"bottom":16}},"blocks":[{"type":"text","source":"productName","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":24,"fontWeight":600,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productShortDescription","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productPrice","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}}]}]},"style":{"pulsating":"always","opacity":1,"background":{"hex":"#d9e3f0","rgb":{"r":217,"g":227,"b":240,"a":1}},"size":"16px","borderWidth":"1px","borderColor":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}}}},{"position":{"x":62.78811432594477,"y":60.952876389551236},"wcProduct":{"productId":null,"productName":"","productPermalink":"","productShortDescription":"","productFeaturedImage":{"url":"","size":"large"},"productStockStatus":"","productPrice":""},"customProduct":{"productName":"Flash pam\u011b\u0165","productPermalink":"","productShortDescription":"Jedno\u010dipov\u00fd procesor nem\u00e1 integrovanou pam\u011b\u0165 na program, ten \u010dte z extern\u00ed flashky.","productFeaturedImage":{"url":"","size":"large"},"productPrice":""},"tooltip":{"direction":"row","style":{"position":"top","layout":"horizontal","width":"300px","height":"auto","background":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}},"triangle":true},"containers":[{"type":"container","style":{"gridSize":"0px","padding":{"left":0,"top":0,"right":0,"bottom":0}},"blocks":[{"type":"media","source":"productFeaturedImage","options":{"size":"large"},"style":{"backgroundPosition":"center"}}]},{"type":"container","style":{"gridSize":"1fr","padding":{"left":16,"top":16,"right":16,"bottom":16}},"blocks":[{"type":"text","source":"productName","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":24,"fontWeight":600,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productShortDescription","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productPrice","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}}]}]},"style":{"pulsating":"always","opacity":1,"background":{"hex":"#d9e3f0","rgb":{"r":217,"g":227,"b":240,"a":1}},"size":"16px","borderWidth":"1px","borderColor":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}}}},{"position":{"x":93.3307499848595,"y":51.17643141618584},"wcProduct":{"productId":null,"productName":"","productPermalink":"","productShortDescription":"","productFeaturedImage":{"url":"","size":"large"},"productStockStatus":"","productPrice":""},"customProduct":{"productName":"USB konektor","productPermalink":"","productShortDescription":"P\u0159es USB se d\u00e1 procesor programovat a tak\u00e9 nap\u0159. do po\u010d\u00edta\u010de pos\u00edlat textov\u00e9 v\u00fdpisy, kdy\u017e chceme v\u011bd\u011bt, co se v programu d\u011bje.","productFeaturedImage":{"url":"","size":"large"},"productPrice":""},"tooltip":{"direction":"row","style":{"position":"top","layout":"horizontal","width":"300px","height":"auto","background":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}},"triangle":true},"containers":[{"type":"container","style":{"gridSize":"0px","padding":{"left":0,"top":0,"right":0,"bottom":0}},"blocks":[{"type":"media","source":"productFeaturedImage","options":{"size":"large"},"style":{"backgroundPosition":"center"}}]},{"type":"container","style":{"gridSize":"1fr","padding":{"left":16,"top":16,"right":16,"bottom":16}},"blocks":[{"type":"text","source":"productName","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":24,"fontWeight":600,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productShortDescription","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}},{"type":"text","source":"productPrice","options":[],"style":{"color":{"hex":"#000","rgb":{"r":0,"g":0,"b":0,"a":1}},"fontSize":16,"fontWeight":300,"margin":{"left":0,"top":8,"right":0,"bottom":8}}}]}]},"style":{"pulsating":"always","opacity":1,"background":{"hex":"#d9e3f0","rgb":{"r":217,"g":227,"b":240,"a":1}},"size":"16px","borderWidth":"1px","borderColor":{"hex":"#fff","rgb":{"r":255,"g":255,"b":255,"a":1}}}}]}

Novou desku jsme chtěli mít modernější a uhlazenější, tak jsme na ni dali mnohem menší konektory, kondenzátory jsme také vybírali podle rozměrů, aby se pod kryt vešly. Pro napájení elektroniky je potřeba napětí 5 voltů, ale baterka dronu má až 25,2 V. Na původním dronu byl lineární stabilizátor, který se hodně hřál. Dlouho jsme hledali ideál a našli spínaný stabilizátor AP63205WU-7, který díky rychlému spínání je opravdu maličkatý (pod 3 mm) a potřebuje kromě cívky už jen několik kondenzátorů. A přitom dokáže dát až 2 ampéry.

Poslední důležitou věc, kterou Filip na novém dronu chtěl mít, je možnost zapisovat si údaje během letu, aby se později mohl podívat, co přesně se s dronem dělo. Zkrátka potřeboval takovou černou skříňku, jako mají velká letadla. Proto je zespodu slot na microSD kartu, kam letová data ukládáme.

Navrhujeme plošný spoj

Když jsme věděli, jaké součástky na desce budou, začala ta nejzajímavější část – návrh samotného plošného spoje. Filip si nejdřív rozkreslil, co všechno musí být propojené: motory, přijímač, slot na SD kartu, LEDky, přípravu na další senzory… a pak se pustil do programu KiCAD. Ten umí z jednoduchého schématu udělat návrh desky, ale není to jen kliknutí na tlačítko.

Schéma desky pro řízení dronu s Arduino Nano RP2040 Connect, stabilizátorem napětí, CF kartou a řadou konektorů.

Nejdřív se nakreslí obrys desky a otvory pro šroubky, aby šla přidělat na dron. Pak přijde na řadu rozmístění součástek. Program ukazuje, které vývody mají být propojené, ale když to rozmístíte špatně, cestičky se začnou křížit jako zamotané šňůry od sluchátek. Filip si s tím hrál tak dlouho, dokud to nevypadalo čistě – čím lepší rozmístění, tím méně práce později.

V KiCADu umíme natáhnout cestičky automaticky, ale ne vždy to automat zvládne dokonale. Některé spoje Filip musel dodělat ručně, aby se nekřížily nebo aby měly správnou šířku. A pak tu byl ještě jeden problém, který není na první pohled vidět: teplo. Stabilizátor napětí se při práci zahřívá, takže nestačí ho jen připojit. Datasheet od výrobce přesně říká, jak velké měděné plochy musí být kolem jeho nožiček, aby se teplo rozptýlilo. Filip musel myslet i na to, aby na druhé straně desky byla volná plocha pro chlazení.

Screenshot programu na návrh tištěnách spojů zobrazujícího obrysy součástek a měděné trasy spojů a panel výběru vrstev.

Pájení

Když byl návrh hotový, zadal desku do výroby. Po pár týdnech dorazila krásná zelená deska – a začalo pájení. Tady už je potřeba trpělivost a přesnost. Studené spoje jsou nepřítel, ještě že si plošný spoj můžeme prohlédnout pod zvětšovadlem:

Nakonec desku očistil od kalafuny a zkontroloval, že není žádný zkrat. Teprve pak se mohla připojit baterka.

Jak dron drží ve vzduchu

Teď, když máme vyřešený hardware, můžeme přemýšlet o řízení. Uvnitř dronu pracuje malý počítač – flight controller – který se stará o to, aby stroj letěl přesně tak, jak si přeje pilot. Pilot posílá povely vysílačkou, ale samotný let není nikdy úplně klidný. Do hry vstupuje vítr, drobné vibrace nebo nepatrné nepřesnosti v pohybu.

Proto má dron v sobě gyroskop a akcelerometr, dva senzory, které mu říkají, jak se naklání a jak se pohybuje. Signály ze senzorů ale nejsou vždy čisté – mohou být „zašuměné“ podobně, jako když rádio praská. Flight controller je proto nejdřív vyhladí pomocí filtrů, aby měl co nejpřesnější představu o tom, co se s dronem opravdu děje.

Pak přichází na řadu samotné řízení. Flight controller si neustále porovnává, co chce pilot, s tím, co hlásí senzory. Rozdíl mezi těmito dvěma informacemi tvoří chybu, kterou se regulátor snaží napravit tím, že motory na jedné straně zrychlí a na opačné zpomalí.

Je to podobné, jako když jedete na kole a snažíte se udržet rovnováhu. Pokud se začnete naklánět, okamžitě reagujete pohybem řídítek. Když se nakláníte delší dobu, přidáte větší korekci. A pokud cítíte, že se pád zrychluje, snažíte se mu předejít ještě dřív, než k němu dojde. Flight controller dělá totéž – jen mnohem rychleji a přesněji, tisíckrát za sekundu.

Díky tomu může dron viset na místě, letět rovně nebo provádět složité manévry, aniž by pilot musel přemýšlet o tom, jak přesně se mají vrtule otáčet.

Jak funguje regulace (PID) 🧠

PID regulátory jsou základní součástí mnoha automatizovaných systémů, včetně řízení dronů, teploty, rychlosti motorů v průmyslu a třeba i v oblíbených 3D tiskárnách a dalších procesů, které vyžadují stabilní a přesné řízení. Zkratka PID označuje tři složky, které regulátor používá k dosažení požadovaného výsledku: proporcionální, integračníderivační. Každá z těchto složek má svůj specifický úkol při korekci chování systému, čímž umožňuje vyrovnání odchylek od požadované hodnoty, tedy nastavení, na kterém má systém fungovat.

První složka, proporcionální (P), se zabývá velikostí odchylky mezi aktuální a požadovanou hodnotou. Pokud je odchylka velká, regulátor reaguje silně, pokud je malá, odpověď je slabší. Tato složka tedy zajišťuje rychlou reakci na změny, ale může také způsobit, že systém „osciluje“ kolem cílové hodnoty, pokud je reakce příliš silná.

Integrační složka (I) řeší problém, kdy malá, ale trvalá odchylka zůstává neopravená, což může vést k dlouhodobému nesouladu. Integruje (sčítá) minulé odchylky, čímž zajišťuje, že i malé, ale dlouhodobé chyby budou postupně eliminovány. To pomáhá stabilizovat systém, ale může také způsobit zpomalení reakce při prudkých změnách.

Poslední složka, derivační (D), se zaměřuje na rychlost změny odchylky, tedy na to, jak rychle se systém přibližuje k požadované hodnotě. Tento člen pomáhá předvídat, co se bude dít dál, a tím zamezuje nežádoucímu „přetáčení“ nebo překmitům, což stabilizuje systém při rychlých změnách. Když jsou všechny tři složky správně nastavené, PID regulátor dokáže velmi efektivně udržet systém v rovnováze, minimalizovat chyby a poskytovat hladký a stabilní výkon.

Programujeme letový počítač

Když si naprogramuješ vlastní software pro řízení dronu, od nuly, tak máš ten luxus, že můžeš do všeho vidět a všemu rozumět. To je v dnešní překomplikované době plné překomplikovaného softwaru vzácný a velice odměňující pocit.

Přitom začátek není zase tak těžký, jak by se mohlo zdát. Příklady od výrobce pokrývaly prakticky vše, co bylo do začátku potřeba, na internetu jsme našli i PIO program pro ovládání motorů. Stačilo to spojit dohromady a věnovat se samotnému řízení. Naučili jsme se tedy rozumět pokynům z vysílačky, číst data z gyroskopu a mohli jsme naprogramovat jednoduchou regulační smyčku s PID regulátorem.

Jak vypadá program ovládající dron 🧠

První verze regulační smyčky vypadala zhruba nějak takto, časem jsme přidali další vymoženosti, jako čtení aktuálních skutečných otáček motoru z obousměrné DSHOT komunikace apod.

C++
if(i2c_get_read_available(i2c_default) >= 12)
{
    /* Přečti data ze senzorů. */
    imu->receiveData(gyro[X], gyro[Y], gyro[Z], accel[X], accel[Y], accel[Z]);
    
    /* Zjisti aktuální výchylku páček na vysílačce. */
    for(uint8_t i = 0; i < 4; i++)
    {
        ref[i] = stick[i]->get();
        ref_filtered[i] = rcCommandLPF[i]->process(ref[i]);
    }

    /* Filtrace dat, aby neobsahovaly vibrace */
    for (int i = 0; i < 3; i++) {
        gyro_filtered[i] = gyroLPF[i]->process(gyro[i]);
        gyro_filtered_d[i] = d_LPF[i]->process(gyro_filtered[i]);
        acc_filtered[i] = accLPF[i]->process(accel[i]);
    }

    /* Odhadni orientaci dronu fúzí údajů z akcelerometru a gyroskopu. */
    accel_angle[ROLL] = atan2(acc_filtered[Y], sqrt(acc_filtered[X] * acc_filtered[X] + acc_filtered[Z] * acc_filtered[Z])) * 180.0 / M_PI;
    accel_angle[PITCH] = atan2(acc_filtered[X], sqrt(acc_filtered[Y] * acc_filtered[Y] + acc_filtered[Z] * acc_filtered[Z])) * 180.0 / M_PI;
    for (int i = 0; i < 2; i++) {
        fusion_angle[i] = complementary[i]->process(accel_angle[i], gyro_filtered[i]);
    }
    
    /* Pokud máme řízení v režimu stabilizace úhlu, použij PID regulátor úhlu jako ovládání. */
    angular_mode = switch_f->get() < 0;
    if (angular_mode) {
        for (int i = 0; i < 2; i++) {
            ref_filtered[i] = angular_pid[i]->output(ref_filtered[i] / 400.0 * 45.0, fusion_angle[i], fusion_angle[i], speed_table[MY_SPEED].dt);
        }
    }

    /* Hlavní PID regulátor rychlosti rotace dronu. */
    for (int i = 0; i < 3; i++) {
        if (ref[THROTTLE] < 0.05)
            rate_pid[i]->error_sum = 0;
        output[i] = rate_pid[i]->output(ref_filtered[i], gyro_filtered[i], gyro_filtered_d[i], speed_table[MY_SPEED].dt);
    }

    /* Mixér motorů */
    offset[REAR_RIGHT] =  - output[ROLL] + output[PITCH] + output[YAW];
    offset[FRONT_RIGHT] = - output[ROLL] - output[PITCH] - output[YAW];
    offset[REAR_LEFT] =   + output[ROLL] + output[PITCH] - output[YAW];
    offset[FRONT_LEFT] =  + output[ROLL] - output[PITCH] + output[YAW];
   
    /* Poslání příkazu o rychlosti otáčení motorů do ESC desky. */
    for (int i = 0; i < 4; i++) {
        power[i] = ref_filtered[THROTTLE] + offset[i] * pid_to_motor;
        motor[i]->setThrottle(ref[THROTTLE] >= 0.03 && !failsafe ? std::max(0.02, power[i]) : 0);
    }
}

Několik zádrhelů, které nám na čas nedaly spát, se ale našlo. Třeba když jsme zjistili, že na internetu nemůžeme najít žádný příklad, jak provádět I2C komunikaci s gyroskopem na pozadí. Všechny příklady a funkce v knihovně prostě pošlou žádost a čekají, až jim senzor odpoví. To je při řízení dronu nemyslitelné! Musíme stihnout tolik věcí. Přitom jsme všude četli, že I2C hardware uvnitř RP2040 má FIFO frontu, jen nikdo neřekl, jak ji použít. A víte co? Skutečně má, stačí do jedné a té samé proměnné plnou rychlostí zapsat několik údajů a ony se tam vejdou, protože na pozadí je skutečně buffer. Stačilo tedy vzít funkci z knihovny, trochu ji přeskládat a prostě odstranit čekání.

Nebo se nám onehdá začalo zasekávat druhé jádro procesoru a celé se to chovalo opravdu divně – nakonec jsme přišli na to, že nám přetekl 4 KB zásobník prvního jádra a začal přepisovat zásobník toho druhého. V tu chvíli si člověk uvědomí, že nemá neomezený prostor pro lokální proměnné.

Filip zapisuje poznámky stylusem na svém notebooku.

Blackbox

Vypisovat čísla na obrazovku počítače pomáhá při rozcházení samotné kostry programu, ale jakmile dojde na ladění samotného letu, potřebujeme do fyzikálních dějů, které se na palubě odehrávají, vidět mnohem hlouběji. Drony létající na některém z koupených flight controllerů logují data na paměťovou kartu a existuje software Blackbox Explorer, který umí ukázat data ve formě grafů. Abychom nevynalézali znovu kolo, naučil se Filip zapisovat data ve stejném formátu, takže nyní vidí po každém letu přesně data z gyroskopů i ovládání dronu vysílačkou, jak na to reagoval regulátor a při jakém výkonu motorů se mu objevily jaké vibrace a oscilace.

Možná se ti to nezdá podstatné, ale podívej se níže, jak vypadají data zaznamenaná gyroskopem a jak vypadají poté, co je vyfiltrujeme. Kdyby takové množství šumu proniklo do motorů (a PID regulátor – zejména derivační člen – má tendenci značně šumy zesílit), tak bychom nutili motory neustále zrychlovat a zase brzdit. To by nebyl hladký chod, když je to moc, tak je to i slyšet, že se motor trápí a nejen to, i cítit! Motory by zasmrděly a brzy se spálily.

Screenshot webové aplikace Betaflight Blackbox Explorer zobrazující velmi zašuměný signál z gyroskopu s histogramem ukazující zahlcení spektra nad frekvencí odpovídající letovému pohybu.
Screenshot webové aplikace Betaflight Blackbox Explorer zobrazující grafy letových dat a histogram šumu na gyroskopu v závislosti na frekvenci ukazující dobře kontrolovaný šum se špičkou na 134 Hz.
Jak se filtruje šum ze senzorů? 🧠

V analogovém světě se filtry řeší pomocí kondenzátorů a cívek, které procházejícímu proudu kladou různý odpor v závislosti na frekvenci signálu a tím např. mohou utlumit vyšší frekvence, což právě potřebujeme i na našem dronu. Regulátor musí reagovat jen na skutečný pohyb dronu a ne na vibrace šířící se rámem i do senzorů. Cokoliv nad 100 Hz je zcela neužitečný šum a musí pryč.

V digitálním světě se na nás hrne proud čísel a my na to potřebujeme matematiku. Postupů existuje celá řada, ale u našeho dronu jsme si z velké části vystačili s tzv. bikvadratickým filtrem, jehož základní vzoreček vypadá takto:

yn=b0xn+b1xn1+b2xn2a1yn1a2yn2y_n=b_0x_n+b_1x_{n-1}+b_2x_{n-2}-a_1y_{n-1}-a_2y_{n-2}

Proměnná xx jsou data ze senzoru a yy je filtrovaný výstup, přičemž od obou si pamatujeme kromě aktuální i minulé a předminulé hodnoty. Koeficienty aabb jsou předem daná čísla, která pak míchají aktuální stav a historii v určitém poměru. Vypočítají se podle toho, jak chceme, aby filtr fungoval, od jaké frekvence signál tlumil a také závisí na vzorkovací frekvenci, tedy s jakou rychlostí nám data proudí.

Bikvadratický filtr je univerzální a pouhým nastavením koeficientů může sloužit jako několik různých typů filtrů. Na dronu používáme low-pass, který zadržuje signály vyšších frekvencí a také tzv. notch filtr, který zadržuje jen úzké spektrum na konkrétní frekvenci a vše ostatní propouští.

Také je dobré vědět, že každý filtr trochu zpožďuje signál – nedá se říci o kolik, protože různé frekvence se zpozdí různě, ale na dronu se chceme pohybovat v jednotkách milisekund. A notch filtr má výhodu v tom, že proti low-pass zpožďuje signál výrazně méně, proto jich můžeme použít několik za sebou. To využíváme pro filtraci frekvencí odpovídajících aktuálním otáčkám každého z motorů. V praxi tedy máme na dronu kaskádu filtrů.

Ladění regulátoru a první zkoušky

Hotové flight controllery už ve výchozím stavu dokáží letět a jen se dolaďují podle dronu a stylu letu, který pilot chce. My jsme ale vůbec nevěděli, s jakými hodnotami P, I a D začít, takže jsme opatrně zkoušeli s dronem uvázaným na velmi pevném provázku otáčet se kolem jedné osy. (Vždy s velice omezeným výkonem a řídili jsme dron na dálku, abychom nebyli poblíž, chránili si zrak atd. – sami to rozhodně nezkoušejte!)

Student v modrém svetru pracuje u stolu s počítačem s kódem a malým dronem s modrými vrtulemi, elektronickými součástkami uloženými na policích v pozadí.

Nejprve jsme hledali P, čili hodnotu proporcionální k odchylce. O ní se ví, že když je příliš malá, tak dron neposlechne páčku nebo jen málo, jako by měl malou sílu se dostat do žádaných otáček a když naopak moc, tak začne rychle oscilovat kolem cílového stavu a bzučí u toho, jako rozzuřený sršeň. Povedlo se nám obě krajní možnosti najít a vybrat vhodnou střední hodnotu, kdy reaguje rychle bez překmitů.

Podobně jsme pokračovali s integrální hodnotou, její nedostatek se projevuje stálou odchylkou, což při letu na provázku se ukázalo tak, že když má být dron natočen šikmo v určité poloze a držet ji, vlastní vahou se pomaličku rovnal do roviny. Příliš velká hodnota zase vede k oscilacím, ale tentokrát velice pomalým. Opět jsme našli oba extrémy a ideál mezi.

Podobně jsme našli i hodnotu derivačního parametru, na něj se musí jít se zvláštní opatrností, protože v něm se neuvěřitelně zvětšují šumy, což může uvařit motor během chvilky, takže jsme vždy koukali na záznamy z Blackboxu, jestli nám šum neproniká do motorů.

Nakonec už nezbylo nic, co by se dalo dělat od stolu, tak si Filip dodal odvahy, zbalil dron a vyrazil na louku:

Letíme!

Technická vysoká škola dá studentovi zabrat, takže Filip reálně na droníčkovi pracoval jen pár večerů o letních prázdninách, ale během školního roku neměl vůbec čas. Nicméně téma ho pořád lákalo a vybral si bakalářskou práci, která s dronem souvisí. Tím ve třeťáku získal přeci jen trochu více času a mohl se do něj pustit naplno.


Člověk s kudrnatými světle hnědými vlasy s modrým svetrem proti oblačné obloze.

„Líbilo se mi, že jsem měl možnost vymyslet si vlastní projekt, který mi potom Tomáš pomohl zrealizovat. Trvalo mi to dlouho, ale spoustu jsem se toho naučil a bavilo mě to tak, že jsem si podle toho vybral i vysokou školu.“

— Filip, student kybernetiky na FEL ČVUT

Tento projekt není jen o technice. Je o vytrvalosti, tvořivosti a radosti z objevování. Ukazuje, že když se spojí zvědavost s odhodláním, dokáže student během několika let vytvořit něco, co by se na první pohled zdálo nedosažitelné.

👉 Pokud vás baví programování, elektronika nebo robotika, přidejte se k našemu klubu. Možná právě váš projekt bude ten příští, o kterém budeme psát.

Přečti si pokračování a pusť si video!