Avtor: Brian Millier
Morda ste že videli oglase podjetja Mikro-e, ki se hvalijo z več kot 1000 Click moduli, ki jih proizvajajo. Ti Click moduli imajo skupen razpored priključkov z dvema 0,1-palčnima konektorjema, od katerih ima vsak 8 priključkov.
Določeni so napajalni priključki ter SPI, I2C in UART priključki, obstaja pa tudi nekaj GPIO priključkov. Zaradi velike raznolikosti Click modulov, ki so na voljo, in večjim številom MCU razvojnih plošč različnih proizvajalcev, vključuje enega ali več Click priključkov. Čeprav je razpored Click priključkov pri vseh modulih enak, je fizična velikost vsakega modula prilagojena dejanskim komponentam, ki se uporabljajo na modulu, in morebitnim omejitvam velikosti zaradi priključnih blokov, nameščenih na modulu. Slika 1 prikazuje modul ECG 3 Click, ki je bil uporabljen v enem od projektov v tem članku – spodnja polovica vsebuje skupni razpored priključkov.
Podjetje Mikro-e zagotavlja vzorčno kodo za svoje Click module – vsaj za tiste, ki vsebujejo periferne MCU čipe. Na voljo so v razdelku LibStock na njihovem spletnem mestu. Ti primeri so napisani v jeziku, ki ga podpirajo njihovi lastni prevajalniki. Micro-e prodaja prevajalnike/IDE za C, Basic in Pascal, namenjene večini družin MCU (PIC, ARM, AVR itd.). Ker so napisali več različnih prevajalnikov, ki so vsi prilagojeni za delo z različnimi MCU-ji, so za te prevajalnike sprejeli edinstven „slog“. V zadnjem času nisem delal s prevajalniki Mikro-e, zato trenutno ne morem oceniti njihove učinkovitosti ali enostavnosti uporabe. Ugotavljam pa, da je izvorna koda za njihove primere LibStock Click oblikovana za njihove lastne prevajalnike in je na voljo v lastni (?) obliki datotek (.mpkg). Te datoteke je mogoče zlahka prebrati z Mikro-e prevajalniki, vendar jih jaz nisem mogel prebrati/uporabiti. Osebno uporabljam Arduino 2.3.2 IDE – ena od velikih privlačnosti Arduina je velika količina vzorčnih programov in knjižnic, ki so na voljo zanj. Za številne periferne čipe, ki jih najdemo na Click ploščah, je enostavno najti knjižnico/primere za Arduino. Za projekte v tem članku sem lahko našel Arduino knjižnice. Na žalost ena od njih ni delovala, kot je napisana, in sem moral narediti veliko sprememb, da je začela delovati.
Ta vsebina je samo za naročnike
ECG 3 Click
Modul ECG 3 Click je zasnovan za branje EKG signalov, zajetih s standardnim enožilnim EKG kablom/elektrodami. Če imate dober spomin, se boste morda spomnili, da sem pred časom napisal članek, v katerem sem opisal EKG projekt, ki je posnemal komercialno EKG enoto KardiaMobile. Ta enota je kot zaslon uporabljala prilagojeno aplikacijo za mobilni telefon KardioMobile. Pri tem projektu sem uporabil čip podjetja Analog Devices ECG Front End AD8232, ki ima analogni izhod. Ta čip obstaja že 12 let, zato sem želel preizkusiti veliko novejši ECG Front-End.
Modul ECG 3 Click vsebuje precej novejši čip MAX30003. To je bil prvotno čip podjetja Maxim, ki je zdaj del podjetja Analog Devices. Za razliko od AD8232 je izhod tega čipa digitalen in uporablja SPI protokol. Poleg tega, da zagotavlja obliko EKG signala v digitalni obliki, vsebuje tudi procesor, ki lahko na podlagi tega EKG signala določi srčni utrip. To je lahko priročno pri enotah z nizko porabo energije (baterijsko napajanje), saj se lahko gostiteljski MCU preklopi v stanje spanja in prekine šele, ko je izračunana vrednost srčnega utripa.
Za izris EKG signala sem se odločil, da bom uporabil zaslon mobilnega telefona. Moj prejšnji EKG projekt je bil odvisen od aplikacije KardiaMobile po meri za mobilne telefone, ki je z mobilnim telefonom komunicirala z ultrazvokom (z mikrofonom telefona). Pri tem projektu sem moral aplikacijo za mobilni telefon izdelati sam. Ker nimam izkušenj s pisanjem aplikacij za mobilne telefone, sem namesto tega uporabil aplikacijo GUI-O za Android. To je poceni aplikacija, ki deluje samo v operacijskem sistemu Android. Zunanjemu MCU-ju z WiFi, Bluetooth ali BLE omogoča interakcijo z vašim mobilnim telefonom. Na zaslonu mobilnega telefona lahko ustvari uporabniško nadzorno ploščo in sprejema pritiske na tipke, geste itd., ki jih pošlje nazaj v zunanjo MCU napravo. Slika 2 prikazuje GUI-O program, ki ga nadzoruje moja EKG naprava in prikazuje EKG sled. Prazno območje proti začetku je „izbrisan“ del prejšnje sledi. Tako kot pri komercialni EKG napravi se sled stalno posodablja po zaslonu, prazno območje pa ločuje prejšnjo sled od trenutne.
Omeniti moram, da podjetje Maxim označuje MAX30003 kot 1-žični ECG Front-End. Tako bi ga nedvomno poimenovali v medicini, kjer EKG meritve lahko vključujejo 6 ali več elektrod, ki so priključene po celem telesu. Za bolj rutinske meritve se uporablja konfiguracija z 1 elektrodo. Vendar pa je to nekaj podobnega kot Dallasov komunikacijski protokol „1-Wire“ – dejansko obstaja več kot ena žica! V primeru 1-žilnega EKG se uporabljata dve aktivni elektrodi in ena „skupna“ elektroda, ki je običajno potrebna za zmanjšanje zunanjih RF šumom. Več o tem pozneje.
Vezje
Maxim MAX30003 ECG Front-End je na voljo v 28-pin TQFN ali 30-pin WLP ohišju, ki sta premajhni, da bi ju lahko uporabljal/montiral na tiskano vezje. Zato je sreča, da je ta čip na voljo na Click ploščici.
Pri tem projektu sem bil prisiljen uporabiti starejši Bluetooth 4.2 protokol. Razlog za to je, da se zdi, da Arduinova BLE programska oprema ni sposobna obvladovati velikih blokov podatkov. To je potrebno za pravočasen prikaz EKG sledi. Vendar pa Bluetooth 4.2 v tem pogledu deluje dobro.
To je v bistvu pomenilo, da sem lahko uporabil le enega od MCUjev ESP32. Le originalni ESP32 vsebuje starejši Bluetooth 4.2. Poznejše različice (C3, S3, S2) vsebujejo le BLE. Novi MCU ESP32C6 naj bi podpiral tako Bluetooth 4.2 kot BLE. Zahteva različico 3.x.x kompleta plošče Arduino ESP32 podjetja Espressif. Vendar nisem mogel sestaviti svojih obstoječih programov, ki so uporabljali Bluetooth 4.2, ko sem kot ciljni MCU izbral ESP32C6 (in naložil komplet plošče Espressif ESP32 v3.0.7).
Razvojne plošče DF Robot DFR0654 imam vedno pri roki, saj se mi zdijo primerne za številne projekte. Vsebuje modul ESP32-WROOM-32E. Ima tudi vtičnico LiPo in polnilec, ki sta potrebna za ta projekt. Ima veliko več GPIO, kot je potrebno za ta projekt, vendar se dobro prilega ohišju, ki sem ga uporabil in ga bom omenil pozneje. Na sliki 3 je fotografija modula DFR0654. Uporablja priključek USBC.
Na sliki 4 je shematski prikaz projekta. Na njem ni veliko komponent. MAX30003 komunicira z ESP32 preko SPI protokola. Simbol DFR0654, ki je bil uporabljen tukaj, je prišel iz knjižnice.
Prikazane številke priključkov so fizične številke priključkov na modulu. Namesto GPIO oznak DF Robot plošče uporabljajo konvencije portov Arduino (D2,D3, A0,A1 itd.). Na plošči so te funkcije pinov označene, SPI priključki pa so naslednji:
SCK = GPIO18
MOSI = GPIO23
MISO = GPIO19
CS = GPIO14 (D6 na plošči)
V skici Arduina za ta projekt sem kot ciljno ploščo določil „FireBeetle 2 ESP32-E“, kar je opisno ime za DFR0654. ESP32 je mogoče konfigurirati tako, da ima privzet SPI port na različnih priključkih, vendar če določite to ciljno ploščo, bo SPI port uporabljal zgoraj navedene priključke. To pomeni, da SPI priključkov ni treba konfigurirati v kodi.
Modul ECG 3 Click potrebuje 3,3 V napajanje, ki ga zagotavlja 3,3-voltni LDO na modulu DFR0654.
MAX30003 vsebuje FIFO buffer za EKG podatke. Vsebuje pa tudi priključek za prekinitev, ki ga je mogoče konfigurirati na več načinov. Ta priključek za prekinitev sem konfiguriral tako, da označuje, kdaj je bil zbran en sam EKG vzorec. Ta priključek za prekinitev (označen kot INT na Click plošči) je povezan s priključkom D3 v DFR0654 (ESP32 GPIO26). Program ga preverja in uporablja za sinhronizacijo zbiranja podatkov.
Moji poskusi branja vzorcev iz FIFO predpomnilnika (z uporabo bitov stanja v besedi podatkov o vzorcu, ki označujejo FIFO stanje) so bili neuspešni. Vendar je uporaba INT priključka in branje vsakega vzorca, ko je bil na voljo, delovalo pravilno.
LED-ica je priključena na D9 naprave DFR0654. Ta bo utripala ob srčnem utripu, kadar bo notranja funkcija za izračun srčnega utripa v MAX30003 lahko določila srčni utrip iz valovne oblike EKG.
Na sliki 5 je fotografija vezja. Pri tem projektu si nisem prizadeval zmanjšati velikosti, ker:
Zaradi prej omenjenega upoštevanja Bluetooth 4.2 sem moral uporabiti večjo razvojno ploščo ESP32.
Odkril sem, da je podjetje Arrow Electronics razprodaja veliko zalog in kupil več Hammond plastičnih ohišij, vnaprej izdelanih za stare M328 Arduino plošče, po izklicni ceni 0,016 €.
EKG kabel, ki sem ga uporabil, je CAB-12790 podjetja Sparkfun.
Programska oprema
Kot sem že omenil, je treba programsko opremo za ta projekt zagnati na originalnem modelu ESP32, saj večina novejših ESP32 modelov v ugnezdeni ROM programski opremi ne podpira Bluetooth 4.2 tehnologije. Prav tako mora biti v Arduino IDE izbrana plošča FireBeetle 2 ESP32-E (opisno ime plošče DFR0654). Razlog za to je v tem, da v svoji skici uporabljam imena vrat GPIO FireBeetle 2, saj je tako označena tudi sama plošča.
MAX30003 ECG Front-End je zapleten čip s številnimi registri, ki jih je treba konfigurirati. Ker nimam nobenega od Mikro-e prevajalnikov, nisem mogel uporabiti ali si ogledati njihovih primerov programov ali knjižnice gonilnikov. Našel sem le eno knjižnico MAX30003, ki je bila napisana za Arduino IDE: Protocentral_max30003. Podjetje Protocentral izdeluje razvojno ploščo MAX30003, podobno plošči ECG 3 Click. Odločil sem se, da poskusim s to knjižnico in njenimi primeri.
MAX30003 opravlja tri diskretne funkcije, ki jih lahko uporabljate neodvisno:
Izmeri dejanski EKG signal, ga zbere v FIFO in ga pošlje pod nadzorom gostiteljskega MCU.
S surovim EKG signalom izvede potrebne izračune za določitev srčnega utripa v udarcih na minuto in to število daje na voljo gostiteljskemu MCU.
Generira kvadratni ali pulzni kalibracijski signal, ki se pošlje v ADC in ga je mogoče prebrati in analizirati, da se zagotovi pravilno delovanje MAX30003.
Ugotovil sem, da je Protocentral-ov primer programa za funkcijo srčnega utripa deloval v redu (z uporabo njihovega programa „Example 3 Computation only“). Vendar pa nisem mogel dobiti pravilnega EKG signala, ko sem uporabil njihov program „Example1-ECG-stream-Arduino-Plotter“. Sicer sem videl signal, vendar je šlo za veliko naključnih podatkov, kolikor sem lahko ugotovil.
Preučil sem protocentral_max30003.h in .c datoteke ter veliko časa porabil za preverjanje kode, da bi ugotovil, ali je sledila definicijam registrov MAX30003 in predlogom za programiranje v podatkovni kartici MAX30003. V njihovi kodi sem našel napake v zvezi z načinom konfiguracije MAX30003 med inicializacijo. Prav tako sem našel napake v načinu, kako je njihova knjižnica obravnavala branje EKG podatkovnega registra. Ne da bi se spuščal v podrobnosti, vam predlagam, da prenesete mojo spremenjeno različico te knjižnice. Spremljala bo mojo programsko opremo za programiranje tega projekta, ki gostuje na spletnem mestu revije Svet Elektronike.
MAX30003 vsebuje 32 besed x 24 bitov FIFO za EKG podatke. EKG podatke zagotavlja 18-bitni ADC, preostalih 6 bitov pa je rezerviranih za stanje FIFO predpomnilnika (prazen, prepoln itd.) Od teh 6 bitov so v podatkovni kartici opredeljeni le trije ETAG biti. Ostali trije niso omenjeni.
Na začetku sem veliko časa porabil za branje EKG signalov iz MAX30003, tako da sem na prsni koš priključil elektrode in iskal ustrezno obliko EKG valovanja. To je bilo milo rečeno neprijetno, poleg tega so nalepljene elektrode namenjene le enkratni uporabi. Če jih odstranite, pri ponovni uporabi ne bodo ustvarile ustrezne oblike valovanja. Zaradi napak v Protocentral knjižnici je bilo to obsojeno na neuspeh.
MAX30003 vsebuje generator za umerjanje, ki lahko zagotavlja številne signale za preskusne namene. To so kvadratni valovi ali impulzi s frekvencami od 4 do 64 Hz, ki so lahko unipolarni ali bipolarni in različnih magnitud. Zato je mogoče MAX30003 sprogramirati tako, da zagotovi preskusni signal, ki je namenjen zagotavljanju pravilnega delovanja naprave – ne da bi bile EKG žice dejansko priključene na osebo. Zato sem pregledal podatkovno kartico, da bi videl, kako omogočiti kalibracijske valovne oblike. Z „znanim“ signalom sem nato poskrbel, da je funkcija knjižnice MAX30003 pravilno poročala o kalibracijskih signalih.
Sprva sem poskušal brati FIFO predpomnilnik, medtem ko sem spremljal stanje FIFO z uporabo teh 3 ETAG bitov. Ne glede na to, kaj sem storil, nikoli nisem videl signala, ki bi bil podoben tistemu, ki sem ga pričakoval od generatorja kalibracije. V najboljšem primeru sem lahko zajel kalibracijski signal, ki je bil videti pravilen, vendar je po nekaj sekundah zajemanja prišlo do anomalij. Čas, ki je bil potreben, da je signal postal „smeti“, se je spreminjal, ko sem spreminjal kodo in preizkušal različne stvari.
Nazadnje sem se odločil, da popolnoma opustim FIFO. MAX30003 lahko sprogramirate tako, da njegov pin INTB zagotovi prekinitev za vsak zajeti EKG vzorec, nato pa se ta zastavica nekoliko pozneje sama izbriše. INTB priključek na MAX30003 je povezan s priključkom INT Click plošče, ki sem ga povezal s priključkom D3 ESP32 (GPIO26). V svoji Arduino skici počakam na naraščajoči rob tega signala in nato zajamem EKG vzorec s funkcijo max30003ReadData(). Ta funkcija vrne 32-bitno vrednost: iz nje je treba izluščiti 18-bitno vrednost ADC (nahaja se v bitih od 6 do 24 vrnjene 32-bitne vrednosti). Čeprav je ta EKG signal 18-bitna vrednost, ima gradnik Chart na mobilnem telefonu navpično ločljivost le približno 1024 slikovnih pik. Zato EKG vrednost pred pošiljanjem v gradnik Chart povečam na 1024 polnih pik. Slika 6 je posnetek zaslona kalibracijskega signala MAX30003 16 Hz 0,5 mV, ki ga zajame moja preskusna skica in nato prek zaporednih vrat pošlje funkciji plotter v Arduino IDE. Zaradi filtriranja, ki sledi ADC, je bil kvadratni val pretvorjen v grob sinusni val. Podatke berem s hitrostjo 128 vzorcev/s, torej je na cikel le 8 vzorcev – to pojasnjuje videz signala.
Tehnični list MAX30003 obsega 46 strani, čip pa ima devetnajst 24-bitnih registrov. Vhodni multiplekser naprave lahko preklaplja med kalibracijskimi signali, normalnim delovanjem ali zaznavanjem manjkajočega vodnika. Za testne/certifikacijske postopke je mogoče ustvariti različne kalibracijske signale. Na enem ali obeh vodih je mogoče uporabiti enosmerno napetost. Čip vsebuje PGA, katerega ojačenje lahko spreminjamo od 20 V/V do 160 V/V v štirih korakih. Čip vsebuje digitalni filter, ki ga je mogoče konfigurirati za 40 Hz, 100 Hz, 150 Hz ali brez filtriranja.
MAX30003 lahko zbira EKG podatke s hitrostjo vzorčenja 128, 256 ali 512 vzorcev na sekundo, če se uporablja kristal s frekvenco 32.768 Hz (kar velja za ECG 3 Click modul). Uporabil sem hitrost 128 vzorcev na sekundo, ker je bilo treba podatke prek Bluetooth povezave poslati v mobilni telefon, mobilni telefon/GUI-O pa ni mogel izrisati EKG valovne oblike hitreje od te hitrosti. Imam poceni mobilni telefon in mogoče je, da bi boljši telefon ali tablični računalnik z operacijskim sistemom Android lahko izrisal obliko EKG valovanja hitreje.
GUI-O uporabniški vmesnik za pametni telefon
Za ta projekt sem se odločil, da preizkusim uporabniški vmesnik za mobilni telefon, saj se zdi, da ljudje danes za vse pogosteje uporabljajo svoje mobilne telefone. Uporabniški vmesnik za mobilni telefon je mogoče oblikovati na tri načine:
Lastna aplikacija, ki deluje v operacijskem sistemu za mobilne telefone Android ali IOS in komunicira prek Bluetooth ali WiFi povezave.
Spletna aplikacija, ki uporablja brskalnik mobilnega telefona. Za to bi moral ESP32 gostiti spletni strežnik, ki bi bil sposoben upravljati funkcijo izdelave grafikonov.
Uporabite aplikacijo GUI-O, ki je na voljo samo za Android mobilne telefone.
Nimam nobenega strokovnega znanja o programiranju aplikacij za mobilne telefone v sistemu IOS (Applov jezik Swift itd.) ali Android (Java itd.). Vendar sem aplikacijo GUI-O za Android uporabljal pri drugih projektih in ugotovil, da je precej intuitivna. Na voljo je v trgovini Google Playstore po zelo nizki ceni.
GUI-O aplikacija je pravzaprav izvorna aplikacija za Android, ki deluje kot „posrednik“ med številnimi API funkcijami Android sistema in tokom ukazov, ki prihajajo iz zunanje naprave prek Bluetooth, BLE ali WiFi povezave. Zunanja naprava se mora nastaviti kot Bluetooth ali BLE odjemalec z uporabo UART profila. Ko zaženete GUI-O aplikacijo, se prikaže seznam razpoložljivih Bluetooth (ali BLE) naprav v dosegu, vi pa izberete ustrezno napravo. GUI-O aplikacija se lahko tudi samodejno poveže z določeno Bluetooth napravo, če jo tako konfigurirate. Ko se to povezovanje izvede, zunanja naprava postane glavna naprava in nato prek Bluetooth povezave pošlje vrsto ukazov GUI-O aplikaciji v mobilnem telefonu. GUI-O bo te ukaze razčlenil in ustvaril uporabniško nadzorno ploščo na zaslonu mobilnega telefona. Na voljo je večina gradnikov, ki jih lahko najdete v kateri koli drugi aplikaciji za Android, ki uporablja ukaze zunanje glavne naprave (v tem primeru ESP32). Seznam vseh GUI-O gradnikov je prikazan v Tabeli 1.
GUI-O Chart pripomoček
Ko sem začel ta projekt, me je najprej skrbelo, ali lahko kombinacija ESP32 MCU krmilnika in GUI-O aplikacije za Android izriše EKG podatke tako hitro, kot so nastajali. Odločil sem se, da bom uporabil Bluetooth 4.2 ali komunikacijski protokol BLE, saj bi bilo treba EKG enoto le seznaniti z mobilnim telefonom in se mi ne bi bilo treba prijavljati v WiFi dostopno točko.
Sprva sem menil, da bi bil najboljši BLE, saj je to novejši protokol. Ker je zasnovan za nizko porabo energije, sem domneval, da bodo njegovi komunikacijski napori manjši. To pomeni, da manj kot je bilo treba prenesti bajtov na paket sporočila, manjša je bila potrebna oddajna moč. V praksi s protokolom BLE nisem mogel izrisati podatkov EKG v gradnik GUI-O Chart widget. Posvetoval sem se z razvijalcem aplikacije GUI-O, ki je dejal, da naj za ta projekt ostanem pri Bluetooth 4.2.
Izkazalo se je, da je pri uporabi GUI-O aplikacije serijski protokol Bluetooth 4.2 veliko hitrejši od BLE protokola (s profilom UART). Ko sem preklopil na Bluetooth 4.2, sem lahko prenesel EKG podatke in jih izrisal z uporabno hitrostjo za posodabljanje zaslona.
Pripomoček GUI-O Chart Widget je mogoče konfigurirati v treh različnih načinih:
XY diagram – to lahko prikaže podatkovne točke z uporabo njihovih X,Y koordinat.
Časovni diagram – to lahko prikaže vrednosti podatkovne točke Y glede na čas.
Diagram preleta – pri tem se izrisujejo podatkovne točke Y s koordinato X, ki se povečuje pri vsaki podatkovni točki – dokler ni dosežena meja varovalnega prostora. Nato se graf vrne na levo stran grafa in prepiše obstoječo sled (s prikazanim ozkim pasom „brisanja“).
Za to uporabo je idealen način preleta (Sweep). Velikost podatkovnega predpomnilnika določi uporabnik. V tem projektu MAX30003 proizvaja 128 EKG vzorcev na sekundo, zato sem določil velikost predpomnilnika na 512. Tako so na zaslonu ves čas prikazane 4 sekunde EKG podatkov. Opozoriti moram, da vsaj na mojem mobilnem telefonu nizke kakovosti traja približno 6 sekund, da se izrišejo 4 sekunde EKG podatkov. Čeprav se torej vedno prikaže neprekinjen 4-sekundni blok EKG podatkov, se med vsakim naslednjim zbiranjem podatkov s 512 vzorci izgubi nekaj EKG podatkov. Če se torej pojavi „enkratna“ naključna anomalija v EKG signalu, je morda ne bo mogoče prikazati, saj se nekaj vzorcev EKG med vsakim neprekinjenim 4-sekundnim blokom podatkov EKG izgubi.
Pripomoček Chart Widget omogoča veliko različnih možnosti prikaza. Nastavite ga lahko na primer tako, da samodejno spreminja merilo prikaza. Tako se na primer ob vnosu podatkov, če njihova vrednost koordinate Y preseže uporabniško opredeljeni vrednosti Ymin ali Ymax, graf ponovno izriše z večjimi minimalnimi ali maksimalnimi mejami polnega merila. Ta funkcija ni potrebna za EKG potrebe. Prikažete lahko tudi grafe, v katerih so za različne sklope podatkov uporabljene različne barve. Na voljo je označevanje osi in mrež.
Čeprav za ta projekt nisem potreboval zapletenega uporabniškega vmesnika, lahko GUI-O ustvari zelo obsežen uporabniški vmesnik ali nadzorno ploščo na mobilnem telefonu ali, še bolje, na tabličnem računalniku s sistemom Android. Slika 7 prikazuje kompleksno nadzorno ploščo, ki jo je ustvaril GUI-O. To je eden od primerov GUI-O programa. Kodo, ki je potrebna za izdelavo, si lahko ogledate na spletni strani GUI-O. Obstaja zelo malo grafičnih elementov, ki jih GUI-O ne obvladuje.
Delovanje
Delovanje je zelo preprosto. Ko odprete GUI-O aplikacijo in vklopite EKG enoto, morate opraviti začetno seznanjanje. Delovanja GUI-O aplikacije ne bom opisoval, saj je dobro opisano v uporabniškem priročniku. Če ESP32 krmilnik deluje pravilno, se mora med postopkom seznanjanja prikazati naprava Bluetooth z imenom „ECG“. Ko je ta naprava seznanjena, se boste ob zagonu GUI-O programa samo povezali z ECG napravo. Prikazala se bo nadzorna plošča, kot je prikazana na sliki 2. Če imate priključene EKG priključke, pritisnete tipko Operate (Deluj) in prikazana bi morala biti približno takšna oblika valovanja EKG – ob predpostavki, da vaše srce deluje pravilno, kot je bilo moje za to zaslonsko sliko. Čez nekaj časa se bo pod grafikonom prikazala vrednost srčnega utripa.
Če pritisnete tipko Test, se po nekaj sekundah prikaže kalibracijski signal, ki uporablja določene parametre, ki sem jih izbral. Nekoliko je podoben pravemu EKG signalu, saj je prisotna ostra „špica“ s fiksno hitrostjo in ravno osnovno linijo.
S tipko Shrani shranite EKG valovno obliko trenutnega zaslona v datoteko. Ta datoteka se bo imenovala „ECG.txt“ in bo vsebovala 512 EKG vrednosti (8 v vrstici). Datoteka se nahaja v mobilnem telefonu v naslednji mapi:
/Android/data/com.guio.guioapp/files/
Do te datoteke dostopam tako, da telefon s sistemom Android priključim na računalnik. Telefon se prikaže kot Flash disk. Zgornja hierarhija map se nahaja v „notranjem datotečnem sistemu“ in ne v zunanjem datotečnem sistemu (na SD kartici) (prikazano, če je nameščena SD kartica).
Druga Click ploščica, v povezavi z zdravjem, ki sem jo preizkusil, je bila Click ploščica za srčni utrip Mikro-e-2000. Mikro-e izdeluje tudi podobno ploščo Click za srčni utrip – Mikro-e-3215. Arrow Electronics je imel veliko razprodajo razvojnih plošč, ki je vključevala veliko Mikro-e Click plošč. Kupil sem približno ducat Click plošč, vključno z dvema zgoraj omenjenima. Mikro-e-2000 meri srčni utrip in vsebnost kisika v krvi (tj. pulzni oksimeter). Plošča Mikro-e-3215 uporablja senzor Rohm BH1790GLC in deluje približno enako kot Mikro-e-2000 pri določanju srčnega utripa, vendar ne vključuje merjenja kisika v krvi. Ker je Mikro-e-2000 cenejši in bolj vsestranski, sem za ta projekt uporabil to Click ploščo.
Mikro-e-2000 uporablja MAX30100 podjetja Analog Devices (Maxim). To je majhen 14-pin čip v 5,6 mm dolgem in 2,888 mm širokem ohišju. Vidimo ga na sredini vzorca srca na Click plošči, kot je prikazano na sliki 8. Vsebuje rdečo (660 nm) in infrardečo (880 nm) svetlobo ter detektor s fotodiodo. Vsebuje 16-bitni sigma-delta ADC.
Na senzor položite palec ali kateri drugi prst in pokrijte obe luknjici. Rdeča in infrardeča LED-ica se napajata neodvisno in oddajata svetlobo pod kotom približno 45° glede na površino MAX30100. Ta svetloba pade na krvne žile, se odbije, zazna jo detektor s fotodiodo, kar izmeri ADC. Detektor bo oddajal signale nizke ravni, prisotna pa bo tudi precejšnja količina 50- ali 60-herčnega zunanjega signala. To še posebej velja, kadar se uporablja LED ali fluorescenčna razsvetljava, kar se danes praktično vedno dogaja, saj se žarnice z žarilno nitko postopoma ukinjajo. Naprava MAX30100 vsebuje lasten digitalni filter 50/60 Hz, ki odstranjuje ta šum.
Količina rdeče svetlobe, ki se odbije nazaj v fotodiodo, se spreminja v odvisnosti od srčnega utripa (pulza). To spreminjanje se izmeri in uporabi za izdelavo signala srčnega utripa.
Ko gledate televizijske oddaje o bolnišnicah ali reševalcih, med prvimi stvarmi, ki jih opazite, je, da zdravstveno osebje na pacientov prst pritrdi majhno napravo. To je pulzni oksimeter, ki se uporablja za merjenje vsebnosti kisika v krvi. Te naprave imajo običajno na eni strani prsta nameščene rdeče in infrardeče LED-ice, na drugi strani pa detektor, tako da merijo rdečo in IR svetlobo, ki prehaja skozi prst. To je verjetno natančnejši način merjenja vsebnosti kisika, vendar vključuje dva ločena sklopa: LED-ice in fotodetektor. MAX30100 je samostojna enota. Svetlobo sveti v prst pod kotom približno 45° in meri svetlobo, ki se odbije nazaj. Ta metoda mora delovati precej dobro, sicer teh senzorjev ne bi prodajali.
Merjenje vsebnosti kisika v krvi s pulznim oksimetrom je odvisno od naslednjih lastnosti krvi:
Hemoglobin z manj vezanega kisika prepušča več infrardeče svetlobe in absorbira več rdeče svetlobe.
Hemoglobin ze vezanega kisika absorbira več infrardeče svetlobe in prepušča več rdeče svetlobe.
Te lastnosti si lahko ogledate na sliki 9, ki prikazuje graf absorpcije svetlobe skozi kri, ki vsebuje manj kisika (modra sled) in kri (rdeča sled), ki vsebuje več kisika. MAX30100 opravi ločene meritve v intervalu, ko je aktivirana IR LED-ica, in v intervalu, ko je aktivirana rdeča LED-ica. Svetloba, ki se odbije nazaj, se spreminja v intervalu med enim in drugim srčnim utripom. Zato predvidevam, da se v tem intervalu nabere veliko odčitkov, ki se ponovijo za oba intervala – prižgano rdečo ali IR LED-ico.
Čeprav podatkovni list MAX30100 ne navaja veliko podrobnosti, je pri tej meritvi prisotna odvisnost od temperature. Pri IR in rdeči LED-ici se valovna dolžina s temperaturo nekoliko spreminja. Na algoritem SpO2, ki se uporablja za določanje vsebnosti kisika v krvi, ima valovna dolžina IR LED le majhen vpliv, bolj pa vpliva valovna dolžina rdeče LED. To lahko opazite na sliki 9, kjer so nakloni v rdečem območju bolj ekstremni. V podatkovni kartici MAX330100 je navedeno, da se valovna dolžina IR LED v območju 10-30 °C praktično ne spreminja, vendar se valovna dolžina rdeče LED v tem območju znatno spreminja. MAX30100 vsebuje vgrajen temperaturni senzor, ki ga je mogoče odčitati in upoštevati pri izračunih kisika v krvi. Vse te izračune v programski opremi izvaja Arduino knjižnica MAX30100.
Za lažje povezovanje MAX30100 uporablja I2C vodilo. Ta Click plošča potrebuje samo 3,3 V napajanje in vključuje 1,8 V LDO za napajanje dela čipa MAX30100. Čip MAX30100 vsebuje INT priključek, ki signalizira, da so meritve pripravljene, vendar knjižnica tega priključka ne uporablja.
Izbor MCU-ja
Našel sem Arduino knjižnico, ki je dobro delovala s to Click ploščo: MAX30100lib by OXullo. To knjižnico je enostavno najti, saj lahko v polje za iskanje te Arduino knjižnice vpišete MAX30100 in se bo prikazala. Po mojem mnenju bi moral za ta projekt delovati vsak MCU, ki deluje z Arduino IDE. Pri roki imam različne ESP32 module in odločil sem se, da bom uporabil DF Robot DFR1117. To je majhna ploščica, ki vsebuje MCU ESP32C6, ki sem jo skupaj s številnimi Click ploščicami kupil pri Arrow Electronics v času razprodaje. Projekt uporablja majhen OLED zaslon za merjenje pulza in kisika v krvi. Ta MCU ponuja možnost BLE, zato sem v skico vključil možnost, da se vrednosti pulza in kisika v krvi prikažejo tudi na mobilnem telefonu s sistemom Android. To je popolnoma neobvezno, saj je sam OLED zaslon zadovoljiv. Ker pa sem za EKG projekt že uporabil GUI-O nadzorno ploščo za mobilni telefon, je to z moje strani predstavljalo zelo malo dodatnega dela.
DFR1117 me je stal le nekaj dolarjev in uporablja nov MCU ESP32C6. Espressifov paket za podporo ploščam ESP32 različice 2.0.17 Arduino, ki ga uporabljam že nekaj časa, ne podpira novega ESP32C6. Treba je naložiti novejši paket za podporo ploščam 3.x.x. Espressif opozarja, da nadgradnja na različico 3.x.x „pokvari“ številne funkcije, ki so bile prisotne v različici 2.x.x. Ker imam več drugih nedavnih projektov, ki uporabljajo različico 2.0.17, sem okleval s posodobitvijo – čeprav se je z uporabo upravitelja Arduino plošč relativno enostavno vrniti na starejšo različico. Namesto tega sem posodobil Arduino IDE na sekundarnem računalniku (Linux), ki ga uporabljam, z različico ESP32. 3.07.
Za EKG projekt sem nameraval uporabiti ESP32C6, vendar ESP32C6 podpira le BLE in ne Bluetooth 4.2. Pri projektu, ki je vključeval prikaz grafikonov v realnem času, BLE ni deloval. Za ta projekt pa je BLE deloval dobro.
Vezje
Na sliki 10 je shematski prikaz projekta, ki je precej preprost. Modul DFR1117 vsebuje vhodne priključke za LiPo celico. Vsebuje LDO 3,3 V regulator in čip za polnjenje LiPo. 3,3 V napajanje modula DFR1117 se uporablja za napajanje plošče Mikro-e-2000 Click in OLED zaslona.
Mikro-e-2000 Click plošča in OLED zaslon uporabljata I2C vodilo in imata različne I2C naslove. Click plošča vsebuje dva 4,7k pull-up upora za liniji SCL in SDA.
Zaslon, ki sem ga uporabil, si zasluži nekaj razlage. Uporabil sem OLED modul podjetja Seeed Technologies, ki je bil prvotno zasnovan tako, da ga je bilo mogoče priključiti neposredno na 40-pin priključek vodila Raspberry Pi računalnika. To si lahko ogledate na sliki 11. Očitno niso bili preveč priljubljeni, zato sem jih nekaj kupil na razprodaji za manj kot 1 USD.
Uporablja priljubljeni gonilni čip SSD1306 in ima zaslon velikosti 128 x 32 pik, kar je običajna velikost. Vsak majhen OLED 128 x 32 zaslon z gonilnikom SSD1306 bi moral dobro delovati. Pri teh zaslonih je treba paziti, da je linija Reset povezana s pinom GPIO na MCU. Kateri pin se uporablja, je treba določiti v programu, kot sledi:
define OLED_RESET 21// Reset pin # (or -1 if sharing Arduino reset pin)
define SCREEN_ADDRESS 0x3C ///< Address; 0x3D for 128×64, 0x3C for 128×32
Adafruit_SSD1306 display(SCREEN_WIDTH,
SCREEN_HEIGHT, &Wire, OLED_RESET);
Za ta zaslon uporabljam priljubljeno knjižnico Adafruit SSD1306. Prav tako morate upoštevati, da se I2C naslov SSD1306 spreminja glede na ločljivost zaslona:
display.begin(SSD1306_SWITCHCAPVCC,
SCREEN_ADDRESS)
Programska oprema
Kot sem omenil v razdelku Izbira MCU-jev, je treba izvorno kodo za ta projekt sestaviti s paketom plošče ESP32 podjetja Espressif različice 3.x.x. Če pa uporabljate starejši MCU ESP32, to ni potrebno in program bi se moral dobro sestaviti z različico 2.x.x paketa za plošče ESP32.
Z uporabo knjižnice Adafruit SSD1306 in knjižnice MAX30100_pulseOximeter je koda precej preprosta. V bistvu sem ponovil enega od primerov iz MAX30100_pulseOximeter knjižnice.
Najprej je treba instancirati razreda OLED in MAX30100. Knjižnica MAX30100_pulseOximeter uporablja eno funkcijo povratnega klica, ki jo je treba opredeliti, kot sledi:
pox.setOnBeatDetectedCallback
(onBeatDetected);
Vse, kar naredi povratna funkcija onBeatDetected je, da zastavico heartbeatFlag nastavi na „True“. Dokumentacija (shema), ki je priložena tej knjižnici MAX30100, prikazuje, da je pin INT na MAX30100 povezan z GPIO priključkom D2 na MCU. Vendar ko sem preveril izvorno kodo knjižnice, ni bilo nobene omembe o tem, da bi se ta priključek spremljal ali da bi se sprožila prekinitev za spremembo priključka. Zato priključka INT nisem povezal z nobeno GPIO linijo ESP32.
Po setup() funkciji loop() rutina izvede časovno omejeno 1-sekundno zanko. Na začetku te zanke se pokliče rutina update(), ki izmeri odčitke srčnega utripa in SpO2 ter predvidoma nastavi zastavico heartbeatFlag, ko so na voljo natančni odčitki. Kadar je zastavica srčnega utripa postavljena na „True“, program pošlje sporočilo „Beat!“ po serijskih vratih (samo za diagnostične namene). Ne glede na stanje oznake heartbeatFlag se pokličeta funkciji knjižnice getHeartRate() in getSpO2(). Rezultati se nato pošljejo na OLED zaslon – nekaj sekund bodo to „smeti“, dokler se MAX30100 ne ustali na dobrih odčitkih.
Dodal sem nekaj kode za pošiljanje dveh odčitkov prek BLE povezave v pametni telefon, na katerem je nameščena GUI-O aplikacija. Konfiguracija ESP32 za vzpostavitev BLE povezave s pametnim telefonom, na katerem je nameščena GUI-O aplikacija, je nekoliko bolj zapletena kot uporaba razreda BluetoothSerial s povezavo Bluetooth 4.2 (kot sem to storil pri projektu EKG). Preprosto sem ponovil kodo, ki jo je GUI-O navedel v svojih BLE primerih.
Skoraj vsa ta koda se nahaja med vrsticami 81 in 100 v mojem programu. Nastavitev GUI-O nadzorne plošče za ta projekt je zelo preprosta, saj so uporabljene le 4 oznake. Dve od teh sta pravzaprav statični oznaki: „Srčni utrip“ in ‚SpO2‘, medtem ko sta drugi dve dinamični in vsebujeta dejanske vrednosti, ki se izmerijo in pošljejo v telefon.
Na sliki 12 je končni projekt z odstranjenim zgornjim pokrovom.
Zaključki
Upam, da vas bo ta članek spodbudil, da si podrobneje ogledate nekatere od več kot 1000 Click modulov, ki so na voljo. Tudi če niste trenutni uporabnik številnih Mikro-e prevajalnikov, so možnosti, da boste zaradi priljubljenosti teh Click modulov našli ustrezne knjižnice za Arduino, ki jih boste lahko uporabili, precej velike.
Priznati moram, da ko sem videl, da ima Arrow Electronics veliko razprodajo na tisoče razvojnih plošč številnih proizvajalcev, sem porabil več ur, da sem si ogledal čim več teh plošč. Na koncu sem kupil približno ducat Click plošč.