česky english Vítejte, dnes je čtvrtek 05. prosinec 2024

Mechatronika, část 1 Programování a ladění projektů s mikrokontroléry

DPS 1/2022 | Mechatronika - články
Autor: RNDr. David Obdržálek, Ph.D. | MFF UK, Jiří Rotta | JeDe Robot s. r. o.
image

Na webových stránkách robodoupe.cz již řadu let vycházejí články týkající se nejrůznějších aspektů amatérské robotiky a mechatroniky a čtenáři diskutují na tamním fóru o všech oblastech práce v těchto oborech. Jako dlouhodobí aktivní účastníci a členové autorského a provozního týmu, který se o projekt stará, máme už celkem dobrou představu, s čím se tvůrci robotických a mechatronických projektů při své práci potýkají.

V tomto seriálu chceme něco z našich zkušeností předat a dát možnost získat nadhled nad základními oblastmi, které budou při další práci užitečné. To pomůže zvládnout celý projekt i v těch částech, kde si zatím zájemce není jistý. V každé části seriálu se budeme věnovat jednomu tématu a doufáme, že ti, kdo se v dané oblasti ještě nepohybují, zde získají základní informace, zatímco ti, kteří se už danou tematikou zabývají, zde i tak naleznou pro svoji práci zajímavé náměty. Po zakončení seriálu by mělo být možné samostatně realizovat nějaký zajímavý menší projekt, ať už se jedná o inteligentní ovládání okenních žaluzií, nebo třeba malého mobilního robota. Především by ale měl tento seriál dodat chuť a odvahu k dalšímu experimentování, zkoumání a vyvíjení vlastních projektů.

V tištěné verzi článku nebyl prostor pro zveřejnění všech informací, proto na konci online verze najdete v části Přílohy odkazy na další doprovodné materiály.

Program jako základ

V tomto dílu se budeme věnovat programování. Pouze velmi výjimečně se totiž dnes setkáte se zařízením, které neobsahuje alespoň jednu programovatelnou součástku – v drtivé většině případů zahrnuje stavba robota nebo tvorba jiného mechatronického projektu potřebu nejen navrhnout a sestavit mechaniku a elektroniku, ale také celé zařízení naprogramovat. V projektech IoT (Internet of Things − internet věcí) bývá dokonce naprogramování velmi často největší částí projektu, protože po stránce sestavení zařízení se typicky jedná o využití už existujícího modulu nebo jednoduché propojení několika modulů mezi sebou. Podíváme se proto na některé typické postupy, které se při tvorbě a hlavně ladění programů pro malé roboty, mechatronické i IoT projekty používají. Kdo se takovým programováním dosud hlouběji nezabýval, může nakonec zjistit, že se nejedná o nic obtížného − i když zde je vhodné podotknout, že stát se opravdu dobrým programátorem až tak snadné není.

Jak začít?

Možností, jak začít, je velmi mnoho. Mikrokontroléry jsou dostupné v ceně od pár desítek korun za samotný čip nebo stokorun za celý modul, a to od řady různých výrobců. Mezi amatéry nalezly v poslední době velkou oblibu mikrokontroléry Arduino a Micro:bit. Ty jsou sice zaměřeny na různé skupiny uživatelů a jejich cílové projekty, ale spojuje je možnost využití úplnými začátečníky. Arduino se hodí spíše pro projekty typu „malé domácí IoT“, ke kterým je běžné postupně připojovat další a další moduly jako senzory, zobrazovače a pohyblivé prvky (motory, serva), nebo dokonce i zcela vlastní elektronická zapojení. Micro:bit je v protiváze k Arduinu koncipován jako výukový modul pro rychlé vytváření jednoduchých zábavných aplikací, které často běží pouze na samotném Micro:bitu. Pro takovou aplikaci se k němu kromě baterie třeba už ani nic dalšího nepřipojuje, ale je samozřejmě možné další prvky přidávat. Arduino i Micro:bit lze programovat jak „textově“, kdy se program napíše v některém z podporovaných programovacích jazyků, tak i „graficky“, kdy se pomocí myši sestaví na obrazovce počítače aplikace z programových modulů, které do sebe zapadají jako dílky skládačky. Podpora pro oba zmíněné způsoby programování je dostupná na všech hlavních platformách Windows, Linux i Mac OS. Záleží tedy jenom na tom, co komu vyhovuje lépe.


Obr. 1 Oblíbené mikrokontrolérové moduly:
a) Arduino Uno (klon), b) Micro:bit, c) Arduino Pro Micro, d) Arduino Nano, e) Raspberry Pi Pico, f) BluePill ARM STM32

 

Čím začít?

Dnes je asi nejjednodušší i nejlevnější koupit nějaké Arduino s USB konektorem − zhruba od sto korun výše za „klon“ nebo kolem pěti set korun za „originál“. Pro jeho programování v textovém režimu je mezi začátečníky velmi oblíbené vývojové prostředí Arduino IDE, přestože poskytuje jen velmi omezené možnosti a pomůcky pro psaní i ladění programů. Je ke stažení zdarma jako aplikace nebo je možné využít velmi podobné prostředí na webové stránce v prohlížeči. Program se píše v programovacím jazyce C++ mírně upraveném pro snazší psaní programu, což je v dokumentaci označováno jako Wiring nebo Processing. Samozřejmě existují i jiné, pokročilejší možnosti, takže se o některých podrobněji zmiňujeme v doprovodných materiálech na webových stránkách časopisu.

Pokud chce někdo programovat Arduino graficky, jsou mu k dispozici vývojová prostředí jako mBlock, ArduBlock a Scratch for Arduino.

Micro:bit stojí o něco více (kolem 600 Kč), ovšem s tou výhodou, že máte k dispozici hned kromě samotného programovatelného čipu i malý maticový displej složený z 5 × 5 LED, dvě tlačítka, senzor naklápění, malý reproduktor, teploměr a kompas a hlavně spoustu projektů připravených přímo pro výuku těch, kdo s programováním dosud žádné zkušenosti neměli. Micro:bit byl sice původně určen pro výuku programování na základních školách ve Velké Británii, kde projekt vytvořila BBC pro podporu výuky informatiky, nicméně se časem ukázalo, že je velmi dobře použitelný i pro starší zájemce. Díky němu se naučilo programovat a současně přestalo bát elektroniky i hodně dospělých, včetně důchodců. O jeho úspěchu ostatně svědčí i to, že koncem roku 2020 byla na trh uvedena nová, bohatěji vybavená verze (Micro:bit v2) za cenu shodnou s původní verzí z roku 2016.

Základním nástrojem pro programování Micro:bitu je grafické prostředí MakeCode běžící ve webovém prohlížeči, a tedy nezávislé na operačním systému. V něm si pomocí myši přesouváte jednotlivé základní stavební prvky programu, přičemž prostředí samo hlídá, zda je možné ten který blok na daném místě použít. Nejde tak sestavit program, který nejde spustit, ale samozřejmě není zaručeno, že dělá to, co má dělat. Jednotlivé typy bloků jsou barevně odlišené a logicky uspořádané, což tvorbu programu velmi usnadňuje. Přímo v editoru je také možné běh programu simulovat a na obrazovce počítače vidět, co by zobrazoval skutečný Micro:bit.

Ten, komu grafické programování nevyhovuje, může v případě Micro:bitu tvořit programy v programovacím jazyce microPython zaměřeném právě pro programování malých zařízení s mikrokontroléry. MicroPython je odvozen od jazyka Python, který je mimochodem dnes velmi populární pro výuku programování ve školách.


Obr. 2 Tentýž program v různém provedení:
Pro Arduino v prostředí Arduino IDE v C++ (vlevo nahoře) a graficky v prostředí mBlock (vpravo nahoře),
pro Micro:bit v prostředí MakeCode graficky (vlevo dole) a textově v microPythonu (vpravo dole)

 

Programujeme...

V následujících odstavcích se pokusíme naznačit několik základních postupů nebo triků. Ty mohou značně usnadnit programování mikrokontrolérů, které mají obvykle poměrně omezené možnosti ve velikosti paměti, možnosti ladění atd. Další a podrobnější text lze nalézt v doprovodných materiálech zmíněných v úvodu tohoto článku.

Při programování je asi nejdůležitějším trikem rozdělit si v myšlenkách celý řídicí program na menší celky, které je možné snadno popsat slovy. Představme si, že někomu potřebujeme v několika málo větách vysvětlit, jak to celé funguje. Zaměříme se proto na stručný popis jednotlivých částí, a když budou tyto části snadno popsatelné, budou se nám i snadno programovat, protože nebudeme muset řešit všechno najednou.

Místo jednoho programu budeme tak mít sadu „bloků“, „modulů“, „funkcí“ nebo „procedur“, které potom složíme dohromady. U složitějších programů bývá potřeba toto rozdělení provést i na několika úrovních.

Dobrou zkušeností je také psát program tak, aby jednotlivé funkce nebyly příliš rozsáhlé – jakmile program přesáhne svou délkou zhruba jednu obrazovku, je obvykle potřeba ho rozdělit na menší samostatné části, abychom měli vždy hned přehled o tom, co daný úsek dělá. Stejně tak opakující se části kódu je více než vhodné vyjmout do samostatné funkce a místo kopírování kusů kódu na různá místa v programu tuto funkci pouze zavolat.

Složitější činnosti a rozhodování mohou být vyřešeny mnoha různými způsoby. Z průmyslové automatizace lze převzít pro mechatronické, IoT a menší robotické projekty řadu různých lety ověřených užitečných postupů, jako jsou například myšlenky reaktivních systémů, sekvenčních řadičů nebo stavových automatů, které ukazují princip zjednodušení a rozložení komplexního chování na jednoduché, snadno odladitelné akce.

Moderní styly programování využívají princip „zapouzdření“ funkčnosti do „objektů“ (nazývaných též „třída“, „modul“), jejichž základním úkolem je poskytovat funkčnost s veškerým komfortem pro programátora. Ten potom tuto funkčnost využívá, aniž by se musel zabývat nejjemnějšími detaily, přičemž je díky tomuto přístupu značně snížena možnost vzniku chyb. Objekt v tomto stylu interně drží data a prostředky, které jsou pro zajištění takové funkčnosti potřeba.

Například pro řízení elektrického motoru uživatel před použitím nejdříve nastaví potřebné parametry pomocí inicializační funkce, ale při vlastním provozu pak už programem pouze určuje například rychlost a směr otáčení. Jak konkrétně se motor na úrovni signálů řídí nebo jak nebo kam je připojen, ho v tu chvíli už nezajímá, protože to je skryto uvnitř objektu, který se sám postará o správný chod. To zahrnuje i kontrolu správných postupů použití – před prvním použitím je typicky potřeba nastavit typ a parametry motoru, způsob připojení a způsob jeho ovládání. Bez této inicializace objekt odmítne motor spustit.

V objektu je také obvykle skryt způsob, jakým je motor ve skutečnosti řízen, ať už přímým ovládáním pinů mikrokontroléru, nebo povely posílanými nějakým komunikačním kanálem do řídicí jednotky motoru.

Proč mi to zase nefunguje?

Když něco nefunguje, rozdělíme si program na co nejjednodušší části. Napíšeme si zvlášť různé malé programy na vyzkoušení výhradně jedné části hlavního programu. Přeprogramovat řídicí jednotku, ať už to je Arduino, Micro:bit, nebo jiný běžný modul, můžeme kolikrát chceme. Nahrání nového programu do mikrokontroléru je velmi rychlé, v řádu vteřin, takže není problém si vyzkoušet různé varianty vícekrát. Tím, že si uděláme jen malý prográmek, budeme mít také jen malý prostor pro chyby. Ty tak snáze odhalíme, než kdybychom je hledali ve velkém a komplikovaném programu, kde se těžko hledají. Ve větším programu může být navíc celá řada chyb, ale pro správný chod je potřeba odstranit všechny.

Ke kontrole běhu programu využíváme tzv. ladicí tisky – do programu přidáme výpis nějakého kratšího textu, indikujícího, co se zrovna děje. Obvykle je ale potřeba mít připojený počítač, kam se tyto tisky budou posílat k zobrazení, protože náš modul možná vůbec žádný displej nemá. Proto se také funkčnost programu často testuje nebo indikuje třeba jen pomocí obyčejné LED, kterou ve vhodný okamžik programem rozsvítíme nebo s ní blikneme. Toto bliknutí můžeme také postupně přemisťovat na různá místa v programu a postupně tak zkoušet a ověřovat jeho správný chod.

Při vývoji můžeme také tyto tisky nebo indikaci pomocí LED využít pro nahrazení skutečné činnosti: tak například místo skutečného roztočení motoru pouze necháme vypsat kontrolní hlášení „Zapínám motor“ a podobně.

Na druhou stranu je třeba dát pozor na to, že ladicí tisky mohou chod programu výrazně zdržovat. Příprava i zpracování textu k zobrazení totiž nějakou dobu trvá. Navíc pokud je obsluha tisku blokující, což znamená, že funkce pro poslání dat skončí, až když jsou data skutečně odeslána, bude výrazně záležet na délce textu a rychlosti komunikace.

Typickým případem jsou malé platformy typu Arduino, kde není k dispozici více výpočetních jader ani komfort operačního systému. Odeslání každého jednoho znaku přes sériovou linku trvá nějaký čas a přenosové rychlosti jsou v porovnání s taktovací frekvencí mikrokontroléru velmi nízké, což v důsledku znamená, že mikrokontroler stráví významný podíl času přenosem dat místo vlastní práce. Například při rychlosti přenosu 9600 baudů (bitů za sekundu) trvá odeslání textu „Hello World!“ 12,5 milisekundy. Odesílání takového textu jednou za sekundu pak znamená zdržení 18 minut denně. S běžnými přenosovými rychlostmi poslání i jen jediného písmene do počítače z Arduina běžícího na frekvenci 16 MHz zabere stejný čas jako vykonání téměř 17 tisíc strojových instrukcí a to se samozřejmě na výkonu a funkčnosti programu může projevit velmi negativně. Navíc se při změně délky textu nebo rychlosti přenosu samozřejmě změní i celková prodleva.

Obdobně to platí i pro Micro:bit − zobrazení běžícího textu na maticovém LED displeji znamená výraznou časovou zátěž, takže vypisovat text na jedoucím robotovi je v podstatě nemožné a je potřeba využít jiný způsob informování člověka o chodu programu. V tomto případě by mohlo například postačovat na displeji zobrazit jediné písmeno místo rolujícího textu.

Mohu se spolehnout?

I když je internet důležitý zdroj informací, stejně jako v jiných oblastech úroveň kvality velmi kolísá. Příklady uvedené na internetu často fungují jen autorovi v jeho konkrétní sestavě a stejně tak jsou často dokonce principiálně špatně navrženy jak po softwarové, tak po hardwarové stránce, přičemž jsou navíc i špatně zdokumentovány − o některých typických problémech se zmíníme v dalším díle seriálu. Je proto třeba k nim vždy přistupovat se značnou rezervovaností a brát je spíše jako inspiraci pro vlastní projekt. Jsme to my, kdo programujeme a kdo našemu dílu potřebuje nejvíc rozumět, takže je potřeba si přebíraný program důkladně projít a pochopit. Bohužel se i ve světě Arduina často setkáváme s chybami v tzv. „knihovnách“, které jejich autoři publikují pro ulehčení práce s nejrůznějšími externími moduly a periferiemi. Uživatelé pak mohou strávit dlouhý čas hledáním chyb, které nezpůsobili.

Příště

Protože se každý správný robot musí pohybovat, podíváme se v dalším díle seriálu na řízení krokových a stejnosměrných motorů a modelářských serv.

david.obdrzalek@mff.cuni.cz | rotta@jederobot.cz
www.robodoupe.cz | www.dps-az.cz/zajimavosti/mechatronika

 
Přílohy

Micro:bit přichází
Micro:bit je mikropočítač orientovaný především na školní mládež ve věku 11 až 12 let, který vznikl v britském univerzitním prostředí z iniciativy mediální společnosti BBC a s podporou velkých firem jako platforma, umožňující školákům zábavnou formou základní seznámení s výpočetní technikou.
Odkaz na celý článek

Micro:bit – programování v Pythonu
Python je interpretovaný programovací jazyk, určený pro všeobecné programování. Hlavnou výhodou je jeho srozumitelnost, takže zdrojovému programu v jazyku Python porozumí i začátečník a velice brzy v něm dokáře realizovat své projekty.
Odkaz na celý článek

Vývojová deska Raspberry Pi Pico
Mikropočítače Raspberry Pi mají vysoký výkon a možnost připojení monitoru, klávesnice a myši, takže jsou to v podstatě mikropočítače, ke kterým můžete připojit různé hardwarové prvky. Nový Raspberry Pi Pico je malý, tenký, lehký a levný a lze jej programovat v programovacích jazycích MicroPython nebo C++.
Odkaz na celý článek

ARDUINO – příručka programátora
Tato publikace je určena začátečníkům, kteří se chtějí seznámit se základním programováním dnes oblíbené platformy Arduino. Není to učebnice programování a není to ani „úplná učebnice Arduina“. Je to text, jehož cílem je dát základní popis, rady a návod, jak to celé uchopit, abyste se hned na začátku neztratili.
Odkaz na celý článek