V preteklem nadaljevanju smose lotili tehnik razvoja primernih uporabniških vmesnikov, s katerimi bolje izkoristimo grafične barvne prikazovalnike. Lotili smo se tudi razvoja Arduino programske kode v Arduino chipKIT razvojnem okolju, ki je prilagojeno za Microchipove mikrokontrolerje in obenem nekoliko prilagodili Arduino chipKIT Microchip PIC32MZ EC Starter Kit plošči.
Avtor besedila, posnetkov zaslona in fotografij: dr. Simon Vavpotič
Tokrat najprej še nekaj o grafičnih vmesnikih in upravljanju na daljavo in o zagotavljanju varnosti upravljanja naprav z mikrokontrolerji na daljavo, nato pa, kot obljubljeno, nadaljujemo z razvojem kompleksnejših Arduini chipKIT aplikacij.
Ta vsebina je samo za naročnike
Uporabniški vmesnik le na oddaljenem IoT klientu
Ker se pogosto pojavljajo vprašanja o primernosti različnih načinov implementacij grafičnih uporabniških vmesnikov glede na tip IoT projekta, poskušajmo tematiko osvetliti tudi s stališča informacijske varnosti, zanesljivosti delovanja, enostavnosti izvedbe in stroškov vgrajenih komponent. Elon Musk ima sicer prav, ko pravi, da je »The best part is no part. The best process is no process…«, kar pomeni, da je najboljši tisti del naprave, ki ga ne potrebujemo in najboljši tisti proces, ki nam ga ni potrebno implementirati, ne v strojni in ne v programski opremi. Nadaljuje, da del naprave, ki ga ne potrebujemo, nič ne stane, nič ne tehta in nič ne more škodovati njenemu delovanju. Obenem pa dobro ve, kako zagotoviti ravno pravšnjo kompleksnost in zanesljivost delov, ki so nujno potrebni za implementacijo.
Daljinsko upravljanje je odlična rešitev za nekritične aplikacije na področju strojne opreme, saj krmilnik naprave ne potrebuje lastnega zaslona in tipkovnice, zadošča že dovolj hiter mikrokontroler z nekaj več RAMa in EEPROMa (kot je PIC32MZ2048ECH100), ali zunanji serijski EEPROM in velik RAM v mikrokontrolerju (kot v ESP32 modulih), v katerega je mogoče shraniti programje za krmiljenje s spletnim strežnikom. Vsa ostala programska oprema za delovanje uporabniškega vmesnika je na odjemalski napravi, ki je lahko pametni telefon, pametna ura, tablica ali osebni računalnik, ki dostopa prek brezžične ali ožičene povezave. O tem lahko preberete tudi na spletni strani gui-o.com.
Zakaj torej tovrstnega pristopa ne bi uporabili pri reševanju vseh krmilnih problemov? Če Android napravo z mikrokontrolerjem povežemo prek kabla, odpravimo večino nevarnosti, ki jih predstavljajo brezžična omrežja, kar je odlično. Žal se večina tovrstnih naprav zanaša le na brezžične komunikacije, obenem pa večina ni prirejena za delovanje v industrijskih okoljih.
Če sestavljamo napravo za domačo rabo, si po drugi strani lahko privoščimo razkošno grafiko in tudi njeno občasno nedelovanje. Če pa bi hoteli napravo s kombinacijo Android naprave in mikrokontrolerja serijsko proizvajati, bi bila dražja od klasične rešitve. Krmiljenje na daljavo iz katerekoli pametne naprave se splača predvsem, če Android napravo že imamo, oziroma pri nekritičnih aplikacijah.
Naj omenim še to, da je na spletni strani [1] Arduino IoT spletna aplikacija za upravljanje ESP32-CAM modula, s katero lahko v pametni telefon prenašamo živo sliko s kamere.
Kdaj upravljanje na daljavo ni najboljša rešitev?
Z leti se mi je pri delovanju strojne opreme marsikaj pripetilo, zato sem iskal različne rešitve za povečanje varnosti in zanesljivosti delovanja. Denimo, v programski opremi elektronskega termostata hladilnika sem imel v začetku več kot dovolj varnostnih lukenj, med katerimi sta bili glavni, da nisem uporabil psa čuvaja (angl. watch dog) in da je nekje v programu ostala skrita možnost oddaljenega nastavljanja parametrov, kar pomeni, da bi lahko nekdo teoretično z oddaljene lokacije spremenil prag vklopa in izklopa hlajenja, kar bi bilo lahko usodno tako za hladilnikov kompresor kot preklopni rele, posledično pa tudi za hrano v hladilniku.
Težave imajo tudi velikoserijske naprave in celo avtomobili. Se vam je že zgodilo, da se je vaš glasbeni stolp Hi-Fi, ki ga upravljate z upravljalnikom, med vašimi počitnicami vklopil kar sam od sebe, ali pa je Wi-Fi povezava med domačo pametno IoT napravo in računalnikom zablokirala, ko ste bili v službi ipd.? Neprijetno sem bil pred kakimi petnajstimi leti presenečen tudi, ko sem šel na izlet na rt Kamenjak v hrvaški Istri izven turistične sezone. Več kot očitno mi je takrat domnevno nekdo posnel kodo iz IR daljinskega upravljalnika v avtomobilskem ključu, ukradel vredne predmete iz avta in ga nato zaklenil nazaj. Manjkajoče predmete smo opazili šele, ko smo se vrnili s sprehoda…
Kljub temu mladim in nadobudnim hekerjem, ki so si gotovo že kdaj ogledali vsaj nekaj videov iz YouTube kanalov kot so: NetworkChuck, Ben Pin, LiveOverflow, The Cyber Mentor, Seytonic, HackerSpolit, STOK, IppSec itn., še dolgo ne bo zmanjkalo novih idej. Obenem lahko na nezanesljivost povezav vpliva tudi siceršnja obremenjenost frekvenčnega prostora z različnimi podatkovnimi omrežji. Več o tem lahko preberete tudi v članku Wi-Fi penetration testing with an ESP32, objavljenem na spletni strani [2]. Naj še dodam, da je pri slabo zaščiteni Wi-Fi IoT napravi dostikrat potreben ponovni zagon.
Varno do kritičnih sistemov na daljavo
Za zagotavljanje visoke stopnje varnosti kritičnih sistemov se ponujajo tri rešitve: ne uporabimo brezžičnih komunikacij, brezžična komunikacija omogoča samo prenos telemetrije, ne pa tudi upravljanje naprave, ali brezžična komunikacija omogoča nastavljanje določenih parametrov, vendar ne dovoli nastavitev izven varnega območja delovanja.
Druga možnost je, da nastavitve vedno izvedemo prek uporabniškega vmesnika naprave, nato pa ne dovolimo njihovega spreminjanja na daljavo. V tem primeru lahko iz oddaljene lokacije prek brezžične povezave preberemo telemetrijo naprave, vendar pa ne moremo vplivati na delovanje naprave. Morda je tak način delovanja za hladilno skrinjo še najboljši. Vendar poudarjam, da je lahko uporaba krmilnih modulov, ki uporabljajo isti mikrokontroler za brezžične komunikacije in krmiljenje, vprašljiva, saj lahko do odpovedi delovanja pride tudi zaradi morebiti neodkritih napak v Wi-Fi programskih knjižnicah in Wi-Fi transiverju, ki ob sprejemu nepravilno formiranih podatkovnih paketov zablokirajo delovanje celotnega mikrokontrolerja.
Zelo visoko varnost pa zagotovimo z ustrezno zaščiteno ožičeno komunikacijo, denimo CAN vodilom ali kako drugo vrsto povezave, prek katere nadzorna enota komunicira iz oddaljenimi krmilnimi moduli. Tak način komunikacije je uporabljen predvsem v sodobnih vozilih in zračnih plovilih (t.i. fly by wire).
Arduino chipKIT: Kako vzpostaviti delovanje kompleksnejših funkcionalnosti?
Raziskovanja naprednih Arduino chipKIT funkcionalnosti sem se lotil podobno kot v preteklosti raziskovanja Arduino funkcionalnosti ESP modulov, tako da sem preprosto uporabil strojno opremo, ki sem jo imel pri roki. Ker se mi je zdelo škoda kupovati s chipKITom neposredno združljivo razvojno ploščo, saj ima PIC32MZ EC Starter Kit skupaj s Starter Kit Expansion Boardom 16 in SD tail boardom vse bistvene funkcionalnosti, ki jih ima tudi večina prej omenjenih razvojnih plošč, sem se raje odločil izdelati novo chipKIT definicijo zanj. Zanimivo pa je, da je chipKIT zagonski nalagalnik (bootloader) zasnovan, tako da ga brez večjih težav namestimo tudi na PIC32MZ EC Stater Kit razvojno ploščo in druge Microchip Starter Kite, zato mi vsaj njegove kode ni bilo potrebno popravljati. Poigral sem se le z nastavitvijo hitrosti in izbiro USARTa, ki omogoča prenos Arduino chipKIT programa. Podrobnosti so v preteklem nadaljevanju v SE307.
Pri zahtevnejših projektih ne uporabljamo zgolj funkcionalnosti v mikrokontrolerju, temveč tudi kopico tistih v zunanjih enotah, med katerimi so: razni merilniki (ultrazvočni merilnik oddaljenosti, elektronski giroskop, kompas, termometer, vlagomer, IR sprejemnik…), tipkovnice, prikazovalniki in komponente za predvajanje Hi-Fi zvoka, od katerih večina komunicira prek SPI in I2C vodil. Arduino chipKIT razvojnemu okolju je priložena množica standardnih Arduino programskih knjižnic za različna področja uporabe, kakor tudi nekatere napredne programske knjižnice, ki bolje izkoriščajo dodatne strojne funkcionalnosti v Microchipovih mikrokontrolerjih in nekaterih zunanjih komunikacijskih modulih, kar omogoča hitrejši in zanesljivejši prenos podatkov ob hkratni nižji obremenitvi procesne enote mikrokontrolerja.
Ko pregledujemo mnoštvo primerov programskih kod za uporabo raznih skupin funkcionalnosti v chipKIT razvojnem okolju, hitro ugotovimo, da vsi ne delujejo na vseh razvojnih ploščah. Pravzaprav, je včasih težko ugotoviti, kateri je najprimernejši.
Od enostavnih h kompleksnejšim primerom
Primeri programov v Arduino chipKIT skušajo kar se da poenostaviti uporabo sicer kompleksnih funkcionalnosti, kot so podpora delovanju USB vmesnika, uporaba datotečnega sistema na notranjem podatkovnem pogonu ali na SD kartici, podpora za SPI in I2C vmesnike in A/D pretvornik ter podporo komunikacijskim vmesnikom za ožičeni Ethernet in brezžični Wi-Fi. Večina potrebnih nastavitev je skrita v programskih knjižnicah in njihovih glavah, medtem ko moramo v glavnem programu (datoteka *.ino) definirati zgolj ustrezno razvojno ploščo. No, sam nisem imel te sreče, sem se pa zato o ustroju chipKIT razvojnega okolja naučil dosti več, kot bi se sicer. Po drugi strani, sta filozofiji Microchipovega MPLAB X in Espressif Systemsovega ESP-IDF razvojnih okolij, ki sta namenjeni predvsem profesionalnim programerjem, ravno nasprotni. Najprej moramo prek grafičnega vmesnika ali v programski kodi svoji napravi prilagoditi kopico nastavitev. Zato se je pri definiciji nove razvojne plošče v Arduino chipKIT razvojnem okolju nemalokrat potrebno še kako potruditi, da v številnih programskih knjižnicah poiščemo možnosti nastavljanja v drugih okoljih sicer samoumevnih nastavitev, kot je hitrost komunikacije s SD kartico.
V preteklem nadaljevanju smo v grobem opisali, kako izdelamo definicijo nove razvojne plošče za chipKIT razvojno okolje, tokrat pa dodajmo, da lahko podrobnejši zasnove in podatkovnih struktur najdete z iskalnikom na spletnem portalu [3]v datoteki chipKIT-MPIDE-Board-Variant-Mechanism-Rev-A.pdf. Pri definiciji nove razvoje plošče se splača začeti z že izdelano definicijo podobne razvojne plošče, ki jo nato dodelamo. Uporabil sem definicijo razvojne plošče s PIC32MZ2048EFH100 mikrokontrolerjem, MikroElektronika Flip N Click MZ, ki deluje pri 252 MHz; medtem, ko PIC32MZ EC Starter Kit le pri 200 MHz. Dodajmo še, da chipKIT podpira strojno in programsko definicijo SPI in I2C protokola, vendar bi bilo pri PIC32 škoda ne uporabiti USART enot, ki večino dela opravijo same.
Nekateri primeri delujejo takoj, drugi ko spremenimo nastavitve, tretji zahtevajo drugo periferijo…
Ko je ob dopolnjevanju nastavitev prvi začel delovati USB MSD primer sem si zares oddahnil, saj je to pomenilo, da je USB port tudi v Arduino okolju pravilno skonfiguriran in aktiven in da hkrati deluje tudi datotečni sistem. Kljub temu to še ni bil razlog za slavje, saj se je pravilna definicija SPI vmesnika izkazala za kar trd oreh. PIC32MZ2048ECH144 ima 6 SPI vmesnikov, ki od kateri lahko kateregakoli uporabimo za priklop SD kartice. S PIC32MZ Starter Kitom lahko prek s Starter Kit Expansion Boarda 16 hkrati povežemo dva SD tail boarda in tako hkrati uporabljamo dve SD kartici, a za to moramo najprej določiti ustrezne priključke na mikrokontrolerju.
Prav tako enostavna je tudi uporaba primerov iz skupine EEPROM, s katerimi lahko beremo in pišemo podatke, kakor tudi računamo varnostne kode CRC, s katerimi lahko odkrijemo morebiti nepravilno shranjene ali zaradi zunanjih vplivov poškodovane vsebine.
Ethernet vmesnik
Za prenos podatkov prek ožičenega interneta ali Wi-Fi potrebujemo ustrezen vmesnik. Nekateri PIC32MX in večina PIC32MZ mikrokontrolerjev ima vgrajeno funkcijsko enoto za žično Ethernet komunikacijo, ki za delovanje potrebuje še prilagoditveno vezje s čipom in miniaturnim ločilnim transformatorjem, denimo LAN8720 ali novejši LAN8740. Vendar vsi primeri niso uporabni za PIC32MZ EC Starter kit, saj se nanašajo na razvojne plošče z drugimi dodatnimi moduli, kot je popularni W5100 za podporo Wi-Fi komunikaciji. Ne sme nas zavesti ime glave programske knjižnice Ethernet.h, ki je vključena v veliko primerov in prirejena za uporabo W5100 modula. Če želimo namesto tega uporabiti ožičeni dostop do interneta prek Ethernet povezave, lahko uporabimo Diligentovo programsko knjižnico DEIPcK, na voljo pa je tudi njihova DEWFcK knjižnica, ki je namenjena brezžični Wi-Fi komunikaciji.
Nerodno pa je, če v dobri veri, da je programiranje v Arduinu na PIC32 mikrokontrolerju podobno enostavno kot pri ESPjih, uporabiš napačen primer in se nato čudiš, zakaj ni rezultatov. Obenem je v poplavi različnih razvojnih plošč s PIC32 mikrokontrolerji treba razumeti tudi snovalce Arduino chipKIT programske podpre, katerim je težko izdelati povsem enotno podporo za razvoj programskih aplikacij.
chipKIT razvojne plošče se ne razlikujejo zgolj po vgrajeni periferiji, ampak tudi funkcionalnih enotah in številu priključkov procesorja. Pri ESP modulih je v tem pogledu dosti lažje, saj je precej manj različic, hkrati pa moduli temeljijo le na dveh funkcionalno različnih tipih mikrokontrolerjev. Tako se, denimo novejši ESP32 Rover modul le malenkostno razlikuje od ESP32 Room modula, saj ima za vmesno hrambo podatkov oddan RAM s serijskim dostopom. Je pa večja razlika, tudi v programskih knjižnicah, med ESP8266 in ESP32 moduli.
chipKIT podpora za SPI vodilo
PIC32 razvojne plošče se zelo razlikujejo po SPI funkcionalnostih in periferiji. Pri PIC32 ne moremo govoriti o modulih temveč le o mikrokontrolerjih in razvojnih ploščah. Slednje se med seboj zelo razlikujejo, zato pogosto tudi za istovrstne funkcionalnosti ne morejo uporabljati enakih knjižnic. V nekaterih primerih knjižnice niso dovolj dodelane, da bi omogočale enostavno prilagoditev na drugo stojni opremo.
Strojna in programska podpora delovanju SPI vodila sta ključni za hiter prenos podatkov med perifernimi napravami in PIC32 mikrokontrolerjem. Z osnovno Arduino chipKIT SPI programsko knjižnico ne moremo v polnosti izkoristiti strojnih funkcionalnosti PIC32 mikrokontrolerjev. Zato so pri Diligentu zgradili tudi dodatno programske knjižnico DSPI s pestrejšo funkcionalnostjo, brez katere ne moremo graditi podobno zmogljivih vgrajenih programskih oprem kot v MPLAB X.
Vendar pa je tudi Diligentova programska knjižnica vezana na isto osnovno chipKIT razvojnega okolja. Zato se ne smemo čuditi, če kateri od primerov ne bo deloval, če smo za novo razvojno ploščo v definicijskih datotekah Board_Defs.h in Board_Data.c izbrali napačne nastavitve. Dostikrat pravih tudi ni najlažje poiskati, kako kot v mojem primeru, ko sem ugotovil, da vse komercialne razvojne plošče s PIC32MZ temeljijo na čipu s 100 priključki ali manj, medtem ko jih ima moj starter kit 144. Saj ne rečem, da ni 144 bolje kot 100, a je treba prav vse dodatne pravilno skonfigurirati, če jih nameravamo uporabljati. Če smo pri tem površni, kaka funkcionalnost morda ne bo dostopna.
Če vzamemo za zgled omenjeni datoteki od katere od podprtih razvojnih plošč s podobnim mikrokontrolerjem, bomo morda morali kako funkcionalnost, ki je naša razvojna plošča nima, tudi odstranit iz nastavitev. Denimo, za PIC32MZ EC Starter Kito je potrebuje za Wi-Fi komunikacijski vmesnik MRF24, razen če ga dodamo, a pri tem ga bomo skoraj gotovo povezali prek drugih priključkov.
SD kartica in datotečni sistem
Večina zmogljivejših chipKIT razvojnih plošč ima vgrajeno tudi ležišče za nadvse uporabno mikro SD kartico. Predpogoj za njeno delovanje je vzpostavitev delovanja ustreznega strojnega ali programskega SPI vmesnika. PIC32MZ mikrokontrolerji imajo med 4 ali 6 SPI funkcionalnih enot, zato res ni razloga, da jih ne bi uporabili, saj bistveno poenostavijo in pohitrijo prenos podatkov prek tega vodila, kar je še posebej pomembno pri uporabi (mikro) SD kartic z velikimi kapacitetami.
Arduino chipKIT podpora za (mikro) SD kartice je implementirana tako na osnovi SPI programske knjižnice, kot tudi na osnovi naprednejše DSPI. Primere za osnovo SPI najdemo v skupini primerov SD, medtem ko je skupina primerov DSDVOL temelji na programski knjižnici DSPI. Uporaba primerov je sorazmerno enostavna in skoraj samoumevna, tako kot že omenjeni USB MSD primer delovanja mikrokontrolerja kot zunanjega podatkovnega pogona prek vodila USB.
Za preverjanje zmogljivosti datotečnega sistema lahko uporabite tudi primere iz skupina RAMVOL, ki ustvarijo navidezni podatkovni pogon v RAMu mikrokontrolerja. Slednjega lahko uporabljate brez vodila USB in prek priključka RS232 za programiranje spremljate delo programa z navideznim pogonom.
Kompleksne aplikacije sestavljamo podobno kot LEGO kocke
Arduino chipKIT ne premore kompleksnejših primerov, zato pa je sestavljanje funkcionalnosti iz različnih primerov veliko enostavnejše kot v MPLAB X okolju. Če pa si želite gotovih projektov, jih veliko najdete na chipKIT blogu za razvijalce [4]. Eden od zanimivih projektov na osnovi PIC32MX270F256D mikrokontrolerja je HelveKit Robot, katerega podrobnejši opis najdete na spletni strani [5]. Robot ima 6 infrardečih tipal za oddaljenost od ovir, po 3 spredaj in zadaj, premika pa se s pomočjo dveh motorjev, po enim na vsakem od dveh koles, oporo pa mu nudi še okrogli drsnik. Čeprav ga brez dodatkov ne moremo upravljati na daljavo, mu tipala ob hkratnem počasnem vrtenju koles omogočajo popolno avtonomijo. Programiramo ga kar prek USB priključka, na voljo pa sta tudi dva UART in dva I2C vmesnika, prek katerih lahko povežemo komunikacijske vmesnike za upravljanje na daljavo in prenos telemetrije.
Avtor v opisu projekta primerja tudi zmogljivost PIC32MX270F256D mikrokontrolerja z ATmega328 mikrokontrolerjem, ki je vgrajen v originalno Arduino Uno razvojno ploščo, in ugotavlja, da ima PIC32MX270F256D mikrokontroler 8-krat več Flash RAMa in 32-krat več RAMa, pri čemer naj bi bil tudi nekajkrat hitrejši.
Zanimiv projekt je tudi BME280 Weather Station, zgrajen na osnovi chipKIT Uno32 razvojne plošče in Boschovega BME280 tipala, ki meri temperaturo, vlago in zračni pritisk. Natančen opis projekta najdete na spletni strani [6]. Za implementacijo projekta potrebujemo tudi nekaj dodatnih Arduino programskih knjižnic, od katerih je večina posebej prirejena za chipKIT razvojno okolje in posebej za druga okolja, kot je ESP32 razvojno okolje. Velja omeniti še, da avtor v projektu poleg BME280 senzorja uporabil tudi danes že nekoliko zastareli Nokia 5110 LCD prikazovalnik, na katerem se sproti izpisujejo vremenski parametri.
Microchip MPLAB X IDE Arduino Import Plugin
Microchipovih mikrokontrolerjev torej ni težko uporabiti v Arduino razvojnem okolju, a v njem pogrešamo možnost razhroščevanja Arduino skript. Microchip je zato že za MPLAB X IDE v3.10 izdelal chipKIT Platform Sketch Importer, ki ga je kasneje dopolnjeval in preimenoval v chipKIT Import Plugin for MPLAB X IDE, katerega izvorno kodo najdemo na GitHubu na spletni strani [7]. Če želimo v MP LAB X razhroščevati chipKIT Arduino skripte, potrebujemo še: MP LAB X v5.10 ali novejši, MPLAB XC32 C/C++ compiler v2.1 ali novejši, Arduino IDE v1.8.5 ali novejši in chipKIT-core v2.0 ali novejši.
Prihodnjič
Nadaljevali bomo s pregledom kompleksnejših aplikacij v Arduino chipKIT okolju in obenem podrobneje spoznali orodja za prebojno testiranje varnosti Wi-Fi omrežij, brez katerih si težko predstavljamo načrtovanje varnih in zanesljivih IoT naprav za resno uporabo.
Viri:
https://github.com/easytarget/esp32-cam-webserver/blob/master/esp32-cam-webserver.ino
www.chipkit.net
https://chipkit.net/category/chipkit-developers
https://www.instructables.com/HelveKit-Robot-How-I-Designed-a-Robot
https://github.com/chipKIT32/chipKIT-importer