Close

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

Mazel micro:bit [ ČÁST 3 ]

V první části tohoto seriálu jsme se pustili do stavby tamagočiho v podobě ovečky ze stavebnice LEGO. Nakreslili jsme si základní schéma chování a sestavili rozhodovací kostru našeho programu.
Druhá část nám ukázala, jak sestavit rozdělit kód do podprogramů – tzv. funkcí a tím ho zpřehlednit
.
Tentokrát si ukážeme, jak se může program rozhodovat na základě informací vyčtených ze senzorů.

Ovečka se učí čití

Také u vás ve škole při výuce základních psychologických pojmů lpěli na znalosti slova čití? Jedná se o velmi archaický výraz pro vnímání počitků vyvolaných působením podnětů na smyslové orgány. Ta definice asi není o moc lepší – v zásadě se jedná o schopnost vnímat informace ze smyslových orgánů, což v případě robotů znamená ze senzorů.
A přesně to je to, co nám chybí k tomu, abychom našeho tamagočiho přivedli k životu: schopnost číst informace ze zabudovaných senzorů. Pro každou z potřeb pak stanovíme nějaká kritéria, jak změřit její naplnění.

Jak nakrmit ovečku magnetem

Začneme pěkně z ostra – copak asi jí robotická ovečka? No přece magnetické seno, to dá rozum! A je dokonce celkem nenáročná, stačí ji chvíli vystavit působení dostatečně silného magnetického pole a je spokojená – ovečka se najedla a magnet zůstal celý! (Což je jedině dobře, protože kdyby nám tamagoči magnety spotřebovával, asi by nám brzy zemřel hlady a my bychom si neměli čím připínat na lednici vzkazy, že už zase chybí mléko.)

Magnetické pole budeme zkoumat pomocí elektromagnetického kompasu – to je senzor, který dokáže určit nejen sílu magnetické indukce, ale také směr, odkud přichází a protože naše planeta je jeden velký magnet, dokáže senzor určit i polohu v prostoru, tím že detekuje magnetický pól Země.

Co nám ovšem v tuto chvíli nejspíš brání, abychom vyrazili vstříc lánům magnetického obilí je potřeba kalibrace kompasu. A to i v případě, že chceme měřit jen velikost magnetické indukce.[ 7 ]

Kalibrace magnetického kompasu

Před prvním použitím je třeba kompas zkalibrovat, zároveň je doporučeno učinit tak vždy, když změníme prostředí, ve kterém chceme senzor používat – docílíme tak větší přesnosti.

Jakmile nahrajete program do micro:bitu a pokusíte se číst data z kompasu, spustí se kalibrace, která se oznámí běžícím textem TILT TO FILL SCREEN, čili žádostí o natáčení micro:bitu do doby, než se rozsvítí všechny diody na LED matici.

[ TIP ] Kalibrace je puštěna už během zobrazení běžícího textu, pokud ji chcete urychlit, můžete začít s nakláněním desky ještě před doběhnutím textu.

Zrychlení kalibrace v průběhu zobrazení instrukcí

Jak se měří hlad

Když už máme kompas zkalibrovaný, čekají nás ještě dvě kontrolní stanoviště, než dorazíme do cíle. To první vyžaduje změřit sílu magnetické indukce, to druhé je trochu záludnější: Musíme zjistit, jakou nastavit kontrolní hodnotu, abychom věděli jak stanovit podmínku.
Začneme tou jednodušší částí – funkci pro změření magnetické indukce najdeme v záložce Input, kde otevřeme podzáložku … more a tam najdeme blok <magnetic force>.

makcode záložka input magnetická indukce
Blok pro měření magentické indukce naleznete v záložce Input

Jistě jste si všimli, že se jedná o zaoblený blok – to proto, že tato funkce vrací číselnou hodnotu. Skvělé – teď už nám zbývá jenom určit, jak poznáme, že je magnet dostatečně blízko… A v tomto okamžiku doporučuji uložit náš program Ovecka.hex a vytvořit nový, pojmenujme ho například MereniSenzoru.hex.

Měření hodnot na samotném micro:bitu není úplně komfortní, protože jediný přímo vestavěný komunikační nástroj je nám již důvěrně známá LED matice – ale buďme rádi za ni, lze na ní zobrazit běžící text, což sice není nejpohodlnější na čtení, ale přeci jen nám to umožňuje měření hodnot v téměř reálném čase.

Kód našeho měřícího programu bude jednoduchý – do bloku <forever> vložíme ze záložky Basic blok <show number> do kterého uložíme hodnotu magnetické indukce. Pokud chceme, můžeme měření trochu zrychlit, když hodnotu ještě zaokrouhlíme pomocí bloku <round>, který najdeme v záložce Math. Zde je potom výsledek:

zobrazení velikosti magnetické indukce na LED matici micro:bitu
MereniSenzoru.hex – kód pro naměření velikosti magnetické indukce

V mém případě se magnetická indukce drží pod hodnotou 40 μT, pokud je magnet daleko a dosahují výšin několika stovek, když se magnet přiblíží. Nutno podotknout, že magnet, který používám není nijak silný, takže pokud použijete třeba neodymové magnetky, je možné že dosáhnete mnohem vyšších hodnot.

V mém případě každopádně stačí, když přesáhnu hodnotu 200 μT – je velmi těžké jí dosáhnout toho jinak, než že vložím magnet ovečce pod hlavu, tam kde bychom očekávali ústa.

Nyní se můžeme vrátit do našeho hlavního programu Ovecka.hex a doplnit podmínku do funkce hungy:

Kompletní kód funkce hungry pro tamagočiho
Kompletní kód funkce hungry pro tamagočiho

[ CVIČENÍ 3 ] Zkuste nyní popřemýšlet, jak upravit náš kód, abyste si mohli vyzkoušet, že měření magnetické indukce funguje tak, jak potřebujeme. Napovím, že poměrně jednoduchá cesta by byla donutit ovečku, aby jako nespokojenost vždy projevila právě hlad.

Jak si posvítit na zádumčivost

Ovečka je nakrmená, mohlo by se zdát, že je vše v pořádku – ale ouha, útočí na ni chmury a upadá do deprese. A to je nebezpečná věc – rozhodně bychom měli zádumčivost rozehnat dříve, než si tamagoči začne do školy nosit benzín a zápalky, nejpozději v okamžiku, kdy začne nabádat Kuncovou, aby na druhý den nechodila do školy.[ 8 ]

A co je osvědčený lék na chmury? Přece dostatek sluníčka! To se nám ovšem replikuje poněkud nesnadno, tak si vystačíme s tím že ovečce pořádně posvítíme do očí, však ona už se dozná… tedy pardon, rozveselí!

Tentokrát nemusíme vůbec nic kalibrovat – stačí, když znovu naměříme hodnoty, tentokrát si však ze záložky Input vybereme <light level>. Při měření hodnot pamatujte, že je třeba mířit na LED matici, která měří intenzitu osvětlení.[ 9 ]

zobrazení velikosti magnetické indukce na LED matici micro:bitu
MereniSenzoru.hex – kód pro naměření úrovně osvětlení

Protože tento návod sepisuji v relativním přítmí, ovečka mi za běžných okolností naměří intenzitu osvětlení 0 – ne že by tu byla tma nebo nebylo vidět, jen množství světla je mimo její rozeznávací schopnost. Když posvítím, jsou hodnoty velmi pohyblivé, ale téměř vždy překračují intenzitu 200 – protože mám rád pěná binární čísla, vyberu si jako mezní hodnotu 192.[ 10 ] Můžeme tedy doplnit podmínku i do funkce gloomy:

Kompletní kód funkce gloomy pro tamagočiho
Kompletní kód funkce gloomy pro tamagočiho

Kurz strkání hlavy do písku aneb Kdo se bojí musí pod stůl

Nevím čím to je, ale naše ovečka je občas docela úzkostná – rozhodně to však nemá nic společného s tím, že jí chmury rozháníme svícením do obličeje!

Nicméně se ukázalo, že alespoň v tamagočiho světě platí, že když strčíte hlavu do písku, všechny problémy zmizí! Možná, že předtím, než jsme z kostek postavili ovečku, byl to pštros…

Fajn – ale jak ovečka zjistí, že má hlavu v písku? No dobře, tak si pomůžeme trochou zjednodušení a bude nám stačit, když hlavu natočí směrem k zemi. To zjistí pomocí akcelerometru – to je senzor, který měří zrychlení, tedy akceleraci tělesa, na němž je namontovaný. A jak je dnes již poměrně běžné, dokáže tento senzor měřit zrychlení ve všech třech prostorových osách. To nám umožňuje měřit otřesy a do značné míry i náklon tělesa. Můžeme tak pomocí akcelerometru počítat například kolik jsme ušli kroků. V našem případě ho využijeme pro rozpoznávání gest – ta najdeme opět v záložce Input, konkrétně nás bude zajímat blok <is [] gesture>, který však narozdíl předchozích dvou případů vrací hodnotu typu Boolean.

nastavení gesta jako podmínky v makecodu
Gesto jako podmínka ve funkci scared pro tamagočiho

Volba gest má celkem srozumitelná vyobrazení:

  • shake znamená zatřesení – dokáže zaznamenat otřesy, například při chůzi,
  • logo up, logo down, screen up, screen down, tilt left a tilt right měří natočení v některém směru,
  • free fall detekuje, že micro:bit padá,
  • 3g, 6g a 8g označují velikost naměřeného přetížení, což zjednodušeně můžeme vnímat jako sílu nárazu. Jen pro představu – na největších horských drahách můžete zažít přetížení 4g, vyšší přetížení už necvičeného člověka způsobuje poruchy vidění, 8g je zhruba hranice toho, kdy je člověk schopen provádět koordinované pohyby (podepřenou) rukou bez speciálního obleku. Jedná se tedy o poměrně velká přetížení.

Jak je z obrázku patrné, nás zajímá detekce gesta screen down, které vykonáme tím, že natočíme ovečku obličejem k zemi.

Můžeme se radovat – právě jsme převedli náš úvodní diagram do funkčního kódu! Pro tentokrát se s tím spokojíme, příště se ale podíváme na to, jak bychom mohli kvantifikovat naši úspěšnost, abychom se mohli chlubit, kdo je horší pečovatel o robotická zvířátka!


[ 7 ] Jen pro úplnost – magnetickou indukci měříme v jednotkách zvaných tesla, značka T (pojmenováno po slavném elektrotechnikovi a vynálezci Nikolu Teslovi). A kdo chce oslňovat znalostmi, může si zapamatovat, že jednotka tesla je definována následovně: Homogenní magnetické pole má magnetickou indukci 1 T, působí-li na přímý vodič s aktivní délkou 1 m kolmý k indukčním čárám a protékaný stálým proudem 1 A silou 1 N.

[ 8 ] Kdo neví, odkud chmury vanou, nechť si vyhledá Vyšetřování ztráty třídní knihy z dílny Divadlo Járy Cimrmana. A pokud jste stejně líní číst jako jsem byl v rané pubertě já, existuje i záznam divadelního představení.

[ 9 ] Úroveň osvětlení neměří žádné exaktní jednotky svítivosti – měříme jen míru reakce LED matice na světlo. Ta je vyjádřena v hodnotách 0-255.

[ 10 ] V binární soustavě má tato hodnota zápis 1100 0000.

Emmet BrickHacker

Napsat komentář