Close

Jak se staví mazel aneb LEGO potkává micro:bit [ ČÁST 1 ]

Mazel micro:bit [ ČÁST 1 ]

Pamatujete si na Tamagoči? V roce 1996 opanovala japonský trh a od roku 1997 se pustila tato digitální zvířátka do dobývání světových trhů. Koncept byl jednoduchý a přitom neuvěřitelně chytlavý: Staráte se o digitální zvířátko, které čas od času vyžaduje nějakou zvláštní péči, jako je pohlazení, nakrmení či hraní. Stačila tři tlačítka a mohli jste se vrhnout do zkoumání, jak moc špatnými jste opatrovníky domácích mazlíčků – protože, co si budeme nalhávat, většina digitálních zvířátek podlehla následkům zanedbání péče.

Proč o tom mluvím? Měl-li bych se držet tradice, začnu vám nyní nudně líčit tak zajímavé věci, jako jako je využití zabudovaných senzorů na desce micro:bitu. Upřímně mám ale pocit, že to je cesta, kterou se vydali už mnozí přede mnou a komu to vyhovuje, ten už si cestu k informacím našel. Já ale raději využiji možnosti předvést jednotlivé senzory na konkrétním použití. A taky jsem slíbil, že se podíváme, jak zabudovat micro:bit do stavebnice LEGO, a tohle je skvělá příležitost! Vzhůru do stavby mikrobití tamagoči ovečky!

Inventář čili Co budeme potřebovat

Ještě než se pustíme do samotného projektu, pojďme si říct, jaké vybavení budeme potřebovat:

  • mikropočítač micro:bit;
  • držák pro dvě tužkové baterie AAA s kabelem pro micro:bit a vypínačem – sestavení ovečky je navrženo na míru průhlednému držáku z dílny ELECFREAKS, použitelné budou jistě i další, ale možná bude třeba mírně upravit konstrukci;
  • USB kabel s koncovkou micro-USB pro stažení programu;
  • kostky LEGO na stavbu ovečky, všechny potřebné je možné najít například v sadě LEGO Minecraft 21153;
  • magnet – měl by posloužit jakýkoli, kdo však chce být stylový, může použít žlutou magnetku z příslušenství LEGO 853915;
  • kapesní svítilna – použít můžete i chytrý telefon.

[ TIP ] Elektronické vybavení si můžete pořídit také v praktické sadě BBC micro:bit s USB kabelem a držákem baterií.

Samozřejmě nesmíme zapomenout na baterie! Počítač micro:bit má relativně nízkou spotřebu, takže klasické baterie vydrží poměrně dlouho, ale je možné použít i dobíjecí baterie. Já osobně preferuji ty dobíjecí, protože na rozdíl od klasických baterií se neroztékají, když je zapomenete v držáku – tzv. battery boxu – pár měsíců bez využití. Je však potřeba vás upozornit, že dobíjecí baterie poskytují o něco menší napětí, což se může projevit například o něco nižší intenzitou osvětlení rozsvícených LED nebo zhoršenou funkčností micro:bitu při využití zařízení s větším odběrem. Omezen může být také rádiový dosah.

Osobně se mi ještě nepovedlo ho do takové konfigurace dostat, nicméně je mou povinností zopakovat, že výrobce doporučuje využívat k napájení micro:bitu dvě tužkové AAA baterie s napětím 1,5 V.

Budovatelské intermezzo aneb stavíme LEGO

Jestli jste jako já, tak se v tuto chvíli nemůžete dočkat, až rozbalíte kostičky LEGO a začnete skládat za doprovodu důvěrně známého cvakání! Mám pro vás dobrou zprávu: Teď je ten okamžik, kdy tamagočimu vtiskneme tvar ovečky – návod si můžete stáhnout přímo zde:

Nakonec už jen stačí vložit baterie do držáku, ten zasunout ovečce do bříška a připojit baterie do odpovídajícího konektoru – to byste měli vidět na úvodní stránce návodu.

Základní schéma chování aneb trocha nalejvárny

Kód programu je vlastně způsob, jak popsat stroji pro něj srozumitelným jazykem, co chceme, aby vykonával. Jde ho tedy přeložit do lidské řeči, ale i obráceně, čehož se pokusíme využít v tomto návodu. Nejdřív si pojďme ujasnit základní schéma chování našeho tamagočiho. K tomu nám pomůže následující diagram:

diagram chování tamagoči ovečky

To ale nevypadá moc jako lidská řeč, že? Pojďme tedy diagram přeložit:

  • Na začátku je tamagoči ovečka spokojená.
  • Když je ovečka spokojená, po chvíli začne pociťovat náhodně zvolený nedostatek nějaké potřeby.
  • Ovečka dá najevo svou potřebu a chvíli čeká, jestli bude naplněna, či nikoli.
  • Pokud je potřeba naplněna, ovečka je spokojená. Dále postupuj podle „Když je ovečka spokojená, …“
  • Pokud potřeba není včas naplněna, ovečka umře. I digitální svět je někdy krutý.

Z těchto bodů už můžeme vyčíst, kromě toho, že naše ovečka je věčně nespokojená, že základ programu bude spočívat v přepínání mezi jednotlivými náladami. K formalizaci tohoto přepínání se vysloveně nabízí událost <forever>, která bude neustále monitorovat, v jaké náladě se tamagoči ovečka nachází a podle toho upravovat její chování. Zde je ideální příležitost prozkoumat záložku Logic!

záložka Logic

Jak si můžete všimnout, je rozdělena do několika sekcí. První jsou Conditionals čili podmínky. Zde se nacházejí dvě varianty velmi důležitého bloku, se kterým budeme pracovat vždy, když bude potřeba se rozhodnout mezi různými možnostmi pokračování.

makecode logika podmínky

Tento blok ověřuje, zda byla splněna podmínka, která je uvedena v šestiúhelníkovém poli za IF. Pokud je splněna, provede se kód, který je uveden v sekci THEN. Pokud splněna není, provede se kód, který je v sekci ELSE. Když však v případě nenaplnění podmínky nechceme provádět nic, můžeme vynechat celou sekci ELSE, což zobrazuje zjednodušená verze bloku nahoře.

Ale co když se, jako v našem případě, potřebujeme rozhodnout mezi více variantami? Můžete si všimnout, že na bloku je symbol plus v kroužku: Když na něj kliknete, přidá se další řádek. Pokud nebyla obsažena, přidá se nejprve sekce ELSE, potom se začnou pod sebe přidávat sekce ELSE IF obsahující další šestiúhelníkové políčko pro podmínku. Je však dobré mít na paměti, že podmínky se vyhodnocují v tom pořadí, v jakém jsou uvedeny shora dolů. Uvedené informace se nám rozhodně budou při stavbě tamagoči parťáka hodit.

Nejlepší bude uvést si příklad: Chceme určit, jestli se číslo x nachází v (uzavřeném) intervalu od -5 do 5. To můžeme provést například touto podmínkou:

makecode podmínka příklad
Příklad zadání podmínky, která neustále kotroluje, za se číslo x nachází v intervalu <-5,5>

V prvním kroku vyhodnotíme, jestli je číslo x větší než pět. Pokud ano, pak víme, že v intervalu není.

V druhém kroku vyhodnotíme, jestli číslo x menší než mínus pět. Opět, pokud je, pak víme, že v požadovaném intervalu není.

A protože k sekci else se dostaneme jen v případě, že obě předchozí podmínky nebyly splněny, víme, že číslo není ani větší než pět, ani menší než mínus pět, což znamená, že se musí nacházet v našem hledaném intervalu!

makecode logika porovnání

Náš příklad nám předvedl i další bloky. Podmínky byly určeny pomocí porovnání hodnot, tedy bloků ze sekce Comparison. Jak už jsme si řekli, podmínky se vkládají do šestiúhelníkových polí. Ta označují výrazy, které mohou nabývat jen hodnot „true“ nebo „false“, tedy „pravda“ nebo „nepravda“. Tomuto typu výrazů se říká boolean či booleovské výrazy[ 1 ].

Všimněte si zaoblených bloků, do kterých vkládáte porovnávané hodnoty – může se jednat o číselné hodnoty, případně řetězce znaků. Pokud chceme, aby se s hodnotou zacházelo jako s řetězcem znaků, je třeba ji vložit do uvozovek „“. To se hodí například v případě, kdy byste potřebovali z nějakého důvodu pracovat s čísly jako s textem. Čísla a řetězce znaků nelze navzájem porovnávat.

makecode logika bool

V sekci Boolean nalezneme logické operace prováděné s booleovskými výrazy pomocí logických spojek. V logice používáme slovo spojka trochu šíře než v přirozeném jazyce. Kromě nejběžnějších binárních spojek, které spojují dva výrazy, máme i spojky unární, tedy spojky, které nějak ovlivňují jen jeden výraz.[ 2 ]

Spojka AND je logická konjunkce, výrok je pravdivý pouze v případě, že levý i pravý výrok jsou také pravdivé.

Někoho však může může mírně zmást spojka OR, logická disjunkce. V přirozeném jazyce ji obvykle vyjadřujeme spojkou NEBO – ta se však v češtině dá interpretovat dvěma způsoby – jako vylučovací spojka, nebo jako slučovací spojka. A stejně tak logika rozlišuje exkluzivní disjunkci a inkluzivní disjunkci. Abych tu příliš nemachroval cizími slovíčky, zestručním výklad: tyto spojky se liší v tom, zda mohou nastat oba případy.

Ve větě „Mám Ti objednat šunkovou pizzu, nebo havaj?“ nepředpokládáme, že by si dotazovaný chtěl objednat oba druhy pizzy. Stejně tak v případě věty „Stavím se v úterý, nebo ve středu.“ nepředpokládáme, že by mluvčí dorazil/a v úterý i ve středu. To je vylučovací použití spojky nebo – všimněte si, že v psané podobě před spojkou nebo potom píšeme čárku. To je exkluzivní disjunkce a v informatice se pro nic vžilo označení XOR.

Pokud ale někde uvidíme ceduli hlásající „otevřeno jen o víkendech nebo o prázdninách“, jedná se o slučovací použití spojky nebo – poměrně dobře si můžeme představit, že nastane situace, kdy je víkend a zároveň prázdniny. V logice pak říkáme, že se jedná o inkluzivní disjunkci a považujeme ji za základní podobu disjunkce. Pokud tedy mluvíme jen o disjunkci, označovanou tradičně OR, jedná se o tuto, inkluzivní, variantu.

Spojka NOT nám vrátí opačnou hodnotu, než kterou má vložený booleovský výraz. Pokud tedy vložíme pravdivý výraz, dostaneme výraz s hodnotou FALSE a obráceně, pokud vložíme nepravdivý výraz, dostaneme výraz s hodnotou TRUE.

[ CVIČENÍ 1 ] Výrazy lze libovolně vnořovat do sebe. Uměli byste pomocí spojek AND, OR a NOT utvořit podmínku, která by vracela stejný výsledek jako spojka XOR? Napovím, že k řešení vás může dovést, když dobře popíšete, čím se spojka XOR liší od spojky OR.

TRUE a FALSE jsou logické konstanty. Pokud je vložíme do podmínky, říkáme, že daná podmínka je vždy pravdivá, případně není pravdivá nikdy.

záložka Variables

V našem příkladě, kde jsme zjišťovali, zda se číslo nachází v intervalu, jsme toto číslo označovali x. V matematice bychom ho někdy označili za neznámou, případně za proměnnou. Právě označení proměnná se používá i v programování. Jedná se o způsob, jak si pojmenovat prostor v paměti, kam si uložíme nějakou hodnotu. Jistě to znáte ze školy, kde vzorečky pracují neustále s proměnnými – třeba obsah obdélníka je určený vztahem S = a . b, kde S je označení pro plochu, v našem případě obsah obdélníku, a a a b jsou délky stran.

Při programování tamagoči ovečky bude využití proměnných důležité, proto se teď podíváme, jak se s nimi v prostředí MakeCode pracuje.

makecode proměnné

Když si v novém projektu otevřete záložku Variables, uvidíte jen prázdnou záložku s rámečkem Make a Variable… Když na tento rámeček kliknete, vyzve vás prostředí k pojmenování nové proměnné. Tím ji vytvoříte. Jakmile se tak stane, objeví se tato proměnná v nabídce záložky jako zaoblený blok. Dále se pod výčtem proměnných objeví další dva bloky, které můžete přidat do kódu.

makecode proměnné nastavení proměnné

Blok <set [variable] to [value]> přiřadí proměnné konkrétní hodnotu. Všimněte si, že hodnota je v zaobleném rámečku a můžete do ní vnořovat libovolné zaoblené bloky – pokud tedy chcete novou hodnotu vypočítat z jiných proměnných, můžete do tohoto rámečku vložit formuli pro výpočet:

makecode proměnná příklad nastavení hodnoty proměnné
Příklad nastavení proměnné na výsledek formule a . b

Blok <change [variable] by [value]> je zkrácený zápis pro jednu z nejčastěji využívaných operací a tou je zvýšení hodnoty proměnné, nejčastěji o jedna. Pokud byste však potřebovali naopak odečítat, prostě zadejte do hodnoty záporné číslo.

makecode příklad proměnné bool
Příklad přiřazení booleovského výrazu proměnné

Pokud jste si dobře prohlédli postup, kterým jsme zjišťovali, zda je číslo v požadovaném intervalu, jistě vás zarazilo, že jsme proměnné InInterval, jejíž hodnota má zaoblený rámeček, přiřadili booleovský výraz, který má šestiúhelníkový rámeček. Prostředí MakeCode vám povolí vložit šestiúhelníkové bloky do zaoblených rámečků, zároveň však kontroluje, zda to někde nevyvolá chybu.

Pokud chcete, aby proměnná nesla hodnotu typu boolean, musíte se k ní tak chovat v celém kódu. Můžete si vyzkoušet, že když se pokusíte přiřadit do stejné proměnné jednou hodnotu typu boolean a jindy číslo, objeví se vám u všech bloků, které s proměnnou pracují trojúhelník s vykřičníkem.

Stavíme tamagočimu kostru programu

Když za sebou máme další kolo povinné teorie, můžeme se vrhnout do budování kostry našeho programu. Proč říkám kostry? Ovečka ve stylu tamagoči už je poměrně rozsáhlý program a proto se vyplatí kód budovat po menších krocích. Ty pak vyzkoušet, že fungují přesně, jak mají, a teprve pak začít přidávat další části.

Začneme tím, že si vytvoříme nový projekt, který si pojmenujeme tak, abychom poznali, o jaký program jde – navrhuji jméno Ovecka.hex, abychom se vyhnuli případným potížím s diakritikou.

Když si vezmeme k ruce výše uvedený diagram, uvidíme, že srdce, které pohání celý náš program, je přepínání mezi jednotlivými náladami. Nabízí se nám řešení, když blok <forever> bude neustále ověřovat, jakou má ovečka zrovna náladu, a podle toho měnit její chování. Pro zjištění aktuálního stavu nálady využijeme proměnnou – pojmenujme si ji mood. Pro snadnější práci s touto proměnnou přiřaďme jednotlivým náladám číslo:

0dead
1happy
2hungry
3gloomy
4scared

[ TIP ] Doporučuji si význam těchto čísel vložit do komentáře. To uděláte tak, že kliknete pravým tlačítkem na blok, ke kterému chcete přidat komentář a zvolíte Add Comment.

Rovnou můžeme zajistit, že jakmile ovečku zapneme, bude spokojená. To zajistíme tak, že v bloku <on start> nastavíme hodnotu proměnné mood na 1. Výsledek by pak měl vypadat nějak takto[ 3 ]:

makecode vícestavová podmínka pro ovečku tamagoči

Dobrá, program už ví, jakou náladu tamagoči ovečka má, ale pro nás je to stále záhada. Pro přímé zobrazení stavu můžeme využít LED matice – stačí, když si pro každou náladu zvolíme nějaký obrázek, který nám ji pomůže identifikovat. Já vybral následující označení: mrtvá ovečka – obrázek lebky, šťastná ovečka – obrázek srdíčka, hladová ovečka – obrázek otevřené pusy, zádumčivá ovečka – obrázek deštníku, vystrašená ovečka – obrázek ducha.

Přiřaďme každému stavu zobrazení odpovídajícího obrázku… A v tuto chvíli máme permanentně spokojenou ovečku, protože nemáme nic, co by změnilo její tamagoči náladu. 

Podle diagramu šťastné ovečce vyvstane náhodně zvolená potřeba – jak to přeložit do kódu? Potřeba vlastně odpovídá konkrétní náladě. A v tuto chvíli se zdá, že jsme si docela šikovně zvolili reprezentaci nálad jako číselnou hodnotu. Takže pokud víme, že když je ovečka šťastná, má její nálada hodnotu 1, a nálady vyjadřující nějakou potřebu mají hodnoty 2, 3, nebo 4, pak nejjednodušší způsob reprezentace potřeby bude zvýšit hodnotu nálady o náhodně zvolené číslo od jedné do tří.

Pro vygenerování náhodného čísla slouží blok <pick random [number] to [number]>, který najdeme v záložce Math. Levé číslo určuje minimální zvolenou hodnotu, pravé číslo maximální možnou volbu. Pokud vložíme celá čísla, bude i náhodné číslo celé. Pokud tedy chceme zvýšit hodnotu proměnné náhodně o 1-3, poskládáme bloky takto: <Change [mood] by <pick random [1] to [3]>>. Výsledný blok vložíme do podmínky za obrázek srdíčka.

V tuhle chvíli nám ale ovečka s tamagoči povahou změní náladu ihned poté, co je spokojená, ale my bychom přeci jen rádi, aby nějakou chvíli spokojená vydržela. Toho docílíme tak, že mezi blok zobrazení obrázku a blok nastavující novou hodnotu vložíme blok <pause>. Ten najdeme v záložce Basic, jak jsme se dozvědeli v dřívějším článku. Krátká přestávka nám umožní trošku si odpočinout od neustálého napětí, co bude zase ovečka vyžadovat.

Abychom se však udrželi ve střehu, mohla by být i délka pauzy náhodná – řekněme mezi jednou a dvěma sekundami. Protože blok <pause> udává přestávku v milisekundách, bude výsledek vypadat takto: <pause <pick random [1000] to [2000]>>. Samozřejmě že pokud vám bude připadat přestávka příliš krátká, či naopak příliš dlouhá, můžete hodnoty upravit.

V současné chvíli máme ovečku, která se nám po spokojené chvilce přepne do stavu neustálé potřeby – do které, to je zvoleno náhodně. Bylo by tedy záhodno, aby se nám ovečka vracela do dobré nálady. Pojďme tedy sestavit podmínku, která řekne, že pokud je zmáčknuto tlačítko B, nastavíme náladu na happy, tedy na hodnotu 1, pokud ale bude potřeba, můžeme zmáčknout tlačítko A, čímž nastavíme hodnotu 0 a tamagoči ovečka se nám odebere na věčnost. Zda je zmáčknuté tlačítko zjistíme pomocí bloku <button [] is pressed>, který najdeme v záložce Input. Výsledná podmínka bude vypadat takto:

<if <button [B] is pressed> then
  <set [mood] to [1]>
else if <button [A] is pressed> then
  <set [mood] to [0]>
>

Nyní tuto podmínku vezměme a zduplikujme ji za obrázek v každém ze stavů 2, 3 a 4. Duplikování bloku, včetně bloků vnořených, provedeme tak, že klikneme pravým tlačítkem na blok a zvolíme možnost Duplicate. Zde si můžete prohlédnout, jak by měl vypadat náš aktuální kód pro tamagočiho:

makecode vícestavová podmínka pro ovečku tamagoči

Máme hotovou kostru programu, takže se můžeme kochat, jak se nám mění ikonky nálady našeho tamagočiho. V příštím díle našeho seriálu se naučíme vytvářet samostatné funkce, které nám kód rozdělí do ještě menších bloků a tím ho zpřehlední.


[ 1 ] Booleovské výrazy jsou pojmenovány po matematikovi Georgi Booleovi, anglickém matematikovi a logikovi (někdy se uvádí, že irském, což je způsobeno tím, že se narodil irským rodičům žijícím v anglickém Lincolnu). V současnosti si jeho jméno spojujeme nejčastěji s booleovskými algebrami, což jsou algebraické struktury, nejčastěji nad dvouprvkovou množinou. Tyto dva prvky můžeme identifikovat například se stavy zapnuto-vypnuto či pravda-nepravda.

Tato zdánlivě velmi abstraktní konstrukce sehrála obrovskou roli ve vývoji počítačů: Když začali inženýři někdy v první polovině 30. let 20. století zkoušet propojení mnoha relé do soustavy reléových počítačů, ještě si neuvědomovali souvislost právě s operacemi nad hodnotami zapnuto-vypnuto. A přestože výsledek občas vyhodil pojistky, někdy dokonce shořel obvod, díky zkušenostem inženýrů tyto počítače většinou fungovaly.

V roce 1936 však na místo asistenta na Massachusettském technologickém institutu (slavném MIT) nastoupil Claude Elwood Shannon, který hned v roce 1937 obhájil možná nejvlivnější magisterskou diplomovou práci v historii, kde ukázal využití booleovských algeber při návrhu reléových sítí. S nadhledem sobě vlastním pak údajně zdůvodňoval svůj úspěch tím, že shodou okolností byl jediný, kdo ovládal obojí tématiku – tedy jak reléové sítě, tak booleovské algebry. Mimo jiné tak jméno George Boolea nejspíš navždy vložil do slovní zásoby informatiky.

[ 2 ] Z čistě formálního hlediska můžeme mít i tzv. nulární spojky, častěji je však nazýváme logické konstanty, protože se nespojují s žádným výrazem. V našem případě se tak jedná o bloky TRUE a FALSE. Nahlížet na ně jako na spojky nám někdy může pomoct nahlédnout jejich využití ve složených výrazech – jedná se ale do značné míry o vysoce abstraktní záležitost a pokud z toho máte zamotanou hlavu, tak se tím v tuto chvíli netrapte a přijměte to prostě jako poznámku pod čarou.

[ 3 ] Měli byste se nyní podivovat, jak se mi podařilo vytvořit podmínku, která obsahuje několik sekcí ELSE IF, ale neobsahuje sekci ELSE. Toho docílíte tak, že jakmile vytvoříte všechny požadované sekce ELSE IF, kliknete na odebrání sekce ELSE. Samozřejmě, že ji můžete odebrat i dřív, ale jakmile přidáte další sekci, vždy se přidá nejprve ELSE a teprve potom se začnou vytvářet další podmínky.

Emmet BrickHacker

Napsat komentář