02. AT parancsok használata Arduino alatt (WEB-szerver és WEB-kliens)

Az ESP8266 chip számos belső funkcióval bír, miközben egy egyszerű soros-wifi átjáróként kezdte a pályafutását. Valójában a beszédes blokkdiagram mutatja meg a valódi belsejét:

A modul egyszerű felhasználhatóságát könnyíti meg a gyári firmware, melyen át egyszerű AT parancsokkal programozható a WiFi eszköz. A parancsok közül a jellemzőbbeket jártuk körbe a korábbi fejezetben. Azonban komplexebb adatgyűjtő, kommunikációs alkalmazás csak külső mikrokontrollerrel valósítható meg - a soros kommunikáció adottságait kihasználva.

Mielőtt a rendszert használatba vennénk…

A legegyszerűbb soros kapcsolatoknál a Tx-Rx kivezetéseket keresztbe kell kötni. Ez az ESP8266 modulok esetén azonban problémát okoz: míg az Arduino 5V-ról, az ESP8266 pedig 3.3V feszültségről üzemel. A kivezetések közvetlen összekötése az ESP8266 chip károsodását okoz(hat)ja! Az ESP chip védelemként csak a bemeneteken levő tápfeszültség fele nyitó diódákat tartalmazza és a bemenetei  nem 5V toleránsak!

A megoldás a jelszintillesztés. Erre többféle megoldás is lehetséges:

  • soros áramkorlátózó ellenállással,
  • ellenállásosztóval,
  • Zener diódával,
  • kétirányú szintillesztővel.

A leggyakoribb megoldás az ellenállásosztóval az 5V→3.3V szintillesztés.

A modul néhány kivezetésének jelszintje kötött a normál működéshez, így ezeket fix feszültségre kell kötni: CH_PD – magas szint, Külső reset - magas szint.

 

Arduino UNO - ESP-01 összekötése (Ellenállás: 2k2 és 1k)

 

A modul ezzel már működésre kész is.

A szoftver

Az 5V-ra előkészített modullal immár tudunk az 5V-os rendszerünkkel kommunikálni. Azonban felmerül a kérdés, hogy az Arduino lapra hogyan kössük be a modult, mert az Uno/Diecimilla csak egyetlen soros portot tartalmaz. A korrekt működéshez minimum két sorosport kellene: egy a WiFi kommunikációhoz egy másik pedig a debughoz (hibakereséséhez, állapotkövetéshez). És valamelyiken át a szoftverfrissítés/programozást is meg kell oldani (célszerűen a debug sorosporton át).

Alappanel Kontroller Soros port
UNO, Diecimila, Pro Mini, ... ATMega328p 1x
Mega ATMega2560 4x
Leonardo, Pro Micro, ... ATMega32U4 1x; 1x USB
Due SAM3X8E 4x; 1xUSB

A Leonardo illetve az Arduino Mega/Due már meg is felel a célnak, hiszen mindkettő legalább két soros illesztést tartalmaz (Leonardo/Due esetén az USB port sorosportkénr érhető el). Azonban a fiókban éppen az Uno  érhető el....

Erre a hiányzó soros portra ad megoldást a szoftverből emulált soros port. Így a WiFi modul felé vétel és az adás is biztosíthatóvá válik. Arduinoban erre a NewSoftSerial eljárás használható (a megkötésekról, hátrányokról a "Mit ne használjuk..." cikkben már volt szó: http://tavir.hu/konyv-tipushiba-2-softwareserial). A legfontosabb kitételek: kötött, hogy melyik lábon lehet a Tx illetve az Rx funkció, valamint a stabil kapcsolat biztosítására szoftveres sorosport sebessége nem lehet több, mint 19.200 bps!

Az ESP8266 modul alapértelmezett sorosporti sebessége 9.600 bps vagy 115.200 bps (firmwarefüggő). Ezt átállítani például közvetlen PC kapcsolatról lehet az AT+UART_DEF=19200,8,1,0,0 vagy AT+CIOBAUD=9600 paranccsal. (Azt, hogy melyik parancsot érti a modul - a firmware határozza meg. A +CIOBAUD paramétermódosító utasítás a gyakoribb.)

 

Soros sebesség átállítása 115.200bps-ről 9600bps-re

A modul tápellátását kell még megoldani, hiszen 3.3V-ról működik. Erre a kézenfekvó megoldás az Arduno lapkán jelenlevő 3.3V feszültség. Azonban az ESP8266 WiFi modul áramfelvétele kedvezőtlen esetben 350 mA is lehet! Ezt az Arduino lapka nem tudja biztosítani. Szerencsére ez csak távoli, gyenge WiFi-re kapcsolódáskor áll fenn. Ha bizonytalan működést tapasztalunk, mindenképp járulékos 3.3V stabilizátort használjunk! Fontos! Diecimila/Duenilanove esetén a 3.3V-os tápág max. 50mA terhelhetőségű - az ESP chip még alapszinten is csak akadozva működik! Az UNO esetén a 3.3V ág terhelhetősége 150 mA. Így itt az ESP8266 beüzemelési kísérletet siker koronázza.

A teljes hardware megvalósítás így néz ki:

 

3.3V stabilizátorral (pl. LM33, LM1117-33) és a kimenetén a 100nF hidegítő kondenzátorral

A software maga felel a rendszer működéséért. A legegyszerűbb parancsokat a PC-ról is letesztelhettük az előző cikk alapján. A mikrokontrolleres áramkört hogy ne kelljen megbontani, egyszerű soros átjárószoftvert készítünk:



A képre kattintva a szoftverminta letölthető.

A tesztelés a legegyszerűbb: a program fordítása és letöltése után nyissuk meg a terminálablakot és adjuk ki az AT parancsot. Ha mindent jól csináltunk, akkor OK-t kell kapni. Ha nem így lenne, akkor az alábbi lehet ennek az oka:

  • a WiFi modul 9.600bps helyett még mindig 115.200bps sebességgel kommunikál,
  • ellenőrizzük a tápfeszültség bekötését, tápfeszültség meglétét,
  • WiFi modul helyén Tx-Rx nullkábelt (vagy egyszerű összekötést) használjunk (a kiadott paracsot kell látnunk visszhangként).

A transzparens illesztőalkalmazás Arduino Diecimila/UNO esetén a SWserial és a beépített USB-sorosport (eszközön áthaladó) átjárást illeszti, Leonardo esetén az USB-HWsoros és az USB-SWsoros megvalósítás érhető el (Katt az előző (felső) képre)

Ha minden működik, akkor az Arduino alá telepítsük fel az ESP8266 chiphez készült valamelyik  eljáráskönyvtárat. Ebben a főbb funciók már leprogramozásra kerültek, ahogy a modulválaszok kiértékelése és a debug is. A kísérlethez az ESP-07 modult használtam:

Access Pointok listája - az első szoftver

Az első mintaprogram segítségével a környékbeli, elérhető WiFi access pointokat, Routereket térképezzük fel. A mintaprogram az ESP8266 függvénykönyvtár alkalmazásai közt található.

A program a sorosportok beállítását, a wifi inicializálást végzi. Majd az elérhető Acces Point-ok kerülnek lekérdezésre és listázásra.

Az eredmény úgy néz ki, mintha az adatsor csonkolásra kerülne. Ez a probléma azonban nem a WiFi modul hibája, hanem az Arduinoé. Ugyanis a Wifi modul elküldi a kért adatokat, a mikrokontroller közben meg mással van elfoglalva. A sorosporton jövő adatokat begyűjti. Amikor egy karakter beesik, a háttérben a sorosport kezelő függvény meghívásra kerül. Kiolvassa a vett jelet, átrakja a soros bufferbe. Mindez addig ismétlódik, amíg a buffert ki nem olvassuk, vagy be nem telik. A buffer betelése után van még 3 byte hely a hardware bufferben - de ez is megtelik. A továbbiakban az érkező karakterek elvesznek. Ezt láthattuk korábban a csonkolt kiírásnál.

De mi a megoldás?

  • átszervezzük a programot - azonban nem lehet annyira átsruktúrálni általában, hogy a soros jelfolyamot azonnal feldolgozzuk.
  • megnöveljük a buffer méretét...

Nagyobb, hosszabb, vágatlan...

A sorosport kezelése a hardwareserial eljáráskönyvtárhoz tartozik. A definíciók a hardwareserial.h paraméterállományban, míg maguk a használatot biztosító eljárások a hardwareserial.cpp programkódban érhető el. A nekünk kellő sorok:

A buffer jelenlegi 64 byte-nyi méretet növeljük meg, akár 128 byte-ra vagy nagyobbra. (Hardware sorosportonként külön-külön állítható a bufferméret!) Fontos! A buffer a SRAM memóriát használja, így kisebb chip esetén kifutatunk a memóriából! Ezt onnan látjuk, hogy a  programunk"összevissza" fut, hibázik és időnként lefagy. Viszont ezek az eseménysorok reprodukálhatóak (így különböztethető meg a táphibától, hardware- és kontakthibától - amely jelenségek véletlenszerűek).

Ha az eszközünk szoftveres sorosportot használ, ott is meg kell növelni a buffer méretét. Ezt a softwareserial.h fájlban tehetjük meg:

Ha Arduino 1.6.x verziót használunk, ott fordításkor tájékoztatást is kapunk a szabad SRAM területéről is.

A megoldás megkerülése

A nagyméretű soros bufferek fixen, már a program futásának elejétől foglalják a szűkre szabott SRAM területet. Érdemes lenne csak a felhazsnáláskor foglalni csak, és utána felszabadítani, hogy más programrészlet ne szoruljon meg a memóriahasználat korlátozása miatt. Erre a C nyelv (illetve a fordító) ad lehetőséget: azon változók, melyek csak egy eljáráson belül kerülnek definiálásra majd felhasználásra - a rutinból kilépve ez a lefoglalt memóriaterület felszabadul.

Az előző - Access Point-okat listázó program - átírva az ideiglenes memóriahasználó változatra: az eredmény magáért beszél (az elérhető access point-ok listája):

  

A sorosporti bufferméret módosítással illetve programszervezési megoldással az adatvesztés eltűnik. Azonban a soros kommunikáció Arduino-hardware korlátjáról nem esett még szó...

Sorosporti sebesség-problémák

Az Arduino eszközünk a WiFi modukkal 115.200 bps vagy 9.600 bps sebességgel tudnak kommunikálni. Ha megnézzük az ATMega328P vagy a ATMega2560 chip adatlapját, akkor a sorosporti sebességnél az alábbi táblázat látható:

Azaz, ami látszik: a 16 MHz kvarc esetén a 115.200 bps helyett a tényleges sebesség 111.111 bps (-3.5%). A legtöbb eszköz esetén a névleges és a valós sebesség közt az eltérés nem lehet több, mint 0,5%! Ha ennél nagyobb a hiba, akkor kommunikáció fokozatosan szétcsúszik. Ilyen esetben megoldás lehet:

  • rövidebb adatcsomagok kiküldése. Így minden csomag indulásakor a szinkronitás visszaáll és az elcsúszásból származó hibák elrejtve maradnak.
  • kisebb/más sebességre kapcsolunk, ahol az eltérés kisebb. AVR és ESP chip esetén a 9.600 bps jónak tűnik a 0,16% hibájával.
  • a küldő és a fogadó azonos irányban és mértékben térjen el a névlegestől. Ilyen például az Arduno Uno/Mega esetén a központi chip soros sebességének -2,16%-os eltérése, ahogyan a soros-USB átjáró áramkörnek szintén ugyanennyi hibája. A két chip relatív hibája így 0%, azaz stabil, elcsúszásmentes lesz az átvitel.

Az ESP8266EX WiFi modulnál a megoldás lehetőség szerint a 9.600 bps kommunikációs sebesség beállítása. Ezt a korábban említett AT+UART_DEF=19200,8,1,0,0 vagy AT+CIOBAUD=9600 paranccsal tehetjük meg, vagy a firmware frissítésével orvosolhatjuk. Az ESP chipben eredetileg levő firmware meghatározza, hogy milyen sebességgel kommunikálhatunk alapértelmezetten. A tapasztalat:

  • 115.200 bps: V0.9.5.0 (ESP-07), V0.9.5.2 firmware (ESP-07; ESP-01 (kék; 512k)), 00170901 (ESP-01 (kék); ESP-12; ESP-12E)
  • 9.600 bps: 0018000902 (ESP-01 (barna, 1MB)), 0.1 rev. b59a35d (ESP-12E)

Természetesen ezek átírhatóak 9600 bps sebességre (az AT+CIOBAUD=9600 utasítással).

Arduino alkalmazáscsomag

Az ESP8266 chipre épülő webszerver különleges alkalmazása az Access Pointtal kombinált webszerver. Ekkor nem kell a modullal a helyi hálózatra sem csatlakozni, önállóan mindent kiszolgál. Accesspoint módban a modul IP címe kötött, és a böngészőeszközben az elérhető hálózatok közt jelenik meg. Ekkor egyszerűen rácsatlakozunk az eszközre, mint WiFi pontra, majd utána egy böngészőt indítva megszólítjuk. Az eszköz, - mint webszerver - visszaadja a beépített lapot - melyet mi programoztunk rá. Fontos! Az eszköz IP címe fix:192.168.1.4.

A modul egyszerű AT parancsokkal való kezelése a legkönnyebben önálló függvénykönyvtárral valósítható meg. Erre számos gyártó, számos alkalmazáscsomagja létezik. A megvalósítások (felsorolás-szerűen):

  • hálózaton kliensként viselkedik az eszköz - külső honlap letöltése,
  • a modul egyidejűleg lehet access point és kliens is - access point-on át lehetséges a konfigurálás, majd a klienskénti csatlakozás az így beállított hálózatra,
  • TCP szerver illetve kliens,
  • UDP szerver illetve kliens.

Az összeállított eljárásgyűjtemény ide kattintva tölthető le.

Összefoglalásul

Az ESP8266 modulok egyszerű AT parancsokkal kezelhetők, Ez gyors, kiszámítható működéssel párosul. Azonban felmerül a kérdés: az eszköz belül tartalmaz egy gyors processzort - nem lehetne csak azt használni? A következő fejezet ennek előnyeit és hátrányait járja körbe.

Kapcsolódó fórum:



Felhasznált források:



Teszteléshez felhasznált eszközök:

TavIR-Facebook