Jihočeská univerzita v Českých Budějovicích Pedagogická fakulta Centrum DVPP Závěrečná práce Mikropočítače Arduino ve výuce na střední škole Program: Učitelství pro střední školy Vypracoval: Mgr. Jakub Macillis Odborný konzultant: Ing. Michal Šerý, Ph.D. České Budějovice 2018
Prohlášení Prohlašuji, že svou závěrečnou práci jsem vypracoval samostatně pouze s použitím pramenů a literatury uvedených v seznamu citované literatury. Prohlašuji, že v souladu s 47b zákona č. 111/1998 Sb. v platném znění souhlasím se zveřejněním své závěrečné práce, a to v nezkrácené podobě ve veřejně přístupné části databáze STAG provozované Jihočeskou univerzitou v Českých Budějovicích na jejích internetových stránkách, a to se zachováním mého autorského práva k odevzdanému textu závěrečné práce. Souhlasím dále s tím, aby toutéž elektronickou cestou byly v souladu s uvedeným ustanovením zákona č. 111/1998 Sb. zveřejněny posudky vedoucího a oponentů práce i záznam i o průběhu a výsledku obhajoby závěrečné práce. Rovněž souhlasím s porovnáním textu mé závěrečné práce s databází kvalifikačních prací Theses.cz provozovanou Národním registrem vysokoškolských kvalifikačních prací a systémem na odhalování plagiátů. V Českých Budějovicích dne: Podpis:
Anotace Mikropočítače představují zajímavou oblast programování, kdy žáci mohou získat nejen znalosti o tvorbě programů, ale také manuální zručnost při sestavení jednotlivých obvodů. Přesto jsou školy k pořízení těchto zařízení zdrženlivé. Tato práce má za úkol představit možnosti zapojení mikropočítačů do výuky na střední škole a poskytnout učitelům sadu úloh se zaměřením na mikropočítače Arduino, které patří mezi nejrozšířenější platformu na trhu. Potenciální uživatelé se v ní dozvědí o různých přístupech k programování Arduin a způsoby, jak školu vybavit bez zatížení jejího rozpočtu. Klíčová slova: Arduino, mikropočítače, elektronika, úlohy Abstract Microcontrollers are interesting area of programming in which, the students can receive knowledge not only about creating programs, but also capability for putting the electronics circuits together. Yet, the schools are withdrawing from buying microcontrollers and needed parts. This publication has the goal in introducing the possibilities of using microcontrollers in high school environment and to give teachers set of exercises, which will lead them on using the microcontroller in their lectures. Main aim is on the most used microcontroller on the market, the Arduino platform. The readers will be informed about different approaches in Arduino programming and ways, how to equip school with it without ruining the budget. Keywords: Arduino, microcontrollers, electronics, exercises
Poděkování Rád bych poděkoval mé rodině, která mi pomáhala v celém průběhu tvorby práce s její kontrolou a studentům a pedagogickému sboru COP Sezimovo Ústí za podněty při tvorbě úloh a jejich otestování. Dále bych rád poděkoval panu Ing. Michalu Šerému, Ph.D. za odborné rady během tvorby práce a její průběžnou kontrolu. Jako poslední bych rád poděkoval všem, kteří mi během tvorby práce pomáhali a poskytovali své rady.
Obsah 1 Úvod... 7 2 Platforma Arduino... 9 2.1 Druhy... 10 2.1.1 Arduino Uno... 10 2.1.2 Arduino Mini... 11 2.1.3 Arduino MEGA 2560... 12 2.1.4 Ostatní... 12 2.1.5 Shieldy... 12 2.2 Vybrané součástky pro obohacení Arduina... 13 2.2.1 LED diody... 14 2.2.2 Segmentové displaye... 15 2.2.3 Fotorezistor... 18 2.2.4 Momentové tlačítko... 18 2.2.5 Mikroserva... 19 2.2.6 Moduly pro bezdrátovou komunikaci... 20 2.2.7 Senzory... 21 3 Práce s Arduinem... 26 3.1 Navržení obvodu... 26 3.2 Zapojení obvodu... 28 3.3 Programování... 32 3.4 C# aplikace... 42 4 Použití ve výuce... 44 4.1 Sada úloh v prostředí S4A... 44 4.1.1 Úloha 1... 45 4.1.2 Úloha 2... 46
4.1.3 Úloha 3... 49 4.2 Úlohy pro Arduino IDE a jazyk C++... 51 4.2.1 RGB dioda... 51 4.2.2 Joystick... 58 4.2.3 Počítadlo... 62 5 Závěr... 67 6 Zdroje... 68
1 Úvod Programování a vývoj aplikací je v současném počítačovém světě velmi žádanou oblastí a kvalitní vývojáři jsou stále nedostatkovým zbožím, které si firmy chrání jako oko v hlavě. Samotnou oblast můžeme dělit na několik menších, které se soustředí například pouze na počítačové aplikace, či hry. S rozvojem robotiky však roste také zájem o programování mikropočítačů a jejich zapojení do nejrůznějších elektronických obvodů, robotických částí, či pro využití v rámci automatizace. Vše podporuje také rostoucí zájem o absolventy technických oborů. Oblast programování a zapojování mikropočítačů je výborným příkladem kombinace těchto dvou směrů. Nejen, že si studenti osvojí logické myšlení, algoritmizaci, či znalosti o vnitřním fungování počítačů skrze část programování, ale také se naučí pečlivosti, trpělivosti a manuální zručnosti při zapojování elektronických obvodů. Proto je vhodné, aby nejen technické školy zvážily zapojení této náplně do výuky a poskytly tak žákům náhled do oblasti techniky, která má před sebou perspektivní budoucnost a možná je tak nadchly pro zaměstnání programátorů. Bohužel pro mnoho škol je brzdou finanční zatížení, či přílišná náročnost daného tématu na pedagogický sbor. Tato práce si klade za cíl přesvědčit školy a vyučující, že obě dvě brzdy jsou překonatelné a programování mikropočítačů vůbec nemusí zruinovat školní rozpočet, nebo zaměstnat učitele hodinami studia navíc, aby mohli studentům poskytnout náhled do programování. Mikropočítačů existuje na trhu velké množství. Velkou skupinou jsou počítače založené na platformě počítačového systému Linux, mezi které patří například Raspberry PI. Jsou to plnohodnotné počítače, do kterých lze instalovat programy, jako například kancelářský software, či sběrné a vyhodnocovací aplikace pro vytvoření například meteostanic. Tyto mikropočítače jsou však jiným druhem, než se bude tato práce zabývat. Hlavním předmětem jsou jednočipové počítače, které neobsahují operační systém, jak jej známe, ale vývojář programuje každý jeho krok a musí mu dát instrukce, které má vykonávat. Jedná se o malé plošné spoje osazené elektronickými součástkami, jako je například procesor a studentům tak poskytne možnost tvůrčí činnosti o začátku až do konce. 7
Nutností ve výuce jsou samozřejmě úlohy, které by měly být dostatečně názorné a zajímavé tak, aby studenty nejen naučily látku, ale také zaujaly a bavily. Právě v oblasti zapojování obvodů a programování mikropočítačů je zaujetí snadnější, než například u základů programování počítačových aplikací. U počítačových aplikací se většinou jedná o jednoduché strohé úlohy, které se projeví textem na obrazovce, zatímco jednoduché úlohy v oblasti mikropočítačů mohou využívat nejrůznějších diod, reproduktorů, serv, či dalších součástek, které mají okamžitý a atraktivní výsledek blikají, hýbou se, vydávají zvuk, apod. Tato skutečnost je jistě atraktivnější, než výpis textu na obrazovce počítače. Programování mikropočítačů je tak jistě zajímavou alternativou, jak atraktivně naučit studenty programovat, přičemž mezi hlavní zástupce mikropočítačů na trhu patří platforma Arduino, kterou se bude tato práce zabývat. 8
2 Platforma Arduino Platforma Arduino je jednou z nejrozšířenějších rodin mikropočítačů. Její počátek nastal již v roce 2000, kdy byl zahájen vývoj v Italském městě Ivrea 1. V rámci tohoto projektu tak vznikla hlavní řada, tzv. oficiální, kterou lze rozeznat dle oficiálního loga projektu. Obrázek 1 Oficiální logo projektu Arduino 2 Oficiální arduina se vyznačují použitím kvalitních součástek s garantovanými parametry, kvalitním výrobním procesem s dostatečnou kontrolou a také zajištěnou podporou ze strany výrobce. V případě problémů se tak kupujícímu dostane pomoci s řešením. Společně s mikropočítači je v rámci oficiální řady k dispozici také velké množství doplňků, které jsou taktéž zaštítěny výhodami oficiálního výrobního procesu. Ačkoliv má použití oficiálních produktů nesčetné výhody, tak pro školní potřeby má také velkou nevýhodu, jejich cenu. Oficiální arduina se cenově pohybují od cca 500 Kč výše, což není nejvhodnější, pokud škola potřebuje pořídit vybavení pro minimálně jednu celou třídu tak, aby každý student měl k dispozici vlastní arduino a ještě zbylo na součástky, se kterými může pracovat. Další nevýhodou, či spíše rizikem, je možné poškození mikropočítače, či jeho úplné zničení, například špatným zapojením, či nevhodnou manipulací ze stran studentů. Toto riziko, společně s vyšší cenou může školu odradit od nákupu a zapojení arduin do výuky. Naštěstí existuje způsob, jak arduina pořídit a zapojit je do výuky za mnohem nižší cenu, než v případě oficiálních výrobků. 1 Zdroj: https://www.arduino.cc/en/main/aboutus 2 Zdroj: https://en.wikipedia.org/wiki/arduino#/media/file:arduino_logo.svg 9
Arduino jako platforma je totiž open-source hardware, což znamená, že jeho schémata jsou volně k dispozici a je tedy umožněno ostatním výrobcům vyrábět tzv. Arduino klony. Klon je mikropočítač, který má stejné rozložení portů, jako originální Arduino, jen je většinou vyroben z levnějších komponent a bez podpory výrobce. Klony nesmí využívat název Arduino a tak je lze nalézt pod velkým množstvím jmen, kdy většinou vždy obsahují výraz duino. Dalším poznávacím znamením bývá také odlišné barevné provedení. Kvalita zpracování klonů se pohybuje ve velkém rozsahu. Na jedné straně jsou kvalitní, skoro originální, výrobci produkující klony jakými jsou například zařízení Seeduino, Roboduino, apod. a na té druhé jsou bezejmenní výrobci z Číny s minimálním počtem prodaných kusů. Cena klonů se taktéž může pohybovat od několika korun (cca 20-50 Kč za kus) až po přibližně polovinu ceny originálů. Pro potřeby škol je pořízení klonů jistě atraktivnější, kdy lze, při pečlivém výběru, vybavit celou třídu mikropočítači za cenu přibližně dvou originálních kusů. Riziko, že daný klon nebude fungovat po stejnou dobu, jako originál je sice větší, ale pro začátečníky, jimiž studenti jednoznačně jsou tyto levnější řešení vhodnější, jelikož pokud dojde k jejich zničení během výuky špatným zapojením, či manipulací, tak škoda nebude stovky, až tisíce korun, ale pouze desítky. Škola tak může žákům tyto mikropočítače poskytnout a do výuky je zavést i za minimální cenu a to včetně doplňků. Jediné, čemu by se při nákupu měla vyvarovat, jsou podezřele levná zařízení, které na sobě nesou originální logo a používají název Arduino. Ta jsou vytvořena v rozporu s autorským právem a tato činnost by neměla být nákupem podporována. 2.1 Druhy Arduin a jeho klonů existuje několik druhů. Liší se velikostí, parametry, počtem pinů, či přítomností nejrůznějších portů a jejich rozložení na desce. Hlavní součástí každého mikropočítače je jeho procesor. V případě arduin se ve většině případů jedná o nejrůznější verze mikroprocesorů ATmega od firmy Atmel. Napájení může být řešeno z USB portu pomocí převodníku, či externího zdroje o napětí, většinou, 3, nebo 5 V. 2.1.1 Arduino Uno Arduino Uno a jeho klony jsou pravděpodobně nejrozšířenější verzí a také pravděpodobně tou, kterou se vyplatí do školy pořídit nejvíce. Jedná se o hlavní vývojovou linii a je pro 10
něj k dispozici nejvíce doplňků, schémat, atd. Výhodou Una je také přítomnost připravených pinů přímo na desce, díky nimž je mikropočítač přípraven přímo k použití bez nutnosti cokoliv pájet. Rozměrově patří Uno mezi ty větší desky, tudíž obsahuje dostatek manévrovacího prostoru při zapojování. Větší velikost také umožnila přímo do desky integrovat USB převodník pro sériovou komunikaci a není tak nutný externí. Procesor na desce Uno je řady ATmega328 a jeho taktovací frekvence je 16 MHz. 2.1.2 Arduino Mini Obrázek 2 Originální Arduino UNO 3 Na rozdíl od verze Uno je Mini miniaturní deskou, která se hodí k zabudování do projektů, kde je potřeba šetřit místem. Obsahuje stejný procesor jako Uno, ale postrádá zabudované piny, či USB převodník, který je nutné dokoupit jako externí doplněk. Obrázek 3 Arduino Mini 4 3 Zdroj: https://commons.wikimedia.org/wiki/file:arduino_uno_-_r3.jpg 4 Zdroj: https://store.arduino.cc/arduino-mini-05 11
2.1.3 Arduino MEGA 2560 Arduino Mega je opakem verze Mini. Jedná se o zvětšenou verzi Uno, ke které přidává více pinů a výkonnější verzi procesoru. Tato verze je používána v projektech, kde je nutné větší množství zapojených doplňků a součástek, či v projektech, které vyžadují vyšší výpočetní výkon. 2.1.4 Ostatní Obrázek 4 Arduino MEGA 5 Další druhy arduin se většinou liší druhem připojení (Ethernet, Bluetooth, apod.), či přítomností USB převodníku (Arduino Nano). Existují také zajímavé verze, které lze využít například pro zašití do textilu (LilyPad), či umožňuje spouštět jednoduchou verzi operačního systému Linux (Yún). V posledních letech se také začala objevovat Arduina s procesory společnosti Intel (Galileo). Speciální verzí je set na základě platformy arduino, který tvoří jednoduchého programovatelného robota s koly a motory (Arduino Robot). 2.1.5 Shieldy Shieldy nejsou samostatnou verzí arduina, ale jedná se o rozšiřující desky, které přidávají pokročilé funkce, jakými je například možnost připojení k síti pomocí ethernet portu, či bezdrátové připojení modulem technologie Wi-fi. Shieldy je možné připojit do jednotlivých pinů arduina, či dalšího shieldu. Jednotlivých rozšiřujících modulů je velké množství a opět se můžeme setkat s originálními, i neoriginálními kusy. 5 Zdroj: https://commons.wikimedia.org/wiki/file:arduino_mega.jpg 12
2.2 Vybrané součástky pro obohacení Arduina Samotné Arduino sice je centrálním prvkem veškeré práce, ale bez dodatečných součástek by byly jeho možnosti rychle vyčerpány. Po již zmíněných shieldech je vhodné k Arduinu pořídit elektronické součástky. Pro základní, až středně pokročilou práci je pro potřeby výuky vhodné pořídit dostatečné množství LED diod, momentových tlačítek, spínačů, či displayů, nejčastěji sedmi segmentových. Je také vhodné sadu dovybavit nejrůznějšími odpory, které jsou potřeba pro bezpečné zapojení některých doplňků. Mezi pokročilejší části patří například mikroserva, která umožní přidat do projektu pohyblivé části, motory pro potřeby například robovozidel, či nejrůznější přídavné moduly a senzory, díky kterým mohou studenti například měřit teplotu, či vlhkost, nebo do projektu přidat čtečku otisků prstů, či moduly pro bezdrátovou komunikaci mezi Arduiny. Jednou z pravděpodobně nedůležitějších součástí práce s Arduiny a elektronickými obvody je nepájivé pole. Studenti při práci s arduiny sestavují více, či méně složité elektronické obvody, ve kterých je nutné vodivě spojit jednotlivé součástky s arduinem, což většinou vyžaduje pájení. Pájení však obvod spojí napevno a jeho opětovné předělání v případě chyby by vyžadovalo zdlouhavý proces a následné čištění. Právě nepájivé pole umožní, jak již název napovídá, zapojit obvod bez procesu pájení a umožní tak opravu chyby, pokud bude obvod zapojen chybně. Obrázek 5 Nákres nepájivého pole 6 6 Zdroj: https://commons.wikimedia.org/wiki/file:breadboard-144dpi.gif 13
Hlavním parametrem nepájivého pole je jeho velikost, která určuje, jak velké projekty bude možné sestavit. Jednotlivé kontakty pole jsou spojeny v závislosti na jeho tvaru a tvoří spojené řady (viz. nákres). Pro potřeby zapojení také při pořízení nesmíme zapomenout na propojovací kabely. Y mohou mít nejrůznější délky, či provedení konce. Co se délek týče, je vhodné mít pro nejrůznější projekty připraveny délky od nejkratších po ty nejdelší, vyvarujeme se tak nutnosti shánět kabel na poslední chvíli, či pracně přerovnávat celé zapojení. Zakončení kabelů mohou tvořit samčí i samičí konektory. Do výbavy je vhodné přidat obě dvě verze, protože ačkoliv do Arduina se většinou připojují samčí konektory, některé menší verze (Nano, apod.) mohou mít napájené samčí piny a poté je nutné naopak použít samičí. To samé platí o některých součástkách. Problém různých druhů zakončení kabelů se samozřejmě týká pouze zapojení napřímo. Do nepájivého pole jsou použity vždy samčí konektory. 2.2.1 LED diody LED diody jsou jednou z nejzákladnějších elektronických součástek, které lze v rámci práce s Arduinem využít. Jedná se o světelnou polovodičovou součástku, kterou lze snadno zapojit i použít v rámci programu. K dispozici je velké množství druhů a barev. Zapojení diody je jednoduché. Samotná součástka většinou má k dispozici dva vodiče plus a minus. V rámci zapojení je nutné dát pozor, zda je dioda zapojena v tzv. závěrném směru, kdy jí neprochází elektrický proud a dioda tak nevydává žádné světlo. Pro lepší orientaci u standardních diod je vodič u anody (-) kratší, než u katody (+). Z programového hlediska pravděpodobně není jednodušší součástky, než je právě dioda. V závislosti na pinu, do kterého diodu připojíme, můžeme s diodou pracovat digitálně (zapnout a vypnout), či analogově. Pro potřeby analogové práce s diodou však musíme využít PWM vstupů, které umožní například pulzování svitu diody (postupně zeslabování, či zesilování). Samotných diod je větší množství, kdy je můžeme rozdělit převážně z hlediska jednotlivých barev. Mírné rozdíly jsou také v technickém provedení diod, na trhu se mohou vyskytovat standardní diody, či například SMD diody, které jsou napájeny na malých plošných spojích, atd. 14
2.2.1.1 Jednobarevné diody V případě použití jednobarevných diod však jejich atraktivnost nespočívá v použití jednoho kusu. Zajímavost nabývají až při větším počtu, kdy je možné vytvořit nejrůznější projekty. Od světelných pásů, přes nejrůznější domácí osvětlení, až po světelné kostky, či jiné ozdobné struktury. Jednotlivé LED diody jsou tedy téměř nutným vybavením pro práci s Arduinem. 2.2.1.2 RGB LED dioda U jednotlivých diod však možnosti těchto polovodičových součástek nekončí. Mezi velmi zajímavé součástky patří také speciální RGB dioda, která je schopna svítit třemi základními barvami modelu RGB, tedy červenou (R - Red), modrou (B - Blue) a zelenou (G Green). Studenti tak mohou v rámci projektů na jediné součástce přepínat barvy, nastavovat jejich intenzitu, či naprogramovat jednoduché sekvence střídání. Tím však možnosti RGB diody nekončí. Barevný model RGB pracuje na principu míchání barev ze tří zmíněných základních barev. Například při maximální hodnotě červené a modré barevné složky vznikne fialová barva, pří stejné situaci ale tentokrát červené a zelené složky vznikne žlutá, apod. Tato skutečnost umožňuje využít RGB diodu nejen při vytváření barevných přechodu z barvy do barvy, ale také k samotnému vysvětlení principu RGB modelu a míchání barev na počítači. Studenti mohou vidět zapnutí jednotlivých barevných složek, ale hlavně také změnu barvy při situaci, kdy je více zapnutých barevných složek najednou. 2.2.2 Segmentové displaye Segmentové displaye mají velice blízko LED diodám, které vlastně obsahují. Jedná se o součástky, které jsou schopné zobrazit číselné, či písmenné údaje. Segmentový display se skládá, jak již název napovídá, z jednotlivých segmentů. Segmenty jsou většinou jednobarevné LED diody, které se chovají naprosto stejně, jako standardní diody, kterými jsme se zabývali výše. Postupným zapnutím jednotlivých segmentů lze znázornit právě vybraný znak. Segmentové displaye můžeme dělit na více druhů dle několika kategorií. Co se technického hlediska týče, tak existují segmentové displaye se společnou katodou a 15
společnou anodou. Díky tomuto způsobu výroby je tak možné využít k zapojení displaye pouze tolik vodičů, kolik obsahuje segmentů plus jedna (pro katodu, či anodu). Obrázek 6 Sedmisegmentový display Využití segmentových displayů roste s počtem jich samotných a jejich segmentů. Základem jsou sedmisegmentové displaye, které zvládnou zobrazit čísla 0-9 a písmena v rozsahu A-F, kdy znaky B a D je možné zobrazit pouze jako malá písmena z důvodu kolize velkých písmen s čísly 8 a 0. Použití tohoto displaye v rámci projektů je v zobrazení nejrůznější odpočtů, počítání skóre, či zobrazení jednoduchých zpráv. Často jsou využívány taktéž jako servisní displaye pro zobrazení hodnot v obvodu (měřiče napětí, apod.). Jednotlivé vývody sedmisegmentového displaye jsou označeny písmeny pro lepší orientaci. Většina sedmisegmentových displayů má vývody rozloženy dle následujícího schématu. Při zapojování je tedy nutné dát pozor, který pin, patří kterému segmentu tak, aby nevznikl při programování problém se zapínáním nežádoucích segmentů. 16
Obrázek 7 Rozložení pinů sedmisegmentového displaye se společnou katodou S počtem segmentů využití displayů roste, jelikož dokáží zobrazit více znaků. Pravděpodobně nejpokročilejšími jsou čtrnácti a šestnácti segmentové displaye, které jsou schopny zobrazit většinu ASCII znaků. Použití je stejné, jako v případě jednodušších displayů, takže pokud se studenti naučí práci s jednoduchými, tak jim nebudou vícesegmentové displaye dělat potíže. Použití vícesegmentovch displayů je samozřejmě tam, kde je potřeba zobrazit více znaků. Pokud ani čtrnácti, či šestnáctisegmentové displaye nestačí, tak je možné pro projekty využít nejrůznější LCD displaye, které však pracují na jiné technologii. 17
2.2.3 Fotorezistor Fotorezistor je jednoduchá a velice zajímavá součástka. Funguje podobně jako standardní rezistor, avšak dokáže svůj odpor měnit na základě okolního osvětlení, odpor fotorezistoru totiž klesá s rostoucím osvětlením. Pokud dojde k zapojení fotorezistoru do obvodu, můžeme pomocí Arduina číst hodnotu napětí a tuto hodnotu dále použít v rámci programu. Vzniknout tak mohou fotocitlivé projekty, jakými je například spínač osvětlení. 2.2.4 Momentové tlačítko Obrázek 8 Dva příklady fotorezistorů Jedna ze základních součástek v rámci projektů je momentové tlačítko. Jedná se o spínač, který je aktivní pouze při stálém stisku. Po jeho uvolnění dojde k rozepnutí spínače a přerušení obvodu. Pokud je tlačítko stisknuté, dojde k připojení pinu, na kterém je zapojené k napájení a Arduino tak dokáže přečíst hodnotu HIGH, v opačném případě (rozpojení) přečte hodnotu LOW. Samotné druhy tlačítek se mohou lišit dle velikosti jak pinů pro zapojení, tak tlačítka samotného a je tak vhodné před pořízením zkontrolovat, zda bude do Vašeho projektu pasovat. Obdobně fungují také přepínače, které zůstávají sepnuté do té doby, než je uživatel opět vypne. 18
Obrázek 9 Dva příklady momentových tlačítek 2.2.5 Mikroserva Mikroserva jsou malá zařízení známá například z dálkově ovládaných modelů aut, či letadel. Servo obsahuje převody, řídící obvody a hlavně malý motor, který mu umožní pohyb, většinou v rozsahu od 0 do 180. Serva nám tak umožní přidat do Arduino projektů element pohybu, ať se již jedná o ovládání řízení auta, nebo součásti robotů. Samotná serva jsou již dostupným a relativně levným artiklem, kdy nejlevnější lze pořídit za ceny kolem 100 Kč, při nákupu z čínských obchodů lze cenu stlačit i na hodnotu 1 2 dolarů za kus. Při nákupu serv je nutné dát pozor na několik faktorů, které ovlivní životnost i použití serva. Samotná serva jsou většinou tříděna dle jejich hmotnosti, jelikož tento údaj je důležitý pro letecké modeláře, kteří je často používají. Tento parametr je důležitý pouze, pokud potřebujeme v projektu šetřit váhu. Důležitější je kvalita převodů, která je určena materiálem, který je použit. Převody mohou být plastové, které jsou nejlevnější, nejlehčí, ale rychleji se opotřebují. Dále můžeme pořídit karboniové, které jsou extrémně lehké a pevné, ale křehké, takže existuje větší riziko poškození při častých nárazech. Posledním standardním materiálem, který je na převody použit, je kov. Kovové převody jsou nekvalitnější a nejpřesnější, ale také nejdražší a nejtěžší. Dalším důležitým parametrem je jeho tah, který určuje, jak moc velké zatížení může na servo působit. Pokud tuto hodnotu 19
překonáme, může dojít ke zničení serva. Posledním důležitým parametrem je napájení serva. To určuje, na jaký zdroj jej můžeme připojit. Pokud připojíme slabší zdroj, servo nemusí fungovat, pokud silnější, můžeme servo zničit. Obrázek 10 17g mikroservo Samotná serva se připojují třemi vodiči. Dva z nich (červený a černý, nebo hnědý a červený) slouží k připojení napájení, zatímco třetí (bílý, oranžový, nebo žlutý) slouží pro přenos signálu. 2.2.6 Moduly pro bezdrátovou komunikaci Bezdrátová komunikace je vítaným obohacením práce s Arduinem. Nejjednodušší variantou je sériová bezdrátová komunikace, která se velmi podobá komunikaci přes USB připojení. Při výběru modulu se můžeme rozhodovat dle frekvence, na které přenos probíhá. Na trhu se pohybují moduly s frekvencí přibližně 400 MHz, přes moduly pro technologii Bluetooth, až po ty s frekvencí 2,4 GHz. Dalším parametrem je dosah přenosu, který je většinou uveden pro otevřený prostor, proto je nutné, dle dané frekvence, počítat s odlišnými hodnotami, zvláště v zástavbě, či budově. Samotné moduly lze použít při komunikaci PC Arduino, nebo také Arduino Arduino, lze tedy programovat jak vysílač, tak přijímač, například pro použití dálkové ovládaných robotů, či přenosu dat z bezdrátových čidel. 20
2.2.7 Senzory Obrázek 11 Ukázka přijímače a vysílače pro bezdrátový sériový přenos Další, již pokročilejší možností, jak Arduino zavést do výuky jsou nejrůznější přídavné moduly. Jak již bylo zmíněno, na trhu existuje sada 37 senzorů, které bohatě stačí pro potřeby výuky. Navíc se i tyto sensory vyskytují na trhu v neoriginální verzi za cenu do 300 korun, takže je škola může opět pořídit ve větším množství, aby posloužily více žákům. Jednotlivé senzory jsou více, či méně zajímavé, ale jako celek tvoří unikátní sadu, která dokáže studentům ukázat praktické využití na vyšší úrovni, než je například blikání LED diody. Samozřejmě není možné požadovat od takto levných senzorů špičkové měření, které bude 100% odpovídat dražším řešením, ale jako praktická ukázka do výuky postačují. Samotné sady se mohou, co se obsahu týče, mírně lišit. V nejrůznějších obchodech lze nalézt také sady o více senzorech (45, apod.). Lze se však spolehnout na několik základních senzorů, které bude pravděpodobně každá sada obsahovat součástky, jakými jsou jednotlivé druhy diod, kdy sada obsahuje od jednoduchého laserového ukazovátka, které funguje stejně, jako jednoduchá dioda až po SMD RGB diody. Sady dále obsahují nejrůznější senzory, které detekují například velikost magnetického pole, či srdeční tep. 21
Vrcholem jsou pak senzory, které umožňují například dálkové ovládání jiných zařízení, nebo detekci překážek pro použití v robotických projektech. Následovat bude krátký přehled jednotlivých senzorů, které by bylo možné prakticky zapojit do výuky na střední škole. Prvním ze sensorů sady je analogový sensor teploty, který dokáže na výstupu navrátit napětí v závislosti na teplotě. Studenti tak za pomoci několika vzorců dokáží naprogramovat jednoduchý teploměr. Obrázek 12 Analogový sensor teploty 7 Další ze součástí sady je jednoduchý joystick, který má dvě analogové osy a jelikož je možné jej stisknout, tak i digitální tlačítko. Do výuky jej lze zapojit například jako problémovou úlohu, kdy musí studenti zjistit, jak vlastně joystick funguje a kdy a jaké hodnoty os X a Y podává. Jeho funkci lze znázornit například za pomocí LED diod pro každý směr, kdy dioda postupně v daném směru zvyšuje jas dle pozice joysticku. Pokročilejší použití samozřejmě zahrnuje servo a nejrůznější ovladatelné stroje, či roboty. 7 Zdroj: http://wiki.sainsmart.com/index.php/file:analog_temperature_sensor.png 22
Obrázek 13 Joystick 8 Další zajímavou součástí jsou dva druhy bzučáků. První z nich, aktivní, je výborným nástrojem pro demonstraci frekvence zvuku. Za pomocí metody tone( ) lze bzučákem znázornit řadu různých frekvencí a žáci tak v rámci výuky mohou tvořit vlastní melodie, či v kombinaci s tlačítky vytvořit jednoduché klávesy. Obrázek 14 Aktivní bzučák 9 Druhým bzučákem v sadě je ten pasivní. Pasivní bzučák funguje podobně jako dioda, jelikož má pouze dva stavy zapnuto a vypnuto. Výsledná melodie je tvořena za pomoci pauz mezi jednotlivými zapnutími. V rámci výuky je pro žáky velice zajímavé vyzkoušet za 8 Zdroj: http://navody.arduino-shop.cz/navody-k-produktum/arduino-joystick-ps2.html 9 Zdroj: http://wiki.sainsmart.com/index.php/file:active_buzzer_module.png 23
pomoci tohoto systému vytvořit známou melodii. Zjistí tak, že tvořit hudbu lze i jinými způsoby než přesným zahráním tónu. Obrázek 15 Pasivní bzučák 10 Pro potřeby robotů nabízí sady většinou dva moduly, první z nich, sledovací, který dokáže rozeznat černou a bílou barvu. Sledovací modulu obsahuje infračervený přijímač a vysílač. Vysílač vypustí paprsky, které se následně odrazí od povrchu zpět do přijímače. Pokud je povrch světlé barvy, nejlépe bílé, jsou paprsky odraženy zpět a modul navrátí hodnotu LOW. Pokud se jedná o tmavý, nejlépe černý, povrch, jsou paprsky pohlceny a modul navrátí hodnotu HIGH. Pomocí tohoto modulu lze ovládat například jednoduchý pohyb robota po dráze, apod. Obrázek 16 Sledovací modul 11 Druhým modulem, který může být prospěšný při stavbě jednoduchých robotů, je jednoduchý detektor překážek. Modul vysílá infračervené paprsky, které se v případě přítomné překážky odrazí zpět. V případě, že sensor detekuje překážku, navrátí hodnotu HIGH, v opačném případě LOW. Na sensoru jsou také umístěny dva potenciometry, které 10 Zdroj: http://wiki.sainsmart.com/index.php/file:passive_buzzer_module.png 11 Zdroj: http://wiki.sainsmart.com/index.php/file:tracking_module.png 24
slouží k nastavení jeho parametrů. Jeden z potenciometrů nastavuje infračervenou frekvenci přenosu a studenti jej nemusí nastavovat, ten druhý je však zajímavější a rozhodně použitelný v projektech. Nastavuje totiž vzdálenost detekce překážek v rozsahu cca 2-40 cm. Tímto potenciometrem tak lze nastavit, s jakou citlivostí bude případný robot přistupovat k překážkám. Bohužel u tohoto sensoru nelze tuto hodnotu měnit jinak, než mechanicky. Taktéž sensor nesděluje aktuální vzdálenost, pouze zmíněné hodnoty HIGH, nebo LOW. Obrázek 17 Infračervený detektor překážek 12 U sensorů je, vzhledem k jejich ceně, nutné přistupovat jako k nedokonale vyrobeným součástkám, jelikož minimálně v jedné sadě použité k přípravě této práce se vyskytly špatně zapojené vodiče, což vyústilo v jinou funkci pinu na sensoru, než jak uváděla dokumentace a popisky. Je potřeba tedy vše důkladně zkontrolovat a případně proměřit. I přes tyto nedostatky se jedná o zajímavé a finančně nenáročné doplňky pro práci s Arduinem. 12 Zdroj: http://wiki.sainsmart.com/index.php/file:infrared_obstacle_avoidance_sensors.png 25
3 Práce s Arduinem Samotná práce s platformou Arduino spočívá ve dvou fázích. Každý, kdo chce vytvořit projekt, musí nejdříve navrhnout a sestavit obvod se všemi součástmi, které k němu potřebuje. Z toho vyplívá, že pro potřeby práce s Arduinem by měl tvůrce mít alespoň základní návyky pečlivé práce tak, aby mohl zapojit často miniaturní zapojení. Finální produkt navíc může vyžadovat pájení, které je, zvláště v malých velikostech velmi náročné. Proto v případě použití u studentů je nutné je vést k pečlivé práci tak, aby součástky nezničili, či se nezranili. Po sestavení a zapojení obvodu však samozřejmě nebude Arduino vykonávat žádnou činnost. Hlavní činností, která vede k funkčnímu projektu je samozřejmě jeho naprogramování. Jedná se o natolik odlišnou činnost, že v některých případech programuje někdo jiný, než zapojuje obvod.vytvoření programu je však nezbytnou součástí a tak by studenti měli obsáhnout i tuto činnost. Samotné programování již nevyžaduje fyzickou činnost, ale jedná se o pokročilý myšlenkový proces. 3.1 Navržení obvodu Samotné navržení obvodu by mělo předcházet zapojení. Každý tvůrce by si nejdříve měl rozmyslet a načrtnout rozložení součástek, zvážit, kam bude výsledný obvod umístěn, jak bude napájen, apod. Možností, jak navrhnout obvod je bezesporu několik, kdy pravděpodobně tou nejjednodušší je náčrt na papír a následné testovací zapojení. Při tomto způsobu však přijdeme o veškeré výhody, které moderní technologie nabízí. Navíc při častém pokusném zapojování hrozí poškození jednotlivých součástek. Naštěstí za pomoci počítače lze zpracovat jak samotný návrh obvodu, tak nasimulovat jeho chování při zapnutí napájení. Specializované programy umožní přidat na virtuální pracovní desku libovolnou součástku, kterou má ve své knihovně. Jedním z takových programů je ten s názvem Fritzing. Frizting je open-source software, který umožní navrhnout a zdokumentovat navržený obvod. Ačkoliv Frizting neumí obvod simulovat, tak jeho open-souce podstata zajišťuje velké množství přispěvatelů do katalogu součástek, které je možné na virtuální desce použít. Výsledkem práce v programu je tak přehledný nákres obvodu, dle kterého je poté 26
možné postupovat při jeho zapojení. Mimo potřeby Arduina obsahuje Fritzing také návrhář plošných spojů. Obrázek 18 Uživatelské rozhraní softwaru Fritzing s přidaným nepájivým polem a Arduinem UNO Dalším zajímavým nástrojem je webová aplikace Tinkercad, která vzniká pod patronátem firmy Autodesk. Jedná se o zjednodušení online CAD nástroj, který může posloužit také k modelování 2D a 3D objektů. Pro potřeby mikropočítačů je však zajímavá jeho část Circuits 13. Ta je totiž plnohodnotným simulátorem obvodů, do kterých lze zapojit také Arduino a základní součástky. Po vytvoření obvodu však přichází rozdíl oproti nástroji Fritzing, kdy Tinkercad dovolí uživateli naprogramovat chování obvodu a spustit simulaci. Tím pádem může být projekt tvořen bez nutnosti mít Arduino u sebe, což se, zvláště v začátcích může hodit. Pro použití aplikace Tinkercad je nutné mít vytvořen účet u společnosti Autodesk, který je však zdarma a neměl by tak představovat překážku. 13 https://www.tinkercad.com/circuits 27
Obrázek 19 Prostředí appletu Tinkercad Circuits Poslední velkou výhodou naplánování obvodu je skutečnost, že se studenti naučí přemýšlet a zvažovat své činy, kdy si nejdříve zadanou úlohu pečlivě promyslí, načrtnou a případně i otestují před tím, než se dostanou k samotnému zapojení obvodu. Díky tomu se v současné uspěchané době, kdy studenti chtějí mít vše co nejrychleji hotové a nejdou do hloubky, zastaví a rozmyslí si své kroky tak, aby neponičili samotné zařízení, či jeho součástky neodborným zapojením. Ve chvíli, kdy je vše navrženo, tak studenti mohou přejít k samotnému zapojení obvodu a jeho propojení s Arduinem. 3.2 Zapojení obvodu Po návrhu a otestování obvodu následuje samotné zapojení. Na základní desce Arduina je mnoho různých konektorů a pinů, do kterých lze něco zapojit. Samozřejmě ne vždy je možné zapojit vše do příslušného pinu, jelikož by daná komponenta v lepším případě nemusel fungovat, v horším by mohlo nevhodné zapojení zničit součástku, nebo celé Arduino. Proto je nutné znát význam jednotlivých pinů ještě před tím, než začneme do Arduina zapojovat. 28
V rámci platformy Arduino se podoba a pozice jednotlivých pinů a konektorů může mírně lišit, jejich funkce však zůstává stejná. Pro potřeby práce bude využíváno Arduino verze Uno, tedy jedna z nejpoužívanějších desek. Uno má velkou výhodu ve skutečnosti, že je většina pinů a konektorů již na místě a není tak nutné je pájet na desku. Pravděpodobně nejdůležitější jsou napájecí konektory a piny. Napájecím a datovým konektorem pro Uno je USB, přičemž záleží na verzi, kterou deska využívá. Nejčastěji se setkáme s konektory USB typu B, microusb a miniusb. Napájení za pomocí USB musí odpovídat jeho specifikaci a tudíž je přes tento konektor možné napájet napětím 5V. Pokud máme Arduino připojené k počítači, je proud omezen na 250 až 500 ma. Pokud je použitý externí zdroj, například powerbanka, který je schopen dodávat proud 1, nebo 2A, tak je regulován rovněž na 500mA. Dalším napájecím konektorem, který se na Unu objevuje, je DC konektor pro připojení externího zdroje napájení. Doporučenou hodnotou napětí, které by měl zdroj dodávat je rozsah od 7 do 12 V. Samotné Arduino zvládne rozsah 6 20 V, ale zmíněný doporučený má dosti velkou rezervu, který pokryje případné výkyvy. Napájení se týká také VIN pin, který je však o něco složitější, má totiž dvě funkce. V první z nich je možné jej využít jako vstup pro zdroj, nebo v rámci druhé jako zdroj pro zařízení, kterému předává energii z DC konektoru. Vzhledem k chybějící ochraně na tomto pinu je však vhodné jej použít spíše jako zdroj a ne přívod energie. V oblasti napájení se nachází také dva piny s označením GND, které slouží pro uzemnění obvodu. Po napájecích pinech jsou další velkou skupinou, která se na desce nachází, digitální piny. Jedná se většinou o piny s označením 0 13 u jedné z delších stran Arduina. Každý z digitálních pinů má interní rezistor, který je zapnut, nebo vypnut použitím dvou stavů, které v programovacím jazyce C++ odpovídají hodnotám HIGH a LOW. Programování digitálních pinů se bude práce více věnovat v následujících částech, tudíž nebude rozebíráno zde. V této části budou rozebrány jednotlivé parametry a speciální funkce jednotlivých pinů. Piny s označením 0 a 1 mají většinou také funkci přijímače (RX, pin 0) a vysílače (TX, pin 1) sériových dat. K těmto pinům se většinou připojují ta zařízení, která komunikují sériově, jako je například bluetooth modul, bezdrátové moduly pro frekvenci 2,4 GHz, nebo další Arduino. 29
Speciální jsou také piny s čísly 3, 5, 6, 9, 10 a 11, které jsou na desce většinou označeny vlnovkou. Tyto piny jsou schopny poslat na výstup tzv. PWM signál, který supluje analogový výstup. PWM (Pulse Width Modulation, neboli Pulzně šířková modulace) je druh přenosu signálu, kdy záleží na poměru času mezi stavy vypnuto a zapnuto (napětími 0 a 5V). Toto rychlé přerušování má za následek úbytek napětí, nižší efektivitu a například u LED diody nižší svit, u motoru nižší výkon apod. Proto lze na těchto pinech docílit chování, které připomíná analogový výstup z Arduina. Rozlišení PWM výstupu je 8 bitů a počet těchto pinů u jiných desek, než Una se může lišit. Zvláště u desek založených na procesoru ATmega8, kde se jedná pouze o piny 9, 10 a 11. Posledním zajímavým digitálním pinem, který bude v této části zmíněn, je ten s číslem 13. Pin samotný funguje stejně jako ostatní standardní digitální piny. Na tento pin je však navíc napojena zabudovaná dioda, která se rozsvítí v případě, že je pin nastaven na HIGH a vypne v případě, že je nastaven na LOW. Jedná se o jednoduchý doplněk, díky kterému je však možné pracovat s velmi jednoduchými programy i bez nutnosti připojení jakékoliv součástky. Ve stejné oblasti jako digitální piny se většinou na desce Uno nachází také jeden digitální pin pro uzemnění GND a také pin s označením AREF, který poskytuje informace o referenčním napětí pro analogové vstupy. Dalšími piny, které se na desce nachází, jsou ty analogové. Na deskách Uno většinou nesou označení A0 až A5, na ostatních se může lišit počtem, nebo umístěním. Tyto analogové piny fungují pouze pro vstup do Arduina a nelze pomocí nich hodnoty zapisovat. Zajímavostí je, že analogové piny lze ve většině případů použít také jako digitální piny. V tomto případě jsou referovány pod čísly 14 (A0) až 19 (A5). Rozlišení převodu z analogových hodnot na digitální je v případě analogových pinů 10 bitů. Po seznámení se s jednotlivými piny přijde na řadu samotné zapojení. Jak již bylo zmíněno, samotné zapojení je vhodné provést do nepájivého pole, které umožní opravit případné chyby. Pro připojení využijeme kabelu dle potřeby. Samotné kabely by měly svou délkou odpovídat vzdálenosti pole a součástky od místa zapojení. Neměly by tedy být příliš krátké, aby nenamáhaly jednotlivé piny a neohýbaly se, ale také, na což velké množství 30
žáků zapomínalo, také příliš dlouhé. Pokud byly vodiče příliš dlouhé, znesnadňovalo to orientaci v obvodu, jelikož se nadbytečná část zapojení pletla do ostatních, zakrývala diody a displaye apod. Co se počtu týče, tak lze říci, že kabelů není nikdy dost a proto je vhodné jich pořídit větší množství nejrůznějších délek. Pro potřeby výuky opět plně postačí levné vodiče z čínských obchodů. Je však nutné si dát pozor, jelikož občas se při velkém množství kabelů v balení může vyskytnout chybný nebo nefunkční. Proto, pokud je obvod zapojen správně a přesto nefunguje, je vhodné zkontrolovat a otestovat jednotlivé vodiče. Pro důležité projekty, které zapojují již zkušení studenti, je vhodnější pořídit kvalitní kabeláž. Při zapojování obvodů bychom také neměli zapomínat také na ochranu jednotlivých součástek proti nadměrnému elektrickému proudu. Tuto ochranu lze zajistit použitím rezistorů. Fyzikální veličinou, která určuje vlastnosti rezistoru je především elektrický odpor R, jehož základní jednotkou je ohm (Ω). Čím vyšší je hodnota elektrického odporu, tím více rezistor odporuje elektrickému proudu a tím méně ho prochází. Rezistory mívají různé hodnoty, které lze poznat dle kódu na jejich povrchu. Ten se skládá z několika barevných proužků, jejich pořadí a barva určuje hodnotu odporu. Pruhy jsou nejčastěji čtyři, či pět a jejich barevné pořadí je bráno od té strany, kde jsou proužky blíže kraji rezistoru, tam se nachází 1. proužek. První dva pruhy (případně tři u rezistorů s pěti pruhy) určují platné číslice hodnoty, zatímco další pruh je násobitel hodnoty. Poslední pruh udává toleranci. Studenti si tak mohou jednoduše ověřit hodnotu rezistoru bez nutnosti dalšího nástroje. Přesto existují aplikace, které dokáží po zadání barev hodnotu rezistoru zobrazit. Jedná se o webové applety (například web Danyk.cz 14 ), ale také mobilní aplikace (například Resistor Code Calculator 15 ). Je tak na vyučujícím, zda bude po studentech požadovat znalost kódů, či jim povolí aplikaci pro výpočet. Při zapojování je nutné samozřejmě dát pozor na to, aby bylo Arduino odpojeno od zdroje napájení. Pokud bychom ho ponechali připojené, tak riskujeme poškození součástek, i případné zranění. 14 http://danyk.cz/znaceni.html 15 https://play.google.com/store/apps/details?id=com.vivid_planet.resistor 31
3.3 Programování Po zapojení obvodu však práce nekončí, jelikož samotný obvod totiž žádnou činnost nevykoná. Základem každého projektu založeného na platformě Arduino je program, dle jehož instrukcí Arduino vykonává veškerou činnost. Programování je odlišné od samotného zapojování obvodů. Jedná se o náročný proces vyžadující ve své aplikaci informatického a logického myšlení. Vysvětlení programování a programových struktur neodpovídá plně náplni této práce a vysoce ji přesahuje, a proto budou ohledně programování vysvětleny pojmy pouze související se základy programování Arduina. Z výše zmíněného vyplývá, že jak vyučující, tak i studenti by měli před zahájením programování Arduina projít základní poučením a seznámením se základy programování. Programování Arduina v základních projektech není náročné a postačí znalost základních pojmů jako je proměnná, metoda, cyklus, či podmínky. Přesto však má programování Arduina svá specifika, na které při tvorbě počítačových aplikací narazí tvůrce jen zřídka. Tvorba programů může probíhat několika způsoby. Je možné nalézt nástroje, které spojují Arduino s populárním programovacím jazykem Scratch, či jeho alternativami. Standardní programování Arduina probíhá v programovacím jazyce C++, který je obohacený o knihovny jazyka Wiring 16. Poslední ze základních možností, jak programovat Arduino je kombinace tvorby vnitřního programu a externí aplikace pro jeho ovládání. Samotný princip, dle kterého Arduino pracuje je však společný všem způsobům. Vnitřní program, který je uložen uvnitř mikropočítače, pracuje tak, že po připojení k napájení dojde k nastavení počátečního stavu a po této fázi poté Arduino opakuje sadu příkazů, které jsou v programu definovány. Základ tak tvoří dvě metody, jakési podprogramy, které obsahují sadu příkazů. Metoda setup je volána pouze jednou při zapojení napájení a slouží k nastavení počátečních hodnot, jednotlivých pinů, či dalších příkazů, které potřebujeme provést při zapnutí Arduina. Druhá ze základních metod je ta s názvem loop. Právě do této metody se píše veškerý kód, který má Arduino vykonávat po dobu zapojení napájení. Tato metoda je volána opakovaně 16 https://arduino.cz/zakladni-struktury-jazyka-wiring/ 32
až do té doby, než je stisknuto tlačítko reset, nebo je odpojeno napájení. Níže je vidět základní kód jednotlivých metod. void setup() // místo pro příkazy provedené při zapnutí napájení void loop() // místo pro příkazy prováděné opakovaně Tyto metody potřebuje každý program ve vnitřní paměti Arduina ať se již jedná o ten, který zprostředkovává jazyk na bázi Scratche, nebo C++, obsah je samozřejmě rozdílný. 3.3.1.1 Scratch Nástroje založené na bázi jazyka Scratch jsou určené pro úplné začátečníky. Princip Scratche je naučit základní programové struktury bez znalosti jakéhokoliv psaného kódu. Samotné programování probíhá skládáním barevných bloků, které reprezentují jednotlivé příkazy. tento způsob tvorby programů tak eliminuje syntaktické chyby, tedy prohřešky proti pravidlům daného jazyka. Programování Arduina za pomoci jazyka Scratch je trochu odlišné od toho dospělého v jazyce C++ jelikož programátor netvoří přímo program pro Arduino, ale pouze jakýsi obslužný program. Do paměti Arduina je totiž nutné nahrát speciální program, často nazývaný firmware, který slouží ke komunikaci Arduina a právě vývojového prostředí. Jazyk Scratch je totiž charakterizován schopností úpravy programů za chodu, což přenáší i do propojení s Arduinem. Při standardním programování je totiž nutné při každé změně program do Arduina znovu nahrát, při programování ve spojení se Scratchem jsou změny v programu okamžitě vidět. Není nutné nahrávání programu, o vše se postará firmware, který je do Arduina nahrán jako první. 33
Přes tyto výhody má však využití nástrojů na základě jazyka Scratch pro programování Arduina také své nevýhody. Tou, která z velké části brání ve větším použití tohoto přístupu je malé množství pokrytých pinů. Vzhledem k nutnosti vytvoření speciálního firmwaru totiž není možné využít veškeré piny, které Arduino nabízí, ale pouze ty, které umožní právě jeho vnitřní program. Proto ačkoliv je tento způsob programování vhodný pro začátky, u pokročilých projektů lze narazit na situaci, kdy nebude možné úkol vyřešit, protože firmware neumožňuje použití více pinů. Mezi nástroje, které kombinují Scratch a programování Arduina patří například rozšíření 17 pro experimentální verzi Scratche s názvem ScratchX 18. To dokáže do prostředí jazyka Scratch přidat bloky, které jsou schopny pracovat v omezené míře s Arduinem. Nevýhodou prostředí ScratchX je jeho experimentální stav. Ten zapříčiní, že ne vždy funguje jak má. Výhodou je naopak využití nového rozhraní Scratche verze 2. ScratchX využívá webového rozhraní a je tedy dostupné za pomoci prohlížeče. V současné době však nepotěší základ na platformě Flash, který je postupně z online světa odstraňován. Otázkou zůstává, zda pro novou, třetí, verzi Scratche, která je aktuálně v betaverzi, bude také možné vytvořit takovéto rozšíření pro programování Arduina. 17 http://khanning.github.io/scratch-arduino-extension/ 18 http://scratchx.org/ 34
Obrázek 20 Sada bloků pro potřeby Arduina v prostředí ScratchX Další variantou jak naprogramovat Arduino pomocí jazyka Scratch je program S4A. Jedná se o desktopovou aplikaci, která je dostupná i bez připojení k internetu. Musí se tedy instalovat, ale na druhou stranu existuje určitá jistota funkčnosti i po úplném zákazu Flash aplikací v prohlížečích. S4A, nebo Scratch 4 (For) Arduino, je založeno na první verzi vývojového prostředí Scratch a tudíž postrádá například tvorbu vlastních bloků, ale pro základní použití v rámci Arduina bohatě postačí. Obrázek 21 Prostředí S4A připomínající Scratch první generace 35
Mírný problém programu S4A však leží v jeho firmwaru, který je nahráván do Arduina. Ten totiž umožní využití pouze 2 digitálních vstupů (piny 2 a 3) a 6 analogových vstupů. V případě výstupu jsou použitelné piny opět omezeny na 3 digitální (10, 11 a 13) a 3 analogové (digitální piny 5, 6 a 9). Firmware umožní ještě ovládání servomotorů přes digitální piny 4, 7, 8 a 12. Bohužel v případně pokročilejších aplikací není možné využít jiné piny jiným způsobem a program se tak musí použití s S4A přizpůsobit. S4A však sdílí výhodu s nástrojem ScratchX a to možnost změny programu v reálném čase s přímo viditelným výsledkem. Je tak opět vhodný pro úvod do problematiky Arduin a jejich programování. Ve spojení s jazykem Scratch poskytuje barevnou a jednoduchou možnost, jak žáky do práce s mikropočítači nalákat. Na bázi jazyka Scratch funguje také již zmíněný simulační nástroj Tinkercad, který umožní simulaci vytvářet právě podobnými bloky jako právě v jazyce Scratch. Použití nástroje Tinkercad s přechodem do nástroje pracující se Scratchem je tak vhodný způsob, jak seřadit pokrok studentů při seznamování se s platformou Arduino. Nejdříve na simulátoru obvod otestují a poté zapojí a naprogramují reálně. Ve chvíli, kdy budou dostatečně seznámeni, je možné přejít na další úroveň. 3.3.1.2 C++ a Arduino IDE Po seznámení se základy v jazyce Scratch by měli studenti být připraveni na dospělé programování v jazyce C++. Jedná se o plnohodnotný vyšší programovací jazyk, ve kterém studenti dokáží vytvořit libovolný projekt. Programování Arduina v jazyce C++ není omezeno počtem pinů jako v případě softwaru pro Scratch, jelikož při programování vytváříme přímo vnitřní program Arduina. Je proto nutné dávat pozor na možné syntaktické chyby, které mohou vzniknout. Jedná o prohřešky proti pravidlům jazyka, a jelikož je C++ překládaný jazyk, který přeložení vyžaduje pro svou správnou funkčnost, tak v případě výskytu jakékoliv chyby bychom tohoto cíle nedosáhli. Pro potřeby programování Arduina je k dispozici oficiální software s názvem Arduino IDE. Jedná o vývojové prostředí, které nabídne editor kódu, překladač a například sériový monitor, který slouží ke zjištění jaké výstupy Arduino navrací, či ke kontrole ladících hodnot. Arduino IDE je k dispozici jako open-source software a pro operační systém 36
Windows lze jej získat na oficiálních stránkách projektu, či v rámci obchodu Microsoft Store. K dispozici je jak verze s instalátorem, tak portable verze, kterou stačí pouze rozbalit a lze ji používat. V obou případech je však nutné zkontrolovat, zda jsou nainstalovány ovladače pro připojení Arduina. Windows aplikace a verze s instalátorem je nainstaluje automaticky, u portable verze je nutné je doinstalovat automaticky. Arduino IDE je dostupné také pro operační systémy Linux a MacOS. Arduino IDE pracuje se soubory s příponou.ino a každý projekt je uložený ve své separátní složce, pokud v ní nebude, IDE se o vytvoření postará při otevření souboru. Obrázek 22 Nový program v prostředí Arduino IDE Při používání Arduino IDE je nutné dávat pozor při samotném připojení. V rámci softwaru je totiž nutné nastavit, jakou desku máme k dispozici, jinak s ní IDE nebude moci spolupracovat. Na tuto skutečnost je nutné být obzvláště opatrný u neoriginálních desek, kdy musíme vědět, na jakém originálním druhu je založena. Samotné vybrání desky a připojení však nemusí stačit. Po připojení je totiž nutné zkontrolovat, zda je vybrán správný COM port připojeného zařízení. Číslo portu závisí na USB konektoru, do kterého Arduino zapojíme. Pokud jich bude k dispozici více, znamená to, že jsou k počítači připojena i jiná zařízení. Samotné číslo ověříme například vypojením a zapojením Arduina. 37
Jak již bylo zmíněno, C++ je překládaný programovací jazyk, tudíž každý program je nutné přeložit do strojového kódu procesoru. Arduino IDE překládá ve dvou případech, při nahrání projektu do Arduina a při vyvolání samotného překládání, tzv. kompilace. Nefunguje tedy jako některá IDE, které kontrolují kód v reálném čase. Poté, co je program zkompilován, je možné jej nahrát do Arduina. Při nahrávání programu může dojít k několika problémům. Velkou skupinu tvoří problémy s připojením, které jsme se pokusili odstranit výše zmíněným výběrem desky a portu. Druhý problém je však o něco náročnější. Pokud bude do Arduina nahrán špatně navržený program, který například vykonává příliš zatěžující úkoly v nekonečném cyklu, tak Arduino nemusí sériovou přenosovou komunikaci přijmout. Tato skutečnost se projeví chybovým hlášením, kdy Arduino IDE oznámí skutečnost, že program nelze na desku přenést. Pokud tento problém nastane, je řešení trochu krkolomné. Po připojení Arduina existuje malý časový úsek, kdy vnitřní program neběží, ale Arduino je již schopné přijímat sériovou komunikaci. Pomocí pečlivého načasování tlačítka reset a opakovaného nahrávání programu lze Arduino takto z nekonečné smyčky vysvobodit. Samotné programování Arduina se soustředí právě na již zmíněné metody setup( ) a loop( ), které nastavují Arduino a provádí všechny jeho příklady. Vývojář má k dispozici knihovnu Wiring, která obsahuje nejrůznější metody a proměnné, které pomohou při práci s Arduinem a při tvorbě programů tak nebude nutné znát fungování desky až na základní úroveň. Základy samozřejmě odpovídají syntaxi jazyka C++, tudíž člověk znalý programových struktur se bude orientovat velice rychle. Odpovídají datové typy, základní programové struktury jako cyklus, či podmínka, či matematické i logické operace. Hlavním obohacením jsou právě metody knihovny Wiring, které zajišťuje práci s Arduinem. Wiring obsahuje například příkazy pro nastavení jednotlivých pinů, práci se sériovým připojením, nebo pozdržení práce procesoru. Pro potřeby vyhledání informací je samozřejmě k dispozici rozsáhlá dokumentace přímo na stránkách projektu 19. 19 https://www.arduino.cc/reference/en/ 38
3.3.1.2.1 Sériová komunikace Pro potřeby získání, či zapsání dat z, nebo do Arduina je ve většině případů využita sériová komunikace. Ať se již jedná o komunikaci s počítačem přes USB připojení, s mobilním zařízením přes technologii Bluetooth, či mezi dvěma Arduiny přes bezdrátový sériový modul, tak je nutné využívat metody ze třídy Serial. Mezi metody, které lze v rámci této třídy patří pravděpodobně ta nejdůležitější, a to Serial.begin(int modulacnirychlost). Funkce této metody je nastavení a zahájení samotné sériové komunikace. Metoda je volána v rámci metody setup( ) a musí být zavolána před jakýmkoliv jiným použitím sériové komunikace. Parametrem je celé číslo (integer), které udává modulační rychlost, tedy údaj, který popisuje kolik bitů může být za jednu sekundu při komunikaci přeneseno. Nejpoužívanější a standardní hodnota parametru je 9600, dalšími přípustnými hodnotami je například 300, 600, 2400, nebo až 115200. Pro potřeby základních použití stačí defaultní hodnota. Dalšími často používanými metodami jsou ty pro zápis dat. Metody Serial.print(data) a Serial.println(data) jsou používány tehdy, kdy potřebujeme, aby Arduino zapsalo nějakou hodnotu přes sériovou komunikaci (nesmíme zapomenou, že program vytváříme z pohledu Arduina). Argumentem metodu může být například text (datový typ string), znak (datový typ char), celé číslo (datové typy int, long, atd.), desetinné číslo (datový typ double, nebo float), či jakýkoliv jiný standardní datový typ, který jazyk C++ obsahuje. Rozdíl mezi dvěma zmíněnými metodami je ten, že Serial.println() zapíše na konec výpisu také znak pro nový řádek, zatímco Serial.print() nikoliv. V případě zasílání dat z počítače do Arduina je potřeba znát použití metod Serial.available( ) a Serial.read( ). Odesílaná data se ukládají do vyrovnávací paměti a právě metoda Serial.available( ) zjišťuje, zda je tato vyrovnávací paměť (buffer) zaplněná, či prázdná. Metoda samotná vrací celočíselnou hodnotu (int), která určuje množství dat (počet bytů) uložené v bufferu. Pokud existují data v bufferu, tak následuje samotné čtení, které zajišťuje druhá ze zmíněných metod Serial.read( ). Tato metoda navrací první byte příchozích dat, jedná se tedy o celočíselnou hodnotu. Pokud je buffer prázdný, je navrácena hodnota -1. V kombinaci s cyklem tak můžeme přečíst postupně celou příchozí zprávu. 39
3.3.1.2.2 Digitální vstup a výstup Digitální vstup a výstup je jednou ze základních funkcí, které Arduino nabízí. Funguje na základě vnitřních rezistorů, které jsou podle situace připojeny k napájení, nebo uzemněny. Podle tohoto stavu je poté navrácena, či zapsána binární hodnota 0 (LOW), nebo 1 (HIGH). Pro použití digitálního vstupu a výstupu je samozřejmě nutné mít danou součástku připojenou na digitální pin. Základní metodou pro použití digitálního vstupu či výstupu je pinmode(int cislopinu, int varianta). Tato metoda je použita v rámci úvodního nastavování v metodě setup( ). Pokud chceme použít daný pin v rámci projektu, je nutné mu přiřadit správnou funkci a to se děje právě pomocí metody pinmode. Metoda má dva parametry, první z nich se jménem cislopinu je jak již název napovídá určením toho, který pin budeme nastavovat. Druhý s názvem varianta nabývá hodnoty jedné ze tří konstant, které říkají, jak se bude pin chovat a k čemu bude využíván. Uvedené konstanty se nazývají INPUT, OUTPUT a INPUT_PULLUP. Konstanta INPUT říká, že pin bude využíván pro digitální vstup, OUTPUT pro digitální výstup a INPUT_PULLUP, který nastavuje pin na použití momentového tlačítka. Použití této metody je povinné pro možnost využití daného pinu v projektu. Samotná komunikace probíhá pomocí metod digitalwrite(int cislopinu, int stav) a digitalread(int cislopinu). Metoda digitalwrite slouží k nastavení stavu určitému pinu, který je určen svým číslem v prvním parametru. Jako druhý parametr poslouží stav, který určí, zda bude pin nastaven na zapnuto, či na vypnuto. Stav je celočíselná hodnota a je obsažena ve dvou konstantách HIGH, která napětí pinu nastaví na určitou hodnotu (5V na 5V deskách a 3,3V na 3,3V deskách), a LOW, která pinu nastaví napětí 0V. Metoda digitalread naopak hodnoty z pinů čte. Při čtení opět navrací celočíselnou hodnotu odpovídající konstantám LOW a HIGH. Hodnotu LOW metoda vrátí, pokud je v okamžiku jejího volání napětí pinu pod hodnotu 1,5V u 5V desek, nebo 1V u 3,3V desek. Hodnotu HIGH navrátí, pokud je napětí pinu větší, než 3V u 5V desek, nebo 2V u 3,3V desek. 3.3.1.2.3 Analogový vstup a výstup Práce s analogovým vstupem, nebo výstupem je odlišná od digitálního. V případě vstupu, tedy situace, kdy Arduino čte analogové hodnoty je potřeba mít zdroj dat připojen na 40
analogových pinech A0 až A5 a použít metodu analogread(int cislopinu). Vstupní parametr určuje číslo pinu, ze kterého bude provedeno čtení. Můžeme uvést pouze číslo, nebo číslo v kombinaci s písmenem A. Návratová hodnota je opět celočíselná a nabývá rozsahu 0 1023. Zápis analogové hodnoty je v případě Arduina o něco složitější. Cíl pro zapsání analogové hodnoty musí být připojen k pinu, který je schopen přijmout PWM signál, tedy ten označený vlnovkou ( ). Na Arduinu UNO se jedná o piny s čísly 3, 5, 6, 9, 10 a 11. Další podmínkou je použití metody analogwrite(int cislopinu, int hodnota). Prvním parametrem je samozřejmě číslo pinu, na který budeme zapisovat. Druhým je hodnota, kterou budeme zapisovat. Analogový zápis funguje na principu rychlého střídání hodnot 0 a 5V. Což má za následek změnu účinnosti a požadovanou změnu. Parametr může nabývat hodnotu 0 255 a určuje poměr času při střídání hodnot, kdy 255 představuje 100% a například 127 50%. 3.3.1.2.4 Práce s časem Jelikož samotná práce Arduina je prováděna nekonečným cyklem, je nutné v některých fázích programu pracovat s časem. To lze provést několika způsoby.pokud Arduino vykonává nějakou činnost až příliš rychle, musíme jej na malý okamžik pozdržet, například abychom načetli hodnotu, nebo aby program počkal na otočení motoru, apod. Pro tento účel slouží například metoda delay(int milisekundy), které pozastaví vyhodnocování programu na dobu určenou v parametru. Je nutné podotknout, že tento způsob pozastaví program plně a Arduino tak nebude po uvedenou dobu nic jiného vykonávat. Pokud tak bude nutné v programu například kontrolovat nějakou hodnotu pro provedení činnosti, či zastavit chod motoru, nebude to z důvodu čekání možné. Použití funkce delay tak může mít v pokročilejších projektech nežádoucí účinky. Pro lepší časové řízení programu je vhodné použít funkci millis(). Její návratová hodnota (datový typ long celé číslo) znázorňuje dobu od zapnutí napájení Arduina v milisekundách. Metoda tedy umožňuje kontrolovat časové úseky například v podmínkách a požadované příkazy tak přesně načasovat například každých 10 sekund. Výhodou tohoto způsobu je nezablokování chodu programu a Arduino tak bude fungovat i 41
mezi časovými úseky. Malou nepříjemností je ale fakt, že počítadlo funkce millis je resetováno každých přibližně 50 dní. Tato skutečnost může způsobit problém u dlouhodobých programů, které například sbírají data o počasí, apod. Pro kratší programy však žádný problém nepředstavuje. Pokud by v obou případech byly milisekundy příliš velké časové úseky, jsou k dispozici ještě metody delaymicroseconds(int mikrosekundy), která funguje shodně s metodou delay, jen pracuje s jinými jednotkami a micros( ), která obdobně jako millis navrací dobu od zapnutí napájení, tentokrát však v mikrosekundách. Počítadlo metody micros( ) je resetováno přibližně každých 70 minut. V závislosti na použité desce je rozlišení mikrosekund nastaveno na 4 (16 MHz desky), nebo 8 (8 MHz desky). Arduino má velké množství možných metod, ale pokud studenti zvládnou tyto zmíněné, tak si u projektů z velké míry vystačí, aniž by museli vyhledávat v dokumentaci a mohou se tak soustředit na řešení problémů. Samozřejmě je nutné počítat se základy z programování a programovacího jazyka C++. 3.4 C# aplikace Poslední způsob, jak vytvářet aplikace s použitím Arduina je odlišný od předchozích. Do této doby byl při programování vytvořen většinou vnitřní program. Při tomto způsobu programování jde spíše o vytvoření ovládacího programu. Nejpokročilejší uživatelé mohou pro Arduino v rámci vyšších programovacích jazyků, zde zmíněn C#, vytvořit aplikace, které budou Arduino na dálku ovládat přes sériové připojení, či dokáží z něj získávat data a zpracovávat v počítači. Můžeme je tak ukládat do databáze, exportovat do souborů, či zobrazovat v pokročileji navrženém uživatelském rozhraní. Obrázek 23 Příklad formulářové C# aplikace pro práci s Arduinem 42
Tento způsob programování je tedy částečně podobný programování na základě jazyka Scratch, ale pokročilejší, jelikož programujeme nejen obslužnou aplikaci, ale také vnitřní program. Využíváme tak vše, co se studenti měli během práce s Arduinem dozvědět a tak by tento způsob programování měl být zařazen až na závěr. Při výběru jazyka pro tento způsob je nutné předem zjistit, zda jeho příkazy umožňují zpracovávat sériovou komunikaci. Pokud se však studenti dostanou až na tuto úroveň, dokáží svým projektům dodat kvalitní uživatelské rozhraní, či další pokročilé funkce a zjistí tak, že programy využívající Arduino nemusí být pouze skryty uvnitř mikropočítače. 43
4 Použití ve výuce V následující kapitole budou shrnuty jednoduché úlohy pro počáteční využití Arduina na střední škole. V první části se zaměří na prostředí S4A a tedy úlohy pro začátečníky a poté na pokročilé a úlohy v jazyce C++. 4.1 Sada úloh v prostředí S4A Vytvořené úlohy se zaměřují na využití Arduina pro práci s RGB LED diodami. Pro sestavení obvodu je potřeba vždy jedna RGB dioda, Arduino a propojovací kabely. Výhodou je také nepájivé pole, které usnadňuje zapojení. Obvody jsou navrženy jednoduše tak, aby nečinily studentům problémy při zapojení a ti se tak mohli soustředit na programování. Ke tvorbě úloh by měli být studenti seznámeni s principy jazyka Scratch, na který navazují. Úlohy by měly sloužit vyučovací metodě hození do vody po vysvětlení základních pojmů vyučujícím. Ten vysvětlí pouze zapojení obvodu. Program studenti tvoří do postavy Arduino. Kód potřebný pro chod programu je skryt a studenti tak programují pouze ten kód, který je má zajímat, a nejsou rozptýleni okolními příkazy. Všechny úlohy na bázi práce s RGB diodami využívají stejného obvodu. Při zapojení by si studenti měli dát větší pozor, kam který vývod RGB diody zapojují tak, aby se později orientovali, který pin spouští jakou barvu. Nejvhodnější by bylo použít barevné vodiče odpovídající barvě připojené na daný pin. 44
4.1.1 Úloha 1 Obrázek 24 Počáteční stav první úlohy 4.1.1.1 Zadání Zapoj Arduino, RGB LED diodu a tlačítko dle pokynů vyučujícího. Po zapojení je tvým úkolem naprogramovat postavu Arduino tak, aby po stisknutí tlačítka počítala dobu, po kterou bylo tlačítko drženo a po jeho uvolnění rozsvítila diodu na stejnou dobu. Počítání programu do předpřipraveného cyklu a část rozsvícení naprogramuj po obdržení zprávy Sviť. 4.1.1.2 Počáteční stav úlohy Obrázek 25 Předpřipravené bloky pro úlohu 1 45
4.1.1.3 Navrhované řešení úlohy Obrázek 26 Ukázkové řešení úlohy 1 4.1.1.4 Cíle úlohy Cílem první úlohy je aplikace cyklů, podmínek a proměnných na Arduino. Studenti by tyto pojmy měli již znát z hodin programování a zde by měli vidět jejich praktické využití na fyzických součástkách. Studenti se také naučí zapojit jednoduchý obvod tak, aby získali manuální zručnost potřebnou v oboru. 4.1.2 Úloha 2 Obrázek 27 Počáteční stav úlohy 2 46
4.1.2.1 Zadání Využij zapojení obvodu z předchozího příkladu. Nový program bude využívat seznamu sekvence k uložení sekvence barev červené, modré, nebo zelené. Po stisku kláves R, G, nebo B se příslušné písmeno přidá do seznamu. Po stisknutí mezerníku RGB dioda zopakuje tuto sekvenci. 4.1.2.2 Počáteční stav úlohy Obrázek 28 Předpřipravené bloky pro úlohu 2 47
4.1.2.3 Navrhované řešení úlohy 4.1.2.4 Úloha v provozu Obrázek 29 Ukázka řešení úlohy 2 Obrázek 30 Úloha 2 po zadání sekvence 48
4.1.2.5 Cíle úlohy Druhá úloha dále rozšíří použití podmínek a cyklů o seznamy. Studenti musí pochopit, jak se seznamem pracuje, jak do něj přidávat hodnoty a jak jej procházet. Studenti si také zopakují princip RGB barevného modelu pro případné porozumění míchání barev. 4.1.3 Úloha 3 Obrázek 31 Počáteční stav úlohy 3 4.1.3.1 Zadání K tvorbě poslední úlohy opět využij obvodu z té předchozí. Tentokrát zkombinuješ úlohy jedna a dva do jedné. Tvým úkolem je vytvořit program, který dokáže uchovávat sekvenci barev, ale také dobu jejich svitu. Uživatel stiskne klávesu příslušné barvy a oproti druhé úloze se ho program navíc zeptá na dobu, po kterou má daná barva svítit. Pro potřeby programu využij seznamy sekvence a casy. Získání času od uživatele naprogramuj po obdržení zprávy Načti čas, sekvence se spustí po stisknutí mezerníku. 49
4.1.3.2 Počáteční stav úlohy 4.1.3.3 Navrhované řešení úlohy Obrázek 32 Předpřipravené bloky úlohy 3 Obrázek 33Ukázkové řešení úlohy 3 50
4.1.3.4 Úloha v provozu Obrázek 34 Úloha 3 při zadávání sekvence 4.1.3.5 Cíle úlohy Závěrečná úloha opakuje prvky z předchozích dvou úloh. Studenti v ní však nově zakomponují práci se dvěma seznamy, z nich musí pochopit princip ukládání dvou sekvencí tak, aby program dělal to, co je zadáno. Studenti také program obohatí o uživatelský vstup. 4.2 Úlohy pro Arduino IDE a jazyk C++ Následující úlohy jsou navrženy již pro pokročilejší fáze výuky s Arduinem a kladou si za cíl seznámit studenty, kteří prošli základní výukou některého z vyšších programovacích jazyků, s programováním Arduina. Jedná se tak o jednodušší úlohy, jejichž zpracování však studenti získají základ pro složitější projekty. Tyto úlohy využívají základní elektronické součástky a také několik senzorů a ovládacích prvků ze sady 37 senzorů zmíněné dříve. Studenti budou potřebovat vždy jedno Arduino, nepájivé pole a vodiče. 4.2.1 RGB dioda Podobně jako v případě úloh v prostředí S4A, tak i v jazyce C++ bude jedna z úloh pracovat s RGB diodou. Studenti tak dostanou možnost porovnat práci s touto součástkou 51
v začátečnickém prostředí s programováním v jazyce C#. Úloha je rozdělena do několika fází, které postupně zvyšují obtížnost. 4.2.1.1 První část 4.2.1.1.1 Zadání Dle instrukcí vyučujícího zapojte obvod obsahující RGB diodu a Arduino. Po zapojení vytvořte pro Arduino program, který bude v rozmezí 2 sekund nastavovat postupně všechny základní barvy RGB modelu. 4.2.1.1.2 Popis a cíl úlohy První část je základním představením práce s diodou a její RGB variantou. První z cílů je čistě mechanický, kdy úloha dovede žáky k úspěšnému zapojení obvodu a jeho připojení k Arduinu. Studenti získají návyky k zapojení diody tak, aby vodiče značili, například barvou, jakou část RGB diody znázorňují, dále zvládli organizaci vodičů, apod. Z programového hlediska by měli být studenti vedeni k pojmenování jednotlivých pinů pomocí proměnných tak, aby si uvědomili, že je vhodnější orientovat se v názvech, nežli v číslech. Jedná se také o vhodnou chvíli k použití funkce millis( ) k ovládání načasování. Druhý dílčí cíl se týká ovládání LED diody. Studenti by si měli uvědomit, že RGB dioda se nechová jako jedna, ale jako tři, pro každou barvu jedna. Proto je pro další části práce s RGB diodou nutné, aby se studentu naučili pracovat se všemi jejími vývody. Obrázek 35 Jedno z možných zapojení obvodu 52
4.2.1.1.3 Možné žákovské řešení Řešení programu, které využívá funkci millis( ) a strukturu switch z jazyka C++ sloužící ke zjednodušení podmínek. int ubehlo; int praveje; int rozdil; byte barva = 1; bool sviti = false; byte cervena = 4; byte zelena = 5; byte modra = 6; short cas = 2000; void setup() pinmode(cervena, OUTPUT); pinmode(zelena, OUTPUT); pinmode(modra, OUTPUT); void loop() praveje = millis(); rozdil = praveje - ubehlo; if (rozdil > cas) switch (barva) case 1: if (sviti) digitalwrite(cervena, LOW); sviti = false; barva = 2; else digitalwrite(cervena, HIGH); sviti = true; break; case 2: if (sviti) digitalwrite(zelena, LOW); sviti = false; barva = 3; else digitalwrite(zelena, HIGH); sviti = true; break; 53
case 3: if (sviti) digitalwrite(modra, LOW); sviti = false; barva = 1; else digitalwrite(modra, HIGH); sviti = true; break; ubehlo = praveje; 4.2.1.2 Druhá část 4.2.1.2.1 Zadání Využijte stejný obvod, jako při předchozím úkolu. Jak jistě víte, barevný model RGB slouží ke znázornění velkého množství barev a ne jen tří základních. Zjistěte tak, jak docílit rozsvícení dalších barev a do předchozího programu přidejte následující odstíny červená, zelená, modrá, žlutá, fialová, azurová, bílá a černá. 4.2.1.2.2 Popis a cíl úlohy Druhá část je řešena metodou hození do vody. Studenti po zjištění, jak rozsvítit diodu a střídat tři základní barvy modelu RGB, dostanou za úkol přijít na to, jak funguje model RGB, a měli by se dopátrat zjištění, že aby byla dioda schopná zobrazit i jiné barvy, je nutné zapínat jednotlivé piny najednou. Následně musí studenti přijít na to, z jakých složek se jednotlivé barvy skládají a pak je přidat do programu. Zde záleží na tom, zda chce vyučující nechat studenty si vzpomenout na RGB model, či jim povolí informace vyhledat. Zajímavou možností je využití grafického editoru, jakým je například Malování, či GIMP, aby studenti vypátrali informace o barevných složkách jednotlivých odstínů v tomto programu, a zjištěné informace aplikovali na Arduinu. Na nástroji výběru barev si navíc plně zopakují princip RGB modelu pro případné další použití. Problémovou částí může být znázornění barev bílá a černá. Pokud však studenti pochopí RGB model, zjistí, že pro bílou barvu je potřeba maximální hodnoty všech složek a pro černou naopak nulovou. Pro bílou tak musí zapnout všechny piny RGB diody, zatímco černá barva reprezentuje vypnutou 54
diodu. Pokud tento úkol studenti zvládnou a pochopí, mohou pokračovat k další části, která je již více zaměřená na programovací struktury. 4.2.1.2.3 Možné žákovské řešení Za předpokladu, že studenti předchozí část naprogramovali kvalitně, neměla by samotná úprava programu pro druhou část být obtížná. Pokud přijdou na řešení se zapínáním jednotlivých kanálů RGB diody, pak se z programového hlediska jedná o pouhé přidání dalších větví pro jednotlivé barvy. int ubehlo; int praveje; int rozdil; byte barva = 1; bool sviti = false; byte cervena = 4; byte zelena = 5; byte modra = 6; short cas = 2000; void setup() pinmode(cervena, OUTPUT); pinmode(zelena, OUTPUT); pinmode(modra, OUTPUT); void loop() praveje = millis(); rozdil = praveje - ubehlo; if (rozdil > cas) switch (barva) case 1: if (sviti) digitalwrite(cervena, LOW); sviti = false; barva = 2; else digitalwrite(cervena, HIGH); sviti = true; break; 55
case 2: if (sviti) digitalwrite(zelena, LOW); sviti = false; barva = 3; else digitalwrite(zelena, HIGH); sviti = true; break; case 3: if (sviti) digitalwrite(modra, LOW); sviti = false; barva = 4; else digitalwrite(modra, HIGH); sviti = true; break; case 4: if (sviti) digitalwrite(cervena, LOW); digitalwrite(zelena, LOW); sviti = false; barva = 5; else digitalwrite(cervena, HIGH); digitalwrite(zelena, HIGH); sviti = true; break; case 5: if (sviti) digitalwrite(cervena, LOW); digitalwrite(modra, LOW); sviti = false; barva = 6; else digitalwrite(cervena, HIGH); digitalwrite(modra, HIGH); sviti = true; break; 56
case 6: if (sviti) digitalwrite(zelena, LOW); digitalwrite(modra, LOW); sviti = false; barva = 7; else digitalwrite(zelena, HIGH); digitalwrite(modra, HIGH); sviti = true; break; case 7: if (sviti) digitalwrite(cervena, LOW); digitalwrite(zelena, LOW); digitalwrite(modra, LOW); sviti = false; barva = 1; else digitalwrite(cervena, HIGH); digitalwrite(zelena, HIGH); digitalwrite(modra, HIGH); sviti = true; break; ubehlo = praveje; 4.2.1.3 Třetí část 4.2.1.3.1 Zadání Předchozí program Vám již jistě funguje. Nyní je však nutné dát mu jakousi programátorskou kulturu. Zkuste vytvořit způsob uložení jednotlivých barev pomocí programových struktur, které jazyk C++ nabízí. Poté vytvořte metodu, která bude sloužit k nastavení jedné z těchto barev na základě jejího názvu. 4.2.1.3.2 Popis a cíl úlohy V této části se již musí studenti zamyslet nad použitím vhodné struktury k uchování informací o zapnutí jednotlivých pinů. Dá se totiž předpokládat, že v minulých částech úlohy studenti postupovali nejjednodušší cestou a použili opakované příkazy digitalwrite na jednotlivé piny. Tento postup vedl k násobnému použití příkazů, což není 57
v programování správný přístup. Proto je cílem této části připomenout studentům existenci datových struktur, jako například pole, či seznam, které mohou tyto násobné hodnoty uchovat, tak, aby zvládli odstranit z programu násobné příkazy. Výsledkem by měla být struktura, která bude mít možnost uchovat tři hodnoty (HIGH, nebo LOW) a jedna tato trojice tak bude reprezentovat jednu barvu. Pří druhé části úkolu, vymyslet metodu pro nastavení určité barvy, studenti dále ukáží, jak dobře ovládají programování a zda zvládnou tvořivě přemýšlet. Způsob práce metody je na studentech, případně vedení vyučujícího. Jedním ze způsobů, jak úlohu vyřešit je druhé, alternativní pole s názvy barev, jehož indexy odpovídají barvám v poli, kde jsou uloženy jednotlivé trojice. Program poté bude pomocí cyklu procházet jednotlivá pole a nastavovat hodnoty dle barev.studenti tak uvidí použití těchto struktur v praxi a uvidí také program, který je z hlediska pravidel programování lépe napsaný. 4.2.1.4 Další možnosti rozšíření S RGB diodou lze samozřejmě vykonávat více úloh, záleží na představivosti a možnostech daného vyučujícího. Po zvládnutí této základní úlohy může vyučující přistoupit například k zapojení tlačítek do projektu. Momentová tlačítka přidají k RGB diodě uživatelský vstup a studenti tak mohou například naprogramovat rozsvícení jednotlivých barev na základě stisku tlačítka. Dalším alternativním pokračováním úlohy je přechod do analogového způsobu programování, kdy studenti mohou pomocí příslušných metod znázornit například přechody mezi jednotlivými barvami. Samozřejmě je také možné přidat do projektu další diody, či ovládací prvky. Alternativou je také vytvoření stejných úloh, jako v případě prostředí S4A, aby studenti měli dokonalé porovnání stejných úloh v jiném prostředí. RGB dioda je tak i pro potřeby jazyka C++ zajímavou součástkou a rozhodně by neměla chybět v nějakém projektu. 4.2.2 Joystick Další úloha pracuje opět s diodami, tentokrát však postačí jednobarevné, a hlavně s joystickem, který je součástí sady 37 senzorů. Pro potřeby úlohy je nutné k Arduinu připojit 5 diod (případně zdrojů světla ve stejném počtu), joystick a propojovací kabely. 58
4.2.2.1 Zadání Dle instrukcí vyučujícího připojte k Arduinu joystick a 5 diod. Až budete mít zapojeno, bude Vaším úkolem zjistit, jak joystick pracuje a poté zajistit, aby se v každé jeho krajní poloze rozsvítila jedna z diod. Pátá z diod se rozsvítí po stisknutí joysticku. 4.2.2.2 Popis úlohy Úloha využívá metodu hození do vody, kdy studenti nemají o součástce žádné informace. Musí tak přijít na způsob, jak joystick funguje, což znamená zjistit, že joystick vrací svou výchylku, která je na něm aktuálně nastavena, jako číselnou hodnotu. Po tomto zjištění musí studenti přijít na skutečnost, že se jedná o analogová data a musí tak použít metodu analogread. Pro hlavní úkol je poté nutné pomocí sériového monitoru analyzovat jak vypadají hodnoty, které joystick vrací a jakou hodnotu mají v krajních polohách. Studenti dojdou ke zjištění, že hodnoty, které jednotlivé osy nabývají, se nachází v rozsahu 0 1024, přičemž středová pozice je přímo v polovině a nikoliv v nule. Poslední překážkou může být stisknutí joysticku, ale jakmile studenti zjistí, že se jedná o obyčejné digitální tlačítko, tak je již naprogramování úlohy otázkou chvíle. Obrázek 36 Možné zapojení obvodu (pro potřeby přehlednosti byl z joysticku odstraněn ovládací prvek) 59
4.2.2.3 Cíle úlohy Cílem úlohy je ukázat studentům práci s analogovými hodnotami. Studenti si tak vyzkouší kombinaci několika součástek a přístupů k datům, jelikož joystick kombinuje jak digitální, tak analogové hodnoty. Jedná se také o první o něco složitější obvod, který otestuje, zda studenti dokáží zorganizovat si práci na zapojení natolik, aby se v rámci projektu mohli orientovat. Druhým cíl úlohy je ukázat studentům, že v rámci práce se součástkami nebudou vždy mít plné informace o součástce a budou muset vlastními silami získat informace o tom, jak součástka funguje a jak s ní mohou pracovat. 4.2.2.4 Ukázka žákovského řešení Jedno z možných řešení úlohy, které využívá porovnávání hodnot pomocí podmínek. Dalšími možnou strukturou, kterou lze použít je například již zmíněný switch. Při práci s joystickem je nutné dát pozor na citlivost daného kusu. Zvláště při použití levných součástek (například z čínských obchodů) je nutné, aby žáci skutečně ověřili, zda jsou hodnoty navrácené joystickem skutečně v rozsahu 0 1024. U kus využívaného v rámci práce byl posun přibližně 95, takže bylo nutné počítat se změněnou hodnotou. V rámci žákovského řešení byl tento nedostatek vyřešen odečtením čísla 95 od získané hodnoty. byte X = A1; byte Y = A2; byte stisk = 3; byte leds = 4; byte ledv = 5; byte ledj = 6; byte ledz = 7; byte ledstisk = 8; short hodnotax; short hodnotay; int stisknuto = 0; void setup() pinmode(a0, INPUT); pinmode(a1, INPUT); pinmode(stisk, INPUT); pinmode(leds, OUTPUT); pinmode(ledv, OUTPUT); pinmode(ledj, OUTPUT); pinmode(ledz, OUTPUT); pinmode(ledstisk, OUTPUT); 60
void loop() hodnotax = analogread(a0) - 95; hodnotay = analogread(a1) - 95; stisknuto = digitalread(stisk); Serial.println(hodnotaX); Serial.println(hodnotaY); Serial.println(stisknuto); if (hodnotax <= 0) digitalwrite(ledz, HIGH); else digitalwrite(ledz, LOW); if (hodnotax >= 1000) digitalwrite(ledv, HIGH); else digitalwrite(ledv, LOW); if (hodnotay <= 0) digitalwrite(leds, HIGH); else digitalwrite(leds, LOW); if (hodnotay >= 1000) digitalwrite(ledj, HIGH); else digitalwrite(ledj, LOW); if (stisknuto == 1) digitalwrite(ledstisk, HIGH); else digitalwrite(ledstisk, LOW); 4.2.2.5 Další možnosti rozšíření Alternativní variantu úlohy s joystickem lze vytvořit pomocí použití analogového výstupu pro diodu. Lze tak vytvořit program, který bude využívat metody analogwrite a bude 61
postupně zesilovat svit diod dle aktuální pozice joysticku. Tato úloha obsahuje velice zajímavý úkol, jelikož jak již bylo řečeno, joystick vrací hodnoty v rozsahu 0 1024, ale dioda přijímá pouze rozsah 0 255. Takže úkolem žáků je najít efektivní způsob, jak převést rozsah joysticku na rozsah diody. Úlohu lze samozřejmě rozšířit o zapojení serv, či dalších pohyblivých součástem, které budou studenti joystickem ovládat. Samotný pohyb jistě zvýší atraktivitu úlohy, avšak je nutné počítat se zvýšenou obtížností. 4.2.3 Počítadlo Poslední z představovaných úloh je ta s názvem počítadlo. Jedná se úlohu, která využívá sedmisegmentový display tlačítko a diodu. Jedná se tak opět o jednoduchý obvod, jehož sestavení by nemělo zabrat mnoho času. Podobně jako úloha s LED diodou, tak i tato je rozdělena na několik podčástí. 4.2.3.1 První část 4.2.3.1.1 Zadání Před sebou byste měli mít sedmisegmentový display, diodu a tlačítko. Se všemi součástkami budete v rámci programu pracovat. Zapojte je tam, aby byly v programu snadno použitelné a obvod nebyl příliš zmatečný. Až jej budete mít hotový, vytvořte program, který bude na displayi zobrazovat čísla od 0 do 9 a zpět. Pro potřeby programu nevyužívejte opakující se metody digitalwrite. 4.2.3.1.2 Popis a cíle úlohy V rámci této části jsou studenti postaveni před novou výzvu. Tentokrát jim nebude sděleno, jak mají obvod zapojit, vyučující jim pouze sdělí skutečnost, že sedmisegmentový display se chová jako několik diod najednou, zbytek dostanou za úkol vyhledat. Hlavním problémem v této úloze bude pravděpodobně zákaz využívání nadměrného počtu metody digitalwrite. Studenty by toto omezení mělo dovést k zamyšlení nad tím, jak budou jednotlivé znaky uchovávat. Po zkušenostech s předchozí úlohou s RGB barvami, by je již mělo napadnout pole, které mohou sestavit několika způsoby. Jedním z nich je znázornění sedmisegmentového displaye do pole. Další z nich je vytvoření sekvence, která bude v poli 62
reprezentovat jednotlivé segmenty tak, aby každý znak byl znázorněn jedním polem. Poté již jen zbývá vhodně uložit jednotlivé znaky (pole) za sebe. Studenti se tak nepřímo dostanou k použití vícerozměrného pole (tzv. pole polí). Pokud se jim toto podaří, je již zapínání a vypínání znaků otázkou procházení pole cyklem. Cílem úlohy je předložit před studenty situaci, kdy musí vymyslet zapojení sami a otestuje tak jejich dovednosti získané na minulých úlohách. V případě nesnází je vede k samostatnosti při získávání informací ohledně zapojení a nutnosti ověření zdrojů, aby si byli jistí, že vyhledaná informace je správná a nebude mít za následek zničení obvodu. Z programového hlediska je cílem úlohy prohloubit znalosti použití polí v programech o existenci vícerozměrných polí. Studenti předvedou, jak jsou schopni zakódovat data reprezentovaná sedmisegmentovým displayem do pole a poté je i zpětně dekódovat pro zobrazení na displayi. Obrázek 37 Jedno z možných zapojení obvodu 4.2.3.2 Ukázka žákovského řešení Řešení první části zahrnuje dva po sobě jdoucí vnořené cykly, které prochází vícerozměrné pole hodnot reprezentujících jednotlivá písmena. Program dále využívá pole pinů, které odpovídají jednotlivým segmentům. Ve výsledku vnořené cykly získávají hodnoty z obou polí a následně je nastavují pomocí metody digitalwrite( ). 63
byte piny[] = 2, 3, 4, 5, 6, 7, 8 ; const int radky = 10; const int sloupce = 7; int cisla[radky][sloupce] = LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH, LOW, HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH, LOW, HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH ; void setup() pinmode(piny[0], OUTPUT); pinmode(piny[1], OUTPUT); pinmode(piny[2], OUTPUT); pinmode(piny[3], OUTPUT); pinmode(piny[4], OUTPUT); pinmode(piny[5], OUTPUT); pinmode(piny[6], OUTPUT); void loop() for (int i = 0; i < radky; i++) for (int j = 0; j < sloupce; j++) digitalwrite(piny[j], cisla[i][j]); delay(500); delay(500); for (int i = radky - 1; i >= 0; i--) for (int j = sloupce - 1; j >= 0; j--) digitalwrite(piny[j], cisla[i][j]); delay(500); 4.2.3.3 Druhá část 4.2.3.3.1 Zadání Použijte obvod z předchozí úlohy a připojte do něj tlačítko a LED diodu. Vytvořte program, který při dosažení hodnot nula a devět rozsvítí diodu, při ostatních hodnotách bude zhasnuta. Dále do programu přidejte ovládání odpočtu tlačítkem. Při stisknutí tlačítka se odpočet zastaví, při opětovném stisknutí se opět rozběhne. 64
4.2.3.3.2 Popis a cíle úlohy Tato část obohacuje předchozí o uživatelský vstup. Studenti ukáží, že jsou schopni zakomponovat do programu využití podmínek a zkombinovat je s vlastnostmi momentového tlačítka. Předvedou tak schopnost vytvoření kontrolní proměnné, která bude zastavovat a spouštět samotný odpočet. Použití diody naopak reprezentuje schopnost programu spustit činnost při dokončení odpočtu. Studenti tak ukáží, že jsou schopni identifikovat obě dvě důležité části, které v programu nastanou a to uživatelský vstup reprezentovaný tlačítkem, a také jeho výstup reprezentovaný diodou. Obrázek 38 Upravený obvod z první části 4.2.3.4 Třetí část 4.2.3.4.1 Zadání Opět použijte obvod z předchozích úloh, ponechte v něm i tlačítko a diodu. Tentokrát pro tento obvod vytvořte program, který využije tlačítko k zadání hodnoty od 1 do 9 a poté při dlouhém stisku tlačítka spustí odpočet od nastavené hodnoty do nuly. Na konci odpočtu rozsviťte diodu. 65