Avtor: Simon Vavpotič
2020_290_
ESP8266 Wi-Fi moduli, kot majhna, enostavna in učinkovita 32-bitna osnova za gradnjo naprav in sistemov interneta stvari (IoT), že leta burijo domišljijo programerjev. Čeprav so novi navadno predprogramirani kot brezžični Wi-Fi modemi, jih lahko z lastno programsko opremo spremenimo v samostojne krmilnike enostavnih IoT naprav.
V preteklem članku smo se najprej lotili razvoja pametnega polnilnika akumulatorskih baterij, potem pa si ogledali še razvoj lastne vgrajene programske opreme za komunikacijski most med USB in RS232 na osnovi PIC18F14K50 (opcijsko tudi MCP2200), ki ga lahko v lastnih ESP projektih uporabimo tudi kot RS232 razširitveno vezje za dodatne vhodno-izhodne priključke in ostale funkcionalnosti, ki so vgrajene v PIC18 mikrokontrolerje. Vsekakor idej ne manjka, še posebej zanimivo pa je, ker za vse potrebujemo le en dodatni čip, ki bi ga že tako ali tako potrebovali za programiranje ESP modula.
Tokrat bomo na osnovi ESP32 spoznali princip izdelave preprostega osciloskopa, se ukvarjali z merjenjem signalov, merili točen čas in snemali zvok. Preizkusili bomo tudi Bluetooth povezavo, .
Ustvarjanje in merjenje signalov
ESP32 ima vgrajena 8-bitna D/A pretvornika, s katerima lahko na vratih GPIO25 in GPIO26 z 8-bitnima D/A pretvornikoma ustvarjamo analogne signale, za kaj več potrebujmo namenski D/A pretvornik, ki ga običajno povežemo prek SPI vrat, denimo 12-bitni Microchipov MCP4822. Brez težav ustvarimo tudi hitre digitalne signale s frekvenco nekaj MHz. Povejmo tudi, da ima ESP8266 le en GPIO, ki ga lahko izkoristimo kot analogni vhod, vseeno pa sicer ni ovir, da ga ne bi mogli uporabiti kot enostaven enokanalni osciloskop.
Ta vsebina je samo za naročnike
Vsekakor pri zajemanju vzorcev signala ne smemo pozabiti na časovno sinhronizacijo. Ena izmed enostavnih programskih implementacij na osnovi zajema vzorcev iz A/D pretvornika, je proženje obdelave signala na prednjo fronto, ki signal iz negativne vrednosti preide v pozitivno, ali na zadnjo fronto, ko signali iz pozitivne vrednosti preide v negativno. Pri tem moramo ločiti med vzorčenjem, ki lahko poteka neprestano in obdelavo signala, s katero določeno zaporedje vzorcev pripravimo za vizualni prikaz uporabniku. Če imamo na voljo dovolj zmogljivo žično ali brezžično povezavo, ali možnost hitrega shranjevanja podatkov v pogon za masovno hrambo podatkov, lahko shranjujemo tudi grobe pakete podatkov (celoten vzorčeni signal), v enakem zaporedju in brez prekinitev kot prihajajo iz A/D pretvornika in jih kasneje programsko obdelamo. Vsekakor je pri tem dobrodošla hitra žična Ethernet povezava z osebnim računalnikom, ki ima tudi možnost kakovostnega prikaza podatkov na velikem monitorju.
Domači osciloskop
Pri izgradnji strojne opreme enostavnega domačega osciloskopa si lahko pomagamo tudi s katero od električnih shem doma izdelanih osciloskopov na spletu. Najpomembnejši je vhodni ojačevalnik/slabilnik signala, s katerim slednjega prilagodimo na razpon napetosti med 0 V in +1 V, pri čemer moramo poznati tudi način preslikave analognih napetosti iz merilnega obsega na razpon digitalnih vrednosti med 0 in 4095 (imamo 12-bitni A/D pretvornik). To je pomembno, saj želimo z osciloskopom meriti ne samo obliko signala, temveč tudi kako se njegova napetost spreminja po času, kot to lahko počnemo pri vsakem profesionalnem osciloskopu.
Kakorkoli, način izgradnje vhodnega ojačevalnika/slabilnika signala za enkrat pustimo ob strani, saj je za to na spletu dovolj načrtov, ki jih sorazmerno enostavno prilagodimo, in se lotimo razvoja ugnezdene programske opreme. Naloga ESP32 modula je zajemanje vzorcev iz A/D pretvornika in njihovo vmesno shranjevanje, lahko pa tudi njihova predobdelava za prikaz. Slednja možnost je uporabna predvsem takrat, ko nimamo na voljo dovolj hitre ali dovolj zanesljive povezave z osebnim računalnikom, ali pa želimo le klasično funkcionalnost osciloskopa, ne pa tudi shranjevanja vseh izmerjenih vrednosti.
Pri pisanju nekoliko bolj zaresne programske opreme, kot so enostavni Arduino primeri, ki uporabljajo funkcijo analogRead(<številka GPIO, ki omogoča branje analognih vrednosti>), datoteka glave esp32-hal-adc.h ponudi še kopico funkcij. Z njimi določimo čas vzorčenja, stopnjo ojačenja vhodnega signala (analogSetPinAttenuation – za posamezen kanal, analogSetAttenuation – za vse kanale, vrednosti: 0 dB, 2,5 dB, 6 dB in 11 dB) in ločljivost A/D pretvornika (analogReadResolution – logično med 1 in 16 biti, vendar strojno med 9 in 16 biti, analogSetWidth – med 9 in 12 biti), vsekakor pa tudi čas vzorčenja (v obsegu med 1 in 255 ciklov).
Po drugi strani, lahko A/D pretvorbo s funkcijo adcStart(<številka GPIO, ki omogoča branje analognih vrednosti>) sprožimo tudi brez čakanja na dokončanje A/D pretvorbe. Nato s funkcijo adcBusy(<številka GPIO, ki omogoča branje analognih vrednosti>) ugotovimo, kdaj je digitalna vzorčena vrednost signala na izbranem priključku na voljo.
Zdaj je na vrsti razvoj programske opreme za sprotni prenos podatkovnih paketov iz ESP32 v osebni računalnik, pri katerem se lahko zgledujemo po primeru ugnezdene programske opreme za ESP32-CAM modul, pri katerem poteka sproten prenos zajetjih slikovnih podatkov iz ESP32 v osebni računalnik, tablico ali pametni telefon prek Wi-Fi povezave. Namesto te lahko vsekakor uporabimo tudi ožičeno Ethernet povezavo, ki zagotavlja višje hitrost, varnost in zanesljivost prenosa podatkov.
Namesto tega se lahko odločimo zgraditi aplikacijo za opazovanje oblika signalov kar v obliki naprednega spletnega strežnika, ki lahko, kot smo videli v SE284, sproti prikazuje tudi grafikone, v našem primeru izriše potek izmerjene napetosti. V tem primeru poteka zajem podatkov, priprava podatkov, kot tudi njihova priprava za prikaz kar v ESP32 ali ESP8266.
Kako najenostavneje merimo in nastavljamo realni čas?
Čeprav se zdi merjenje realnega časa v osnovi enostavno, je ura realnega časa tudi v ESP32 na voljo le, če jo poganja 32,768 kHz kristalni oscilator. K sreči je na voljo tudi števec mikrosekund, ki so pretekle od njegovega zagona. Zato je mogoče dokaj natančno meriti realni čas tudi s pomočjo standardne programske knjižnice, vgrajene v Arduino IDE razvojno okolje. Vendar moramo uro ponovno nastaviti vsakokrat, ko ESP modul ponovno zaženemo. Kako to narediti, lahko vidimo na primer v primeru spletnega radia, ker se čas naloži kar iz enega izmed javno dostopnih spletnih časovnih strežnikov. Medtem, ko lahko ročno nastavitev časa izvedemo tako, da uro in datum (leto, mesec, dan, ure, minute, sekunde) vnesemo v programsko strukturo tipa tm, iz te pa s funkcijo mktime v tip time_t oziroma 32-bitno celo število, ki natančno določa trenutni čas.
Realni čas smo merili že v tretjem nadaljevanju, ko smo omenili funkcije za branje in nastavljanje RTC (ure realnega časa) ter branje in nastavljanje sistemskega časa, ki temelji na sistemskem časovniku mikrosekund. Bolj uporabno je slednje, saj potrebujemo za pravi RTC dodatni resonator s 32,768 kHz, kar je tudi dejansko standard pri ostalih mikrokontrolerjih, saj to omogoča natančnejše merjenje časa, pri katerem lahko napako ure merimo v sekundah na mesec in ne v sekundah na nekaj dni.
<Program 1> File fsettm; struct tm Xnow; getLocalTime(&Xnow,0); sprintf(tmx," %d.%d.%d %d:%d:%dn ",Xnow.tm_mday,Xnow.tm_mon+1,Xnow.tm_year+1900,Xnow.tm_hour,Xnow.tm_min,Xnow.tm_sec); if((fsettm=SD.open("/tm.txt","w"))!=NULL){ for(i=0;i<=100;i++)if(!tmx[i])break; fsettm.write((uint8_t *)tmx,i); fsettm.close(); }
Program 1: Zapis trenutnega sistemskega časa v standardni obliki v datoteko
<konec programa 1>
Primer prikazuje, uporabo vnaprej določene strukture tm, s katero lahko čas, ki omogoča členjenje časa, ki ga v 32-bitni obliki vrne funkcija getLocalTime. Naslednji korak je zapis posameznih vrednosti v zapisu lasa (leto, mesec, dan, ura, minuta, sekunda) v človeku prijazni obliki, v zadnjem koraku pa to zapišemo v datoteko tm.txt, ki je ustvarimo ali prepišemo na SD kartici.
Napredno delo z znakovnimi nizi – stringi
Po kopici primerov, ki so na voljo v sklopu Arduino razvojnega okolja, se zdi, da je premetavanje besedila in izpisovanje številčnih vrednosti v desetiškem ali šestnajstiškem zapisu enostavno, vendar se nemalokrat zatakne pri najbolj osnovnih opravilih, kot je analiza ukaznega znakovnega niza, ali pri pretvorbi iz enostavnega znakovnega niza, oziroma pomnilniškega polja tipa char, v kompleksni znakovni objekt String, ki poenostavlja delo z znakovnimi nizi. Hkrati nekatere funkcije kot vhodno argument sprejemajo String, druge pa kazalec na polje znakov (char *).
Sestavljanje znakovnih nizov je najenostavnejše z objekti tipa String, saj lahko s stringi manipuliramo podobno kot s števili. Denimo, dovolj je, da za neko spremenljivko določimo, da je string in že ji lahko s pomočjo enačaja priredimo tekst med narekovaju, ali pa tekst s pomočjo operatorja »+=« enostavni dodamo. S funkcijo String(<vrednost>,<način pretvorbe>) lahko v stringe spreminjamo tudi številčne vrednosti iz konstant ali spremenljivk. Denimo, funkcija String(adc_val,DEC) vrne znakovni zapis vrednosti adc_val v desetiški obliki, medtem, ko funkcija String(”n”) vrne vrednost ASCII 0, ki označuje konec enostavnega znakovnega niza (char *).
Dobra plat dela s stringi predstavljajo tudi številne funkcije, s katerimi lahko na enostaven način izvemo iskane lastnosti znakovnega niza. Denimo, če je spremenljivka tekst tipa String, izvemo njeno dolžino v bajtih s preprostim klicem tekst.length(). Zelo uporabni sta tudi funkciji tekst.startsWith(<spremenljivka ali konstanta tipa String>) in tekst.indexOf(<spremenljivka ali konstanta tipa String>). Prva pove, če se znakovni niz tekst začne z znakovnim nizom, ki ga podamo kot argument, druga pa, vrne pozicijo v stringu tekst, od katere naprej se začne znakovni niz, ki ga podamo kot argument. Med funkcijami velja izpostaviti še tekst.substring(<spremenljivka ali konstanta tipa String>, <od pozicije>,<do pozicije>), s katero lahko iz stringa izrežemo podstring. To je še posebej uporabno pri gradnji ukaznega interpreterja, saj lahko npr. s funkcijo argumenti= tekst.substring(tekst.indexOf(”UKAZ”)+1) v string argumeti prenesemo samo vsebino za besedo UKAZ. Če kot ukaz v spremenljivko tekst vnesemo besedilo »UKAZ 71,A,9«, bomo v argumentih dobili vrednost »71,A,9«, ki jo lahko nadalje členimo in skladno s tem vplivamo na delovanje ESP32 kar med njegovim delovanjem. Zdaj pa se lotimo snemanja zvoka s kodekom VS1053, pri katerem bomo na praktičnem primeru preverili, kako lahko uporabimo omenjeni interpreter tekstovnih ukazov.
Kako pripraviti VS1053 modul za povezavo z ESP32?
V SE288 in SE289 smo VS1053 modul uporabili pri gradnji spletnega radia. A povejmo, da vsi tovrstni moduli niso enaki. Novejši uporabljajo 3,3 V in 2,5 V napajanje, starejši moduli pa 3,3 V in 1,8 V napajanje. Za povezavo na HSPI vodilo ESP32 (signala MISO in MOSI), morajo biti povezovalni vodniki brez upornosti proti napajanju ali proti masi. V nasprotnem, ni mogoč zagon ESP32 iz EEPROM čipa v modulu, oziroma je ESP32 neuporaben. Nekateri (starejši) moduli (sam imam enega na zelenem tiskanem vezju) teh upornosti nimajo in delujejo normalno. Kljub temu, lahko odvečne upore odstranimo iz tiskanega vezja, kot vidimo tudi na sliki. Obenem dodamo upornosti proti napajanju za priključke, s katerimi izbiramo različne naprave, s katerimi ESP32 komunicira prek HSPI vodila. Namesto HSPI vodila lahko uporabimo tudi VSPI vodilo, vendar potem ne morem hkrati povezati tudi LAN8720A modula za ožičen Ethernet.
Snemanje zvoka z VS1053 avdio kodekom
Zakaj ne bi izkoristili vseh funkcionalnosti, ki jih ponuja kodek VS1053? Čeprav se na prvi pogled zdi, da je VS1053 le kodek za predvajanje glasbe in zvoka v različnih zapisih, ga lahko sprogramiramo tudi za samostojno delovanje. Je pa res, da v nasprotju z ESP32 in ESP8266 ne omogoča brezžične povezljivosti, česar se zaveda tudi proizvajalec VLSI (www.vlsi.com), ki na svoji spletni strani med množico primerov uporabe VS1053 navaja tudi spletni radio z ESP8266. Mi smo v preteklih nadaljevanju spoznali naprednejši spletni radio z ESP32.
Vsekakor je že pri nakupu VS1053 modula, ki ima poleg izhoda za slušalke ali avdio ojačevalnik tudi linijski vhod in celo mikrofon, vsakemu elektrotehniku jasno, da modul zmore še veliko več od predvajanja glasbenih datotek in zvokovnih tokov iz interneta. Malo se zatakne le pri ugnezdeni programski opremi, saj snemanja zvoka Espressif Systemsova knjižnica, ki je del IDFa, ne podpira. Vendar na spletu najdemo novejšo Adafruit-ovo knjižnico s primerom shranjevanja mono zvoka pri 44 kHz vzorčenju v formatu OGG. Nekoliko podrobnejši pregled knjižnice razkrije, da je ta prilagojena tudi za ESP8266 in ESP32, saj ima vgrajene dele programske kode, ki se aktivirajo, ko jo prevajamo za omenjena modula.
Vseeno moramo v priloženem primer, record_ogg, popraviti poti do ključnih datotek v datotečnem sistem mikro SD kartice, kjer na začetku dodamo še »/« pred vsakim od imen datotek pa tudi nastaviti pravilne priključke, prek katerih je ESP32 ali ESP8266 povezan z VS1053. Če kot snemalnik zvoka uporabimo kar spletni radio iz SE288 in SE289, pri tem za priključek reset na VS1053 izberemo vrednost -1, saj je reset vezan na ESP32 priključek enable (EN) in ga ne moremo programsko upravljati iz ESP32. Reset ESP32 in VS1053 se tako izvede ob priklopu napajanja, ali prek programatorja. Vsekakor lahko spremenimo vezavo in ta priključek zvezan na enega od prostih GPIO ESP32.
Zdaj se lahko lotimo snemanja zvoka! Adafruit primeru record_ogg je priložen vtičnik (plugin) za VS1053, ki ga moramo odložiti na datotečni sistem SD kartice, na katero bomo snemali zvok. Vtičnik vsebuje program, s katerim VS1053 zajema zvok, ga pretvarja v zapis OGG in vmesno shranjuje v izravnalnike v svojem RAMu. ESP32 bere zvok iz izravnalnikov VS1053 preko SPI povezave in ga shranjuje na mikro SD kartico. Pred leti so nekateri skušali zvok iz VS1053 zajemati tudi neposredno iz njegovega A/D pretvornika, vendar je bila kakovost izjemo slaba, saj brez vmesnega shranjevanja ne gre, ker mora ESP32 poleg snemanja zvoka opravljati še druge naloge.
Po številnih predpripravah sem se končno lotil testiranja originalnega primera record_ogg in bil razočaran. Medtem, ko je bil prvi posnetek povsem uporaben, so bili ostali za odmet, saj VS1053 sploh ni posnel zvoka, ampak zgolj 1024 bajtov neuporabnih podatkov. Izkazalo se je, da je treba pred vsakim snemanjem vtičnik ponovno naložiti v VS1053, potem je delovalo.
Ampak na vprašanje, ali lahko zvok snemamo tudi pri drugih ločljivostih in tudi dvokanalno iz linijskega vhoda namesto iz mikrofona, mi k sreči ni bilo treba dolgo iskati odgovora. Moral sem iti le na spletno stran www.vlsi.com, kjer najdemo kopico primerov uporabe VS1053, razvojno okolje in programske knjižnice, pa tudi že prevedene vtičnike, s katerimi lahko zamenjamo originalni vtičnik iz primera record_ogg. Za snemanje iz linijskega vhoda namesto iz mikrofona je treba pri klicu funkcije startRecordOgg(<vir zvoka>) nastaviti <vir zvoka> na false, medtem ko ima pri snemanju iz mikrofona vrednost true. Zanimivo je če, da moramo pred vsako ponovitvijo snemanja ponovno naložiti tudi ustrezen vtičnik, kar naredimo z ukazom prepareRecordOgg(<ime datoteke z vtičnikom na kartici SD>). Opozorimo še to, da omenjeni funkciji kličemo iz avdio objekta za dostop do funkcionalnosti VS1053. Če definiramo avdio objekt kot Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS), potem, denimo funkcijo prepareRecordOgg, pravilno kličemo takole: musicPlayer.prepareRecordOgg(<ime datoteke z vtičnikom na kartici SD>).
Vendar si zvok pogosto želimo snemati iz različnih virov in z različnimi ločljivostmi in frekvencami vzorčenja. Ker je neprestano reprogramiranje ESP32 časovno potratno, sem originalni primer nekoliko razširil in dodal upravljavsko konzolo, ki omogoča zagon snemanja zvoka preko RS232 povezave, prav tako pa tudi ogled posnetih datotek v OGG zapisu. Tako je zelo enostavno preveriti, kateri kodeki delujejo in kateri posnamejo zgolj uvodni del OGG datoteke. Mogoča je tudi zamenjava vtičnika z alternativnim, iz zbirke vtičnikov v datoteki vs1053-vorbis-encoder-170c.zip, ki jo lahko prenesemo iz spletne strani www.vlsi.com. Ko datoteko razpakiramo v prazen datotečni imenik, v mapi profiles najdemo kopico datotek tipa IMG, s katerimi lahko nadomestimo priloženo datoteko. Tako izberemo hitrost in ločljivost vzorčenja zvoka. Večja kot sta ločljivost in hitrost vzorčenja, kakovostnejši bo zajeti zvok in obratno. Primer record_ogg sem dodelal tako, da lahko vtičnik iz mikro SD kartice izberemo kar med delovanjem, tako da preko RS232 povezave damo ukaz PLUGIN <pot do datoteke na SD kartici>.
Morda velja pripomniti le še to, da za predvajanje zvoka potrebujemo tudi ustrezno aplikacijo na PC. Sam sem uporabil kar brezplačni Audacity, ki podpira predvajanje datotek v OGG zapisu, kakor tudi njihovo pretvorbo v druge zapise (npr. MP3).
Bluetooth
Čeprav je Bluetooth v primerjavi z Wi-Fi manj zanimiv, je dodatna funkcionalnost ESP32 modulov tista zanimiva, ki je starejši ESP8266 moduli ne omogočajo. Vzpostavitev Bluetooth naprave izvedemo s klicem funkcije .begin, potem, ko izdelamo nov objekt tipa BlootoothSerial. V našem primeru smo objekt poimenovali SerialBT in tako je za inicializacijo dovolj naslednji programski klic:
SerialBT.begin(<ime naprave Bluetooth>).
Če imena ne podamo, je ESP32 dostopen s prednastavljenim imenom »ESP32«. Zdaj se s pametnim telefonom ali drugo Bluetooth napravo že lahko povežemo, brez uporabe varnostne kode, lahko pa z ukazom SerialBT.setPin(pin) določimo pin kodo, ki jo je potrebno vpisati v oddaljeno napravo za uspešno uparjanje Bluetooth naprave z oddaljeno napravo. Če tega ne storimo, ESP32 pin kode ne zahteva in se z njim lahko poveže katerekoli naprava, iz katere vnesemo prednastavljeno pin kodo »1234«.
Kot vidimo, je uporaba Bluetooth veliko enostavnejša od uporabe Wi-Fi in lahko nadomesti ožičeno razhroščevalsko RS232 povezavo, kar dokazujeta tudi zelo podobna nabora funkcij za prenos podatkov pri Serial in SerialBT objektih. Razlika je predvsem v tem, da je Serial že vnaprej definiran kot HardwareSerial v HardwareSerial.h datoteki glave.
V delu programa v glavni programski zanki loop, vidimo kako enostavno je izdelati programsko kodo za dvosmerno kopiranje podatkov med Bluetooth povezavo in RS232 povezavo, s katero postane ESP32 most med RS232, ki ga lahko preko USB vmesnika povežemo s PC, in Bluetooth napravo.
<Program 2>
#include “BluetoothSerial.h”
BluetoothSerial SerialBT;
char *pin = “1234”;
void setup() {
Serial.begin(115200);
SerialBT.begin(“ESP32test”); //Bluetooth device name
SerialBT.setPin(pin);
Serial.println(“The device started, now you can pair it with bluetooth!”);
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
Program 2: Vzpostavitev ESP32 Bluetooth serijske naprave
<Konec Programa 2>
Most ali usmerjevalnik med Wi-Fi in Ethernetom
ESP32 ima vgrajena dva MAC vmesnika, od katerih je prvi namenjen podpori Wi-Fi, ki je v celoti implementiran, medtem ko je pri vmesnik za Ethernet ni implementiran modemski del, za katerega lahko, kot smo videli v SE287 in SE288, uporabimo ustrezen vmesnik s čipom LAN8720A, ki je prav tako kot ga uporabljajo tudi Microchipovi mikrokontrolerji.
Zdaj pa odgovorimo na vprašanje, ali je lahko spletni radio tudi most med Wi-Fi in ožičenim Ethernetom. Odgovor je seveda pritrdilen, saj so programske knjižnice ESP32 SDK izdelane tako, da zagotavljajo povezljivost med različnimi Ethernetnimi vmesniki (tudi Wi-Fi vmesnik je Ethernetni vmesnik) na ravni IP segmentov, med katerim prehajamo tako, da navedemo vmesnik v ciljnem segmentu kot prehod (gateway), ko dostopamo iz drugega segmenta. Denimo, če dostopamo iz 192.168.4.x v segment 192.168.0.x, in ima vmesnik za ožičeni Ethernet naslov 192.168.0.1, slednjega pri Wi-Fi vmesniku navedemo kot prehod. Če ima, po drugi strani, vmesnik iz ožičenega Etherneta dostop tudi do interneta, bomo tako lahko dostopali do slednjega tudi prek Wi-Fi vmesnika. Če hočemo torej vsem avtoriziranim domačim Wi-Fi napravam omogočiti dostop do interneta preko ESP32 mostu, je torej dovolj, da slednjega razglasimo za dostopno točko in obenem prek ožičenega Ethernetnega vmesnika povežemo z Internetom.
Kaj pa, če želimo dostop do Interneta iz dostopne točke Wi-Fi omejiti? V tem primeru moramo na osnovi Wifi SDK programske knjižnice izdelati ustrezne filtre, ki omejujejo spletni promet zgolj na izbrane internetne segmente, ali IP naslove. S tem preprečimo, da bi ob morebitne vdoru v omrežje Wi-Fi prišlo tudi do neavtoriziranega dostopa do interneta preko naše strojne opreme. Vsekakor opozorimo na potrebno previdnost še posebej v blokovskih naseljih.
Filtre za TCP/IP podatkovni promet lahko izdelamo na osnovi določitve tipa filtra s funkcijo esp_wifi_set_promiscuous_filter, s katero lahko glede na izbrano 32-bitno filtrsko masko filtriramo vse podatkovne pakete, ali pa samo tiste, ki ustrezajo določenemu kriteriju v filtrski maski, in implementacije filtra s povratno klicanimi funkcijami, ki jih moramo po implementaciji tudi registrirati, s čemer postanejo dostopni gonilniku za Ethernet. Pri tem povejmo, da lahko filtriramo tako kontrolne kot podatkovne pakete, vendar je to časovno potratno. Pogosto namreč želimo zgolj preprečiti povezovanje z določenimi spletnimi segmenti, za kar navadno zadošča filtracija kontrolnih paketov.
Kako je Espressif Systems ESP SDK ugnezden v Arduino okolje?
Pri reševanju kompleksnejših problemov, ko želimo iz modulov ESP izvleči kar največ funkcionalnosti, se pogosto srečujemo s sistemskimi funkcijami, ki ležijo globoko v drobovju programskih knjižnic za ESP module. Čeprav je večina programske kode za ESP odprtokodne, IDF SDK ni, saj so priložene zgolj že prevedene programske knjižnice z končnico *.a. Je pa res, da je opis modulov dokumentaciji strojnih funkcionalnosti ESP modulov zdaj dovolj popoln, da bi se samostojnega pisanja takih knjižnic lahko lotil kak nadobudni programer z bogatimi izkušnjami pri programiranju gonilnikov za strojno opremo.
Po drugi strani, marsikdo meni, da sta Expressif System IDF razvojno okolje in Arduino razvojno okolje dve povsem različni in temeljita na povsem drugih programskih knjižnicah. Vendar podrobnejši pregled Arduino razvojnega okolja pokaže, da sta tudi v podporo za programiranje ESP modulov v Arduino razvojnem okolju zakopana tako C programski prevajalnik s povezovalnikom, kakor tudi celoten SDK paket. Vsekakor lahko z dodajanjem raznih programskih knjižnici, kot je tista za upravljanje VS1053 avdio kodeka, razširimo nabor združljive programske opreme, vendar dodatne knjižnice za osnovno komunikacijo, denimo prek SPI vodila, še vedno uporabljajo IDF SDK funkcije. Slednje imajo k sreči zelo bogato funkcionalnost, tako da lahko naredimo marsikaj, kar se v enostavnejših knjižnicah višjega nivoja ne da, a smo kljub temu omejeni s podprtimi funkcionalnostmi. Po drugi strani, so za programerje začetnike na področju pisanja ugnezdene programske opreme enostavnejše knjižnice višjega nivoja zakladnica znanja, saj je na voljo tudi njihova izvorna koda, iz katere se lahko naučimo uporabljati kompleksnejše IDF SDK knjižnice, ne da bi za to potrebovali veliko dokumentacije. Je pa seveda včasih, kot denimo pri uporabi vtičnikov pri VS1053 modulu vprašanje, kaj je dejansko v programski knjižnici višjega nivoja narobe ali pomanjkljivo, da moramo posamezen vtičnik za snemanje zvoka vsakokrat ponovno naložiti, če želimo snemati drugi posnetek v istem formatu kot prejšnjega in če vmes nismo ugasnili oz. resetirali kodeka. Dopuščam tudi možnost, da je knjižnica OK, in je napaka v primeru…
Glede programskih knjižnic povejmo še to, da jih v Arduino razvojno okolje ni nujno uvažati in nameščati s funkcijami razvojnega okolja, ali pa jih prenesti v obliki datotečne strukture, kot smo to storili v prvem nadaljevanju v SE282. Lahko jih enostavno skopiramo poleg aplikacije (datoteka *.ino) in nato z direktivo #include vključimo njihove datoteke glav, kar je povsem enako, kot to tudi sicer počnem v kompleksnejših C projektih, le da Arduino tovrstna opravila programerju začetniku kar dobro skrije in jim s tem olajša programiranje. Bolj izkušenim pa je slednja možnost dobrodošla predvsem takrat, ko je v programskih knjižnicah precej napak. Čeprav moramo potem programske knjižnice prevajati vsakokrat, ko prevajamo glavni program, lahko po drugi strani v njih hitro odpravimo napake…
Kako se lotiti kompleksnejših projektov?
Če bi me vprašali lani, bi rekel, da so ESP moduli odlična odskočna deska za hitro implementacijo marsikaterega kompleksnejšega IoT projekta, ne zgolj domače eksperimentiranje. Vendar sem se doslej prav pri že izdelanih priljubljenih kompleksnejših projektih, kot je ESP32-CAM, ki domačim uporabnikom približa uporabo digitalnih kamer, že velikokrat znašel v situaciji, ko je bila priložena programska koda pomanjkljiva in nezanesljiva. Lahko bi trdil, da je bila bolj namenjena domačemu igračkanju, kot pa resnim projektom.
Po drugi strani, najdemo v spletu že tudi komercialne izdelke, temelječe na ESP32 in digitalnih kamerah. Vendar njihovi avtorji večinoma ne ponudijo tudi izvorne kode ugnezdene programske opreme, temveč zgolj dostop do API vmesnika. Do neke mere je to povsem razumljivo, saj so morali avtorji vložiti veliko napora v razhroščevanje in testiranje tako programske kot strojne opreme. Če želimo praktično uporaben izdelek, ne zgolj igračo, ki se bo vsak teden vsaj enkrat sesula in jo bomo morali restartati, moramo dobro načrtovati tako strojno opremo, kot smo videli že v SE288, kot tudi ugnezdeno programsko opremo in njene funkcionalnosti.
Na koncu moramo misliti tudi na enostavnost uporabe. Če bomo doma izdelano napravo, denimo sistem za upravljanje doma, vsakodnevno uporabljali prek mobilnega telefona, je gotovo smiselno, da tudi zanj izdelamo ustrezno aplikacijo. No, vsekakor pa se splača uporabiti USB-RS232 most, ki omogoča upravljanje ESP32 brez pretikanja kablov in mostičkov.
Naslednjič
Nadaljevanka o programiranju ESP8266 in ESP32 se s prihodnjim nadaljevanjem, ko bomo pogledali še nekaj praktičnih implementacij kompleksnejših primerov uporab ESP32 in podrobneje preverili, kako zagotavljamo varnost spletnih storitev, zaključuje. Prihodnjič se lotimo tudi primera domače ESP32 vremenske postaje. Podrobnejša navodila in celotne primere programske kode najdete na spletni strani htts://sites.google.com/site/pcusbprojects.
<konec programa 2>
https://sites.google.com/site/pcusbprojects
<konec slik>