Vývoj elektroniky | 9. 4. 2018

Arduino na steroidech

část 1.

Tento článek je určen pro mírně pokročilé bastlíře a programátory či elektroniky, kteří mají základní znalosti práce s Arduinem [1], tedy nejen že rozblikali LED, ale naprogramovali si již nějakou menší sofistikovanou aplikaci. V tomto článku a v následujícím pokračování si ukážeme, že máme k dispozici lepší vývojové prostředí pro psaní programů než je standardní IDE pro Arduino dostupné na originálních stránkách projektu, ale také že Arduino nemusí být jen mikrokontrolér ATmega328 osazený v klasickém modulu Arduino Uno, ale i 32bitový ESP32 modul podporující WiFi a BT v jednom čipu. Pojďme tedy na to.

Všichni známe klasické IDE vývojové prostředí pro projekty postavené na Arduinu. Pracuje se v něm pomocí tzv. „skečí“ (sketch). Pokud používáme knihovny třetích stran, je nutné je nainstalovat pomocí správce knihoven, což je sice pěkné řešení, které může fungovat, ale brzy se dostaneme do situace, že si knihovnu musíme upravit k obrazu svému pro určitý projekt, ale v jiném projektu potřebujeme používat knihovnu původní. Také může např. nastat situace, že po roce otevřený projekt kompilovaný s nejnovější knihovnou nefunguje a rádi bychom se vrátili ke starší verzi, která zase ovšem koliduje s projektem jiným, který již využívá nové funkce knihovny. Přepínání knihoven v manažeru – tedy neustálé přeinstalovávání není nic příjemného, a to ještě může nastat situace, že celý projekt chceme zveřejnit a nastane problém v případě upravené knihovny, kterou musíme nějakým způsobem exportovat a zájemci si ji musí instalovat. Nestačí totiž jen dát ke sdílení adresář s našimi soubory.

Jak jste se asi dovtípili, existuje profesionální řešení, které je pro náš rozsah práce zdarma a toto řešení se jmenuje PlatformIO [2]. Jedná se o kombinaci „Hackable text editoru“ Atom [3] a pluginu/ekosystému pro vývoj IoT aplikací PlatformIO – obsahující IDE, debugger, podporu C/C++ syntaxe o doplňování, integrovaný sériový monitor a mnoho dalšího. Jde o multiplatformní aplikaci – pracuje pod Windows, OS X i Linuxem. Prostředí si kontroluje aktualizaci pluginů a frameworků používaných a instalovaných podle platforem. Součástí projektů je unikátní nastavení projektů – tedy jaká vývojová deska a jaký Framework je použitý včetně použitého sériového portu pro programování. Tím odpadá další problém originálního Arduino IDE prostředí – používáte‑li více současně připojených Arduino desek, nemusíte neustále při kompilaci přepínat typy desek a příslušné COM porty. Už se vám nestane, že do desky č. 1 nahrajete omylem program určený pro desku 2 a zničíte tak nějaká čidla, popřípadě mnohem dražší součástky.

Instalujeme PlatformIO

Atom i PlatformIO jsou multiplatformní aplikace pro Windows, MAC OS i Linux – stáhněte si tedy potřebnou verzi editoru Atom z [3]. Jako první nainstalujeme textový editor Atom. Následující postup bude popisován v prostředí Windows. Pro MAC a Linux jsou návody samozřejmě také k dispozici [4].

Po úspěšném nainstalování Atomu spustíme tzv. „Atom package manager“ – „Menu: File  Settings  Install“. Jako hledaný (instalovaný) balíček budeme hledat „platformio‑ide“ – obr. 1

Obr. 1: Instalace balíčku PlatformIO v editoru Atom

 

Obr. 2: Instalace balíčku PlatformIO terminal pro zadávání příkazů pro PlatformIO v příkazové řádce editoru Atom

Package manager vám nabídne také „Platformio‑IDE‑terminal“ – obr. 2. Doporučuji si ho instalovat také. PlatformIO používá „Clang“ pro automatické doplňování kódu – tzn. vám při psaní zdrojového kódu v C/C++ (Atom lze použít jako editor pro libovolný kód) nabízí možnosti příkazů, funkcí a jejich parametry, což hodně urychluje psaní. Stáhněte si tedy „Clang 3.9.1 for Windows.“ z [5]. Doporučuje se verze 3.9.1, ačkoli je na stránkách již verze 5.0.1 – tuto verzi nemám vyzkoušenou, používám zmíněnou verzi 3.9.1. Hledejte ji v „Pre‑Built Binaries“:

  • Clang for Windows (32-bit) (.sig),
  • Clang for Windows (64-bit) (.sig).

Obr. 3: Nastavení instalace Clangu pro editor Atom

Zvolte si správnou verzi (32 nebo 64-bit) dle vašich Windows. Při vlastní instalaci Clang zvolte „Add LLVM to the system PATH“ možnost – obr. 3. Potom Atom restartujte. V tuto chvíli mi PlatformIO hlásí revizi Home 0.6.1 a Core 3.5.2b1, ale systém se stále vyvíjí. Při každém spuštění kontroluje, zda nejsou k dispozici nové revize balíčků nebo samotného systému. Osobně mám nainstalované tyto „Community Packages“ balíčky:

  • autocomplete‑clang (0.11.4),
  • build (0.70.0),
  • busy (0.7.0),
  • busy‑signal (1.4.3),
  • file‑icons (2.1.16),
  • intentions (1.1.5),
  • language‑ini (1.19.0),
  • linter (2.2.0),
  • linter‑gcc (0.7.1),
  • linter‑ui‑default (1.6.10),
  • minimap (4.29.7) – zobrazuje vám v pravé části zmenšený pohled na zdrojový kód – lépe se pak v celém programu pohybujete,
  • platformio‑ide (2.0.1),
  • platformio‑ide‑debugger (1.2.5) – bohužel na jeho používání potřebujete mít plán minimálně Basic – 10 USD / měsíčně,
  • platformio‑ide‑terminal (2.8.0) – sériový terminál,
  • tool‑bar (1.1.5).

Dále jsou součástí instalace tzv. „Core Packages“, které si systém jako potřebné instaluje sám.

Ještě k neplacenému a placenému plánu – základní instalace, jak už to bývá, je zdarma. Jedná se o tzv. plán „Community“. Zde je k dispozici používání vývojového prostředí a aktualizace. Myslím, že tento plán postačuje každému bastlíři a makerovi [6]. Výhodou vyššího plánu „Basic“ za 10 USD / měsíčně je debugger, unit testy a další věci spojené již s profesionálním a týmovým vývojem. To je již v případě komerčních projektů, kde je cena za vývoj pochopitelná. V případě, že jste studenti nebo učitelé, je cena „Basic“ plánu zanedbatelné 3 USD / měsíčně. Pokud jste novým uživatelem, můžete si „Basic“ plán vyzkoušet v rámci „Community“ plánu na měsíc zdarma a pak se rozhodnout. V tuto chvíli máme už připraven software pro vývoj aplikací na Arduinu i např. ESP8266 modulech. A protože předpokládám, že Arduino již znáte jako svoje boty, podíváme se na poněkud výkonnější a menší platformu, již zmiňovaný obvod ESP8266 od firmy Espressif.

Espressif ESP8266 a vývojové moduly

Obr. 4: SoC obvod ESP8266

Pojďme si tedy onen levný (cena vývojových modulů ESP-01 s tímto obvodem začíná na eBay od 2 USD) zázrak představit. Samotný obvod je na obr. 4. Je to vysoce integrované SoC (Systém On a Chip) řešení, nabízející WiFi konektivitu, SPI/SDIO/ I2C/UART rozhraní a další. Na čipu jsou kompletní RF obvody, vyžadující externě pouze přizpůsobení anténě – což silně minimalizuje nároky na výslednou velikost modulu nebo PCB (Printed circuit board) čili plošného spoje. Srdcem je 32 bitový mikrokontrolér Tensilica L106 Diamond s SRAM pamětí 80 kB. Vlastnosti WiFi části obvodu ESP 8266 jsou následující:

  • podpora 802.11 b/g/n – tedy pracuje ve WiFi pásmu 2,4 GHz,
  • 2× WiFi interface – podpora AP infrastructure (přístupový bod), P2P mode a BSS Station mode,
  • hardwarová podpora CCMP (CBC‑MAC, counter mode), TKIP (MIC, RC4), WAPI (SMS4), WEP (RC4), CRC,
  • podpora MIMO 1 × 1 and 2 × 1, STBC, and 0,4 μs ochranný interval, ƒƒ anténní diverzita, podpora pro Bluetooth při současném využívání antény.

Blokové schema ESP8266 je na obr. 5

Obr. 5: Vnitřní zapojení obvodu ESP8266

Na první pohled na něm není samozřejmě nic zajímavého, pro bastlíře se stává zajímavým v okamžiku, kdy se osadí tento čip do modulu s jednoduchým připojením k senzorům apod. Těchto modulů existuje několik – obr. 6 je jeden z nejpoužívanějších modulů ESP01, obr. 7 ukazuje modul ESP05 a obr. 8 modul ESP12 patřící také k hojně používaným. Schéma zapojení modulu ESP12 je na obr. 9, rozmístění vývodů na obr. 10. Všimněte si, že k obvodu ESP8266 je připojen pouze externí rezonátor, dále pí‑článek pro přizpůsobení VF výstupu s anténou a externí FLASH paměť. Ano, to je ta, kam se nahrává váš program/firmware. Obvod obsahuje ve svojí ROM bootloader, který pomocí sériové linky dokáže nahrát data do externí EEPROM paměti připojené přes SPI interface – ta může být velká až 16 MByte.

Obr. 6: Modul ESP01

Obr. 7: Modul ESP05

Obr. 8: Modul ESP12

 

Obr. 9: Vnitřní schéma zapojení modulu ESP12 (ESP8266 + QSPI Flash)

 

Obr. 10: Rozmístění signálů modulu ESP12E

Začneme tím nejjednodušším – modulem NodeMCU v1.0

Začneme tím nejjednodušším – bez nutnosti pájení a se vším potřebným na jedné desce. To se povedlo vměstnat konstruktérům na tzv. NodeMCU modul – obr. 11. Tento modul lze běžně koupit na všech čínských e‑shopech i na eBay. U nás můžete projet Aukro nebo specializované obchody pro Arduino. Bude to sice trošku dražší, ale zase budete mít modul doma na hraní v rámci dnů. Na obr. 12 jsou zjednodušeně popsány GPIO (general pin input/output) piny pro připojení senzorů a periférií. Pro úplnost si popíšeme schéma tohoto modulu. Jádro modulu, tedy obvod ESP8266, najdeme na obr 13a.

Obr. 11: Modul NodeMCU v1.0 (ESP12 + CP2102)

Obr. 12: Zapojení vývodů modulu NodeMCU

 

Obr. 13a: NodeMCU – ESP8266

Je zde navíc filtrace napájení externím kondenzátorem a ošetřené vstupy jako EN a RST, dále GPIO0 (přepíná se jím RUN/FLASH mode), GPIO2 a GPIO15. Tyto vstupy jsou nutné pro provedení správné boot‑sekvence při nahrávání paměti. Obr 13 b ukazuje USB/UART interface osazený známým a osvědčeným obvodem CP2102. Zde poznámka – protože obsah paměti s firmwarem dosahuje běžně 1 MByte, je rychlost komunikace 115 200 baud po sériové lince nedostatečná. Naštěstí ESP obvod dokáže díky CP2102 komunikovat rychlostí 921 600 baudů, což podstatně zkracuje dobu uploadu. Pozor např. na verzi NodeMCU v0.9 nebo jiné klony – pokud se použije oblíbený obvod USB/UART CH340, je tato rychlost pouze 230 400 nebo 256 000 baudů. Ověřeno na modifikaci Arduinové desky nazývané WeMos D1 s modulem ESP12 – obr. 14.

Obr. 13b: NodeMCU – USB/sériový převodník + reset/boot obvod

 

Obr. 14: Čínský klon Wemos D1 (Arduino s modulem ESP12)

Zpět k NodeMCU – zajímavá část zapojení je na obr. 13b vlevo dole – takové ty překřížené NPN tranzistory. To je obvod, který převádí signály RTS a DTR na ovládání pinu RESET a GPIO0, zmiňované při popisu samotného modulu s ESP8266 na předchozí straně. Pomocí GPIO0 se totiž obvodu oznamuje, že se bude pomocí bootloaderu provádět změna obsahu externí FLASH paměti připojené s ESP pomocí QSPI sériové sběrnice. A díky tomu můžeme do ESP obvodu nahrávat software, aniž provádíme nějaké „čarování“ s mačkáním tlačítek reset a boot – přesně tak, jak to známe z Arduina. Tam se reset mikrokontroléru provádí pomocí signálu DTR, vzpomínáte?

Další část schématu na obr. 13c ukazuje mapování vývodů na výstupní piny. Ty jsou v rozteči 2,54 mm a jsou tedy vhodné pro připojení modulu do nepájivého pole – obr. 15.

Obr. 13c: NodeMCU – zapojení interface modulu (rozteč 2,54 mm)

Obr. 15: Node MCU – příklad aplikace na nepájivém poli

NodeMCU modul je osazen dvěma tlačítky – FLASH a RST. Tato tlačítka jednak suplují ony zmiňované signály RTS a DTR, takže firmware lze do obvodu nahrát i „ručně“, jednak pomocí RST můžeme obvod manuálně „resetovat“ a tlačítko „FLASH“ lze použít v programu jako ovládací. Při běhu programu, kdy je RESET signál neaktivní, se GPIO0 dá použít ke vstupně/výstupním operacím jako ostatní piny. Za zmínku stojí připojení modré LED diody na GPIO16, která je umístěna kousek vedle CP2102. Tento pin není jen tak úplně obyčejný – GPIO16 je výstupem vnitřního RTC (Real Time Clock) časovače. Na schématu je vidět rezistor R10 s hodnotou 0 ohmů (tedy zkrat), který není standardně osazen. Jedná se o spojku – viz obr. 16. Dokud tuto propojku neosadíme, můžeme si s LED cvičit jak je libo. Pokud však spoj zkratujeme, ovládáme přímo pomocí GPIO16 pin RESET mikrokontroléru. K čemu je to dobré? Spousta senzorů pracuje periodicky a v určitých časových intervalech zasílá naměřená data. Průměrná spotřeba ESP8266 je při připojení na WiFi asi 80 mA. Pokud se čidlo probouzí např. 1× za hodinu, je jasné, že napájecí baterie čidla bude drtivou většinu času vybíjena jen proto, aby bylo čidlo připojeno ve WiFi síti. Ale pokud celý obvod uspíme – a ESP8266 umí několik tzv. sleep módů – můžeme ušetřit spoustu energie tím, že se čidlo samo dokáže probudit, změřit, odeslat data a opět usnout, kdy spotřeba je v jednotkách mikroampér. A k tomu nám sloučí právě onen RTC časovač (s výstupem na GPIO16), který jako jediný v hlubokém spánku zůstává v činnosti a odměřuje v milisekundách dobu, kdy se ESP opět probudí. A to probuzení musí proběhnout přes RESET signál – proto ono propojení GPIO16 s RESETem. Budeme li tedy chtít využít této vlastnosti, musíme buď propojit na kontaktním poli výstup GPIO16 s RST pinem, nebo to udělat pomocí spojky na pozici R10. Pokud jste zvyklí na tzv. built‑in diodu z Arduina, je to taková ta dioda jak bývá pevně na Arduinu na pinu D13, tak ta je součástí modulu ESP12 na pinu GPIO2 – také obr. 16.

Obr. 16: NodeMCU – umístění LED a modifikace pro RTC wake-up

Podobně jako Arduino s ATmega328 obsahuje i ESP8266 modul 10bitový A/D převodník. Upřímně, tento převodník není dobrý. Je pomalý, je k němu málo informací ohledně parametrů (linearita apod.) a je připojen pouze na jeden pin (ADC) – obr. 13e. Rozsah vstupního převodníku je 0–1 VDC. Na schématu NodeMCU vidíte, že je použit dělič napětí 2,2:1, rozsah napětí na pinu A0 je tedy 0–3,2 V. Pokud budeme chtít měřit více kanálů, pak je nutné připojit si vlastní multiplexer pro přepínání vstupů, nebo se spolehnout na vlastní externí A/D převodník využívající nějaké standardní rozhraní – I2C nebo SPI. Vnitřní A/D převodník lze připnout speciálním příkazem k interní napěťové sběrnici, tedy Vcc, což má velkou výhodu v tom, že můžeme bez jakéhokoli drátování a připojování měřit napájecí napětí modulu a tím stav baterie. Toto jednoduché řešení je v senzorech hojně používáno.

Obr. 13e: NodeMCU – odporový dělič pro měření napájecího napětí

Poslední částí zapojení je obvod napájení – obr. 13f. Pro regulaci napájecího napětí je použitý obvod NCP1117 nebo ekvivalent, což je 3,3 V lineární stabilizátor. Výstupní napětí je 3,3 V s proudem 800 mA (limitně 1 A). Maximální vstupní napětí je 20 V, minimální rozdíl napětí (voltage dropout) je 1,2 V. Samotné napájení 3,3 V lze do NodeMCU dodávat i externě přes pin označený 3V3. Napětí vyšší než 3,3 V přes pin Vin. Oddělení od USB napájení je přes diodu, nehrozí tedy poškození ani CP2102 ani připojeného počítače přes USB kabel.

Obr. 13f: NodeMCU – napájecí část se stabilizátorem napětí 1117

V oblasti spotřeby a úsporných módů se vedou velké spory a existuje spousta modifikací, jak použít NodeMCU pro bateriové napájení a přitom významně snížit spotřebu. Pro vývoj je to jedno – napájí se z USB, ale po připojení baterie se poměry drasticky mění. Takže nejčastější úpravou je demontáž onoho stabilizátoru 1117 a demontáž modré LED. Také je nutné odškrábnutím přerušit spoj k CP2102 ve větvi 3 V napájení. Tyto postupy jsou hojně popsány v diskuzích na internetu, kdy se jednotliví členové chlubí tím, jak se jim daří snížit spotřebu obvodu v tzv. deep‑sleep (hlubokém spánku) módu. Z dokumentace k ESP8266 vyplývá, že maximální napájecí napětí obvodu je 3,6 V, což je problém při používání jednoho článku LiON baterie, která má sice jmenovité napětí 3,6 V, ale po nabití mívá okolo 4 V. Dobrým kompromisem je zde použití LiFePO4 článku, který má jmenovité napětí 3,2 V. Osobně používám na pokusy vyřazené články 18650 z notebookových baterií, které mají pro napájení senzorů stále dostatek kapacity. Zatím jsem nezaznamenal žádné zničení ESP8266 tímto napětím – 4 V po nabití.

Popsali jsme si téměř ideální platformu pro první i složitější pokusy s obvodem ESP8266 a seznámíme se s několika tipy a triky v jazyce Wiring C pro programování ESP, než si budeme blikat diodou.

Tipy a triky pro programování ESP8266

Podívejme se tedy, co je stejné a co jiné v klasickém programování s porovnání s Arduinem:

Digital IO:

číslování pinů GPIO je shodné jako na Arduinu. Používají se příkazy pinMode, digitalRead, and digitalWrite jako obvykle, např. pro čtení pinu GPIO2 voláme funkci digitalRead(2). Piny 0–15 mohou být nastaveny jako INPUT, OUPUT nebo INPUT_PULLUP. Pin 16 může být INPUT, OUPUT nebo INPUT_PULLDOWN_16. Po resetu jsou všechny piny nastaveny jako vstupní. Piny mohou mít několik sdružených funkcí, jako sériový interface (UART), I2C nebo SPI. Tyto funkce jsou aktivovány příslušnými knihovnami – obr. 12.

Digitální piny 6–11 nejsou k dispozici, protože slouží k připojení sériové EEPROM ve většině modulů. Pokud se je pokusíte použít, způsobíte většinou pád programu. Některé moduly, např. NodeMCU, mají vyvedené také piny 9 nebo 11. Tyto piny mohou být za zvláštních podmínek použity jako vstupně/výstupní, pokud sériová paměť pracuje v tzv. DIO (dual IO) módu oproti QIO (quad IO), který je standardní po resetu. Pro přenos se potom nepoužívají 4 datové, ale jen 2 datové vodiče. To je ale opravdu jen pro fajšmekry a doporučuji k tomu nastudovat na fórech materiály.

Taktéž je podporováno přerušení generovaného signálem připojeným k pinu. Používají se standardní funkce attachInterrupt, detachInterrupt. Přerušení může být generováno kterýmkoli pinem kromě GPIO16. Taktéž nastavení pro reakci přerušení je stejné jako na Arduinu, tedy CHANGE, RISING, FALLING.

Analogový vstup:

Jak jsem zmiňoval v předešlé části, ESP8266 obsahuje jednokanálový A/D převodník, který může být buď připojen vnitřně k měření napájecího napětí, nebo externě na ADC pin. NodeMCU používá na tomto pinu dělič 2,2 : 1, kdy ovšem vnitřní reference a tedy i maximální vstupní měřitelné napětí je 1 V v rozlišení 10 bitů. Pro čtení napětí používáme příkaz analogRead(0). Při interním měření napájecího napětí MUSÍ zůstat ADC pin NEZAPOJEN a v programu použijeme konstrukci ADC_MODE(ADC_VCC); která je umístěna mimo všechny funkce, většinou ihned za #include sekcí.

Analogový výstup:

příkaz analogWrite(pin, value) povoluje použití PWM pro daný pin. Jedná se o softwarovou PWM, pro kterou může být použitý libovolný pin 0–16. Voláním analogWrite(pin,0) zakazujeme na daném pinu PWM. Hodnota value může nabývat rozsahu od 0 do PWMRANGE, který je standardně 1 023. Nastavení PWM rozsahu může být změněno voláním funkce analogWriteRange(new _range). Standardní frekvence PWM je 1 kHz. Zavoláním analogWriteFreq (new_frequency) můžeme tuto frekvenci změnit.

Časování a čekání:

jak je zvykem, millis() a micros() vracejí počet milisekund, popřípadě mikrosekund od zapnutí nebo posledního resetu obvodu. Funkce delay (ms) pozastaví vykonávání programu na daný počet milisekund a dovolí provádět činnost WiFi a TCP/IP stacku (obsluze). Pro krátká čekání můžeme použít funkci delaysMicroseconds(us) s parametrem počtu mikrosekund.

Uvědomme si, že kromě našeho programu je nutné vykonávat spoustu činností pro obsluhu WiFi a TCP/IP implementace. Obsluha těchto činností nastává při každém vykonávání smyčky loop() nebo v okamžiku volání funkce delay(). Pokud máme v programu (smyčce loop) někde činnost, která ji zbrzdí na více jak 50 ms bez příslušného volání „delay“, je dobré umělé volání delay přidat, aby nedocházelo např. k rozpadu WiFi spojení. Existuje ještě funkce yield(), která je ekvivalentní delay(0). Na druhou stranu, funkce delaysMicroseconds neuvolňuje během provádění časové sloty pro vykonávání funkcí operačního systému na pozadí, proto se nedoporučuje používat ji pro přerušení trvající déle jak 20 ms.

Sériová linka:

Objekt Serial se používá více méně jako na klasickém Arduinu. Pro obsluhu sériové linky je rezervovaných 128 bytů vyrovnávací hardwarové paměti, navíc pak 256 bytů v RAM díky SW implementaci. Příjem i vysílání znaků je tzv. interrupt‑driven, tedy pod přerušením. Při zápisu nebo čtení tedy není blokovaný chod programu čekáním na příjem nebo odvysílání znaků, které se děje automaticky z FIFO paměti. Blokování nastane pouze v okamžiku, kdy je vyrovnávací paměť plná, např. díky nevyzvedávání přijatých znaků.

Serial používá kanál UART0, který je namapován na piny GPIO1(TX) a GPIO3(RX). Sériová linka může být přemapována na piny GPIO15(TX) a GPIO13(RX) zavoláním Serial.swap() po Serial.begin. Opětovným voláním Serial.swap() dojde k navrácení UART0 na piny GPIO1 a GPIO3.

Serial1 využívá kanál UART1, kdy GPIO2 je mapován jako TX směr. UART1 nemůže být použit pro příjem znaků, neboť původní RX pin je použit pro jinou funkci. Nicméně i tak lze využít UART1 např. k posílání ladících informací (hodnoty proměnných, místa kudy program prochází) při oživování programu. Pro použití Serial1 voláme Serial.begin(baudrate).

Standardně jsou vypnuty diagnostické výstupy z WiFi knihoven, pokud zavoláme Serial.begin. Pro povolení těchto diagnostických zpráv je nutné zavolat Serial.setDebugOutput(true). Na přesměrování do Serial1 voláme Serial1.setDebugOutput(true). Jestliže budeme používat metodu/funkci printf(), je nutné také nastavit Serial.setDebugOutput(true). Oba objekty Serial a Serial1 podporují 5, 6, 7 a 8bitová slova, sudou, lichou nebo žádnou paritu a 1 nebo 2 stopbity. Pro nastavení těchto módů používáme Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2), etc.

FLASH Paměť programu:

Opět je to podobné jako u Arduina. Může obsahovat pouze read‑only data, což budou v případě ESP8266 statické webové stránky nebo texty/řetězce, kdy je pro ně škoda plýtvat RAM (HEAP) pamětí. Rozdíl je v zápisu a také v tom, že se neřeší opakování řetězců, takže pokud se vyskytnou dva stejné, každý bude zabírat v paměti svoje místo. Pro uložení do EEPROM paměti se používá zápisu F(“ „) nebo PSTR(“ „). Framework obsahuje jedno pomocné makro pro vykonání const PROGMEM metody nazvané FPSTR(). Použití tohoto makra usnadní použití sdílení stejných řetězců.

Příklad:

String response1;

response1 += F(„http:“);

String response2;

response2 += F(„http:“);

 

úspora s použitím FPSTR() vypadá takto:

 

const char HTTP[] PROGMEM = „http:“;

{

String response1;

response1 += FPSTR(HTTP);

String response2;

response2 += FPSTR(HTTP);

}

To byly tipy a triky pro přechod z Arduina na ESP a teď již první projekt s ESP a PlatformIO prostředím.

První projekt s NodeMCU a PlatformIO

Nebudeme se pouštět do žádných velkých akcí – zkusíme si rozblikat LED. Podrobnějším zkoumáním instalovaných příkladů naleznete např. jednoduchý WiFi klient, server a dokonce i WiFi scan, který vám po sériové lince vypisuje název viditelných WiFi sítí.

Založíme si nový projekt – zvolíme z horní lišty nabídek PlatformIO  Home a otevře se nám stránka „Welcome to PlatformIO“. V pravé části jsou odkazy pro rychlé přístupy – „Quick access“. Volíme „New Project“ a otevře se nám tzv. „Project Wizzard“. V nabídce Board bude vidět něco jako „Select a board (474 available)“. Zvolíme „NodeMCU 1.0 (ESP-12E module)“ a jako Framework nastavíme „Arduino“. Pokud necháme zaškrtnutou volbu „Use default location“, bude se nový projekt ukládat do uživatelské složky Dokumenty, jestliže využíváte na vašem počítači jinou strukturu, nastavíte si vlastní umístění projektového adresáře. Já jsem si projekt nazval Blink a otevřel jsem si kliknutím na main.cpp tento soubor s nachystanou šablonou a nakopíroval z internetu klasický Blink příklad – obr. 18. Samozřejmě můžeme použít odkaz „Project examples“ z „Quick access“. Tlačítky pro kontrolu syntaxe nebo nahrání programu provedeme překlad. Pro správné nahrání je nutné ještě poupravit soubor platformio.ini, nacházející se v projektovém adresáři, např. takto:

[env:nodemcuv2]

platform = espressif8266

board = nodemcuv2

framework = arduino

upload _ port = COM3

upload _ speed = 921600

První tři řádky tam už budou většinou připravené. Další musíme v editoru ručně přidat. Jednak nastavením správného COM portu zrychlíme nahrávání, protože uploader nebude prohledávat všechny existující COM porty a zkoušet, dále automaticky nastavíme nejvyšší rychlost pro zkrácení doby uploadu. Při každém překladu nebo uploadu se ve spodní části otevře okno, kde vidíme postup překladu nebo nahrávání. Jako příklad výstupu uvedu kompilaci většího programu s WiFi konektivitou:

[02/11/18 18:40:59] Processing nodemcuv2 (platform:

espressif8266; board: nodemcuv2; framework: arduino)

Verbose mode can be enabled via `-v, –verbose` option

PLATFORM: Espressif 8266 > NodeMCU 1.0 (ESP-12E Module)

SYSTEM: ESP8266 80 MHz RAM/80 KB Flash/4 MB

Library Dependency Finder (LDF)  http://bit.ly/configure‑pio‑ldf

LDF MODES: FINDER/chain COMPATIBILITY/light

Collected 26 compatible libraries

Scanning dependencies…

No dependencies

Calculating size.pioenvsnodemcuv2firmware.elf

text data bss dec hex filename

254202 1288 29896 285386 45aca.pioenvsnodemcuv2firmware.elf

[SUCCESS] Took 4.23 seconds

Samotný kód programu zabírá se všemi knihovnami 254 202 bytů, k tomu proměnné v SRAM paměti 1 288 bytů. Po překladu se vytvořil soubor firmware.elf a firmware.bin. A nahrání již přeloženého programu:

[02/11/18 18:37:39] Processing nodemcuv2 (platform:

espressif8266; board: nodemcuv2; framework: arduino)

Verbose mode can be enabled via `-v, –verbose` option

PLATFORM: Espressif 8266 > NodeMCU 1.0 (ESP-12E Module)

SYSTEM: ESP8266 80 MHz RAM/80 KB Flash/4 MB

Library Dependency Finder (LDF)  http://bit.ly/configure‑pio‑ldf

LDF MODES: FINDER/chain COMPATIBILITY/light

Obr. 18: Prostředí frameworku PlatformIO v editoru Atom

Collected 26 compatible libraries

Scanning dependencies…

Dependency Graph

|– <ESP8266WiFi> v1.0

Configuring upload protocol…

Looking for upload port…

Use manually specified: COM3

Uploading.pioenvsnodemcuv2firmware.bin

Uploading 273712 bytes from.pioenvsnodemcuv2firmware.bin

to flash at 0x00000000

……………………………………………………… [29%]

……………………………………………………… [59%]

……………………………………………………… [89%]

……………………………………………………… [100%]

[SUCCESS] Took 14.58 seconds

Vidíme, že nahrání proběhlo úspěšně [SUCCESS] a program zabírá 273 712 bytů v EEPROM paměti.

Závěr

V článku jsou popsány výhody vývojového prostředí PlatformIO, které je důstojným a profesionálním nástupcem klasického prostředí Arduino IDE. Doporučuji ho proto používat pro budoucí vývoj aplikací. Další část článku popisuje obvod ESP8266, možné vývojové moduly a také podrobněji modul NodeMCU, který je velmi vhodný pro prototypovou výrobu a pokusy. Jsou popsány rozdíly mezi klasickým Arduinem osazeným mikrokontrolérem ATmega328 a modulem s ESP8266. Na závěr je uveden příklad spolupráce vývojového prostředí PlatformIO a NodeMCU, založení projektu a jeho překlad s finálním uploadem do vývojového kitu.

Další pokračování článku uvede podrobněji operace v deep‑sleep módu, který je stěžejní pro použití v bateriově napájených senzorech. Tato technika bude ukázána na příkladu senzoru detekujícího otevření dveří a zaslání informačního emailu na nastavené telefonní číslo. Protože samotný ESP8266 se dovede probudit pouze resetem, bude funkci paměti, zda k probuzení došlo periodickou kontrolou činnosti nebo dveřním senzorem, zastávat mikrokontrolér ATtiny85 provozovaný taktéž ve sleep módu.

Ondřej Pavelka, vyvoj@onpa.cz

Literatura a odkazy:

[1] https://www.arduino.cc/

[online; cit 8. února 2018]

[2] http://platformio.org/

[online; cit 8. února 2018]

[3] https://atom.io/

[online; cit 8. února 2018]

[4] http://platformio.org/get‑started/ide?install=atom

[online; cit 8. února 2018]

[5] http://releases.llvm.org/download.html

[online; cit 11. února 2018]

[6] https://en.wikipedia.org/wiki/Maker_culture

[online; cit 11. února 2018]