Avtor: dr. Simon Vavpotič
E-pošta: simon.vavpotic@gmail.com
https://pcusbprojects.com
Kako hitre in zanesljive so brezžične komunikacije z M5Dial? Katere so njihove prednosti? Ali je lahko v zidno konzolo vgrajen okrogli M5Dial krmilnik z barvnimi LCD zaslonom zanesljivo komunicira z različnimi krmilniki doma in upravlja tako luči kot gospodinjske aparate?
Če M5Dial primemo v roke, hitro ugotovimo, da razen USB-C, ki je namenjen pretežno njegovemu programiranju, nima veliko zunanjih priključkov, le porta A in B, s po štirimi priključki; od katerih sta vsakokrat po dva uporabljena za maso in +5 V napajanje, preostala dva pa za prenos podatkov.
M5Dial modul, ki sem ga testiral, ima še dodatni napajalni priključek, prek katerega ga lahko napajamo z napetostjo med 6 V in 36 V (vsaj tako piše na papirnem krogcu, ki je s plastično matico privit na novi M5Dial modul.
Kako začeti?
Torej! Mar ni enostavneje modul zgolj napajati prek napajalnega priključka (recimo z 12 V) in hkrati namesto žičnih podatkovnih vodil I2C (port A) ali serijske komunikacije (port B) preprosto uporabiti Wi-Fi krmilne komunikacije?
Na ta način lahko poenotimo način upravljanja prek vgradnih krmilnikov in prek pametnih naprav, kot so PCji, tablice in pametni telefoni. Hkrati ni potrebno vleči dodatnih žic, razen napajalnih kablov, za katere pa lahko navadno porabimo že obstoječo napeljavo, saj so vsakega klasičnega stikala za luč navadno vodita 2 žici. Če namesto izmeničnega 230-voltnega preklopa napajanja priklopimo enosmerno 12-voltno, tako da žici, ki vodita do doze stikala postaneta +12 V in masa, je to vse, kar poleg ustreznega pokrovčka potrebujemo za vgradnjo M5Dial.
Vse ostalo poteka brezžično, kar pomeni, da bi v principu M5Dial lahko nosili tudi v žepu, če bi ga priključili na majhno 6-voltno (litijevo) baterijo prek napajalnega priključka, ali na 5-voltno baterijo prek USB-C priključka.
A prav tega nočemo, saj hočemo razsvetljavo in druge pametne naprave v stanovanju prek Wi-Fi in Bluetooth upravljati tudi, ko nimamo ničesar v žepu, in ne, da začnemo iskati daljinca takoj, ko želimo spremeniti nastavitev luči ali jih ugasniti.
Ta vsebina je samo za naročnike
Prednosti Wi-Fi pred vodilom I2C ali zaporedno povezavo
Wi-Fi je bistveno hitrejši in kompleksnejši protokol od I2C ali zaporedne povezave. Zagotovo deluje, če sta dostopna točka in Wi-Fi naprava v istem prostoru, običajno pa tudi po celem stanovanju, če ni zelo debelih betonskih sten. Zaradi varnostnega kodiranja vanj ob dovolj dolgih pristopnih geslih tudi ni enostavno vdreti. Res pa je, da bi nam teoretično lahko pri vzpostavljanju povezav nagajali nadobudni sosedje. A zakaj bi ti to počeli, če vedo, da lahko pri tem odkrijemo?
Kakorkoli, komunikacije prek Wi-Fi in Bluetooth je mogoče zasnovati robustno. Ne trdim, da jih nekdo ne more preprečiti z motilcem signala, ampak tudi naša aplikacija ima možnost spreminjati nosilni Wi-Fi kanal in samodejno poiskati tistega, ki deluje. Skratka, možnosti za upravljanje prek Wi-Fi in Bluetooth so. Lahko pa se vseeno odločite za uporabo brezžičnega protokola ESPnow, ki so ga razbili pri Espressif Systems in naj bi bil še robustnejši.
Še nekaj pomembnih stvari o razvojnem okolju Arduino!
Že res, da lahko programiramo ESP32S2 in ESP32S3 module le v Arduino 2.x IDE, kajti če namestimo ESP32 podporo v3.0.1 v Arduino IDE 1.8.19, torej zadnjo različico 1.x.x, bomo kaj hitro ugotovili, da ne deluje. No, vsaj meni ni. Kakorkoli, zadnja verzija Arduino 2.3.2 deluje le v Windows 10 in naprej, v Linuxu z gonilniki Vulcan in v Mac OS, kjer imamo na voljo tako različico za x64 arhitekture kot ARM64 arhitekture. Žal različice za Raspberry Pi in podobne računalnike na eni plošči na spletni strani arduino.cc ne najdemo. K sreči je na GitHubu voljo prav v ta namen prevedena različica Arduino 2.2.1, kar je definitivno bolje kot različica 2.1.1, ki še deluje na klasičnih PC s starejšimi različicami Windows, a zdi se, da morajo tudi ti imeti novejšo grafično kartico s podporo standardu Vulcan.
Sicer se programiranja M5Dial z ESP32S3 sistemom v enem čipu lahko lotimo tudi z Raspberry Pi 4 ali 5, a pri tem mora biti Raspberry Pi OS pravilno nameščen, namestimo pa tudi gonilnike Vulcan. Arduino IDE 2.2.1 lahko GitHuba prenesemo v datoteki ZIP, ki jo razširimo v poljuben imenik ali izvedljivi datoteki s končnico appimage (ali vse v enem). Oboje deluje!
Povejmo še, da se podpora za ESP32 namesti v podmapo .arduino15 v domači mapi (npr. /home/jaz/.arduino15). Tam lahko delamo tudi vse ročne popravke. Sicer je programiranje M5Dial enako preprosto kot na klasičnem PC. Potem, ko M5Dial prek kabla USB-C – USB-A povežemo z računalnikom, je vse popolnoma avtomatizirano, vključno s ponovnim zagonom po programiranju.
Kako komunicirajo Wi-Fi pristopne točke in krmilniki?
Čeprav med osnovnimi primeri za M5Dial ni takega, ki bi vključeval funkcionalnosti Wi-Fi, lahko slednje pregledamo med splošnimi primeri za ESP32 module. Med vsemi je še najbolj zanimiva funkcionalnost postaje Wi-Fi, ki se v domače Wi-Fi omrežje poveže prek dostopne točke. Tako lahko iz vsakega M5Dial modula dosežemo vse naprave, vključene v domače Wi-Fi omrežje.
Pri tem je še posebej zanimiva možnost krmiljenja ne samo luči v prostoru, kjer je nameščen M5Dial modul, ampak tudi v sosednjih sobah in hodnikih. Denimo, če smo v dnevno sobi pozabili ugasniti luč, ko smo šli iz kuhinje lahko zdaj M5Dial namesto s krmilnikom luči v kuhinji komunicira s krmilnikom v dnevni sobi in mu ukaže, da ugasne luči. Podobno velja tudi za M5Dial, ki ga namestimo v dnevni sobi in lahko z njim nastavljamo luči v kuhinji.
Čeprav smo za primer izbrali luči, to ne pomeni, da z M5Dial prek Wi-Fi in Bluetooth ne moremo upravljati tudi drugih naprav, denimo klimatske naprave, prezračevanja in ogrevalnih naprav pa tudi senčil. Skratka, gre za zelo pametno, vendar še vedno zelo enostavno napravico za vgradnjo, s katero lahko upravljamo skoraj karkoli.
M5Dial lahko upravlja tudi pametne LED sijalke, ki jih v lestence privijemo namesto žarnic ali halogenk. Vsekakor pa nam to lahko uspe le, če natančno poznamo komunikacijski protokol. Zato se pred nakupom takih LED sijalk splača preveriti razpoložljivost izvorne kode ali programskih knjižnih posameznih proizvajalcev.
Združevanje Wi-Fi drugih funkcij
Nekatere funkcije Wi-Fi, kot je skeniranje razpoložljivih omrežjih vzamejo veliko časa in lahko znatno vplivajo na zajem podatkov iz drugih tipal M5Dial. Zanimiv je na primer poskus, ko primeru Encoder dodamo enostavno Wi-Fi funkcionalnost. Osnovni primer zajema podatke z enkoderja in tipke M5Dial. Ko vrtimo M5Dial v levo ali desno, šteje premike glede na podatke, ki jih sproti zajema iz enkoderja. Šteti zančne z 0, pri čemer ob vsakem premiku v desno trenutni vrednosti prišteje 1, pri zasuki v levo pa 1 odšteje. S klikom na gumb, vrednost števca ponastavimo na 0.
Če primer združimo s primerom WiFiScan, tako da se M5Dial nekaj časa ukvarja z enkoderjem, nekaj časa pa skenira Wi-Fi omrežja in rezultat izpiše prek zaporedne povezave, ki je povezana s PC prek vgrajenega USB vmesnika (tega uporabljamo tudi za programiranje), se začne zatikati. Dobesedno! Zaznavanje premikov enkoderja postane dokaj neodzivno, četudi v glavno zanko programa vgradimo kretnico, ki sproži skeniranje omrežij le vsakič stotič. Zato je več kot očitno, da zajemanje vzorcev z enkoderja zahteva natančno časovno uskladitev.
Ena izmed mogočih rešitev je uporaba enega od procesorskih jeder za preverjanje enkoderja, drugega pa za vse ostalo. Na ta način veliko lažje dosežemo časovno uskladitev kot z vgrajevanjem kompleksnih časovnih programskih strukturi za izvajanje postopkov po korakih, na primer z ukazoma select in case ter uporabo števca, pri čemer v vsakem koraku zanke izvedemo eno od opravil.
Vklop Wi-Fi funkcij
Funkcije Wi-Fi postanejo dostopne, če na začetek Arduino Skripte dodamo naslednjo vrstico: slika 1
To lahko vidimo tudi iz številnih splošnih primerov za ESP32, ki demonstrirajo uporabo Wi-Fi funkcij. Zanimivo pa je, da med osnovnim primeri za M5Dial ne najdemo tudi takega, ki bi vključeval Wi-Fi ali Bluetooth funkcije. Kaže, da sta avtorjem veliko bolj pri srcu zaporedni vmesnik (kvazi RS-232 s TTL nivoji) in I2C vodilo, ki ste ju spoznali že v preteklih nadaljevanjih.
Večnitnost!
Če se še vedno sprašujete, zakaj imajo Tensilicini mikrokontrolerji v ESP32 čipih po dve procesorskih jedri, je zdaj odgovor kot na dlani. Strojno izvajanje vzporednosti v programih poteka na nivoju najmanjših enot procesiranja, strojih ukazov. Zato teče veliko bolj gladko in lahko brez večjih težav razrešimo »Gordijski vozel« iz prejšnjega odstavka. Določena opravila bi bilo sicer težko razbiti na dovolj majhne kose, da bil lahko potekala vzporedno.
Poglejmo primer, kako zgradimo opravilo (angl. task). Najprej moramo v glavnem programu vključiti ustrezno programsko knjižnico, ki omogoča tvorbo in poganjanje več opravil iz glavnega programa: slika 2
Naj dodam, da je v prejšnjih različicah podpore Espressif Systems za Arduino (različice do 2.0.0) potrebno navesti tudi še nekatere druge knjižnice FreeRTOS, oziroma le tega vključiti v Arduino skripto. No, pri zadnji različici 3.0.1, ki sem jo uporabljal, zagotovo zadošča samo navedba zgoraj omenjene knjižnice pod pogojem, da smo prej v Arduino IDE namestili knjižnico FreeRTOS, ki je na voljo za vse Arduino projekte.
Zdaj lahko tvorimo ročico nove naloge, ki smo jo v našem primeru poimenovali xEncoderTask, saj bo povezana z zaznavanjem položaja enkoderja. Vanj bomo preselili kodo za spremljanje vrtenja M5Dial in spremljanje stanja gumba. Tako bo vedno na voljo stanje vrtenja v obliki spremenljivke MD5Dial_rotation in stanje gumbe M5Dial_button:
TaskHandle_t xEncoderTask;
// Task handle for encoder task
Med definicijami moramo podati tudi prototip funkcije novega opravila EncoderTask si katerim Arduino C++ prevajalniku povemo, da naj v telesu programa pričakuje tudi kodo funkcije:
void EncoderTask ( void * parameter ) ;
// Encoder Task
Zdaj moramo lahko dodamo nekje v telo programa tudi novo nalogo EncoderTask, ki v neskončni zanki opravlja opravila, za spremljanje stanja rotacije, ki jih je prej izvajala glavna programska nit:
void EncoderTask ( void * parameter )
{
while ( true )
{
M5Dial.update();
newPosition = M5Dial.Encoder.read();
if (newPosition != oldPosition) {
M5Dial.Speaker.tone(8000, 20);
M5Dial.Display.clear();
oldPosition = newPosition;
Serial.println(newPosition);
M5Dial.Display.drawString
(String(newPosition),
M5Dial.Display.width() / 2,
M5Dial.Display.height() / 2);
}
if (M5Dial.BtnA.wasPressed()) {
M5Dial.Encoder.readAndReset();
}
if (M5Dial.BtnA.pressedFor(5000)) {
M5Dial.Encoder.write(100);
}
vTaskDelay(1); // Wait 1 ms until next
repetition of the task body
}
}
Naloga se seveda nikoli ne konča, zato mora po inicializaciji vsebovati tudi neskončno zanko, v kateri bare podatke iz enkoderja in jih izpisuje na zaslon M5Dial ter hkrati izpisuje na terminal prek zaporednih vrat.
Tako nam na koncu preostane le še vgradnja funkcije za zagon programske niti enkoderja v glavno setup proceduro, takole:
xTaskCreatePinnedToCore(
EncoderTask,
// Task to play data in dataqueue.
„Encoder“,
// name of task.
1600,
// Stack size of task
NULL,
// parameter of the task
2,
// priority of the task
&xEncoderTask,
// Task handle to keep track of
created task
0 ) ;
// Run on CPU 0
Klic funkcije xTaskCreatePinnedToCore navadno dodamo na konec, da je prej že vse pripravljeno.
Še glavna programska zanka!
Loop je zdaj lahko namenjena samo Wi-Fi povezavam. Namerno smo za začetek izbrali enostaven primer, s katerim zgolj izpišemo podatke Wi-Fi dostopnih točk v bližini M5Dial prek zaporednih vrat. Izpis lahko vidimo na terminalu gostiteljskega računalnika. V mojem primeru je bil to Raspberry Pi 5, ki je poganjal Arduino IDE 2.2.1 z nameščeno podporo za plošče M5Dial in programsko knjižnico FreeRTOS.
Poglejmo izsek programske kode:
void loop() {
if (M5Dial.BtnA.wasPressed()) {
M5Dial.Encoder.readAndReset();
Serial.println(„Scan start“);
// WiFi.scanNetworks will return the number of networks found.
n = WiFi.scanNetworks();
…
}
Čeprav bi lahko skeniranje Wi-Fi dostopnih točk potekalo neprestano, sem se namesto tega odločil, da ga raje sprožim s tipko M5Dial. Vendar to ne pomeni, da med skeniranjem omrežij enkoder in izpis na LCD ali prek zaporednih vrat ne delujejo. Prav nasprotno! Skeniranje omrežij je zdaj neopazno in ne vpliva na zajemanje podatkov z enkoderja. Izpis Wi-Fi dostopnih točk dobimo prek zaporednega vmesnika za terminal hipoma, šele ko je pripravljen. Dejansko je to po kakih petih sekundah, od trenutka, ko smo s pritiskom na tipko M5Dial sprožili skeniranje.
Prihodnjič
Tokrat samo Bluetooth samo omenili, prihodnjič boste spoznali njegovo praktično uporabo. Lotimo se tudi kompleksnejšega Wi-Fi primera, v katerem bomo M5Dial uporabili kot krmilni modul za upravljanje kuhinjskih luči.
https://svet-el.si