úterý 27. srpna 2013

Arduino Pro Mini - menší a ještě lepší

Pro seznámení s Arduino platformou jsem po krátkém přemýšlení zvolil Arduino Uno, a že bylo z čeho vybírat! Vždyť seznam originálních Arduino produktů obsahuje 19 různých desek nejroztodivnějších konstrukcí, včetně Arduina určeného k zašití do oděvu (ano, wearable computing!). Díky svobodné licenci, pod kterou je projekt Arduino vyvíjen a vydáván vzniklo také mnoho klonů. Přitom na začátku roku 2013 už byl Arduino Uno starý produkt a žhavou novinkou byl Arduino Leonardo. Přesto jsem si vybral Uno, protože jsem USB novinky z Leonarda (umí se chovat jako USB klávesnice nebo myš) nepotřeboval a naopak jsem chtěl využít osvědčenost a kompatibilitu Uno se všemi shieldy.

Arduino Uno je fajn, pokud si člověk chce hrát a zkoušet nová zapojení, především pak pokud dokupuje další shieldy. Ovšem když potřebuje připojit periferie, které nepasují do Uno pinů přesně (třeba třípinový IR měřič vzdálenosti, třípinové relé či ten 8pinový LC displej), musí stejně přidat nějakou pomocnou chlebovou destičku, propojit všechno dráty a elegance Arduino skládání na sebe se začíná vytrácet. Navíc výsledek složený z několika desek nad sebou je relativně objemný. Jelikož chci krom jiného postavit nový, inteligentnější pokojový termostat, kam by se Uno sendvič rozumně nevešel, hledal jsem něco jako Arduino Uno, ale menší, skladnější, vhodnější pro hotové výrobky. A našel jsem:

Arduino Pro Mini (originální čínská kopie)
Arduino Pro Mini je naprosto úžasné. S rozměry pouhých 33 mm x 18 mm se vejde prakticky kamkoliv, přitom obsahuje stejný procesor ATmega328 jako velké Arduino Uno, takže sdílí všechny jeho skvělé vlastnosti. Nabízí dokonce o dva analogové piny navíc, tedy 14 digitálních a 8 analogových vstupů/výstupů. Zůstal mu i regulátor napětí, takže také pracuje na 5-12 V. Na fotce je vidět i miniaturní tlačítko reset, a zřejmě tam nejsou vidět dvě LEDky: jedna svítící, když je Pro Mini pod napětím a druhá připojená na pin D13, stejně jako to má velké Uno (asi aby si člověk mohl zablikat LEDkou bez připojování čehokoliv). Takže opět kompletní počítač, ale rozměrů poštovní známky!

Co naopak tomuto Pro Mini chybí? Nemá USB port ani čip, který by USB komunikaci zajišťoval. To mi ovšem nadmíru vyhovuje, protože v běžném provozu není USB na nic potřeba. Ale jak Arduino Pro Mini naprogramovat? Má jen sériové rozhraní s TTL úrovněmi (RX/TX). Tím bych ho mohl připojit k PC do sériového portu, kdybych do cesty vřadil převodník úrovní z TTL na RS232 (obvykle MAX232). No ale proč dávat převodník na RS232, když můžu dát rovnou převodník ze sériového rozhraní na USB, které je dnes u PC mnohem častější?

Takže kromě tohoto Arduino Pro Mini jsem si objednal také sério-USB převodník. Měl jsem na výběr ze dvou typů - levnější s čipem PL2303 a dražší s čipem CP2102. Po "skvělých" zkušenostech jsem delší dobu váhal, a nakonec opět zvolil řešení s PL2303, protože jsem si nebyl jistý, jestli je CP2102 v Linuxu dobře podporován. Výsledek vypadal nějak takto:


Propojil jsem tedy Arduino Pro Mini s tím převodníkem pomocí dodaných kabelů - napájení, zem, RX a TX, a zkusil poslat do Arduina první program. Místo úspěchu jsem obdržel error stk500_recv(). Začal jsem se pídit na Internetu a prakticky okamžitě zjistil krutou skutečnost: nejsem sám, na tuhle chybu už narazili všichni ostatní přede mnou, kteří se pokoušeli programovat jen přes RX+TX signály.

Proč tomu tak je? Arduino obsahuje ve své paměti tzv. boot loader (obouvač bot, krátce nazouvák, nebo také obvykleji zvaný zavaděč), který ihned po resetu naslouchá velmi krátkou dobu (pár stovek milisekund), posílá-li do něj někdo přes sériový port nový program. Neposílá-li nikdo nic v tomto krátkém časovém okně, tak boot loader předává řízení uživatelskému programu, který je nahrán v paměti Arduina od minula, tím pádem na sériovém portu už nikdo nic neposlouchá/nepřijímá a IDE posílající nový program z PC do Arduina se s ním nedomluví a skončí s errorem stk500_recv().

Ctěného čtenáře možná zajímá, proč jsem neznal tento problém z dřívějšího hraní si s Arduino Uno. Tam probíhá komunikace PC <-> Arduino celá přes USB a tak je tam ten nutný reset vyvolán v pravý čas automaticky, řízený některým z USB signálů z PC. Celé to funguje tak pěkně, že mě ani nenapadlo, že se tam v průběhu nahrávání nové verze programu do Arduina děje nějaká magie.

Palčivou otázku, proč jsem si tohle nezjistil PŘEDTÍM, než jsem objednal Pro Mini a ten serio-USB převodník, ponechme raději stranou a hledejme nějaké řešení. Jsou v podstatě tři možnosti: ruční, keš nebo páječka. Ruční řešení je popsáno na Internetu docela jednoduše: stačí v pravou chvíli při posílání programu z PC do Arduina stisknout ten maličký reset na Arduinu. Jednoduché, že? Ovšem trefit tu "pravou chvíli" je dost obtížné. Prý se to dá nacvičit, ale závisí to na rychlosti daného PC, velikosti nahrávaného programu a ještě několika dalších faktorech, takže mě po pár desítkách minut neúspěchů přestalo počítání milisekund od kliku myši na tlačítku Upload k mačkání resetu bavit a šel jsem hledat jiný způsob.

Řešení přes keš je na Internetu popsáno taky docela jednoduše: tento převodník stačí vyhodit z okna a koupit místo něj jiný, který má vyvedený i DTR signál (tedy například ten s CP2102, který je obvykle 6pinový). DTR signálem potom Arduino IDE z PC hlásí Arduinu připojenému přes sériový port, že začíná nahrávat nový program. Tento DTR signál pak přivedeme na RST vstup Arduina a je vymalováno - PC resetne Arduino přesně v ten pravý okamžik automaticky.

Jelikož mi bylo líto vyhazovat PL2303 a čekat další dlouhé týdny na jiný převodník, šel jsem do třetího, nejkrkolomnějšího řešení. On ten čip PL2303 totiž převádí všechny RS232 signály, i DTR. Zrovna DTR je vyvedený na vývod č. 2. Takže teoreticky stačí napájet dráteček na SMD nožičku toho čipu a vyvést ho někam na pin tak, aby šel připojit k Arduinu. Návod je například na http://www.instructables.com/id/Arduino-USB/ a výsledek pájení má vypadat zhruba takto:



No jo, jenže ty nožičky toho čipu jsou teňounké asi tak čtvrt milimetru, a mezera mezi nimi je zrovna tak úzká! Trefit se tam páječkou na správnou nožičku, připájet k ní dráteček, a nespojit přitom dvě-tři sousední nožky v jednu hroudu cínu vyžaduje kromě pevných rukou a dobrých nástrojů v mém případě také kus štěstí. To se na mě usmálo (po několika pokusech) a tak jsem výsledek okamžitě zafixoval pomocí tavné pistole s lepidlem:


Výsledkem je tedy USB<->serial převodník s PL2303, který má celkem 6 pinů - 5 V, 3,3 V, zem, RX, TX a DTR (na spojení posledních třech zmíněných signálů s Arduinem používám audio kabel od CD-ROM :-).

Takto upraveným převodníkem se dá programovat Arduino Pro Mini zcela parádně a pohodlně, s jedinou zvláštní výjimkou: převodník není možné připojit k PC přes USB prodlužku delší než velmi krátkou. Konkrétně mně tu dobře funguje 30 cm prodlužka, ale cokoliv delšího (v jakékoliv kvalitě, včetně super stíněné USB 3.0) nefunguje - jednoduše ztrácí data a programování ani jiná komunikace se nezdaří. Dá se říct, že jsem si na to časem zvykl a při pokusech se holt hrbím pod stolem - aspoň že fungují přední USB porty a nemusím být vlezený pod stolem celý až u zadní strany PC :-)

neděle 25. srpna 2013

Arduino: univerzální řešení

Arduino mikrokontrolér mi připadá jako skvělá náhrada všech drobných elektronických udělátek, která jsem kdy stavěl nebo hodlal postavit. Zároveň mi otevřel dveře k řešení problémů, které jsem si dřív ani neuměl představit. Svou plnou programovatelností a rozšiřitelností je to univerzální švýcarský armádní nůž na téměř cokoliv, co jde převést na elektrické signály.

Například taková drobnost, jakou je "světelný had". Tedy řada LEDek vedle sebe, které blikají v nějakém rytmu, takže vytvářejí iluzi běžícího světla. Vždycky jsem chtěl postavit to, co měl zabudováno vepředu K.I.T.T. a čím pulzoval tím rychleji, čím napínavější scénu Michael Knight Rider zrovna řešil. Z pasivních součástek se to postavit dá, ale je na to potřeba buďto specializovaný obvod, nebo je to složité zapojení a ve výsledku je člověk zklamán, že efekt není dokonalý, protože nejspíš postrádá prvek zpomalení na krajích, když se světlo "odráží" a mění směr.


S Arduinem je tohle naprostá brnkačka! Stačí připojit diody (s omezujícími odpory) do všech 14 až 20 pinů a pak napsat jednoduchý program, který se dá během chvíle vyladit k dokonalosti. A tato hračka se dá dále rozvíjet - například připojením teplotního čidla může takový domácí K.I.T.T. reagovat na změnu teploty a čím víc člověk topí, tím rychleji světlo pulzuje :-) Nebo podobně může reagovat na denní čas, množství světla či na přiblížení "vetřelce". Možnosti jsou neomezené..

Takových hraček je samozřejmě možné navymýšlet milion: co třeba čidlo měřící vlhkost půdy v doma květináčích nebo venku ve skleníku a hlásící, že je čas doplnit zálivku? Z pasivních součástek není problém, ale s Arduinem je to ještě jednodušší a opět lze řešení dále rozvíjet. Zařízení nemusí jen blikat světýlkem, když je půda suchá - může také tu vodu samo spustit a zalít automaticky, nebo může dávkovat vláhu pravidelně, klidně i v závislosti na denní době, teplotě či dalších okolnostech. Stačí připojit pár čidel a dopsat pár řádků programu.

Z dalších šikovných věcí mě napadá například ventilátor, který v koupelně vyvětrá, když je v ní příliš vlhko. Nejspíš se prodává hotové řešení, ale určitě nepůjde naučit, aby se chovalo přesně tak, jak chci (například nepůjde nastavit spínací a vypínací hranice vlhkosti nezávisle). A co takový hlásič unikajícího plynu nebo přítomnosti kouře/ohně? S Arduinem je naprosto jednoduché postavit zařízení, které při detekci plynu či kouře kromě spuštění výstražné sirény může také poslat e-mail nebo SMSku nebo rovnou zavolá na dané číslo. Vlastně by mohlo i začít hasit, a předtím vypnout přívody elektřiny a plynu.

Zatím to byly samé drobnosti až zbytečnosti, ale co se inspirovat v knize Practical Arduino (k dostání u dobrých knihkupců, v PDF pak na uložto)? Můžeme tak například na dálku ovládat elektrické zásuvky (Arduino vysílá řídicí signál na 433 MHz), v pravou chvíli automaticky mačkat spoušť fotoaparátu (takže vytvoříme časosběrné video, nebo vyfotíme kapku dopadající na hladinu), postavíme vlastní zabezpečovací zařízení, nebo můžeme číst teploty z bezdrátových meteo čidel (Arduino poslouchá na 433 MHz) a postavit tak například inteligentní meteostanici s výstupem na web.


Další návody v knize uveřejněné jsou ještě mocnější: jak postavit vlastní osciloskop, bránu řízenou RFID čipy, nebo dokonce jak Arduino propojit s počítačem v autě, aby sbíralo data o jízdě tak, že je možné propojit údaje o poloze (z GPS připojené k Arduinu), otáčkách motoru, spotřebě a další a všechno to vynést do 3D grafu v Google Earth.

Člověka napadají další věci jen když prochází seznamem čidel k Arduinu na Ebay: čidlo světla, výšky hladiny, vlhkosti vzduchu, vlhkosti půdy, vzdálenosti (infračervené i ultrazvukové), magnetického pole, náklonu/otřesů, metanu, propan-butanu, zvuku, barvy, pH, zrychlení, tlaku vzduchu a další a další. Potom také existují měřidla různých veličin, která poskytují na výstupu elektrické impulzy, takže je možné Arduinem měřit například spotřebu elektrické energie nebo vody.

No a to byly vstupní možnosti. Na výstupu či pro komunikaci je Arduino také vybaveno skvěle: může blikat, pípat, vypisovat na alfanumerický displej, malovat na LCD, dokonce i na ty s dotykovou vrstvou. Umí taky komunikovat bezdrátově (v pásmu 350 MHz až 2,4 GHz, také přes WiFi a Bluetooth) a drátově (přes sériový port, USB i Ethernet), může tedy fungovat i jako jednoduchý web server, což je často využíváno. A samozřejmě může ovládat prakticky jakékoliv elektrické zařízení, počínaje motory a konče nevím čím.

Arduino je každopádně velmi mocná platforma, která by IMHO měla být vyučována ve školách anebo aspoň elektro-kroužcích. Dnešní mladí technici to potřebují jako sůl, aby neztratili kontakt s realitou...

V tuto chvíli mám rozestavěno snad 6 různých zařízení s Arduinem a napadají mě další. Zkusím je příležitostně popsat, třeba to bude inspirovat další hackery. Ale předtím všem prozradím, co je ještě lepší, než Arduino Uno... (klikni zde pro pokračování)

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.