Satura rādītājs:
- 1. darbība. Aparatūra
- 2. darbība. MAX30102 atgriezti digitālie signāli
- 3. solis: signāla pirmapstrāde
- 4. solis: darba zirgs: automātiskās korelācijas funkcija
- 5. solis: skābekļa piesātinājuma noteikšana
- 6. darbība: avota kods
Video: Pulsa oksimetrs ar daudz uzlabotu precizitāti: 6 soļi (ar attēliem)
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:56
Ja nesen apmeklējāt ārstu, iespējams, ka jūsu pamata dzīvības pazīmes pārbaudīja medmāsa. Svars, augums, asinsspiediens, kā arī sirdsdarbības ātrums (HR) un skābekļa piesātinājums perifērās asinīs (SpO2). Iespējams, pēdējie divi tika iegūti no sarkani kvēlojošas elektroniskās pirkstu zondes, kas dažu minūšu laikā parādīja atbilstošus skaitļus uz maza ekrāna. Šo zondi sauc par pulsa oksimetru, un visu pamatinformāciju par to varat atrast šeit.
Protams, var viegli iegādāties vienkāršu pulsa oksimetru, bet kur ir tā jautrība? Esmu nolēmis izveidot savu, pirmkārt, lai to izdarītu, bet vēl svarīgāk, ņemot vērā konkrētu pielietojumu: nakts oksimetriju, kurā gan HR, gan SpO2 dati tiktu nepārtraukti apkopoti visu nakti un ierakstīti micro SD kartē. Instructables jau ietver vairākus šāda veida projektus, piemēram, divus, kuros iesaistīts Arduino šeit un šeit, un vienu, izmantojot Raspberry Pi. Mana kontrolē un datu ierakstīšanā izmanto nedaudz jaunāku sensoru MAX30102 no MAXIM Integrated un Adafruit Feather M0 Adalogger.
Tādējādi mūsu projekts nav īpaši novatorisks aparatūras ziņā, un tādēļ nebūtu vērts rakstīt šo pamācību, taču tās izveides procesā esmu guvis būtiskus sasniegumus programmatūras jomā, kas ļāva man iegūt datus no MAX30102 ar daudz lielāku konsekvenci un daudz ko citu. mazāk trokšņa nekā programmatūra, ko šim sensoram rakstījusi MAXIM. Mūsu signālu apstrādes algoritma veiktspēja ir parādīta iepriekš redzamajā diagrammā, kur abos augšējos grafikos ir nakts pulss un piesātinājums ar skābekli, kas aprēķināts no neapstrādātiem signāliem, izmantojot mūsu metodi (identificēts ar "RF"), bet divi apakšējie grafiki parāda MAXIM rezultātus, kas iegūti no tieši tādi paši signāli. Standarta novirzes HR ir 4,7 sitieni minūtē un 18,1 sitieni minūtē, un SpO2 0,9% un 4,4%, attiecīgi RF un MAXIM.
(Abi RF grafiki atbilst minimālajam autokorelācijas slieksnim 0,25 un neierobežo R / IR korelāciju; šo terminu skaidrojumu skatiet 4. un 5. darbībā.)
1. darbība. Aparatūra
- Pulsa oksimetrs un sirdsdarbības sensora MAX30102 sistēmas plate no MAXIM Integrated, Inc.
- Feather M0 Adalogger no Adafruit, Inc.
- Litija jonu akumulators no uzņēmuma Adafruit, Inc.
Savienojumi:
- Adalogger tapas SCL un SDA ar atbilstošajām SCL un SDA tapām uz MAX30102 plates
- Adalogger pin 10 līdz pin INT uz MAX30102 plates
- Adalogger GND to MAX30102 plate GND
- Adalogger 3V līdz MAX30102 VIN
2. darbība. MAX30102 atgriezti digitālie signāli
Sensora darbības principi ir ļoti vienkārši: divas gaismas diodes, viena sarkana (660 nm) un viena infrasarkanā (880 nm, IR), spīd caur cilvēka ādu. Gaismu daļēji absorbē pamatā esošie audi, ieskaitot perifērās asinis. Sensora fotodetektors savāc atstaroto gaismu abos viļņu garumos un atgriež divas atbilstošas relatīvās intensitātes, izmantojot I2C protokolu. Tā kā skābekļa un deoksigenētā hemoglobīna absorbcijas spektri atšķiras abos viļņu garumos, atstarotajai gaismai ir mainīga sastāvdaļa kā arteriālo asiņu daudzums, kas atrodas zem ādas impulsiem ar katru sirdspukstu. Sirdsdarbības ātruma un skābekļa piesātinājuma noteikšana ir atkarīga no signālu apstrādes programmatūras.
Neapstrādātu signālu piemēri (tikai IR kanāls) ir parādīti iepriekš redzamajos attēlos. Var pamanīt periodisku komponentu, kas ir pārklāts uz mainīgas bāzes līnijas, kas mainās vairāku Wikipedia lapā minēto faktoru dēļ. Kustības izraisīti artefakti ir īpaši kaitinoši, jo tie var maskēt noderīgo HR signālu un izraisīt viltus rezultātus. Tādējādi uzlabotajos komerciālajos oksimetros ir akselerometri, kas palīdz atcelt šos artefaktus.
Es varu pievienot akselerometru savai oksimetra nākamajai versijai, bet nakts HR/SpO2 ierakstot, ja sensors lielākoties paliek nekustīgs, pietiek ar izkropļotu signālu noteikšanu un izlaišanu.
Pats MAX30102 sensors tiek piegādāts nelielā, uz virsmas uzstādītā iepakojumā, bet MAXIM laipni piedāvā sadalīšanas paneli (sistēmas plate 6300), kā arī signālu apstrādes programmatūru Arduino un mbed - tas viss ir iekļauts MAXREFDES117#standarta dizaina paketē. Es to laimīgi iegādājos, cerot tikai pielodēt dažus vadus starp sensoru un Adalogger un vienas dienas laikā iegūt funkcionējošu, labu oksimetru. Es pielāgoju MAXIM programmatūras versiju RD117_ARDUINO, lai tā darbotos ar Adalogger ARM Cortex M0 procesoru. Būtībā viss, kas man bija jādara, bija aizstāt nesaderīgās SofI2C funkcijas max30102.cpp ar atbilstošajiem Wire bibliotēkas zvaniem. Kods ir labi apkopots Arduino IDE v1.8.5 un darbojās uz M0 bez kļūdām. Tomēr neto rezultāti bija neapmierinoši. Ievadā es jau esmu parādījis ļoti augstu gan HR, gan SpO dispersiju2. Protams, var apgalvot, ka esmu izdarījis kaut ko nepareizi, un tā bija arī mana sākotnējā doma. Tomēr MAXIM mācību video var novērot arī ekrānā redzamās mežonīgi svārstīgās HR vērtības. Turklāt komentāri zem video apstiprina, ka arī citi ir pamanījuši līdzīgu parādību.
Īsi sakot, pēc dažiem eksperimentiem esmu noskaidrojis, ka sensors darbojas labi, un alternatīva digitālās signālu apstrādes metode nodrošina daudz labāku stabilitāti. Šī jaunā metode, kas apzīmēta ar "RF", ir aprakstīta turpmākajās darbībās.
3. solis: signāla pirmapstrāde
Mūsu ieviešanā neapstrādātais signāls tiek vākts ar frekvenci 25 Hz (tāds pats kā MAXIM) visas 4 sekundes (MAXIM programmatūra savāc tikai 1 sekundes vērtību), kā rezultātā vienā gala datu punktā tiek iegūti 100 digitalizēti laika punkti. Katra 100 punktu secība ir jāapstrādā šādi:
- Vidējā centrēšana (jeb "līdzstrāvas komponenta noņemšana" elektroinženieriem). Neapstrādāti dati, kas nāk no sensora, ir veselu skaitļu laika rindas 105 diapazons. Tomēr noderīgais signāls ir tikai daļa no gaismas, kas tiek atstarota no arteriālajām asinīm, kas mainās tikai 10 reizes2 - pirmais skaitlis. Tāpēc jēgpilnai signālu apstrādei vēlams no katra sērijas punkta atņemt vidējo. Šī daļa neatšķiras no tā, ko jau dara MAXIM programmatūra. Tomēr atšķirība ir pašu laika indeksu papildu vidējā centrēšana. Citiem vārdiem sakot, tā vietā, lai sērijas punktus indeksētu pēc skaitļiem no 0 līdz 99, jaunie indeksi tagad ir skaitļi -49,5, -48,5,…, 49,5. Sākumā tas var šķist dīvaini, taču, pateicoties šai procedūrai, signāla līknes "smaguma centrs" sakrīt ar koordinātu sistēmas izcelsmi (otrais attēls). Šis fakts kļūst ļoti noderīgs nākamajā solī.
- Bāzes līmeņa izlīdzināšana. Vēl viens 2. solī parādīto viļņu formu skatījums parāda, ka reālo oksimetrijas signālu bāzes līnija nebūt nav horizontāli plakana, bet atšķiras dažādās nogāzēs. Trešais attēls parāda vidējo IR signālu (zilā līkne) un tā bāzes līniju (zila taisna līnija). Šajā gadījumā bāzes slīpums ir negatīvs. Iepriekš aprakstītajai signālu apstrādes metodei ir jābūt horizontālai. To var panākt, vienkārši atņemot bāzes līniju no vidējā signāla. Pateicoties Y un X koordinātu vidējai centrēšanai, bāzes līnijas krustojums ir nulle, un tā slīpuma vienādojums ir īpaši vienkāršs, kā parādīts ceturtajā attēlā. Sākotnējā līmenī izlīdzināto signālu trešajā attēlā parāda oranža līkne.
Tādējādi iepriekš apstrādāts signāls ir gatavs nākamajam solim.
4. solis: darba zirgs: automātiskās korelācijas funkcija
Atgriežoties pie parastās 1,…, n indeksēšanas, pirmajā attēlā parādīta autokorelācijas funkcijas r definīcijam - daudzums, kas atzīts par ļoti noderīgu signāla periodiskuma un kvalitātes noteikšanai. Tas ir vienkārši normalizēts signāla laikrindas skalārais produkts ar pašu nobīdi par lag m. Tomēr mūsu lietojumprogrammā ir ērti mērogot katru autokorelācijas vērtību attiecībā pret tās vērtību aizkavēšanās laikā = 0, t.i., izmantot relatīvo autokorelāciju, ko definē rm / r0.
Tipiska labas kvalitātes IR signāla relatīvās autokorelācijas diagramma ir parādīta otrajā attēlā. Kā gaidīts, tā vērtība pie nobīdes = 0 ir pie tās globālās maksimālās vērtības, kas vienāda ar 1. Nākamais (vietējais) maksimums notiek pie lag = 23 un ir vienāds ar 0,79. Vietējo minimumu un maksimumu klātbūtne autokorelācijas diagrammā ir viegli saprotama: signālam pārvietojoties pa labi, tā virsotnes sākumā destruktīvi traucē viena otrai, bet noteiktā brīdī traucējumi kļūst konstruktīvi un sasniedz maksimumu, ja aizkavēšanās ir vienāda ar vidējo signāla periods.
Pēdējai frāzei ir izšķiroša nozīme: lai noteiktu vidējo laika periodu starp pīķiem, no kura var aprēķināt signāla frekvenci (t.i., sirdsdarbības ātrumu), pietiek ar to, lai atrastu pirmo autokorelācijas funkcijas vietējo maksimumu! Pēc noklusējuma MAX30102 parauga analogo ieeju ar ātrumu 25 punkti sekundē, tāpēc dotajā m laika periods sekundēs ir vienāds ar m / 25. Tas noved pie sirdsdarbības ātruma, kas izteikts sitienos minūtē (bpm) ar:
HR = 60*25 / m = 1500 / m
Protams, nav nepieciešams veikt dārgus r aprēķinusm pie visām nobīdes vērtībām. Mūsu algoritms pirmo reizi nosaka sirdsdarbības ātrumu = 60 sitieni minūtē, kas atbilst m = 25. Autokorelācijas funkcija tiek novērtēta tajā brīdī un salīdzināta ar vērtību kreisajā kaimiņā, m = 24. Ja kaimiņu vērtība ir augstāka, tad gājiens turpinās pa kreisi, līdz rm-1 <rm. Tādējādi noteiktais galīgais m tiek atgriezts kā maksimālā nobīde. Nākamā atkārtošana sākas no šīs vērtības, nevis 25, un viss process atkārtojas. Ja pirmais kreisais kaimiņš ir zemāks, iepriekš minētie parastie soļi līdzīgā veidā novirza punktus pa labi. Lielāko daļu laika maksimālā aizkavēšanās prasa tikai dažus autokorelācijas funkcijas novērtējumus. Turklāt kā ierobežojošās vērtības tiek izmantotas maksimālās un minimālās pieļaujamās kavēšanās (attiecīgi attiecīgi minimālajam un maksimālajam sirdsdarbības ātrumam).
Iepriekš minētais ļoti labi darbojas labas kvalitātes signāliem, taču reālā pasaule ir tālu no ideālas. Daži signāli tiek izkropļoti, galvenokārt kustību artefaktu dēļ. Šāds signāls ir parādīts trešajā attēlā. Slikta periodiskums atspoguļojas tā autokorelācijas funkcijas formā, kā arī zemās vērtības (0,28) pirmajā lokālajā maksimumā pie m = 11. Salīdziniet to ar maksimālo vērtību 0,79, kas noteikta labas kvalitātes signālam. Līdz ar nobīdes ierobežojošajām vērtībām, tātad r vērtībam / r0 maksimums ir labs signāla kvalitātes rādītājs, un prasību pārsniegt noteiktu slieksni var izmantot, lai filtrētu kustības artefaktus. Ievados parādītie "RF" grafiki radās no šāda sliekšņa, kas vienāds ar 0,25.
5. solis: skābekļa piesātinājuma noteikšana
Iepriekšējais solis bija pietiekams, lai noteiktu sirdsdarbības ātrumu. SpO2 prasa vairāk darba. Pirmkārt, jāņem vērā līdz šim novārtā atstātais signāls sarkanajā (R) kanālā. Tālāk tiek aprēķināta sarkano un infrasarkano signālu attiecība Z = R/IR, kas abi atspoguļojas no arteriālajām asinīm. "Arteriālo asiņu" daļa ir izšķiroša, jo lielākā daļa gaismas faktiski tiek atstarota no audiem un venozām asinīm. Kā izvēlēties signāla daļu, kas atbilst arteriālajām asinīm? Tas ir pulsējošais komponents, kas atšķiras ar katru sirdsdarbību. Elektroinženieru vārdiem sakot, tā ir "maiņstrāvas daļa", bet atlikušā atstarotā gaisma ir "līdzstrāvas daļa". Tā kā R un IR gaismas absolūtā intensitāte nav samērojama, Z attiecība tiek aprēķināta no relatīvās intensitātes, kā parādīts pirmajā attēlā. Runājot par faktiski aprēķinātajiem daudzumiem, es izmantoju vidējā kvadrāta (RMS) vidējo centrālo, sākotnēji izlīdzināto signālu, y, līdz jau zināmajam neapstrādātā signāla vidējam, <Y>; skatīt otro attēlu. Tomēr Z attiecība ir tikai puse no darba. Nelineārai sensora reakcijai nepieciešama empīriska kalibrēšana starp Z un galīgo SpO2 vērtības. Es paņēmu kalibrēšanas vienādojumu no MAXIM koda:
SpO2 = (-45,06*Z + 30,354)*Z + 94,845
Paturiet prātā, ka šis vienādojums attiecas tikai uz MAX30102 dizaina plāksni, kas iegādāta 2017. gadā! Iespējams, ka MAXIM vēlāk var pārkalibrēt savus sensorus.
Iepriekš minētā procedūra joprojām rada daudz nepatiesu SpO2 lasījumi. Sarkanais kanāls cieš no daudziem artefaktiem, tāpat kā IR. Ir pamatoti pieņemt, ka abiem signāliem jābūt cieši saistītiem. Faktiski labas kvalitātes signāli, tāpat kā piemērs trešajā attēlā, ļoti labi korelē. Pīrsona korelācijas koeficients šajā gadījumā ir pat 0,99. Tas ne vienmēr notiek, kā parādīts ceturtajā attēlā. Lai gan IR signāls ar savu r pārsniegtu sirdsdarbības kvalitātes filtrum / r0 = 0,76, izkropļotais R signāls rada sliktu korelācijas koeficientu starp abiem, kas vienāds ar tikai 0,42. Šis novērojums piedāvā otro kvalitātes filtru: korelācijas koeficients starp kanāliem ir lielāks par noteiktu slieksni.
Pēdējie divi skaitļi ilustrē šādas kvalitātes filtrēšanas neto efektu. Pirmkārt, izmērīto skābekļa piesātinājumu attēlo ar HR kvalitātes slieksni 0, 25, bet bez SpO2 filtrs. Nākamais paraugs tiek iegūts, filtrējot sliktu HR un SpO2 rezultāti pie 0,5 rm / r0 un 0,8 korelācijas koeficienta sliekšņi. Kopumā stingrākais režīms filtrēja sliktos datu punktus, kas sastāda 12% no kopējā apjoma.
Mūsu kodā korelācijas koeficients cc tiek aprēķināts pēc formulas piektajā attēlā, kur y apzīmē vidējo centru, sākotnēji izlīdzinātu signālu, bet r0 tika definēts iepriekšējā solī.
6. darbība: avota kods
Šī projekta C avota kods, kas formatēts Arduino IDE, ir pieejams mūsu Github kontā, izmantojot šo saiti:
github.com/aromring/MAX30102_by_RF
Lapā Readme ir aprakstīti atsevišķi komponenti.
Es gribētu veltīt brīdi, lai uzslavētu Adafruit par tik izcilu produktu kā M0 bāzes Adalogger. Tā ātrais 48 MHz ARM Cortex M0 procesors ar lielu operatīvo atmiņu noteikti palīdzēja padarīt šo projektu dzīvotspējīgu, savukārt tieši pievienots SD karšu lasītājs (kā arī Adafruit SD bibliotēka) noņem visas vaļasprieka sāpes, kas saistītas ar liela datu apjoma saglabāšanu reālā laikā.
Ieteicams:
Arduino pulsa oksimetrs: 35 soļi (ar attēliem)
Arduino pulsa oksimetrs: Pulsa oksimetri ir standarta instrumenti slimnīcas apstākļos. Izmantojot skābekļa un deoksigenētā hemoglobīna relatīvo absorbciju, šīs ierīces nosaka pacienta asiņu procentuālo daudzumu, kas pārvadā skābekli (veselīgs diapazons ir 94–9
Lieliska siltumnīca ar automātisku laistīšanu, interneta savienojumu un daudz ko citu: 7 soļi (ar attēliem)
Lieliska siltumnīca ar automātisku laistīšanu, interneta savienojumu un daudz ko citu: laipni lūdzam šajā instrukcijā. Gājiena sākumā es biju dārza veikalā un redzēju dažas siltumnīcas. Un tā kā es jau sen gribēju izveidot projektu ar augiem un elektroniku, es devos uz priekšu un nopirku vienu: https://www.instagram.com/p
Oksimetrs uz Arduino bāzes (OAB): 3 soļi
Oksimetrs uz Arduino bāzes (OAB): " Lūdzu, ņemiet vērā, ka šī lietojumprogramma, sensori un funkcionālā ierīce NAV pārbaudīti medicīniskiem nolūkiem un atsevišķas detaļas nav kalibrētas un nav sertificētas. Lūdzu, izmantojiet šo vienkāršo ierīci profilakses nolūkos un novērošanai
Mikrokontrolēts pulsa oksimetrs: 5 soļi
Mikrokontrolēts pulsa oksimetrs: šim projektam es plānoju parādīt, ko līdz šim esmu paveicis ar savu mikrokontrolēto pulsa oksimetra projektu. Mana aizraušanās ar elektroniku un fitnesu ir ļoti spēcīga, tāpēc nolēmu izveidot projektu, kas ļautu izmantot abas savas aizraušanās
Kontrolējiet daudz servo ar Arduino!: 4 soļi (ar attēliem)
Kontrolējiet daudz servo ar Arduino!: Sākumā man vajadzētu kaut ko pateikt. Man nebija skaistu attēlu. Tātad, es esmu uzņēmis attēlus no bildr.blog. Mēs zinām, ka Arduino UNO nav daudz pwm tapas, lai kontrolētu daudzus servo. Tātad, mums bieži rodas problēma kontrolēt vairāk servo arduino