Fyzikální kabinet GymKT

Články Prostředí mBlock & modul Arduino mBlock, Arduino a Funduino

mBlock (ver. 5), Arduino a Multi-Function Shield (Funduino)

Když si chci hrát, ale neumím vhodný programovcí jazyk…

Dostupnost modulů Arduino i mnoho jejich rozšiřujících modulů (kupříkladu multifunkčního modulu Funduino) dává dnes mnoha lidem příležitost vstoupit do světa, který jim byl doposud naprosto uzavřen. Stejně tak i různé didaktické tendence o začlenění programování (nejlépe kamkoliv a kdykoliv), nás staví do situace, kdy sice chceme cosi ovládat, ale nemáme elementární znalost potřebného programovacího jazyka. Ono je úplně jedno, zda se modul Arduino dostal do rukou zvídavému důchodci, který chce objevovat svět „novot“, které za něj nebyly, nebo dítěti na prvním stupni ZŠ, kterou zasáhl nějaký inovátorský počin o předčasnou přípravu dětí na průmysl 4.0.

Ale já chci něco programovat!

Jistým řešením může být použití některých z grafických programovacích prostředků (záměrně se vyhýbám slovu programovací jazyk). Naštěstí v tomto směru nám trochu štěstí přeje. Ze všech možností, které lze zvolit, jsem si pro tento článek vybral prostředí mBlock, které mi přišlo poměrně hezké a intuitivní. Na pracovní ploše se vytváří kód stavebnicovým stylem, jednotlivé stavební prvky (bloky) jsou rozděleny do kategorií, pro pokročilé, lze přidávat různá další rozšíření. Nevím jak negramotné děti v nějaké IT mateřské školce zacílené na budoucí kormidelníky našeho průmyslu, ale průměrný Čech ocení i českou lokalizaci základního prostředí. I když čeština není 100%, v jenom případě, jak dále uvidíme, mám dokonce ostrou výhradu k překladu, ale i tak to pro začátek potěší.

Zatím jsem na českém internetu nenašel příliš příspěvků věnovaným právě kombinaci mBlock a modulu Arduino, tak zkusím být v tomto průkopníkem. Snad tím někoho inspiruji, aby se kombinaci programovacího prostředí mBlock a modulu Arduino zkusil podrobněji věnovat a třeba právě ten český internet svými příspěvky zaplnil.

mBlock – začínáme

Nastavení prostředí

Aplikaci mBlock můžeme stáhnout přímo ze stránek autorů (https://www.mblock.cc/) nebo pro Windows 10 ji lze nalézt i ve Windows Store. K tomu si ale dovolím poznámku: Ve verzi stažené z Windows Store (ver. 5.1.0) se mi nepodařilo připojit modul Arduino. Prostředí na zvoleném USB stále jen marně hledalo připojený modul, ale úspěch se nedostavil, V případě verze stažené a nainstalované z webu bylo vše bez problémů, doporučuji tedy asi použít verzi z webu.

Pro ty, co nechtějí, třeba jen pro začátek, nic do svého počítače instalovat, lze využít i on-line nástroje na webové adrese: https://ide.mblock.cc/?device#/. Ale v okamžiku, kdy budete chtít připojit modul Arduino, budete muset stejně doinstalovat alespoň ovladače. Takže je otázkou zda to on-line prostředí nám tedy nějaký význam.

Po spuštění prostředí mBlock nás medvídek panda (logo celého projektu) uvítá v následujícím prostředí.

prostredi mBlock

Pokud se nám prostředí samo nepřepnulo do českého jazyka (jako na zobrazeném obrázku), zvolíme si svou lokalizaci ručně. Klikneme na symbol zeměkoule v levé části horní lišty, kde vybereme svůj jazyk.

Na panelu prostředí vidíme několik zámečků. První (vlevo nahoře) je rámeček s pandou, tu my pro modul Arduino moc využívat nebudeme. Toto prostředí (podobně jako jazyk Scratch, na kterém je mimochodem mBlock postaven) slouží pro výuku programování právě pomocí ovládání tohoto panáčka – pamětníci možná vzpomenou na programovací jazyk Karel, tak to je něco podobného. Pod rámečkem s pandou máme záložky „Zařízení“ (Device), „Postavičky“ (Sprites) a „Pozadí“ (Background). Nás z toho bude zajímat jen záložka zařízení, kde křížkem zrušíme to, které je tam nyní nastaveno (zde Codey) a volbou „Přidat“ (Add) si vybereme naše požadované Arduino.

vyber modulu Arduino

Zároveň si v levém horním roku zámečku s modulem Arduino zaškrtneme hvězdičku, které značí, že toto zařízení je naše oblíbené a příště již bude pro nás po spuštění prostředí mBlock připraveno.

Po zvolení češtiny a nastavení modulu Arduino by mělo prostředí vypadat následujícím způsobem:

prostredi mBlock pro Arduino

Všimněte si, že v prostředním sloupci se nyní změnily jak jednotlivé příkazy, tak i jejich kategorie. Vidíme tu například kategorii PIN, která slouží k nastavování vstupů s výstupů modulu Arduino, jako je čtení digitálního/analogového pinu, nastavení PWM výstupu na zvoleném pinu a tak dále.

Připojení modulu Arduino

Nyní připojíme modul Arduino ke svému počítači pomocí USB kabelu a připojíme ho k prostředí mBlock. Připojení modulu k prostředí provedeme kliknutím na tlačítko „Připojení“ v levé dolní části. Zobrazí se okno připojení, kde je potřeba zaškrtnout volbu „Zobrazit všechna připojená zařízení“.

mBlock - pripojení modulu Arduino

Pokud je všechno O.K., mělo by se zobrazit číslo portu na kterém je modul Arduino připojen (zde COM3). Po výběru daného portu stačí kliknout na „Připojit“. A máme hotovo!

Po připojení modulu Arduino nám v oblasti, kde jsme klikali na tlačítko „Připojení“, Přibude tlačítko „Nahrát“, kterým nahrajeme náš program do modulu Arduino, dále tlačítko „Odpojit“, které modul odpojí a tlačítko „Nastavení“, které nabídne aktualizaci firmware modulu Arduino (zde bych byl s touto volbou asi zdrženlivější).

Ještě než se pustíme do našeho prvního kódu, jen upozorním na přepínač režimů (nad tlačítkem „Nahrát“). Buď je v režimu „Nahrát“, tedy připravuje se program přímo pro modul Arduino, kde také pak bude fungovat, nebo lze využít režim „Živě“, kdy program probíhá jen v prostředí mBlock. My však stále budeme pracovat v režimu „Nahrát“ a hotové programy testovat přímo v modulu Arduino.

Multifunkční Shield Funduino

Abychom viděli, co náš připojený Arduino dělá, například pro rozsvěcení LED, reakci na tlačítka a podobně, rozšíříme modul Arduino pro naše další hrátky o multifunkční shield Funduino. Jen připomínám, že je nutné tento shield nasadit na modul Arduino ve chvíli, když je vypnutý a zcela odpojený!

Pochopitelně pro obecné programování modulu Arduino v prostředím mBlock to není použití shieldu Funduino potřeba, zde nám slouží jen jako zdroj vstupně/výstupních periférií.

V následující části článku postupně sestavíme programy a zapojení popsané v článku „Testujeme Arduino Multi-function Shield (Funduino)“ jen tak učiníme v prostředí mBlock. Tím bych rád ukázal, jak lze vizuálním programováním v prostředí mBlock dosáhnout stejného výsledku jako při zápisu v klasickém řádkovém programovacím jazyku.

Konec řečí, pojďme na to!


Blikáme

Funkčnost signalizačních LED shieldu Funduino si vyzkoušíme pravidelným cyklickým blikáním (1 s LED svítí, 1 s budou LED zhasnuté). Připomenu, že tyto signalizační LED jsou v shieldu Funduino připojené na pinech 10, 11, 12 a 13 modulu Arduino.

Vytvoření prvního programu si ukážeme postupně – krok za krokem, u ostatních již budou uvedeny jen výsledné „kódy“. Popřípadě budou uvedeny jen některé zvláštnosti, kterými se použití v mBlock liší od klasického programování.

V seznamu kategorií příkazů klineme na „Události“, tím se nám otevře nabídka příkazů. Pokud mám režim přepnutý do „Nahrát“, mělo by zde být několik stavebních prvků, ale aktivní (sytě žlutý) by měl být jen „když se Arduino UNO spustí“. Chytneme jej myší a přetáhneme na pracovní plochu (vpravo) – viz obrázek.

prostredi mBlock - zacatek programu

Všechny další bloky, které budeme připojovat pod tuto hlavičku, se provedou po spuštění nebo resetu modulu Arduino. Protože chceme, aby zvolené LED blikaly stále, musíme nejdříve vytvořit nekonečně se opakující smyčku. Tu najdeme v kategorii „Ovládání“. Vybereme smyčku „opakuj stále“ a přetáhneme ji pod hlavičku „když se Arduino UNO spustí“. Blok by měl sám přiskočit a spojit se s hlavičkou. Sláva! Pomalu, ale jistě vzniká náš první program…

prostredi mBlock - tvorba programu

Do mezery, která vznikla v nekonečné smyčce, nyní budeme vkládat další příkazy, které se budou opakovat do nekonečna. Jako první chceme rozsvítit LED na pinech 10–13. To učiníme výběrem příkazů v kategorii „pin“, konkrétně hledáme příkaz „nastavit výstup digitálního pinu (9) na [vysoký]“. Tento příkaz vložíme do smyčky hned 4×. Všimněte si, když najedete přetahovaným příkazem nad část hotového kódu, že se tam pro něj vytváří místo.

Po naskládání těchto čtyř příkazů do kódu je musíme upravit. Takto by byla nastavena vysoká úroveň (logická 1) na pinu 9 a to hned čtyřikrát za sebou. Kliknutím na položku (9) jednotlivých příkazů ji můžeme editovat a postupně ji změníme na hodnoty 10, 11, 12 a 13 – viz následující obrázek. Naopak hodnotu úrovně [vysoký] necháme.

prostredi mBlock - prvni bloky programu

Už teď bychom mohli program nahrát do modulu Arduino, ale jediné, čeho bychom dosáhli, je rozsvícení všech čtyř LED. My ale máme vyšší cíl – blikat!

Po rozsvícení potřebujeme počkat jednu vteřinu. K tomu nám pomůže příkaz „počkat (1) sekund“, který najdeme v kategorii „Ovládání“. Přetáhneme ho do programu pod nastavení pinu 13 na úroveň [vysoký].

Nyní již asi můžeme zrychlit. Je jasné, že po vteřinové pauze chceme LED zhasnout, tedy nastavit je na úroveň [nízký]. To uděláme zcela stejným způsobem, jako jsme nastavili piny 10–13 na rozsvícení LED, jen nastavenou úroveň v rozklikávací volbě změníme na [nízký]. Nezapomeňme na závěr dát opět vteřinou pauzu.

A máme náš první program hotový! Měl by vypadat takto:

prostredi mBlock - prvni program pro Arduino

Nyní ho nahrajeme do připojeného modulu Arduino. K tomu nám poslouží tlačítko „Nahrát“. Pokud vše proběhlo bez závad, mělo by nahrávání skončit zelenou hláškou „Kód byl nahrán“.

Čtveřice LED na shieldu Funduino připojeném na našem modulu Arduino by měla pravidelně blikat.

Vzniklý program doporučuji uložit – využijte volby „Soubor“ a pak zvolit volbu „Uložení do počítače“. POZOR, klasické „Uložit jako…“ (Ctrl+Shift+S) ukládá programy do Vaší knihovny projektů na internetu, na to musíte mít zařízený účet (zdarma) na mBlock webu.

Pro ty, co by rádi viděli, jak vlastně vypadá zdrojový kód programu, který jsme si pomocí „hraní s bloky“ vytvořili, je možné kliknout na žlutou záložku na pravé straně pracovní plochy. Zprava se vysune okno s vytvořeným kódem v jazyku Arduino C.

prostredi mBlock - nahled zdrojoveho kodu


Postupné rozsvěcení LED (PWM - „analogový“ výstup)

Dalším příkladem bude postupné rozsvěcení čtveřice LED pomocí tzv. pulzní šířkové modulace (PWM), což je jakási digitální „náhražka“ analogového výstupu modulu Arduino. Výstupní piny 10 a 11 tuto pulzní šířkovou modulaci podporují. Naopak (u modulu Arduino UNO) piny 12 a 13 toto nepodporují, proto se postupně rozsvěcet nebudou – budou mít jen dva stavy rozsvíceno a zhasnuto.

Protože vytvoření tohoto programu vyžaduje vytvoření proměnné, které jsme zatím nedělali, ještě si zde vytvoření programu částečně popíšeme.

Hlavičku „když se Arduino UNO spustí“, stejně jako nekonečnou smyčku „opakuj stále“ vytvoříme jako v předešlém programu. Dále budeme chtít vkládat na výstupy 10–13 postupně vkládat hodnoty 255 (úplně zhasnuto), 254, 253, …, 0 (plný svit) – tak je nastaven shield Funduino. Chceme tedy 255× vložit na výstupy nějakou hodnotu. Nebude do programu vkládat 255 příkazů, vyřešíme to cyklem. Podobně jako cyklus „opakuj stále“, existuje mezi příkazy i cyklus „opakuj (10) krát“, kde hodnotu (10) změníme na (255). Do tohoto cyklu vložíme čtyři příkazy „nastavit PWM (5) výstup na (0)“. Opět původní číslo pinu (5) změníme na 10, 11, 12 a 13.

Program by doposud mohl vypadat asi takto (jsou zde již přidány i potřebná čekání)

prostredi mBlock - vystupy PWM

Teď ale potřebujeme nějak zařídit, aby se místo pevného nastavení hodnoty (0) vkládala postupně hodnota 255, 254, …, 0.

K tomu nám poslouží proměnná, které nám bude uschovávat hodnotu, kterou budeme postupně měnit. Proměnnou si musíme založit (tzv. deklarovat). To učiníme v kategorii příkazů „proměnné“ volbou „Vytvořit proměnnou“.

prostredi mBlock - deklarace promenne

Pro pojmenování naší proměnné jsem zvolil nepříliš originální název „naše hodnota“. Volba „Pro všechny postavičky“ nebo „Jen pro tuto postavičku“ nehraje při práci s modulem Arduino žádnou roli, necháme přednastavenou volbu.

Po založení proměnné nám v sekci „proměnné“ vznikne následujících několik příkazů:

prostredi mBlock - prace s promnennou

  • nastavte [naše hodnota] na (0) – nastaví naši proměnnou na zadanou hodnotu
  • změnit [naše hodnota] za (0) – POZOR: jedná se o nevhodný překlad!!! Správně by mělo být „Změnit [naše hodnota] o (0)“, protože tento příkaz přičte zadanou hodnotu (v případě zadané záporné hodnoty pochopitelně odečte)

Zároveň si všimněte, že zatržením naší proměnné (modrá „fajfka“ před proměnnou) způsobuje vypsání proměnné v levém horním rohu hrací plochy. (To lze využívat při odlaďování programu v režimu „Živě“, ale jinak to při práci s Arduino moc nevyužijeme).

Chceme-li na PWM výstupy postupně odesílat hodnoty 255 až 0, nejdříve (ještě před 255 krát opakujícím se cyklem) nastavíme naší proměnnou na výchozí hodnotu 255. A pak při každém průběhu vnitřního cyklu tuto hodnotu v proměnné snížíme o 1 (přičtením –1).

Pokud bychom však udělali jen toto a výsledný kód by vypadal následujícím způsobem, ještě by program nefungoval:

prostredi mBlock - zatim nefunkcni program

Proč? Protože sice hezky měníme proměnnou „naše hodnota“ v rozmezí 255–0, ale na výstupy stále posíláme napevno nastavenou hodnotu 0. Je třeba i do modrých příkazů nastavit to, aby se odesílala na výstupy hodnota obsažená v proměnné „naše hodnota“. Tedy na místo (0) přetáhneme z levého panelu právě tu naší proměnnou. Výsledný a již funkční program pak vypadá takto:

prostredi mBlock - Arduino - vystup PWM (hotovo)


Bzučák

Bzučák použitý na shieldu Funduino je pasivní – to znamená, že po připojení napětí nevydává předem zvolený tón, ale musíme si tón vygenerovat. Kupříkladu střídáním stavu logická 1 a logická 0 na výstupu 3, ke kterému je bzučák připojen. Pokud jsme zvládli blikat LED, což je naprosto stejné, nemělo by nás nyní nic překvapit. Nejdříve si tón v programu vygenerujeme klasickým „blikacím“ způsobem, pak abychom si opět ukázali něco nového v mBlock.

Pokud jsme si první program (blikání LED) uložili do počítače, můžeme jej načíst volbou Soubor – Nahrát z počítače. Protože tento program jen použijeme pro tvorbu nového, doporučuji si jej okamžitě uložit pod novým jménem (třeba „03-blikáme.mblock“), abychom si ten původní nepřemazali. Vyndáme příkazy týkající se nastavení výstupů 11–13 z nekonečné smyčky. Když ji necháme na pracovní ploše, již nejsou v programu, ale trochu překáží. Přesuneme je tedy nad seznam příkazů, tím je hodíme do koše. Tam teď patří, už je nebudeme potřebovat! A pokud ano, vyndáme si příkazy ze seznamu znova.

Na zbylém modrém příkazu výstupu 10 změníme číslo pinu na hodnotu 3, na kterém je připojený bzučák. Máme téměř hotovo! Je třeba jen zvolit jiné časování. Zatím nastavíme čas na 2 tisíciny vteřiny, uvidíme, jaký tomu bude odpovídat zvuk.

Následující kód, který bude generovat jeden tón:

prostredi mBlock + Arduino - brzucak

Abychom dodrželi, to, že všechny zde uvedené příklady odpovídají programům z článku „Testujeme Arduino Multi-function Shield (Funduino)“, ještě musím program upravit. Podle originálního zadání musíme tento tón vygenerovat 80×, pak 100× tón založený na časové prodlevě 4 tisíciny sekundy.

Opět to zkusíme udělat trochu efektivním způsobem, abychom si vyzkoušeli další vlastnosti prostředí mBlock. Uchopíme blok tvořící tón (vnitřek nekonečného cyklu) a vyndáme jej mimo hlavní blok. Když jej uchopíme za první příkaz, půjde tato sekvence příkazů vyndat jako celek. Klikneme-li na vyndaný blok pravým tlačítkem, máme zde možnosti „kopírovat“. Tím vytvoříme kopii bloku, kterou použijeme pro generování druhého tónu. Opět ji položíme kousek vedle na pracovní ploše a změníme v ní časování na 0,004. (viz obr).

prostredi mBlock + Arduino - vznik kodu

Nyní vložíme do hlavní smyčky dva cykly, jeden, který se opakuje 80× a generuje první tón, druhý opakující se 100×, který generuje druhý tón (výkonné bloky opět vtáhneme do připraveného bloku kódu se dvěma cykly).

Vznikne nám následující program:

prostredi mBlock + Arduino - buzzer

2. způsob generování tónů

Pozorný „programátor“ si možná při tvorbě předešlého příkladu všiml, že mezi příkazy prostředí mBlock je i příkaz „přehraj na pinu (9) notu [C4] na (0.25) taktů“. To je přesně volba pro hudebně nadané, kteří využijí znalosti nejen výšek jednotlivých not, ale i rychlosti v taktech. Předešlý příklad by tedy šel vytvořit následujícím způsobem (zvolené tóny jsou zde zcela náhodné a neodpovídají předešlým generovaným tónům).

prostredi mBlock + Arduino + Funduino - generovani tonu

Připravený příkaz v prostředí mBlock nám celý program výrazně zjednodušil!


LED zobrazovače – AHOJ SVĚTE!

Shield Funduino je osazen čtveřicí LED segmentovými zobrazovači, které jsou řízeny dvojicí obvodů 74HC595. Přímé řízení těchto obvodů, tedy i rozsvěcení LED zobrazovačů, je poměrně dosti složité. Je nutné nastavovat, které segmenty jednotlivých zobrazovačů se mají pro daný zobrazený symbol rozsvítit. To vše postupně pro čtyři segmentovky. Navíc se vše musí dělat neustále dokola a ještě tak rychle, aby to lidské oko nepoznalo. To v případě „normálního“ programování modulu Arduino se shieldem Funduino není nic moc příjemného.

Při programování v prostředím mBlock, které je určeno pro programátory začátečníky, máme naštěstí tento problém vyřešený! Musíme se ale podívat na další schopnost prostředí mBlock, kterou je instalování rozšiřujících knihoven.

V seznamu kategorií příkazů je dole i možnost „rozšíření“, když na ni klikneme, otevře se průvodce pro získání dalších rozšíření. Jsou to vlastně knihovny, které nám přidají do sloupce příkazů další příkazové bloky. Najdeme tu všechno možné od knihoven pro ovládání displejů, tepelných čidel, ale i pro celé shieldy – kupříkladu pro shield Funduino (zde je označen MF Shield).

prostredi mBlock - instalace rozsireni

Některé knihovny se musí nejdříve stáhnout z internetu, což se provede kliknutím na značku + v pravém horním rohu. Pozor, průvodce se potom zavře, ale knihovna ještě není přidána do našeho projektu. Musíme průvodce opětovně otevřít, opět vyhledat své rozšíření a přidat do našeho projektu kliknutím na „+ Přidat“ pod obrázkem požadovaného rozšíření.

To, že se rozšíření přidalo, poznáme tak, že mezi skupinami příkazů přibude další skupina s novými příkazy (zde pro shield Funduino nazvaná „MFS“).

prostredi mBlock - nove prikazy pro MFS Funduino

Nás nyní bude zajímat příkaz „display text (hi)“. Všimněte si, že tyto příkazy nejsou lokalizovány do češtiny. Je to dáno tím, že jde o externí rozšíření od vývojáře, který češtinu do svého kódu nedal.

Pokud chceme, aby se na čtyřech segmentovkách shieldu Funduino objevil nápis „AHOJ“, stačí nám nyní následující program.

prostredi mBlock + Arduino + Funduino - vypis textu

To je opravdu všechno! Všimněte si, že vůbec nepotřebujeme zde mít nekonečnou smyčku, nemusíme se starat vlastně vůbec o nic. O vše se stará rozšiřující funkce, kterou jsme využili. Zkuste porovnat tento program s kódem, který řeší totéž v původním článku „Testujeme Arduino Multi-function Shield (Funduino)“.

prostredi mBlock + Arduino + Funduino - AHOJ SVETE

Ale tento způsob má i jisté nevýhody. Kupříkladu na obrázku vidíte, že zobrazený text není požadovaný text „AHOJ“, ale „AhoJ“. Nemůžeme si prostě vybrat, co se má na displeji zobrazit. Znak „H“ je definován jako „h“. To je daň za to, že za nás někdo již vyřešil ovládání segmentovek.

Mezi příkazy najdeme i příkaz „set display segment (2) to (0)“, což by mělo nastavovat zadané hodnoty na jednotlivé segmenty, ale popravdě řečeno, mně to tedy moc nefunguje. Nezbývá nám tedy se (zatím) spoléhat jen na funkci „display text“.


Trimr na A0

Pochopitelně další možnosti se odvíjejí od načítání hodnot na vstupech modulu Arduino (resp. shieldu Funduino) Jednou možností je načítání potenciometru na vstupu A0. V rozšíření MFS je přímo funkce „get potenciometer“, která načítá hodnotu z A/D převodníku na vstupu A0.

Problém nastává se zobrazením této hodnoty. V prostředí Arduino IDE máme tzv. Sériový monitor, ve kterém můžeme sledovat hodnoty odeslané modulem Arduino (připojené přes sériový port, či USB) do PC. Prostředí mBlock, však nic takového nemá! Takže i když paradoxně máme v mBlock k dispozici celou skupinu příkazů „sériový port“ nemáme tyto odeslaná data jak v PC zobrazit.

Využijeme tedy vlastnosti shieldu Funduino a místo odeslání hodnoty na PC, je zobrazíme na LED zobrazovačích. Výsledný program pak bude vypadat takto:

prostredi mBlock + Arduino - nacitani A0

Opět, jak prosté! Na LED zobrazovačích se bude ukazovat hodnota od 0 do 1023, která odpovídá napětí nastavené potenciometrem na vstupu A0.


Jednoduchý voltmetr

Nyní již můžeme modul Arduino se shieldem Funduino využít i pro něco praktičtějšího – třeba voltmetr (s rozsahem 0–5V).

Kompletně použijeme předešlý program, jen vstup od potenciometru „přemapujeme“ z rozsahu vstupních hodnot 0–1023 na rozsah 0–5 V. Úmyslně jsem použil slovo „přemapovat“, protože prostředí mBlock má takový příkaz, ale bohužel, jej použít nemůžeme. Příkaz sice dělá to, co potřebujeme, tedy mohl by vypadat třeba takto: „mapovat (get potenciometer) z (0), (1023) na (0), (5)“, ale problém je, že jeho výstupem je přemapování na interval celých čísel. Tedy náš voltmetr by zobrazoval jen 0, 1, 2 … 5 voltů, a to i když měří mnohem přesněji. Nebudeme tedy používat připravenou funkci, ale normálně získanou hodnotu vynásobíme 4.97 a poté vydělíme 1023.

Aby vše nebylo tak jednoduché, jak to doteď vypadalo, nastane zde ještě jeden problém. Pokud vložíme blok „get potenciometer * 4.97 / 1023“ rovnou do funkce „display text“, skončí překlad chybou. Pomůžeme si tedy tím, že tento výraz nejdříve vypočítáme do pomocné proměnné POM, až pak tuto proměnnou zobrazíme. Pak program funguje. Proč? Nevím! Asi je to dáno tím, že funkce „display text“ nemůže mít na stupu složitý výraz. Tohle se občas stává i v prostředí Arduino IDE. Programování modulu Arduino je prostě někdy trochu adrenalin!

Problém jsme vyřešili, máme další fungující program:

prostredi mBlock + Funduino - voltmetr na A0

Měl bych poznamenat, že i zde je drobné úskalí. Proměnná POM je reálné číslo, které má několik desetinných míst. Funkce „display text“ umí toto číslo rovnou převádět na text a zobrazit ho, Bohužel to učiní s přesností jen na jedno desetinné místo. To nám s ohledem na přesnost měření napětí na pinu A0 moc nevyhovuje. Bohužel, zatím nevím, jak jednoduše vynutit na funkci „display text“ zobrazení na vyšší počet desetinných míst! (a jak později uvidíme, tak ani jí zcela ty desetinná místa zakázat)

Chcete-li  multifunkčního shieldu udělat skutečný voltmetr (s rozsahem 0–5 V), musíme v programu změnit načítání napětí z pinu A0 (kde je napevno připojen potenciometr) na pin A4 – ten je dostupný na konektoru pro teplotní čidlo LM35, kam pak připojíte měřené napětí. Funkce „get potenciometer“ načítá pouze A0, musíme ji tedy nahradit obecnější funkcí, a to funkcí „čtení analogového PINu A (4)“. Tuto úpravu ukazuje následující program:

prostredi mBlock + Funduino - voltmetr na A4


Načítání A1 – Stiskni tlačítko S1

Pro test některého z tlačítek na shieldu použijeme analogový vstup A1, který použijeme pro zjištění jednoho ze dvou stavů tlačítka S1 (sepnuto, což odpovídá hodnotě nižší než 512 a rozepnuto, pro hodnotu vyšší než 512). Stav sepnuto (stisknuto) je na desce multifunkčního shieldu řešen připojením vstupního pinu k uzemnění. Rozepnuto (nestisknutí) tlačítka má dvě možnosti. Buď je na shieldu zkratována propojka J2 (poblíž tlačítek) – pak je na vstupní pin přes PullUp rezistor přivedeno napětí +5 V (vstupní cca 1024, tj. vyšší než 512), nebo je propojka rozpojena a vstupní pin je „volný“ – není na něj připojena žádná napěťová hodnota, což znamená značně neurčitý stav. Tento neurčitý stav lze vyřešit zapnutím interního PullUp rezistoru. Na to je třeba doinstalovat rozšiřující funkci, budeme nadále řešit jen případ sepnuté propojku J2.

Následující program dělá to, že po dobu stisknutí tlačítka S1 (pin A1) se rozsvítí LED 1 (pin 13).

prostredi mBlock + Funduino - test stlacitka

Rozšíření MFS obsahuje funkci „get button state“, která však při stisku kteréhokoliv tlačítka na shieldu Funduino nevrací žádné hodnoty. Podobně se mi nepodařilo využít ani funkci „is button (1) [pressed] in (1)“, která se mi též vzdorovala. Ale je možné, že obě funkce fungují a jen hned „na první dobrou“ jsem je nepochopil. Můžete se s nimi zkusit poprat sami, budu rád, když se nakonec ukáže jejich pravá funkce.


Čítač s nulováním

Posledním programem, který zde zcela kopíruje příklady uvedené ve výše zmíněném v článku věnovanému Funduinu (tam programované pomocí prostředí Arduino IDE), je časovač s nulováním. Pomocí tlačítka (S1) budeme čítat počty zmáčknutí, pomocí druhého tlačítka (S2) získanou hodnotu vynulujeme. Pochopitelně hodnota „namačkaná“ se bude zobrazovat na LED segmentech.

Abychom v tomto posledním příkladu opět přidali něco nového z prostředí mBlock, vyřešíme testování tlačítek v tomto programu pomocí vlastní procedury (v mBlock je to nazvané „Moje bloky“).

Klikneme na „Moje bloky“ a podobně, jako vytváříme proměnné, vytvoříme vlastní blok pomocí tlačítka „Vytvoř blok“.

prostredi mBlock - vlastni bloky

Zvolíme název našeho bloku (např. Tlačítko). Můžeme přidat i vstupní parametr, třeba vstupní číslo, text nebo logickou hodnotu. Tím můžeme takto vytvořenou proceduru volat s nějakým parametrem. Pokud budeme chtít tuto hodnotu použít tvorbě našeho bloku, vytáhneme si ji jako proměnnou z růžové hlavičky našeho bloku. My zde ale žádnou vstupní hodnotu nepotřebujeme, tak necháme hlavičku bloku bez parametru. Na ploše nám vznikne růžová hlavička, pod kterou můžeme začít skládat bloky příkazů, které se při zavolání našeho bloku mají vykonávat. Naopak v seznamu našich bloků se objevil nový blok s naším názvem. Ten pak můžeme použít do hlavního programu.

Požadovaný čítač s nulováním můžeme i s využitím vlastního bloku (procedury) vytvořit následujícím způsobem.

prostredi mBlock - program s vlastnim blokem

Vlevo vidíme hlavní program, který se spustí při zapnutí modulu Arduino. Nejdříve se nastaví počet kliků na nulu, pak se zobrazí tento počet na LED zobrazovačích. V hlavní části, která se opakuje v nekonečné smyčce, probíhá náš definovaný blok nazvaný „Tlačítko“. Jeho definice je uvedená vpravo. Je zde nejdříve testované první tlačítko. Pokud je stisknuto (hodnota na pinu A1 je menší než 512) nastane čekání, dokud se tlačítko neuvolní. Pak je hodnota počtu stisknutí zvýšena o jedna a je zobrazena nová hodnota na zobrazovačích. Obdobně je pak testováno i druhé tlačítko (A2). Jediná změna je jen v reakci po uvolnění tlačítka – hodnota počtu kliknutí je v tom případě vynulována.

Příklad je zde zcela zbytečně řešen pomocí vlastního bloku. Je to především jen kvůli tomu, abychom viděli, jak se vlastní blok vytváří a používá v hlavním programu. Kdo chce program bez bloku „Tlačítko“, může příkazy z jeho těla přesunout do hlavního programu. Získá tak následující program:

prostredi mBlock + Funduino - citac s nulovanim

Všimněte si ještě jedné „vychytávky“ v programu. Jde o fialový blok „omezit (počet) mezi (1, 999)“, který zajišťuje, že výsledná hodnota proměnné „počet“ nepřekročí zobrazovatelný rozsah čtyř číslic.

Správně by ale v této funkci mělo být o jednu devítku více. Problém ale nastává u zobrazení díky bloku „display text“, který zobrazuje počet kliknutí jako číslo s jedním desetinným místem, tedy 1.0, 2.0 atd. Zatímco u voltmetru nám zobrazení na jedno desetinné místo připadalo málo, zde je to naopak až moc! Zatím se mi nepodařilo donutit tuto funkci k tomu, aby celá čísla zobrazoval na zvolený počet desetinných míst. On je vůbec v prostředí mBlock problém s typy proměnných.

Závěr

Prostředí mBlock je zajímavým počinem a myslím, že i příjemným prostředím pro ty, co si chtějí zkusit naprogramovat jednoduché projekty i přes určitou neznalost konkrétní syntaxe daného programovacího jazyka. Kromě přehlednosti a intuitivnosti ovládání, oceňuji i českou lokalizaci (vyjma některých rozšiřujících knihoven třetích stran) a především otevřenost systému, která umožňuje nejen rozšiřovat a doplňovat, ale i přizpůsobovat prostředí pro různé platformy a moduly.

I když je asi mBlock primárně určen pro jiný typ programování pro programování modulu Arduino se dá docela hezky využít. Rozhodně to není na bůhví jaké profesionální projekty, ale ruku na srdce, který profesionál by programoval v mBlock modul Arduino.

I přes určité sympatie, kterém si za poměrně krátkou dobu u mě prostředí mBlock vybudovalo, vidím zde i určité slabiny. Jako programátora mě trochu mrzí totální absence rozhodovat o datových typech zvolených proměnných. V prostředí mBlock jsou standardně všechny proměnně deklarovány jako reálné. Na záložce funkcí „Data“ sice jsou určité konverzní funkce, ale zde nejde o převody, ale o samotné deklarace proměnných ve zdrojovém kódu. Díky tomu občas se vkládá špatný (nekompatibilní) typ proměnné do zvolené procedury a překlad programu pak končí chybovým hlášením. Někdy se tomu dá zabránit zcela iracionálním použitím funkce, která díky své správně zvolené výstupní hodnotě splní vstupní požadavek procedury, které původní datový typ vadil. Což je trochu prasárna! Ale účel holt někdy světí prostředky a pod heslem „Funguje to – Prodáme to“, lze asi programovat i tímto způsobem.

Je možné, že výše popsaný problém je způsoben jen tím, že jsem zcela ještě nepronikl do tajů mBlocku. Ale pokud jsem chválil intuitivnost celého prostředí, diví se, že bych přehlédl možnost „vnutit“ požadované datové typy u proměnných při jejich deklaraci.

Rozhodně si myslím, že prostředí mBlock si zaslouží (nejen mou) další pozornost! Do budoucna si jistě v něm cvičně zkusím vytvořit ještě několik dalších projektů pro Arduino. Koneckonců trénink dělá mistra a třeba právě díky jeho celkové jednoduchosti tomuto prostředí nakonec zcela přijdu na chuť.

Autor článku: RNDr. Miroslav Panoš, Ph.D.