Med moduli za brezžično povezovanje elektronskih naprav v internet so danes nedvomno najpogostejši tisti, ki temeljijo na čipih ESP8266/ESP32 kitajskega proizvajalca Espressif. Delo z njimi si lahko olajšamo z uporabo katerega izmed obstoječih integriranih razvojnih okolij, kot je na primer Arduino in programskih jezikov, kot sta na primer MicroPython in Lua, ali z ukazi AT, vendar nam največ fleksibilnosti omogoča uporaba razvojne programske opreme SDK (Software Development Kit) samega proizvajalca čipov.
Da bi bralce razbremenili potrebe po konfiguriranju sistema, nameščanju različnih verzij prevajalnikov in podpornih orodij, smo pripravili na spletu prosto dosegljiv navidezni računalnik z vso potrebno razvojno programsko opremo, ki vključuje tudi nov vtičnik ESP-IDF za Eclipse. V prispevku opišemo njegovo uporabo in prednosti.
Z oznako ESPx v naslovu označujemo čipe ESP8266, ESP32 in ESP32-S2, ki temeljijo na 32-bitnem mikroprocesorju Tensilica Xtensa. Namenjeni so za brezžično povezovanje naprav v računalniško omrežje (802.11 b/g/n) v t. i. projektih interneta stvari. ESP8266 je najstarejši med njimi. Njegova slabost je pomanjkanje mehanizmov za zaščito dostopa do občutljivih podatkov in kode v njem. ESP32 ima dodatno jedro, več periferije in strojno podporo šifrirnim algoritmom. Prihod čipa ESP32-S2 se pričakuje letos. Ima eno jedro, manj periferije od ESP32, vpeljuje pa USB OTG (zmožnost gostitelja USB), vmesnik za kamero in LCD prikazovalnik ter digitalno podpisovanje programske kode [4].
Ta vsebina je samo za naročnike
Nameščena razvojna programska oprema SDK temelji na operacijskem sistemu (OS) FreeRTOS. Za čipa ESP32 in ESP-S2 [1] se imenuje ESP-IDF (Espressif Internet Of Things Development Framework), za čip ESP8266 pa ESP8266 RTOS SDK [2] in je od verzije 3.0 naprej spremenjena v slog ESP-IDF, kar pomeni, da sta programska vmesnika in konfiguracija za ESP8266 in ESP32 sedaj podobna.
Pripravljeni navidezni računalnik v brezplačnem virtualizacijskem okolju Oracle VirtualBox verzije 6.1.2 z nameščenim OS Linux (Lubuntu 18.04 LTS) ima 1,5 GB delovnega in 30 GB dinamično dodeljenega zunanjega pomnilnika. Nanj nameščena orodja omogočajo razvoj aplikacij za čipa ESP8266 in ESP32 v ukaznem načinu, vgrajeni vtičnik ESP-IDF [3] pa boljšo uporabniško izkušnjo za programiranje čipov ESP32 in ESP32-S2 v okolju Eclipse. Demonstracijski video o njegovem zagonu in uporabi je dostopen na naslovuhttps://youtu.be/sU06oOD7EkA.
Zagon navideznega računalnika in preizkus delovanja
Navidezni računalnik prenesemo s strežnika na povezavi bit.ly/2vt0ZCt. Z dvoklikom na njegovo ikono in potrditvijo izbire Uvozi, ga uvozimo v VirtualBox. Po zagonu se vanj prijavimo z uporabniškim imenom in geslom espcomp.
Najprej prikažemo klasični postopek gradnje programa prek vmesnika ukazne vrstice (command line interface – CLI) v Linuxu, nato pa še z uporabo okolja Eclipse z vgrajenim vtičnikom za ESP-IDF.
Uporaba vmesnika ukazne vrstice
Za sprehajanje po imenikih lahko uporabimo grafični program »File Manager«, ki ga odpremo s kombinacijo tipk Windows+E. Znotraj domačega imenika espcomp se nahaja imenik esp, ki je naš delovni imenik za programiranje čipov ESP8266/ESP32 (slika 1 a). Imenika DELO_ESP32 in DELO_ESP8266 sta prazna imenika, namenjena hrambi naših projektov.
ESP8266_RTOS_SDK in esp-idf sta imenika s SDK za razvoj programske opreme za čipa ESP8266 in ESP32, ki med drugim vsebujeta imenik examples. Na njem je veliko delujočih projektov, urejenih po področjih (slika 2), ki jih lahko uporabimo kot izhodišče za razvoj našega projekta. V datoteki README.md je tudi dokumentacija o projektih.
Da ohranimo projekte v mapi examples nespremenjene (morda jih bomo še kdaj potrebovali v izvorni obliki), prekopiramo imenik z želenim projektom za ESP8266 v imenik DELO_ESP8266, za ESP32 pa v imenik DELO_ESP32.
Uporabo navideznega računalnika bomo demonstrirali za čip ESP32 na razvojni plošči ESP32 Dev Kit v1 podjetja DOIT na projektu hello_world, ki se nahaja v istoimenskem imeniku (slika 1 b) znotraj imenika get-started. Imenik hello_world najprej prekopiramo v imenik DELO_ESP32. Za ogled in urejanje izvorne kode aplikacije hello_world_main.c, ki se nahaja znotraj imenika main (slika 3 a), uporabimo urejevalnik Sublime Text (slika 3 b). Uporabniške aplikacije začnejo izvajanje v funkciji app_main() (slika 4). Morebitne spremembe shranimo s kombinacijo tipk Ctrl+S.
Prevajanje, odpravljanje napak, konfiguracijo, nalaganje, zagon in spremljanje delovanja programa bomo izvajali v CLI. Nahajati se moramo v vrhnjem imeniku projekta hello_world. CLI odpremo s kombinacijo tipk Ctrl+Alt+T, ki nas postavi v domači imenik espcomp, od koder se z ukazom cd esp/DELO_ESP32/hello_world premaknemo v imenik hello_world. Za programiranje čipa ESP32 zaženemo ukaz esp32, ki nastavi sistemsko spremenljivko IDF-PATH do imenika esp-idf. Modul ESP32, ki je opremljen s pretvornikom USB/UART, povežemo na računalnik. V navideznem računalniku omogočimo uporabljeni vmesnik USB/UART (kliknemo Devices -> USB -> ime uporabljenega vmesnika) za priključeni modul (slika 4), kar nam omogoča neposredno povezavo med modulom in navideznim računalnikom. Delovanje povezave USB lahko preverimo prek CLI z ukazom lsusb, ki mora izpisati ime priključenega vmesnika USB/UART. V primeru težav odstranimo kljukico pri Enable USB Controller v nastavitvah VirtualBox-a pri izključenem navideznem računalniku.
Konfiguracijo mnogih lastnosti (npr., serijski vmesnik, frekvenca ure, periferne naprave, nastavitve RTOS) lahko izvedemo prek grafičnega vmesnika, ki ga zaženemo z ukazom idf.py menuconfig (slika 5 a). Za zagon konfiguracije mora biti CLI v celozaslonskem načinu, sicer sporoči težavo »Your display is too small to run Menuconfig!«.
Projekt zgradimo in naložimo v napravo z ukazom idf.py flash. idf.py je ovojnica okrog ukaza make s priročnimi dodatki [3]. Prvo prevajanje projekta in prevajanje po vsaki spremembi konfiguracije traja dlje časa. Z ukazom idf.py monitor preverimo delovanje programa v čipu v t. i. monitorskem načinu, ki prek serijskega vmesnika komunicira z navideznim računalnikom. Izpis povzetka lastnosti uporabljenega čipa in verzije SDK za izbrani projekt hello_world ter periodično resetiranje vezja potrjuje, da se je program pravilno izvedel. Iz monitorskega načina izstopimo s kombinacijo tipk Ctrl+5.
Za čip ESP8266 najprej kopiramo projekt hello_world iz imenika ESP8266_RTOS_SDK v imenik DELO_ESP8266 (za test smo uporabili modul NodeMCU ESP8266-12E proizvajalca Lolin). V CLI zaženemo ukaz esp8266, ki nastavi sistemsko spremenljivko IDF-PATH do imenika ESP8266_RTOS_SDK. Ta spremenljivka je namreč skupna za ESP8266 in ESP32. Zgoraj uporabljene ukaze za prevajanje, nalaganje in testiranje delovanja čipa ESP32 spremenimo v ukaze za čip ESP8266 tako, da ukaz idf.py zamenjamo z ukazom make. Za brisanje znakov v konfiguracijskem vmesniku za esp8266 uporabimo kombinacijo tipk Ctrl+Backspace.
Uporaba okolja Eclipse z vgrajenim vtičnikom za ESP-IDF
Uporaba okolja Eclipse z vgrajenim vtičnikom za ESP-IDF, ki ga je Espressif predstavil v drugi polovici leta 2019, poenostavi in izboljša uporabo standardnega Eclipsa za razvoj aplikacij za čipe ESP32/ESP32-S2. Okolje zaženemo s klikom na ikono za Eclipse na namizju in potrdimo predlagano delovno področje eclipse-workspace znotraj domačega imenika.
Sedaj ustvarimo nov projekt (kliknemo File -> New -> Espressif IDF Project) in ga poimenujemo hello_world (slika 6 a). S pritiskom na gumb Finish biustvarili t. i. prazen projekt z inicializacijsko kodo za brezžično povezovanje naprave na razpoložljivo dostopovno točko. Za odpiranje projekta iz šablone kliknemo Next, izberemo možnost Create a project using one of the templates, izberemo projekt hello_world in okno potrdimo s Finish (slika 6 b).
Okolje Eclipse z odprtim projektom (oznaki 8 in 9) prikazuje slika 7. Preverimo, da nastavitve v poljih z oznakami 3, 4 in 5 ustrezajo nastavitvam na sliki. Izvedemo prevajanje projekta (oznaka 1), spremljamo njegov potek v oknu Console (oznaka 7) in naložimo program v napravo (oznaka 2). Ne pozabimo na nastavitve vmesnika USB/UART (slika 4). Za testiranje delovanja aplikacije uporabimo vgrajeni serijski terminal (oznaka 6), ki ga ustrezno nastavimo (npr., Serial Terminal, /dev/ttyUSB, 115200).
Vtičnik ESP-IDF omogoča uporabo konfiguracijskega menija neposredno iz okolja Eclipse (slika 5 b), ki ga odpremo s klikom na ikono sdkconfig (oznaka 8). Ikona se pojavi po prvem prevajanju projekta.
Posebnosti, povezane z OS FreeRTOS
Kreirana opravila v FreeRTOS-u aktiviramo z ukazom vTaskStartScheduler. Opazimo, da med primeri v imeniku examples (npr. gpio), ki vključujejo eno ali več opravil, te funkcije ni. Le-ta se nahaja v datoteki startup.c (esp8266) oz. cpu_start.c (esp32) znotraj SDK-ja, od koder je klicana vstopna funkcija uporabniških aplikacij app_main(). App_main torej predstavlja eno od opravil.
Večini sistemskih opravil, kot so na primer inicializacija sistema, periferije in datotečnega sistema, upravljanje protokolnega sklada TCP/IP, procesiranje sistemskih dogodkov v realnem času in upravljanje porabe energije, ne moremo spremeniti prioritete prek konfiguracijskega vmesnika, lahko jim le izberemo želeno jedro v primeru dvojedrnega vezja ESP32. Nobeno opravilo, ki ga ustvari uporabnik, ne sme vsebovati zank, ki bi trajale predolgo, saj s tem preprečimo nizkoprioritetnemu opravilu IDLE (za vsako jedro eno pri ESP32), da poleg sproščanja pomnilnika za zavržena opravila periodično resetira stražni časovnik opravil. Neresetiranje časovnika ima za posledico resetiranje čipa ESPx. Pod izbiro Common Esp realted, v konfiguracijskem meniju vidimo, da je privzeta nastavitev tega časovnega intervala 5 s.
Zaključek
V prispevku predstavljeni navidezni računalnik za programiranje čipov ESPx z razvojno programsko opremo proizvajalca Espressif in z vgrajenim vtičnikom ESP-IDF je učinkovita zastonjska alternativa nekaterim komercialnim rešitvam s podobno uporabniško izkušnjo (VisualGDB). Poganjamo ga lahko na različnih gostiteljskih OS. Omogoča neposredno komunikacijo z vezji ESPx. Prehod na najnovejše verzije SDK je preprost [2]. Popularno zastonjsko okolje PlatformIO podpira delo s SDK,vendarne omogoča integracije konfiguracijskega menija. Nekoliko slabšo začetno odzivnost navideznega računalnika pri uporabi razvojnega okolja Eclipse lahko izboljšamo s povečanjem delovnega pomnilnika in števila jeder za navidezni računalnik. Čeprav vtičnik ESP-IDF izboljša uporabniško izkušnjo, ki je dobrodošla predvsem za začetnike, se zdi, da je razvoj programske opreme prek CLI hitrejši, ko postanemo vešči dela na konzoli.
Literatura:
[1] ESP-IDF Programming Guide, https://docs.espressif.com/projects/esp-idf/en/latest/, [on-line 20. 1. 2020]
[2] ESP8266 RTOS SDK Programming Guide, https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/, [on-line 20. 1. 2020]
[3] Espressif IDF Eclipse Plugins, https://github.com/espressif/idf-eclipse-plugin/blob/master/README.md, [on-line 25. 1. 2020]
[4] ESP32-S2, https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf, [on-line 20. 1. 2020]