sobota 24. srpna 2013

Arduino: seznámení

Loni v létě se stal velkým hitem Raspberry Pi a na základě oslavných článků jsem po něm také začal pokukovat. Chtěl jsem něco malého, šikovného, co by se dalo programovat a pomohlo mi to v domácí automatizaci. Jal jsem se rozhlížet po nabídce maličkých počítačů a přitom úplnou náhodou "znovuobjevil" Arduino, což byla v tu dobu už 7 let stará platforma, kterou jsem bohužel celou dobu úspěšně ignoroval.

Několik dlouhých zimních měsíců jsem se snažil porovnávat Raspberry Pi (což je v podstatě kompletní PC, jen velikosti kreditní karty) s Arduinem (8-bitový mikrokontrolér se spoustou vstupů a výstupů, taktéž velikost kreditky), až jsem nakonec vybral a 8. února 2013 objednal na dx.com své první Arduino Uno. Vycházelo asi na třetinu ceny Raspberry Pi (což byl pro mě důležitý argument, protože jsem tušil, že u jednoho kusu nezůstane) a zdálo se mi, že s ním bude víc legrace (a o zábavu tu jde především, že? :-)

Arduino Uno rev.3
Nerad bych tu opakoval informace, které jsou dostupné na opravdu mnoha místech, neboť Arduino platforma je po těch letech výborně zavedená a perfektně podporovaná, včetně mnoha zdrojů v češtině. Proto zkusím jen stručně napsat, co mě na Arduinu fascinuje a v čem vidím jeho hlavní výhody:

  • miniaturní, minimální spotřeba energie
  • 20 vstupů/výstupů s HW podporou několika "protokolů"
  • ohromná rozšiřitelnost díky nepřebernému množství periférií a "štítů"
  • programuje se jednoduše v C/C++
Krátce vysvětlím: Arduino Uno pracuje na 5 V (a může být napájeno přímo přes USB kabel z PC), ale na desce má také regulátor napětí, takže bere cokoliv od 5 do 12 V (jede klidně třeba i na 9 V baterii nebo autobaterii v autě), a jak brzy ukážu, tak umí pracovat i na mnohem nižších napětích než je základních 5 V. To je super praktické. Navíc spotřeba proudu je velmi nízká - dá se stlačit i pod 1 mA, když je to potřeba (v některém z příštích dílů tohoto vzrušujícího Arduino seriálu ukážu jak).

Dále, Arduino má naprosto fantastické množství vstupů a výstupů. Když jsem pracně propojil svou digitální teploměrovou síť s PC přes USB-RS232 převodník (protože dnešní PC nemá žádný TTL digitální vstup vhodný na takové hraní), začal mi chybět nějaký jednoduchý digitální výstup, jen nějaký drát, kde bych mohl spínat relé pomocí TTL hodnot 0/1. A tam jsem s PC v podstatě skončil. Oproti tomu základní Arduino Uno má takových vstupů/výstupů minimálně 20! Vlastně prakticky všechny černé dírky na fotce nahoře jsou vstupy nebo výstupy toho mikrokontroléru a dají se jednoduše programovat. To je úžasné!

Navíc ty vstupy/výstupy automaticky podporují některé velmi zajímavé "protokoly" (promiňte nevhodnost slova, zrovna mě nenapadá lepší). Především, 6 z nich funguje kromě digitálních (TTL nuly a jedničky) i jako analogové, a to až s 10bitovou přesností (tj. když měří napětí od 0 do 5 V, tak s rozlišením na 5 mV, což je velmi dobré). Dále některé piny (nožky toho procesoru) podporují protokol a sběrnici SPI, jiné pak I2C, což umožňuje k Arduinu připojit celou plejádu různých periferií počínaje HW hodinami a čtečkami SD karet a konče třeba barevnými dotykovými displeji. Další piny je možné použít pro PWM - jednoduše tak můžeme přímo z Arduina plynule řídit třeba jas připojené LE diody (LEDky) nebo výkon motorku. No a hlavně je těch pinů (vstupů/výstupů) 20, slovy DVACET! :-)

Arduino za těch svých 7 let nasbíralo obrovský náskok před Raspberry Pi hlavně v nabídce připojitelných periferií, kterým se v Arduino hantýrce říká Shields, tedy mým překladem štíty. Funguje to tak, že se v podstatě narážejí na základní Arduino Uno desku shora a většina štítů je dále průchozích, takže výsledek pak vypadá jako nějaký mnohapatrový sendvič. Seznam dostupných štítů je například na http://shieldlist.org/ a je opravdu vyčerpávající. Pro prvotní orientaci mi stačila i nabídka na http://dx.com/s/arduino+shield (možná se už zdá, že ten čínský obchod s poštovným zdarma protěžuji, jako bych měl z nákupů tam nějaké provize, ale není tomu tak a navíc - spoiler alert - brzy se s ním nadobro rozloučím!)

No a otázka programování tohoto mikrokontroléru? Na škole jsem měl tu čest programovat 68HC11 v assembleru a neměl jsem s tím žádný problém - naopak byla radost rozpomínat si na assembler z Atari 800XL a připomenout si, co všechno se v něm dalo s nějakými 50 instrukcemi vyčarovat za programy, hry a dema. Ale dnes už ocením možnost naprogramovat mikrokontrolér i v čistém C (s trochou C++ příchutě) - přecejen ta vyšší abstrakce dovolí soustředit se na samotný algoritmus místo přemítání nad správným adresním módem či délkou skoku, kód je čitelnější a jak se ukazuje, tak nabídka hotových open-source knihoven v C/C++ pro Arduino je obrovská.

Takže zpět k mému Arduinu Uno, které jsem objednal v prvních dnech oslav Čínského nového roku. Mimochodem, nikdy v tu dobu nic v jihovýchodní Asii neobjednávejte, nechcete-li čekat na balíček pět a více týdnů. Když konečně 15. března pošta doručila, nadšeně jsem vybalil samotné Arduino Uno s USB kabelem, infračervený měřič vzdálenosti, LC displej původem z telefonu Nokia 5110, modul s relé určený speciálně pro Arduino a pár JST kablíků, které jsem vlastně ani nepotřeboval. Bleskově jsem Arduino připojil přes USB k PC, v Ubuntu rozbalil vývojové prostředí a rovnou si začal hrát, neboť v Arduino IDE je v menu pod položkou File -> Examples dostupných mnoho desítek hotových fungujících příkladů.

Programování pro Arduino je opravdu velmi jednoduché, ještě jednodušší než v běžném C/C++. Odpadají hlavičkové soubory a celý program se smrskne na dvě funkce, setup() pro prvotní inicializaci a loop() pro běh programu v nekonečné smyčce. Vývojové prostředí připravoval zřejmě někdo, kdo chtěl umožnit programovat i lidem, kteří to do té doby nedělali, a občas je to podle výsledků vidět. Ale zas na druhou stranu, díky za tyto výsledky - všechno okolo Arduina je totiž přísně Open Source dle svobodných licencí, jak hardware tak i software, a díky tomu se komunita kolem Arduina tak úspěšně rozrostla a pokryla prakticky všechny možné i nemožné oblasti použití.

Takže jsem si pohrál s relé, s IR měřičem vzdálenosti, s LEDkama, a pak jsem jednoduše vzal konec své teploměrové sběrnice s DS18B20, zapojil do jednoho z DVACETI volných pinů, přidal tolik potřebný 2k2 rezistor "napájející" tuto sběrnici a po měsících problémů začal naráz odečítat teploty bez jediné chybičky. Hurá. Opojen množstvím volných vstupů jsem dokonce celou sběrnici rozdělil na dvě větve, čímž jsem ji zkrátil a "zhvězdicovatěl", obě větve zapojil do zvláštních vstupů na Arduinu, do dalších pěti připojil LCD z Nokie (pořád mi zbývá 13 volných pinů :-), do projektu naimportoval hotovou knihovnu pro displej a druhou knihovnu pro DS18B20 a teď odečítám venkovní a vnitřní teploty současně a vidím je na displeji, s naprosto minimální námahou a pár řádky zdrojového kódu. Mazec!

Vypadá to jako šťastný konec mé teploměrové anabáze, ale ve skutečnosti je to teprve začátek něčeho mnohem většího... Začnu s nápady, co s Arduinem dělat: viz další díl mého Arduino seriálu.

Žádné komentáře:

Okomentovat