V knížce Šolim, já a tranzistory, která je dnes mezi elektroniky a radioamatéry téměř kultovní, je scénka, kdy přijde šprt Horčička do Svazarmovského kroužku mladých elektrotechniků a ptá se, kdy se už budou rozdávat ty blikače, jak je měli kluci ve škole. Vedoucí zapráská fousama a odpovídá: „Sem se nechodí pro součástky. Sem se chodí pro rozumy a makat, rozuměno?“ Ale vy se nebojte, na konci dnešního dílu svůj blikač mít budete.
Máme Arduino, máme Ethernet shield, máme USB kabel a sedíme u počítače. Když to všechno propojíme a zapneme, můžeme začít psát programy. Tedy, teoreticky…
Podle verze našeho OS budeme potřebovat:
- Arduino IDE (stáhneme si ze stránek Arduina)
- Java runtime (na Ubuntu jsem zaregistroval problém s OpenJDK a musel jsem použít Javu od SUN – pozn.aut.)
- FTDI ovladače (Linux většinou obsahuje)
- avr-gcc, avr-libc a avr-gcc-c++ (v IDE pro Windows je přibaleno, na Linuxu si je budete muset doinstalovat podle návodu)
Pokud se vše podaří, uvidíte Arduino v systému jako /dev/ttyUSB#
(na Windows jako COM#), kde „#“ bude číslice podle vaší konkrétní situace. (V dalším textu budeme předpokládat, že se Arduino připojilo na /dev/ttyUSB0
.)
Vývojové prostředí
Když máme vše nainstalováno, spustíme IDE. Prostředí je poměrně strohé, nečekejte žádné Netbeans či Eclipse – v podstatě je to jen takový lehce rozšířený textový editor:
Arduino IDE – Ubuntu 10.4
Díky Javě vypadá IDE všude stejně – na Windows, Linuxu i Macu.
Menu nabízí klasické položky s volbami File (uložení, otevření, otevření příkladů, tisk či nastavení) a Edit (úpravy textů). Nabídka Sketch odpovídá zhruba nabídce „Project“ v jiných vývojových prostředích: nabízí překlad zdrojového kódu a zkratky pro import knihoven. Pod nástroji (Tools) se skrývá nastavení portu pro Arduino či výběr konkrétního typu – nastavte si obojí. Pokud je volba „Serial port“ neaktivní (stalo se mi na Ubuntu – pozn.aut.), zkuste Arduino nejprve připojit, nechat systémem detekovat, a teprve pak spustit IDE.
V terminologii Arduina se používá pro jednotlivé programy označení Sketch, v české literatuře o Arduinu jsem ustálený překlad nenašel. Česky slovu „sketch“ odpovídá zhruba pojem „krátká scénka“, známý z divadla či televize (další významy, jako třeba „skica“ nebo „náčrtek“, nejsou zcela přesné). A protože lze předpokládat, že většina čtenářů zná skeče britské skupiny Monty Python, zůstaneme -pokud budete souhlasit – právě u české podoby: „skeč“.
Jak přeložit termín "Sketch" z Arduino IDE?
Tools dále nabízejí monitor sériového rozhraní (můžeme si s Arduinem povídat přes sériový port nebo si nechat tisknout ladicí výpisy), formátování zdrojového textu, archivaci projektu nebo „vypálení“ bootloaderu pomocí programátoru AVR.
Arduino IDE – Windows
Lišta s ikonkami pod hlavním menu nabízí zkratky pro překlad, zastavení operace, vytvoření nového skeče, otevření, uložení, nahrání do Arduina a zapnutí monitoru sériové linky.
Skeče jsou uloženy ve vašem domovském adresáři v podadresáři arduino. Ukládány jsou vždy jako nový adresář, jehož jméno odpovídá jménu skeče (např. blink/), a v tomto adresáři je stejnojmenný soubor s příponou .pde. Je to obyčejný textový soubor se zdrojovým kódem.
Víme už, čím budeme programovat a jak. Zatím ale nevíme, v čem ani co. Pojďme si tedy představit programovací jazyk pro Arduino.
Wiring
Programovací jazyk, v němž můžete pro Arduino psát, se jmenuje Wiring (lépe řečeno „vychází z jazyka Wiring“, ale rozdíly jsou minimální). Podle autorů jde o „jazyk podobný C++“ – ve skutečnosti je to jakýsi metajazyk či „vylepšená sada maker“ nad C++. Wiring původně vznikl pro vývojový kit podobný Arduinu a vychází z dalšího open source projektu, který se jmenuje Processing (můžete si všimnout určité podobnosti v logu Arduina a Processingu).
Návrh sledoval maximální jednoduchost a srozumitelnost pro programátora, co s jednočipy začíná: Syntakticky lze použít všechny návyky, co máme z C-like jazyků. Všechny ty složené závorky, středníky, definice funkcí a proměnných, poznámky, bloky i řídicí konstrukce budou povědomé každému, kdo kdy prošel kolem C (viz základy jazyka Wiring). Přitom není potřeba zabývat se vší tou objektovou veteší – z objektové syntaxe zůstává v podstatě jediný operátor „.“ (tečka).
Pokud budeme pro Arduino vytvářet knihovny (a to budeme v některém z dalších dílů), sestoupíme i o úroveň níž, k C++, ale zatím si vystačíme s Wiring.
Předpokládám, že čtenáři seriálu znají C, a že tedy není potřeba popisovat základy jazyka. Ostatně to hlavní uvidíme např. při pohledu do cheat sheetu (uložte si, bude se hodit) a odlišnosti si vysvětlíme, když na ně narazíme. prozatím nám stačí vědět, že můžeme psát „céčkové programy“.
Hello World!
Každý správný programátorský manuál začíná příkladem „Hello World“, tedy něčím, co ukáže, že to všechno funguje. Přidržíme se tohoto modelu a napíšeme si jednoduchý program, na kterém si ověříme, že vše funguje tak jak má. Ekvivalentem „Hello World“ v elektronice je blikání LEDkou, budeme tedy blikat i my. Ale nejdřív ještě krátký pohled na hardware, abychom věděli, s čím máme vlastně blikat.
Porty Arduina
Podívejme se zblízka na naše Arduino:
Porty Arduina
Vidíme dvě řady konektorů, nahoře a dole. Pomocí těchto portů připojujeme další zařízení (třeba shieldy) a obsahují všechny použitelné signály, co ATMega nabízí.
Horní řada obsahuje 14 digitálních vstupů nebo výstupů (záleží na konkrétním nastavení) číslovaných 0 až 13, vývod země (GND) a vstup referenčního napětí pro A/D převodník (AREF).
Porty Arduina – digitální část
Dolní řada nabízí vlevo různé vývody napájení (napájecí napětí, 5V stabilizovaných, 3.3V, zem) a RESET. Vpravo je šest analogových vstupů (0–6).
Porty Arduina – napájení a analogové vstupy
Bližší informace zjistíte v technickém popisu Arduina nebo je vyčtete ze schématu (pokud je umíte číst).
Při pohledu do schématu zjistíme, že k digitálnímu výstupu číslo 13 je připojena LED, takže ji rovnou využijeme pro blikač. (Dioda je na stejném vstupu zapojená i v Ethernet shieldu.)
Cíl je tedy jasný: Rozblikat LED, která je připojená na vývodu 13.
Blikáme!
Program v C má vždy hlavní funkci, nazvanou main(), která je volána při spuštění programu. U Arduina máme takové funkce dvě a nazývají se setup()
a loop()
– toto rozvržení vychází z nejčastější kostry programů pro jednočipy, kde po RESETu proběhne nějaká inicializace a pak se dokola provádí v nekonečné smyčce nějaká akce, až do vypnutí napájení. Zkušení návrháři používají postupy, kdy se ona „nekonečná smyčka“ nahrazuje kombinací obslužných rutin, vyvolaných na základě nějaké akce (přerušení) a uspávání jednočipu do stavu s nízkým odběrem. U Arduina, které slouží především pro experimenty a seznámení s elektronikou, je vše zjednodušeno do výše zmíněné podoby. Lze si to představit zhruba takto:
void main() { setup(); while (1) { loop(); } }
Ve funki setup si tedy nastavíme digitální port 13 jako výstupní, a ve smyčce (loop) uděláme to nejjednodušší, co udělat můžeme: Rozsvítíme LED (=pošleme na výstup logickou 1), počkáme, zhasneme LED a zase počkáme. A protože je loop() voláno stále dokola, bude i Arduino stále blikat.
Program („skeč“) může vypadat třeba takto:
#define LED 13 // číslo pinu, kde je připojena LED void setup() { // nastavíme pin jako výstupní pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); // rozsvítíme LED delay(1000); // počkáme digitalWrite(LED, LOW); // zhasneme LED delay(300); // ... a zase počkáme }
Kód je velmi jednoduchý – definujeme si číslo pinu s LED. Ve funkci setup() zavoláme funkci pinMode, která nastaví pin jako výstupní. A konečně ve funkci loop() děláme to, co jsme si popsali výše – nastavíme pin na log. 1 nebo log. 0 (HIGH / LOW) pomocí systémové funkce digitalWrite a čekáme (delay).
Zkusíme si kód přeložit a ověřit, že jsme se neupsali – klikneme proto na Verify:
IDE bude chtít skeč uložit – uložte ho třeba pod názvem Blink. Pokud jsme vše napsali dobře, vypíše se ve spodním okně něco jako Binary sketch size: 934 bytes (of a 30720 byte maximum)
. Tedy že skeč přeložený do binární podoby zabírá 934 bajtů.
Pokud máme přeloženo, připojené Arduino, nastavený správný model a port v IDE, tak můžeme se zatajeným dechem kliknout na Upload:
IDE přeloží skeč, nahraje ho do Arduina, počká pár sekund a pošle signál RESET. A nám to…
ano, bliká!
No, upřímně: Není to nic světoborného, já vím. Ale ani Řím nepostavili za den.
Modifikace
Téměř naprosto shodný program najdeme i v příkladech, co jsou dodávány s Arduino IDE – v sekci Digital s názvem Blink (jaké překvapení!) Místo konstanty (#define) je použita globální proměnná. Zkusme si další úpravu – třeba vytvořit vlastní funkci. Pokud na to půjdete stejně jako v C, nemůžete se splést:
int LED = 13; // pin tentokrát definujeme proměnnou void setup() { pinMode(LED, OUTPUT); } void blik() { digitalWrite(LED, HIGH); delay(300); digitalWrite(LED, LOW); delay(300); } void loop() { blik(); delay(600); blik(); blik(); delay(600); }
Blik – blik blik – blik – blik blik…
Za domácí úkol se podívejte do reference, zkuste si ke každému bliknutí poslat zprávu po sériovém rozhraní (malá nápověda a řešení) a nezapomeňte: Půl hodiny hraní vydá za dvě hodiny studování manuálů!
Těším se na shledanou u dalšího dílu, kde už se konečně připojíme s Arduinem k internetu…