04. Arduino eljárások ESP8266 kontrollernél

Arduino alapfunkciók

Az Arduino keretrendszerben a sikeres ESP8266 kiegésztítő telepítés után rendelkezésre állnak már az alapszintű szolgáltatások. Azonban az Arduino keretrendszer minden kivezetésre és/vagy funkcióra egyedi néven utal. Ennek ismerete alapvetően szükséges a programok és az eszközök használatához. Bonyolítja a helyzetet a sokféle ESP8266 alapú eszköz - különféle kivezetés-elrendezésekkel.

A legegyszerűbben használható fejlesztőeszköz a NodeMCU lapka (ESP-12 illetve ESP-12E modullal szerelten). Ennek kivezetései:

NodeMCU lábkiosztás

Az Arduino keretrendszerben a processzorközeli utasítások, regiszterkezelések értelemszerűen nem működnek az ESP8266 alapú lapkákon. A magaszintű eljárások azonban szinte minden esetben alkalmazhatóak az ESP8266 chippel kiegészített Arduino keretrendszerben.

Az első minta

Az Arduino keretrendszerben az ESP8266 chipek használata nagyon hasonló az AVR alapú rendszerek használatához. A minták, a fordítás és a feltöltés is majdnem azonos módon történik. Az ESP8266 minták az egyes kapcsolódó eljáráskönyvtárak alatt találhatóak. A szokásos mintával lehet kezdeni a tesztelést: "Hello Word" - azaz a LED villogtató kis program. Ezt a programot a szokásos File → Examples  01.Basic → Blink útvonalon találhatjuk meg. A keretrendszerbe betöltve a D13 kimeneti LED helyét kell átírni, mert az eltér. Ha NodeMCU fejlesztőkörnyezetet használunk, akkor az ESP-12 modulon levő kék LED a D2, míg a fejlesztői panelen levő piros LED a D16 névre hallgat (ESP-01 modulon a kék LED szintén a D2 néven érhető el).
Blink program az ESP-12 (NodeMCU) chipen...
A program fordításakor kiválasztjuk az alappanelt és a kapcsolódó összes paramétert: chipsebességet, memóriajellemzőket, feltöltési portot és feltöltési sebességet. 
Paraméterek kiválasztása

Alappanel kiválasztása
Ha nem NodeMCU, hanem önálló modult használunk, akkor az automatikus reset és feltöltésvezérlés helyett nekünk kell gondoskodni a chip feltöltési módba lépéséről. Erre önálló modulok esetén (pl. ESP-01, ESP-07 vagy ESP-12) az ESP8266 firmware frissítés oldalon láthatunk mintát.
A feltöltési mód beállítása után az Arduino keretrendszerből a szokásos módon indítható a sketch fordítása és feltöltése a céláramkörbe. (A Sketch → Upload menüt választva.) A feltötés után az ESP chipet futtatási módba állítjuk és meg is láthatjuk mit tud a programunk.
Tipp: NodeMCU esetén az Autoreset és feltöltésvezérlő funkció a lapkán kialakításra került. A lényegi rész a kapcsolási rajzon:
Ez a kapcsolási rajz részlet felel annak beállításáért, hogy az ESP8266 chip frissítési vagy programfuttatási módba lépjen. Csak érdekességképpen: az ESP8266ra épülő eszközök számos módon képesek működni, függően a konfigurációs kivezetések állapotától (1-High, 0-Low, X-Lebeg(N/C)):
  GPIO0 GPIO2 GPIO15
Soros letöltés (firmware átprogramozás) 0 X vagy 1 0
Flashból programfuttatás (normál működés) 1 X vagy 1 0
Programfutás SD kártyáról (SDIO mód) 0 vagy X 0 vagy X 1

Tipp! A fejezet összes mintaprogramja elérhető a cikk végén letölthető állományként!

Alapfunkciók


Az Arduino keretrendszerben megszokott alapfunkciók az ESP chipre fordítva is működnek. Természetesen azon eljárások, melyek alacsony szinten érik el a kontrollert (pl. regiszter írás-olvasás, timer rutinok) - nem működnek. Az egyszerű I/O utasítások, szoftveresen létrehozott kommunikációs protokollok, sorosport kezelése, szoftveres időzítő illetve PWM - mind implementálásra került. A legtöbb Arduino kód magasszintű utasításokat használ - az asalcsony szintet az eljáráskönyvtárak tartalmazzák. Így, ha az alacsonyszintű rendszer-eljáráskönyvtárak a chiphez igazításra kerülnek  - az Arduino sketch az ESP8266 chipre lefordíthatóvá válik....

I/O manipulálás

Az Arduinoban már megismert alaputasítások az ESP8266 GPIO kivezetéseire használhatóak. Ezen utasítások a pinMode(), digitalRead(), digitalWrite(), analogWrite()Az eszköz GPIO0...GPIO15 kivezetéseihez rendelt paraméterek lehetnek:
  • INPUT - Bemenet,
  • OUTPUT - Kimenet,
  • INPUT_PULLUP - Bemenet, a belső felhúzóellenállás bekapcsolásával,
  • INPUT_PULLDOWN - Bemenet, belső lehúzóellenállással (Arduinoban ilyen nincs).
Az ESP modul valamely kivezetésén a kommunikáció-visszajelző LED található, itt a INPUT, OUTPUT és az INPUT_PULLDOWN használható.
Egy egyszerű LED villogtató, a klasszikus blink már korábban megismerésre került:

A nyomógomb vezérelt villogás

A programkód magáért beszél:

És hogy miért pont ezek a kivezetések? Ez van készen a NodeMCU demopanelen - amit a rajza is jól mutat...
 
Az ESP8266 modulok rajzain majdnem minden esetben feltűntetésre kerül, hogy a GPIO kivezetések közül a GPIO0, GPIO2 illetve a GPIO15 jelszintjei kötöttek - mivel ezek határozzák meg a chip indulási konfigurációját. Ezen kivezetések ki/bemenetre konfigurálása csak az alapértelmezett indulási funkciójának megfelelően javasolt - különben működési zavar lép fel! Szintén kötött  az SPI busz kivezetése is, hiszen ezen lábakon van (ESP-12 esetén a fém árnyékólón belül) az programot tartalmazó FLASH memória: így csak olyan eszközökkel használhatóak a kivezetések, amelyek nem zavarják az SPI busz kommunikációját.
Tipp! A fejezet összes mintaprogramja elérhető a cikk végén letölthető állományként!

Analóg bemenet  

Az ESP8266 chip és a vele készített ESP-07, ESP-12 modulok analóg bemenettel is rendelkeznek, erre majdnem bármit köthetünk. Azonban a NodeMCU demopanelen a kivezett ADC láb mellett egy 1:2 leosztást találunk külön kivezetve a bemenet védelme érdekében (a beépített ellenállások: 100k:220k). Itt is igaz, hogy a bemenetre kapcsolt mérendő feszültség a Vcc értékét nem haladhatja meg! Azonban a chipre jutó analóg jel csak 0...1V tartományban mérhető. Az NodeMCU lapon így az ellenállás előosztó segítségével került kiterjesztésre a mérési tartomány 0...3.3V-ra. Az itt mérhető feszültségtól függően a LED-et kigyújthatjuk vagy a kapott eredményt a PC-re is visszaírhatjuk. A beolvasás ugyanúgy, ahogyan az AVR chip esetén - az AnalogRead() utasítással történik. A mérési tartomány:0...1023 (0...1V).
A kapcsolás a lehető legegszerűbb: egy tápfeszültségre kötött potméter csúszkája került az A0 bemenetre, míg a LED-et a D16 kivezetésen a NodeMCU beépítve tartalmazza. 
 
Tipp: Az ESP8266 modulnak egyetlen analog csatornája van. Erre az AnalogRead(0) utasítással lehet hivatkozni. 
Egyes ESP8266 modulokkal való analóg bemenetek megvalósítása eltérhet. Van ahol közvetlenül került kivezetésre az A0 jelű bemenet, van ahol ellenállásosztóval mellette megtalálható a 3.3V tápfeszültséghez illesztett ellenállásosztó alapú bemenet is.
Analóg bemenet
Tipp! A fejezet összes mintaprogramja elérhető a cikk végén letölthető állományként!

Kvázi-analóg kimenet

A GPIO0...GPIO15 kivezetésekre PWM szabályozás is került, amelyet szoftveresen valósít meg a keretrendszer. A PWM tartomány 0...1023. A szoftveresen megvalósított PWM  következménye, hogy erőforrásigényes, vagy megszakítást használó program esetén a PWM kimenet ugrálni fog, a PWM kitöltési tényezője bizonytalanná válik! Ha a programban nincs ilyen hosszabb "megakadás", akkor teljesen jól használható. Például fényerőszabályozásra.
Analog kimenet szimulálása
Fontos! A GPIO16 kivezetésen nem használható a PWM meghajtás. 
Tipp! A fejezet összes mintaprogramja elérhető a cikk végén letölthető állományként!

Megszakítás

A hagyományos Arduino funkciók közül a megszakításkezelés is elérhető az integrált modulon. A GPIO0....GPIO15  kivezetések mindegyikén használható a felfutó él (Rising), lefutó él (Falling) és az élváltozás (PinChange) módú megszakítás.
Kivételek, javaslatok: a GPIO16 kivezetésre nem köthető megszakítás, illetve a GPIO6...11 kivezetések a FLASH memóriával közösek (így a megszakítás a program futásbeli problémáját okozza : egyszerűen lefagy)! Megszakítás használata esetén a pinChange interruptra állított kivezetésekre sűrű impulzust juttatva (pl. intenzív prell) - a modul watchdog miatt újraindulhat!
Megszakítás
A megszakításkezelés az attachInterrupt() illetve a detachInterrupt() utasításokkal rendelhető a kivezetéshez, paraméterként az alprogram és a használati mód megadásával. Itt is igaz az általános szabály: egszakításban csak a lehető legrövidebb időt szabad tartózkodni!

KIvezetések speciális funkciói

A legtöbb I/O kivezetésen plusz funkciók is megvalósításra kerültek - akárcsak az Arduino esetén. Azonban itt, ezek használatához a funkciót aktiválni kell! Ezt a pinMode(pin,FUNCTION_X) utasítással tehetjük meg (ahol X=0, 1, 2, 3, 4 lehet). Ilyen fontosabb funkciók például a soros port (1, 3 kivezetés), SPI busz (12..15 kivezetés), órajelek (0, 4, 5 kivezetés).
I/O kivezetések speciális funkciói
Például a másodlagos sorosport / debug sorosport aktiválása a pinMode(2, FUNCTION_2) utasítással lehetséges.

Időzítés

Az arduino keretrendszerben két fő időzítő utasítás van: a millis() és a micros(). Mindkettő működik az ESP8266 chippel is. 
Az időmérő utasítások funkcionális működése nem változott: millis() és a micros() meghívásakor a chip utolsó újraindulása óta eltelt mili- illetve mikroszekundum értéket kapjuk vissza.
A késleltetést a delay() utasítással rakhatunk a programba, ezzel a megadott milisec várakozást érhetünk el. Ennek rövidebb idejű párja a delayMicroseconds(), amivel microsec idejű várakozások iktathatóak a programba. Fontos! A késleltetések a WiFi/TCPIP feladatok (taszkok) futását nem függesztik fel!

A modul alapvető funkciója a WiFi kapcsolat működtetése. Az Arduino leple mögé nézve látható, hogy a delay() alatt illetve a loop()-ban levő utasítások lefutása után időszeletet a WiFi kezelés és a TCP/IP stack. Ha a programban valahol 50 msec-nél hosszabb utasítőssor van (és ebben delay() sincsen), akkor a hálózat kezelése nagyon le fog lassulni!

A yield() utasítás megegyezik a delay(0) utasítással.

Javaslat: 20 milisec-nél hosszabb várakozás ne szerepeljen a programban...

Az Alábbi Arduino funkciók is implementálásra kerültek az ESP8266 chip kezelése során:

  • Sorosport kezelése a kommunikációhoz,
  • Progmem a SRAM memória szabadon tartásához konstansok esetén,
  • WiFi eljáráskönyvtár a WiFi kezeléshez,
  • Ticker periódikus Timer alapú ismétlődő programrészekhez,
  • EEPROM kezelés a FLASHból kihasított helyen,
  • IIC/Wire kommunikáció master része (Slave nem implementált),
  • SPI kommunikáció (SPI_MODE0 és SPI_MODE1),
  • OneWire a Dallas-busz kezeléshez,
  • Servo a szervomotorok irányításához.
 
Források:
 
Mintakódok
 

TavIR-Facebook