Avtor: dr. Simon Vavpotič
2020_287_38
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 članku v predhodni reviji smo traktor opremili z dodatnimi tipali in videli, kako zmogljivost njegovih komunikacij izboljšamo s pravo Wi-Fi anteno, ki jo lahko priključimo na nekatere ESP32 module. V ta namen smo vzpostavili TTL RS232 povezavo med ESP8266 in ESP32-CAM moduli in zmogljivo anteno slednjega izkoristili tudi za krmiljenje traktorskih motorjev in ne le za prenos žive slike. Pri tem smo lahko Wi-Fi del ESP8266 celo ugasnili in s tem izničili morebiten neželen medsebojni radijski vpliv modulov, ki sta v neposredni bližini.
Zanimalo nas je, ali lahko v isto vezje vgradimo več ESP modulov in ali je prenos podatkov med njimi mogoč tudi brez brezžičnih komunikacij. Spoznali smo, kako vzpostavimo redundantno IoT mrežo, v kateri je vsaka IoT naprava hkrati strežnik in odjemalec, pri čemer lahko deluje tudi kot komunikacijski most med drugimi IoT napravami, ki so preveč oddaljene, da bi bila mogoča neposredna komunikacijska Wi-Fi povezava med njimi.
Ta vsebina je samo za naročnike
Tokrat bi morali spoznati, kako izdelamo pametni polnilnik baterij, vendar mi je urednik predlagal zahtevnejši projekt, internetni radio, ki je zahteval veliko časa in testiranj pa tudi veliko dodatne strojne opreme. Po nekaj zapletih prototip končno deluje…
Internetni radio
ESP32 in ESP8266 imata z nekaj dodatne strojne opreme vse, kar potrebujemo za predvajanje spletnega radija, potrebujemo le še ustrezno programsko opremo. Na Internetu, oziroma na GitHubu, najdemo več tovrstnih projektov, vendar je mojo pozornost najbolj pritegnil ESP32-radio, ki je zasnovan dovolj splošno, da ga lahko prilagodimo lastnim željam in potrebam, hkrati pa je zanj na voljo vsa izvorna programska koda. ESP32-radio morda ni najenostavnejši za implementacijo, a ponudi kopico možnosti za različne kombinacije opcijske strojne opreme pa tudi spremembe in dopolnitve programske kode.
Predvsem možnosti dopolnjevanja in spreminjanja programske kode sem si želel tudi sam, saj sem si internetni radio zamislil nekoliko drugače od prvotnega načrta, ki predvideva komunikacijo po zraku, oziroma Wi-Fi. Namesto tega sem želel za prenos spletnega radia uporabiti kar klasično ožičeno Ethernet povezavo, h čemur me je najbolj vzpodbudil članek na spletni strani www.hackaday.com, “ESP8266 and ESP32 WiFi hacked”, v katerem avtor navaja, da mogoče vdreti v komunikacijo modulov z ne dovolj novim jedrnim delom vgrajene programske opreme. Pa smo tu! Kdo ve, mogoče bodo hekerji čez čas odkrili še kako novo ranljivost, ki so jo nemara namerno ali nenamerno zagrešili snovalci paketa SDK za Espress Systemsove modula ESP8266 in ESP32.
Tako je nastala zamisel od spletnem radiu preko ožičenega Etherneta, pri kateri je novo to, da za osnovo uporabimo modul ESP32, ki ima poleg Wi-Fi MAC vmesnika vgrajen tudi EMAC vmesnik za povezavo na ožičeni Ethernet. Pri tem je najtežji del vzpostavitev hitrih podatkovnih linij med ESP32 in LAN8720A vmesnikom, ki omogoča modemsko prilagoditev na fizično Ethernetno omrežja. Ja, prav ste prebrali! Podobno je tudi pri Microchipovih PIC-jih.
Pritrditev modula ESP32 na razvojno ploščo
Če se boste odločili za nabavo že izdelane razvojne plošče z ESP32 in stebrički za natikanje povezovalnih kablov, s povezovanjem perifernih naprav skoraj gotovo ne boste imeli težav, mene pa je zanimalo, kako uporabiti ESP32-WROVER-32D modul, ki še ni pritrjen na kako razvojno ploščo. Sestavljanja spletnega radija sem se lotil s komponentami, ki sem jih imel pri roki. Namesto osnovnega ESP32 modula, bi lahko uporabil katerokoli ESP32 razvojno ploščico z velikimi priključki, a to ne bi bil pravi izziv. Z žičnim povezovanjem sem na podoben način že uspešno povezal nekaj ESP8266 modulov, ESP32 pa ima bistveno več priključkov, ki so vrh tega še za spoznanje bližje skupaj. Razmišljal sem, o tem, kako modul fiksno pritrditi, ne glede na žične povezave.
ESP32 ima velik priključek za maso s spodnje strani, ki ga lahko s pridom izkoristimo, če nanj prispakamo krajši kos instalacijske bakrene žice s premerom 1,5 mm. Med spajkanjem posameznih priključkov, pri katerem priporočam uporabo povečevalne leče in spajkalnika s konico 0,2 mm, lahko tako modul držimo za bakreno žico. Pri tem je vsekakor dobro, da na njej še pustimo večino izolacije, saj se le tako ne bomo opekli. Pred spajkanjem je dobro pripraviti kose trakastega kabla. Razmik med priključki ESP32 je zelo majhen, saj si sledijo na 1,27 mm. Vendar je to lahko tudi v pomoč pri spajkanju trakastega kabla, saj nam ga ni potrebno na koncu raztrgati, da bi dobili dovolj velik razmik med žicami, ampak je navadno dovolj, da kratka dela koncev le olupimo. Dolžina trakastih kablov za povezavo ESP32 z razvojno ploščo naj ne bi daljša od okoli 2 cm. Ko so trakasti povezovalni kabli prispajkani, se lahko lotimo njihove povezave z razvojno ploščo, pri čemer lahko kable na konci raztrgamo, da jih bomo lahko kasneje prispajkali z razmikom 2,54 mm na razvojno ploščo. Naslednji korak je oblikovanje in spajkanje debele bakrene žice, s katero smo povezali dno ESP32. Žica med delovanjem ESP32 lahko služi tudi za njegovo hlajenje, saj ima baker veliko toplotno prevodnost, zato moramo biti pri njenem oblikovanju in spajkanju na razvojno ploščo previdni.
Odločil sem se, da bom ESP32 pritrdil kakih 7 mm nad razvojno plošči, za kar sem ustrezno oblikoval tudi bakreno žico in hkrati odstranil odvečen del izolacije na delu, kjer sem jo nameraval pritrditi na razvojno ploščico tiskanega vezja. Naj omenim še, da sem pri delu uporabil standardno enoplastno razvojno tiskano vezje, zaradi česar sem moral vanj zvrtati luknjico, skozi katero sem vstavil del nosilne 1,5 mm bakrene žice in ga prispajkal s spodnje strani. Tako je ostalo ogromno prostorja tudi za hlajenje ESP32 s spodnje strani, hkrati pa tudi Wi-Fi signal boljše možnosti za sprejem in oddajo.
LAN8720A Ethernetni modul
Čeprav sem računal, da bom nekoč kak PIC32 sam povezal z ožičenim Ethernetom, oziroma internetom, sem dodatni Microchipov modul s krmilnikom LAN8720A porabil za ESP32. Mogoča je tudi uporaba drugih modulov, vendar so ti dražji, prenos podatkov prek vmesnima RMII pa še vedno poteka pri 100 Mb/s. Zato dvomim, da bi z dražjimi moduli kaj pridobili, razen morda glede možnosti prenosa podatkov po dolgih Etherentnih kablih (daljših od 10 m).
A težava je v tem, da hčerinski modul nima vgrajenega 50 MHz oscilatorja, ki je del PIC32MZ EC Starter Kita, kateremu je prvenstveno namenjen. Ker takega oscilatorja še nisem imel pri roki, sem skušal izkoristiti kar tistega na Starter Kitu, vendar ne tako, da bi ga odspajkal, ampak, da bi namesto tega uporabil ustrezne priključke. Tako sem se lotil vgradnje podnožja za hčerinsko tiskano vezje s krmilnikom LAN8720A, ki ga uporablja tudi PIC32MZ EC Starter Kit. Razmik miniaturnih nožic slednjega je 1,27 mm, zaradi česar moramo uporabiti podnožje z enakim razmikom. Na standardno razvojno ploščo z razmikom lukenj 2,54 mm ga lahko prispajkamo tako, da vsako drugo nožico ukrivimo pod kotom 90° na levo ali desno. Nanjo kasneje po potrebi z zgornje strani prispajkamo povezovalni vodnik. Tako ni potrebno spajkanje trakastega povezovalnega kabla, hkrati pa za stabilnost vtičnice zadošča, če od spodaj prispajkamo vsako drugo nožico.
Žal se poskus ni posrečil, saj LAN8720A po uspešni inicializaciji nikakor ni hotel začeti prenašati podatkov. Kasneje sem odkril, da je bilo to skoraj gotovo le za to, ker sem napačno povezal signal EMAC_TXD0, ki sem ga namesto na priključek 31 pomotoma vezal na nepovezan priključek 32 na ohišju modula ESP32. Vendar sem zmotno menil, da modul ne deluje, ker so težave s prenosom 50 MHz oscilatorskega signala, zato sem nabavil 50 MHz oscilator in ga priklopil namesto PIC32MZ EC Starter Kita. A tokrat inicializacija ni več delovala, kar je pomenilo, da LAN8720A krmilnik ni zadovoljen novim načinom pogona. Kdor ima pri roki vsaj 100 MHz digitalni osciloskop, lahko prenos in kakovost signala preveri na PC-ju, sicer pa so pogosto razlog za nedelovanje takih rešitev sorazmerno visoka frekvenca taktnega signala in navadno predolge in predebele žične povezave, kar predstavlja dodano kapacitivno breme in onemogoči pravilen prenos signala. Vseeno menim, da bi z nekaj eksperimentiranja skoraj gotovo uspel, vendar sta že prišla naročena Ethernetna vmesniška modula, Smart Electronics LAN8720 Network Module High-Performance 10/100 Ethernet Transceiver (Phy) Development Board RMII Interfaces s čipom LAN8720A, ki sem ju nabavil pri Amazonu.
Tako sem opustil igranje z oscilatorjem in se posvetil povezavi LAN8720 Network modulov z ESP32 modulom, vendar tudi tu ni šlo brez začetnih težav. Čeprav sem modula pravilno predelal in dodal žično povezavo iz oscilatorskega priključka EN na priključek NC (ki je originalno puščen nezaseden), tega pa na GPIO4 (v programu sem pravilno definiral ETH_PHY_POWER = 4) , komunikacija ni in ni hotela steči, dokler nisem k sreči odkril napačno povezanega signala, EMAC_TXD0. Težava je bila tudi v programski kodi, saj modul na SPI vodilu uporablja naslov 1 in ne 0, kot je to večini drugih implementacij in tudi pri prej omenjenem hčerinskem tiskanem vezju za PIC32MZ EC Starter Kit. Končno je ukaz ping vrnil odgovor in prava težava je bila rešena. Zdaj sem se lahko lotil povezovanja VS1053 kodeka.
Predvajanje zvoka
Naslednji premislek je veljal izbiri kodeka predvajanje avdio tokov iz strežnikov spletnega radija. Ker sem za osnovo izbral projekt ESP32-radio, tu ni bilo kaj dosti razmišljati, saj je VS1053 modul obvezen. Lahko bi se sicer lotil predelave programske kode v upanju, da bo ta delovala brez kodeka, vendar ima v ESP32 vgrajeni D/A pretvornik fiksna izhodna priključka GPIO25 in GPIO26, ki pa ju potrebujemo tudi za povezavo Ethernetnega krmilnika ESP32 z LAN8720A; hkrati avdio kodek omogoča kakovostnejše predvajanje in celo snemanje zvoka s stiskanjem v MP3 datoteke.
VS1053 MP3 avdio kodek z ESP32 komunicira preko SPI vodila; natančneje v aplikaciji ESP32-radio je uporabljen SPI vmesnik VSPI, ki ga nisem mogel uporabiti hkrati, saj je del njegovih priključkov (predvsem GPIO17 in GPIO19, ki ju ni mogoče prestaviti) že izkoristil EMAC modul. Tako mi je ostala le še možnost uporabe vmesnika HSPI, ki za svoje delovanje zahteva priključke:12 (MISO), 13 (MOSI), 14 (SCK) in 15 (XCS), medtem ko lahko za priključke DREQ, vendar moramo prav tako, kot v prejšnjem primeru, precej predelati vgrajeno programsko opremo (npr. ESP32-radio), namenjeno le brezžični komunikaciji prek brezžičnih vmesnikov Wi-Fi; a o tem več v nadaljevanju.
VS1053 kodek temelji na skoraj istoimenskem čipu, VS1053B, katerega analogni del deluje pri 3,3 V, digitalni pa pri 1,8 V. Spet me je doletela nesreča, saj se mi zdi, da sem med meritvijo napajalne napetosti 1,8 V na regulatorju AMS1117B po nerodnosti naredil kratek stik med maso iz izhodom za regulirano napetost, vem pa tudi, da sem mi je med delom po pomoti »posrečilo« namesto + 5 V na regulator pripeljati celi +12 V. A, da bi zaradi slednje prišlo do težav, je manj verjetno, da v specifikacije obeh napetostnih regulatorjev dopuščajo visoke razlike med vhodno in izhodno napetostjo od primerno majhni porabi toka. Kakorkoli, na regulatorju sem po nesreči izmeril le še 1,36 V, kar pa je odločno premalo za delovanje digitalnega dela VS1053B čipa, ki zahteva delovno napetost med 1,7 V in 1,85 V.
Nesrečni 1,8 V regulator napetosti, AMS1117, ki se je pokvaril na plošči VS1053 pri sestavljanju vezja, je skoraj gotovo kriv tudi za to, da sem ugotovil, kaj pravzaprav povzroča motnje pri predvajanju zvoka in zakaj številni avtorji podobnih projektov na spletu menijo, da je potrebno za VS1053 modul uporabiti ločeno napajanje, nekateri pa so se ogreli celo za baterijsko napajanje, kar je samo po sebi dokaj noro. Tretja možnost je, da namesto tega uporabimo zares kakovostne napetostne regulatorje in seveda napajalnike, ki nimajo ozemljitvenega priključka. Prav tako, se splača odklopiti RS232 priključek, preko katerega programiramo ESP32 in sprejemamo diagnostična sporočila. Po drugi strani, je ožičeni Ethernetni priključek že sam po sebi opremljen s transformatorskim vmesnikom.
Kakorkoli, uničen regulator AMS1117 1.8, me ne prisilil, da sem uporabil laboratorijski Texas Instrumentsov regulator, TPS7A4701-EP (tiskano vezje »high precision psu« lahko za nekaj evrov kupimo v spletni trgovini AliExpress), ki sem ga v 3. delu serije člankov o Digitalni analizator signalov uporabil za pogon 32-bitnega A/D pretvornika, ADS1263. VS1053B MP3 kodek ima zdaj enkratno stabilizirano napetost digitalnega dela (1,8 V), poleg tega pa z običajnim stabilizatorjem stabilizirano napetost analognega dela (3,3 V). Vsekakor gre zahvala za odličen zvok tudi trem velikim elektrolitskim kondenzatorjem, ki zagotavljajo zaloge energije za ESP32, SD kartico in VS1053 modul. Ker nisem imel časa, da bi izdelal lastni regulator, sem 3,3 V in 5 V napajanje potegnil kar iz razvojne plošče Microchip Expansion 16, ki je v tem primeru vsekakor ne potrebuje PIC32MZ EC Starter kita. Kot lahko vidite na fotografiji, vse skupaj odlično deluje, zvok pa je čist tako preko slušalk, kot tudi preko Hi-Fi avdio ojačevalnika. Tako zvokovnih ločilnih transformatorjev, ki jih bom dobil enkrat sredi poletja niti ne bom potreboval.
Izbira in uporaba opcijske strojne opreme
Ko listamo po priloženem priročniku za sestavljanje ESP32-radia, zasledimo kopico opcijskih komponent za neposredno upravljanje, ki jih lahko z internetnim radijem povežemo, ali pa tudi ne: različne vrste prikazovalnikov, rotacijski enkoder s tipko in tipkovnico. Sam sem si zaradi pomanjkanja priključkov, ki sem jih porabil za ožičeno povezavo z Ethernetom, neposredno upravljanje zamislil nekoliko drugače, prek povezave RS232 povezave in dodatnega ESP32 modula, podobno kot pri modelu velikega traktorja iz preteklega nadaljevanja, saj bo tako priključkov več ko dovolj. Na ta način je mogoče hkrati zagotoviti tudi večjo varnost delovanja naprave, saj le upravljavsko ESP32 sprogramiramo kot IoT Wi-Fi modul, medtem ko radijski ESP32 nima neposrednega dostopa do Wi-Fi. Zanimivo je, da ima v tem pogledi programska koda ESP32-radio za razvojno okolje Arduino vse programske knjižnice, ki jih potrebujemo tudi za izgradnjo vgrajene programske opreme drugega ESP32. Programsko kodo je treba predvsem nekoliko oskubi, pri čemer ohranimo spletni vmesnik za upravljanje spletnega radija in krmilne funkcije, ki zajemajo podatke iz krmilnik vhodnih naprav, kot sta rotacijski enkoder in tipkovnica. Vsekakor potrebujemo tudi prikazovalnik.
Opcijska komponenta je lahko tudi čipni sprejemnik valovnega radia, denimo Si4735, za katerega pa bomo morali tudi ustrezno prilagoditi vgrajeno programsko opremo. Vendar bomo morali v tem primeru razvijati tudi na novo, ne samo spreminjati nastavitev vgrajene programske opreme, kot do sedaj. Zato si to nalogo raje pustimo za kdaj naslednjič, saj bomo imeli s nastavitvami in prilagajanjem osnovne vgrajene programske opreme spletnega radia že tako dovolj dela.
Za tiste, ki bi se namesto predlaganega projekta raje lotili izdelave originalne različice ESP32 internetnega radija, povejmo, da lahko za prenos vgrajene programske kode priloženih iz binarnih datotek uporabijo tudi Espressif Systems programsko orodje Flash download tools, ki smo ga spoznali v prvem delu nadaljevanke. A pred tem vseeno preberite priložena navodila v PDF datoteki, da boste znali pravilno izvesti nastavitve in povezati opcijsko strojno opremo.
Programska oprema
Originalno programsko opremo Wi-Fi spletnega radija in podrobna navodila za njegovo sestavljanje najdete na spletni strani www.Github.com v projektu ESP32 Radio, različico spletnega radija, ki deluje tudi preko ožičenega Etherneta pa poiščite na spletni strani https://sites.google.com/site/pcusbprojects. Vsekakor velja pri originalni programski opremi opozoriti predvsem na zagotavljanje informacijske varnosti, saj je aplikacija ESP32 Radio izdelana tako, da se najprej skuša prijaviti v katerikoli razpoložljiv lokalni Wi-Fi usmerjevalnik, če to ne uspe pa se pojavi kot samostojna Wi-Fi dostopna točka z imenom ESP32 Radio in prednastavljenimi poverilnicami, kar omogoča izbiro nastavitev in predvajanje glasbenih datotek iz mikro SD kartice, ne pa tudi predvajanja iz radijskih postaj, za kar potrebujemo internetno povezavo.
Aplikacija ESP32 Radio omogoča s pomočjo programskih knjižnic ArduinoOTP in Update tudi svoje polavtomatsko posodabljanje na novejše različice iz binarnih datotek na spletnih strežnikih razvijalca, če v meniju Config kliknemo gumb Update. Čeprav gre vsekakor za zanimivo funkcionalnost, si je včasih ne želimo, še posebej, če smo vgrajeno programsko opremo prej spremenili po lastnih željah, saj bodo s posodobitvijo odpadle vse funkcionalnosti, ki smo jih sami dodali. Denimo, v mojem primeru, je radio postal celo neuporaben, saj osnovna različica za komunikacijo z VS1053 modulom uporablja VSPI vmesnik, moja pa HSPI.
Ko smo že ponovno pomenili SPI vmesnika VSPI in HSPI, velja povedati še to, da je v programski knjižnici SPI, ki je v datotekah SPI.h in SPI.cpp, v slednji že programski stavek SPIClass SPI(VSPI), medtem ko je v celotni glavni programski kodi (datoteka *.ino) in nekaterih drugih programskih knjižnicah za SPI vmesnik uporabljena njegova implementacija. Če hočemo torej VSPI za menjati za HSPI, ne da bi izdelali novo implementacijo razreda SPIClass, moramo omenjeni stavek v datoteki SPI.cpp spremeniti v SPIClass SPI(HSPI), ali pa ga zakomentirati in pri vrhu glavne programske kode ponovno definirati. Vsekakor pa ne smemo zmotno misliti, da bo strojna podpora delovanju protokola SPI delovala s katerimikoli priključki, kar na začetku da misliti možnost proste izbire priključkov. Res pa je, da lahko počasno izvajanje protokola SPI implementiramo tudi programsko, brez posebnih vmesnikov, vendar taka implementacija ne more podpreti vseh funkcionalnosti VS1053 modula in hitrega prenosa podatkov na in iz pomnilniške kartice micro SD.
Prevajanje DNS naslovov
Osnovna funkcionalnost internetnega radija je predvajanje programa, oziroma zvokovnega toka iz izbrane spletne radijske postaje. Ker je podajanje opisov radijskih postaj zgolj z IP naslovom in dostopnimi vrati preteklost, je prevajanje imenskih naslovov v IP naslove zelo pomemben del funkcionalnosti, brez katere internetni radio težko povežemo na spletno radijsko postajo. Žal kaže, da pretvornik imenskih naslovov v IP naslove pravilno deluje le z brezžično povezavo, čeprav programska knjižnica ETH, ki je v datotekah ETH.cpp in ETH.h, uporablja enake osnovne razrede za podporo delovanju TCP/IP in drugim protokolom, kot podporna knjižnica za Wi-Fi. No, o tem kaj spremeniti in kaj popraviti v programju, da bo vse pravilno delovalo, pa več v prihodnjem nadaljevanju.
Predvajanje MP3 glasbenih datotek
ESP32 Radio ni smo radio, ampak zna predvajati tudi avdio datoteke, vendar le, če radiu dodamo ležišče, kamor lahko vstavimo mikro SD kartico in žrtvujemo še enega od GPIO priključkov za njen signal CS (angl. chip select). Za komunikacijo lahko uporabimo priključke MISO, MOSI, in SCK, ki jih že uporabljamo za komunikacijo z VS1053 modulom, tako da micro SD kartico vežemo vzporedno z modulom. Na fotografiji lahko vidimo zunanje SPI vodilo, ki poteka od ESP32 naprej do VS1053 modula in nato do ležišča za mikro SD kartice, narejenega iz mini SD na mikro SD vmesnika. Kot vidimo, je od ostale elektronike na ležišče prispajkan le še 3300 µF kondenzator, ki vsebuje zalogo električne energije za kakovostno napajaje kartice. Prav tak kondenzator je prispajkan tudi na VS1053 modul, nekoliko manjši (2200 µF) pa na ESP32 modul. In moram priznati da se glede kakovosti delovanja strojne preme in predvajanega zvoka spletnega radia, veliki elektrolitski kondenzatorji res odlično obnesejo.
Prihodnjič
Prihodnjič se lotimo priklopa dodatkov za spletni radio, predvsem tipkovnice in OLED prikazovalnika in izdelave pametnega polnilnika baterij. Zanimalo nas bodo zanimali še možnost priklopa kapacitivne tipkovnice in krmiljenja naprav infrardečega vmesnika ter izdelava samostojnega daljinskega upravljalnika s kapacitivno tipkovnico na osnovi ESP8266 ali ESP32.