Základy programování pro Arduino

Vývojové prostředí Arduino IDE
Vývojové prostředí Arduino IDE

Pro vytvoření programu (v terminologii Arduino anglicky sketch, česky projektu), který bude mikrokontrolér vykonávat, a pro jeho nahrání do paměti mikrokontroléru lze použít tzv. vývojového prostředí, které nainstalujete a spustíte na Vašem domácím počítači. Vývojových prostředí a překladačů existuje několik, většina jich je zdarma nebo za dobrovolný příspěvek, Nejrozšířenějším prostředím je Arduino Software (IDE) pro OS Windows, Mac OS X nebo Linux, v lednu 2016 ve verzi 1.6.7. Stáhnout si jej můžete na stránkách Arduina www.arduino.cc/en/Main/Software (u Linuxu bývá někdy potřeba doinstalovat chybějící drivery nebo Java runtime, ale to si už na netu najdete). Vývojové prostředí Arduino IDE je napsáno v programovacím jazyku Java, a proto vypadá na všech platformách (Windows/Mac/Linux) prakticky stejně.

Po instalaci vývojového prostředí na Váš osobní počítač ještě zbývá v nastavení programu vybrat aktuálně použitou vývojovou desku a vybrat port, ke kterému je deska připojena. Ve vývojovém prostředí pak program pro Arduino napíšete, přeložíte do kódu pro daný mikrokontrolér, po USB kabelu do mikrokontroléru nahrajete a spustíte. Pokud USB kabel necháte stále zapojený, můžete v dalším okně, v tzv. sériovém monitoru, běh programu sledovat.

Program přitom nemusíte psát zcela sami – na začátku pravděpodobně zvolíte spíše úpravu ukázkových komentovaných příkladů, kterých je přímo ve vývojovém prostředí hned po instalaci k dispozici několik desítek, další tisíce naleznete opět na internetu.

Programovací jazyk pro mikrokontroléry Arduino je odvozen z programovacího jazyka Wiring, a je založen na klasickém programovacím jazyku C++, jehož základy položil Bjarne Stroustrup v roce 1983. Jedná se o relativně jednoduchý jazyk, jehož funkce i operátory (např. typu +, -, *, /) jsou intuitivní a snadno pochopitelné. Pro navrhování aplikací pro Arduino byl jazyk navíc dále zjednodušen vynecháním relativně komplikované syntaxe objektového programování, která začínajícím programátorům občas zamotá hlavu. Na rozdíl od programování pro Windows či pro jiné aplikace navíc nejsou pro úspěšné sestavení programu potřeba ani obsáhlé deklarace datových typů a tříd, inicializace objektů a struktur či definice grafického prostředí aplikace.

Součástí prostředí IDE je jak obsáhlá nápověda, tak referenční příručka s definicemi jednotlivých prvků jazyka (sice jen v angličtině, ale na webu www.hobbyrobot.cz najdete v pdf formátu velmi slušně zpracovanou referenční Příručku programátora v češtině – Arduino Příručka Programátora ). Při programování se vám hodí i tzv Cheat Sheet neboli tahák se zjednodušenou syntaxí jazyka – naleznete jej například zde, bohužel opět pouze anglicky.

Konkrétní popis všech možností programovacího jazyka pro Arduino je námět na několik samostatných článků, pro základní představu ale nejprve popíši základní části programu a poté na konec článku uvedu alespoň příklad nejjednodušího programu pro blikání LED diody ve vteřinovém intervalu. Pro úplnost ještě dodám, že vysvětlení většiny dále uvedených termínů (proměnné, konstanty, funkce, knihovny atd. naleznete v dalším, detailnějším článku, zaměřeném právě na základy programování aplikací pro Arduino).

Každý program pro Arduino (v teminologii Arduina tedy anglicky sketch, česky projekt) se skládá z několika málo základních částí:

  • deklarace tzv. globálních proměnných, definice konstant a načtení externích knihoven,
  • definice funkce setup(),
  • definice funkce loop(), a případně nakonec i
  • definice zbývajících funkcí programu.

Deklarace globálních proměnných, definice konstant, načtení externích knihoven.

Proměnné jsou v principu chlívky, šuplíčky či poznámkové papírky, sloužící k zapamatování hodnot, čísel a informací, se kterými program pracuje. Proměnné mohou být buď lokální nebo globální. Lokální proměnné jsou vytvořeny (deklarovány) pouze na krátkou dobu a použity v krátké, ohraničené části programu, v takzvané funkci (setkáte se i s termínem podprogram či procedura). V jiné části programu mimo tuto funkci již takovou proměnnou nevidíte a tedy ji nemůžete ani číst (zjišťovat její hodnotu), ani měnit. Výhodou lokálních proměnných je, že po skončení funkce, ve které byly deklarovány, se uvolní část paměti, kterou zabíraly, a to může být velmi užitečné. Globální proměnné jsou naopak vytvořeny (deklarovány) v úvodní části programu, ještě před tím, než program začně skutečně pracovat, a poté jsou viditelné v kterékoli části programu, a to i uvnitř všech funkcí, které takový program obsahuje.

Konstanty jsou číselné hodnoty, kterým byl přiřazen vhodný název (například hodnotu 3,14159 si pojmenujeme jako Pi). Na rozdíl od proměnných nezabírají místo v paměti (jejich hodnota je použita pouze během sestavování programu před jeho nahráním do vývojové desky). Užitečné jsou v případě, kdy jednu hodnotu v programu používáme několikrát, například číslo vstupního nebo výstupního pinu. Při změně čísla pinu (třeba při změně zapojení obvodu) pak stačí změnit hodnotu konstanty a nemusíte tak hledat a měnit tuto hodnotu opakovaně na různých místech programu.

Konečně knihovny jsou samostatné programy, které zabezpečují další funkce programu např. pro ovládání přídavných modulů, displejů, sběrnic, řízení konkrétních obvodů a podobně. Pokud na začátku programu takovou knihovnu uvedeme, můžeme začít používat všechny funkce, které jsou v knihovně definovány. Příkladem může být například knihovna LiquidCrystal pro ovládání alfanumerického LCD displeje – ta k programovacímu jazyku „přidá“ další jednoduché příkazy, kterými můžeme například na LCD displeji zobrazit nějaký text.

Definice funkce setup()

Funkce void setup() je vykonána vždy pouze jednou po spuštění programu (tedy po nahrání programu z počítače do mikrokontroléru, po stlačení resetovacího tlačítka nebo po zapnutí napájení desky). Funkce setup() musí být v programu vždy přítomna, přinejmenším jako prázdná funkce, která nemusí ani žádné další příkazy obsahovat; pokud by však v programu chyběla, ohlásí vývojové prostředí chybu v programu. Ve funkci setup() mohou být proměnným přiřazeny jejich počáteční hodnoty, nadefinovány vlastnosti vstupních a výstupních pinů, inicializovány knihovny, které bude program využívat, přiřazeny obslužné funkce přerušení a pod. Jakmile je funkce setup() dokončena, přejde mikrokontrolér k vykonávání funkce loop().

Definice funkce loop()

Funkce void loop() je vlastním výkonným jádrem programu, které zabezpečuje to, co má program dělat. Funkce loop() je vykonávána stále dokola – jakmile tedy program dojde na její konec, začne opět od začátku.

Definice dalších funkcí programu

Po definici funkcí setup() a loop() mohou následovat definice dalších funkcí (podprogramů). Ty mohou být volány buď z funkcí setup() a loop(), kdykoli, opakovaně, a třeba i v obou případech stejná funkce, nebo z jiných funkcí definovaných v programu, případně vyvolány na základě tzv. přerušení programu definovanou externí událostí (pak se jedná o tzv. obslužnou funkci přerušení).

A nyní konečně ke slíbenému příkladu programu pro blikání LED diody.

Blikání LED

V tomto případě se jedná o příklad, který je zahrnut v ukázkových programech v prostředí IDE ( Soubor > Příklady > 01.Basics > Blink).  Program rozbliká LED diodu, která je na vývojové desce Arduino Uno připojena k pinu číslo 13 a rozsvítí se, pokud je pin nastaven jako výstup a je na něm logická hodnota „HIGH“ – v tomto případě tedy není nutno zapojovat žádný externí hardware.

Základní struktura programu vypadá takto:


void setup() {              // inicializační funkce (vykoná se po spuštění
                            // programu)
  pinMode(13, OUTPUT);      // pin číslo 13 nastavíme jako VÝSTUP (OUTPUT)
}

void loop() {               // výkonná funkce, po dokončení funkce setup()
                            // se vykonává opakovaně stále dokola
  digitalWrite(13, HIGH);   // rozsvítí LED připojenou na pin 13 přepnutím
                            // výstupu na hodnotu "HIGH"
  delay(1000);              // pauza 1000 ms = 1 vteřina   digitalWrite(13, LOW);    // zhasne LED připojenou na pin 13 přepnutím
                            // výstupu na hodnotu "LOW"
  delay(1000);              // opět pauza 1 vteřina
}                           // a znovu na začátek funkce loop()

Takhle jednoduché to je :)

Mimo základního kódu ve funkcích setup() a loop() tento program neobsahuje žádné deklarace, knihovny či jiné funkce. Zbývá snad jen doplnit, že cokoli za znakem dvojitého lomítka (až do konce řádku) je považováno za komentář a na funkci programu nemá vliv, a že složené závorky slouží k uzavření části programu do jednoho bloku, v tomto případě bloku funkce setup() a bloku funkce loop().

Dále se o programování aplikací pro Arduino se ale dočtete až v dalším článku, věnovaném právě této problematice.

Leave a Reply