Cuprins:

Pulsoximetru cu precizie mult îmbunătățită: 6 pași (cu imagini)
Pulsoximetru cu precizie mult îmbunătățită: 6 pași (cu imagini)

Video: Pulsoximetru cu precizie mult îmbunătățită: 6 pași (cu imagini)

Video: Pulsoximetru cu precizie mult îmbunătățită: 6 pași (cu imagini)
Video: COVID-19 Early Treatment to Prevent Severe Disease 2024, Noiembrie
Anonim
Pulsoximetru cu precizie mult îmbunătățită
Pulsoximetru cu precizie mult îmbunătățită
Pulsoximetru cu precizie mult îmbunătățită
Pulsoximetru cu precizie mult îmbunătățită

Dacă ați vizitat recent un medic, este posibil ca semnele vitale de bază să fi fost examinate de o asistentă medicală. Greutatea, înălțimea, tensiunea arterială, precum și ritmul cardiac (HR) și saturația de oxigen din sângele periferic (SpO2). Poate că ultimele două au fost obținute dintr-o sondă electronică cu degetul roșu care afișa numere relevante pe un mic ecran în câteva minute. Sonda respectivă se numește puls oximetru și puteți găsi toate informațiile de bază despre aceasta aici.

Se poate cumpăra cu ușurință un pulsimetru simplu, sigur, dar unde este distracția în el? Am decis să-mi construiesc propriul meu, mai întâi, dar mai important, având în vedere o aplicație specifică: oximetria nocturnă în care atât HR cât și SpO2 datele vor fi colectate continuu peste noapte și înregistrate pe un card micro SD. Instructables conține deja mai multe proiecte de acest fel, de exemplu, două care implică Arduino aici și aici și unul care folosește Raspberry Pi. Al meu folosește senzorul MAX30102 ceva mai nou de la MAXIM Integrated și Adafruit Feather M0 Adalogger pentru control și înregistrare a datelor.

Prin urmare, proiectul nostru nu este deosebit de inovator în ceea ce privește hardware-ul și, ca atare, nu ar merita să scriem acest Instructable, dar în procesul de creare a acestuia am făcut progrese cruciale în software care mi-au permis să extrag date din MAX30102 cu o consistență mult mai mare și mult mai puțin zgomot decât software-ul scris de MAXIM pentru acest senzor. Performanța algoritmului nostru de procesare a semnalului este ilustrată în graficul de mai sus, unde cele două grafice superioare conțin ritm cardiac peste noapte și saturație de oxigen calculate din semnale brute prin metoda noastră (identificată prin „RF”), în timp ce cele două grafice inferioare arată rezultatele MAXIM produse din exact aceleași semnale. Abaterile standard pentru HR sunt de 4,7 bpm și 18,1 bpm, iar pentru SpO2 0,9% și 4,4%, pentru RF și respectiv MAXIM.

(Ambele grafice RF corespund pragului minim de autocorelare de 0,25 și nicio limită a corelației R / IR; consultați pașii 4 și 5 pentru explicația acestor termeni.)

Pasul 1: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Oximetru de puls și senzor de ritm cardiac MAX30102 placa de sistem de la MAXIM Integrated, Inc.
  2. Feather M0 Adalogger de la Adafruit, Inc.
  3. Baterie litiu-ion de la Adafruit, Inc.

Conexiuni:

  • Adalogger pin SCL și SDA la pinii SCL și SDA corespunzători de pe placa MAX30102
  • Adalogger pin 10 la pin INT pe placa MAX30102
  • Adalogger GND la MAX30102 placă GND
  • Adalogger 3V până la MAX30102 VIN

Pasul 2: Semnale digitale returnate de MAX30102

Semnale digitale returnate de MAX30102
Semnale digitale returnate de MAX30102
Semnale digitale returnate de MAX30102
Semnale digitale returnate de MAX30102

Principiile funcționării senzorului sunt foarte simple: două LED-uri, unul roșu (660 nm) și unul infraroșu (880 nm, IR) strălucesc lumina prin pielea umană. Lumina este parțial absorbită de țesuturile subiacente, inclusiv sângele periferic. Fotodetectorul senzorului colectează lumina reflectată la ambele lungimi de undă și returnează două intensități relative corespunzătoare utilizând protocolul I2C. Deoarece spectrele de absorbție pentru hemoglobina oxigenată și dezoxigenată diferă pentru ambele lungimi de undă, lumina reflectată are o componentă variabilă ca cantitatea de sânge arterial care este prezentă sub impulsurile pielii la fiecare bătăi ale inimii. Descoperirea ritmului cardiac și a saturației de oxigen depinde de software-ul de procesare a semnalului.

Exemple de semnale brute (numai canal IR) sunt ilustrate în imaginile de mai sus. Se poate observa o componentă periodică suprapusă pe o linie de bază variabilă care se schimbă din cauza mai multor factori menționați în pagina Wikipedia. Artefactele induse de mișcare sunt deosebit de enervante, deoarece pot masca semnalul HR util și pot provoca rezultate false. Prin urmare, oximetrele comerciale avansate prezintă accelerometre care ajută la anularea acestor artefacte.

Pot adăuga un accelerometru la următoarea versiune a oximetrului meu, dar pentru HR / SpO nocturnă2 înregistrarea, când senzorul rămâne nemișcat de cele mai multe ori, este suficient să detectați și să omiteți semnale distorsionate.

Senzorul MAX30102 vine în sine într-un mic pachet montat la suprafață, dar MAXIM oferă cu plăcere o placă de descărcare (System Board 6300) plus un software de procesare a semnalului pentru Arduino și mbed - totul în pachetul de design de referință MAXREFDES117 #. L-am cumpărat cu bucurie, așteptând să lipesc doar câteva fire între senzor și Adalogger și să am un oximetru funcțional și bun într-o singură zi. Am adaptat versiunea RD117_ARDUINO a software-ului MAXIM pentru a rula pe procesorul ARM Cortex M0 al Adalogger. Practic, tot ce trebuia să fac era să înlocuiesc funcțiile SofI2C incompatibile din max30102.cpp prin apelurile de bibliotecă Wire corespunzătoare. Codul a fost compilat bine în Arduino IDE v1.8.5 și a rulat pe M0 fără erori. Rezultatele nete, însă, au fost dezamăgitoare. În etapa de introducere am arătat deja o varianță foarte mare atât a HR cât și a SpO2. Bineînțeles, se poate pretinde că am făcut ceva greșit și acesta a fost și gândul meu inițial. Cu toate acestea, în videoclipul instructiv al lui MAXIM puteți observa, de asemenea, valori de HR care se deplasează sălbatic afișate pe ecran. Mai mult, comentariile de mai jos video confirmă că și alții au observat un fenomen similar.

Pentru a face scurtă povestea lungă, după unele experimentări, am stabilit că senzorul funcționează OK și o metodă alternativă de procesare a semnalului digital are ca rezultat o stabilitate mult mai bună. Această nouă metodă, indicată prin „RF”, este descrisă în pașii următori.

Pasul 3: Preprocesarea semnalului

Preprocesare semnal
Preprocesare semnal
Preprocesare semnal
Preprocesare semnal
Preprocesare semnal
Preprocesare semnal
Preprocesare semnal
Preprocesare semnal

În implementarea noastră, semnalul brut este colectat la o rată de 25 Hz (la fel ca MAXIM) timp de 4 secunde (software-ul MAXIM colectează doar 1 secundă), rezultând 100 de puncte de timp digitalizate pe fiecare punct de date final. Fiecare secvență de 100 de puncte trebuie prelucrată în felul următor:

  1. Centrare medie (de exemplu, „îndepărtarea componentei de curent continuu” către inginerii electrici). Datele brute provenite de la senzor sunt o serie temporală de numere întregi din 105 gamă. Semnalul util, totuși, este doar o parte a luminii reflectate din sângele arterial, care variază în ordinea a doar 102 - prima cifră. Pentru o procesare semnificativă a semnalului, este de aceea de dorit să se scadă media din fiecare punct de serie. Această parte nu diferă de ceea ce face deja software-ul MAXIM. Cu toate acestea, diferența este centrarea medie suplimentară a indicilor de timp înșiși. Cu alte cuvinte, în loc de indexarea punctelor de serie cu numere de la 0 la 99, noii indici sunt acum numerele -49,5, -48,5, …, 49,5. La început poate părea ciudat, dar datorită acestei proceduri „centrul de greutate” al curbei semnalului coincide cu originea sistemului de coordonate (a doua figură). Acest fapt devine destul de util în pasul următor.
  2. Nivelare de bază. O altă privire asupra formelor de undă prezentate în Pasul 2 ilustrează faptul că linia de bază a semnalelor reale de oximetrie este departe de a fi orizontal plană, dar variază prin diferite pante. A treia figură arată un semnal IR centrat mediu (curba albastră) și linia de bază a acestuia (linia dreaptă albastră). În acest caz, panta liniei de bază este negativă. Metoda de procesare a semnalului descrisă înainte necesită ca linia de bază să fie orizontală. Acest lucru poate fi realizat prin simpla scădere a liniei de bază din semnalul centrat mediu. Datorită centrării medii atât a coordonatelor Y, cât și a coordonatelor X, interceptarea liniei de bază este zero, iar ecuația pantei sale este deosebit de simplă, așa cum se arată în figura a patra.

Astfel, semnalul preprocesat este gata pentru următorul pas.

Pasul 4: Workhorse: Funcția de autocorelare

Workhorse: Funcția de autocorelare
Workhorse: Funcția de autocorelare
Workhorse: Funcția de autocorelare
Workhorse: Funcția de autocorelare
Workhorse: Funcția de corelare automată
Workhorse: Funcția de corelare automată

Revenind la indexarea obișnuită 1,…, n, prima figură arată definiția funcției de autocorelație rm - o cantitate considerată a fi foarte utilă în detectarea periodicității și calității semnalului. Este pur și simplu un produs scalar normalizat al seriei temporale a semnalului, cu el însuși deplasat cu întârziere m. În aplicația noastră, totuși, este convenabil să scalați fiecare valoare de autocorelație în raport cu valoarea sa la lag = 0, adică să utilizați autocorelația relativă definită de rm / r0.

Diagrama autocorelației relative a unui semnal IR tipic de bună calitate este prezentată în a doua figură. Așa cum era de așteptat, valoarea sa la lag = 0 este la maximul global egal cu 1. Următorul maxim (local) are loc la lag = 23 și este egal cu 0,79. Prezența minimelor și maximelor locale în graficul de autocorelare este ușor de înțeles: pe măsură ce semnalul se deplasează spre dreapta, vârfurile sale interferează distructiv între ele la început, dar la un anumit moment interferența devine constructivă și atinge maximum la decalajul egal cu media perioada semnalului.

Ultima frază este crucială: pentru a determina perioada medie de timp dintre vârfuri, din care se poate calcula frecvența semnalului (adică ritmul cardiac), este suficient să se găsească primul maxim local al funcției de autocorelare! În mod implicit, MAX30102 eșantionează intrarea analogică la o rată de 25 de puncte pe secundă, prin urmare, la m dat, perioada în secunde este egală cu m / 25. Acest lucru duce la ritmul cardiac exprimat în bătăi pe minut (bpm) prin:

HR = 60 * 25 / m = 1500 / m

Desigur, nu este necesar să faceți calcule scumpe ale rm la toate valorile lag. Algoritmul nostru face prima estimare a ritmului cardiac = 60 bpm, care corespunde m = 25. Funcția de autocorelație este evaluată în acel punct și comparată cu valoarea din vecinul său stâng, m = 24. Dacă valoarea vecinilor este mai mare, atunci marșul continuă spre stânga până la rm-1 <rm. Astfel, valoarea finală m este apoi returnată ca întârziere la maxim. Următoarea iterație începe de la acea valoare în loc de 25 și întregul proces se repetă. Dacă primul vecin din stânga este mai mic, atunci marșurile de rutină de mai sus întârzie spre dreapta în mod similar. De cele mai multe ori, decalajul la maxim necesită doar câteva evaluări ale funcției de autocorelare. În plus, sunt folosite ca valori limită întârzieri maxime și minime acceptabile (corespunzătoare ritmului cardiac minim și respectiv maxim).

Cele de mai sus funcționează foarte bine pentru semnale de bună calitate, dar lumea reală este departe de a fi ideală. Unele semnale ies distorsionate, mai ales din cauza artefactelor de mișcare. Un astfel de semnal este prezentat în a treia figură. Periodicitatea slabă se reflectă în forma funcției sale de autocorelație, precum și în valoarea scăzută, 0,28, a primului maxim local la m = 11. Comparați-o cu valoarea maximă de 0,79 determinată pentru semnalul de bună calitate. Alături de valorile care limitează întârzierea, prin urmare, valoarea lui rm / r0 la maxim este un bun indicator al calității semnalului și o cerință pentru depășirea anumitor praguri poate fi utilizată pentru a filtra artefactele de mișcare. Graficele „RF” prezentate în introduceri au rezultat dintr-un astfel de prag egal cu 0,25.

Pasul 5: Determinarea saturației oxigenului

Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului
Determinarea saturației oxigenului

Pasul anterior a fost suficient pentru determinarea ritmului cardiac. SpO2 necesită mai multă muncă. În primul rând, trebuie luat în considerare semnalul neglijat până acum în canalul roșu (R). Apoi, se calculează raportul dintre semnale roșu și infraroșu, Z = R / IR, ambele reflectate de sângele arterial. Partea „sânge arterial” este crucială, deoarece cea mai mare parte a luminii se reflectă de fapt în țesuturi și sânge venos. Cum se alege porțiunea semnalului corespunzătoare sângelui arterial? Ei bine, aceasta este componenta pulsatilă care variază cu fiecare bătaie a inimii. În cuvintele inginerilor electrici, este „partea de curent alternativ”, în timp ce lumina reflectată rămasă este „partea de curent continuu”. Deoarece intensitățile absolute ale luminii R și IR nu sunt proporționale, raportul Z este calculat din intensități relative, așa cum se arată în prima figură. În ceea ce privește cantitățile calculate efectiv, folosesc pătratul mediu-rădăcină (RMS) al semnalului centrat mediu, nivel de bază, y, până la media deja cunoscută a semnalului brut, <Y>; vezi a doua figură. Cu toate acestea, raportul Z reprezintă doar jumătate din muncă. Răspunsul neliniar al senzorului necesită o calibrare empirică între Z și SpO final2 valori. Am luat ecuația de calibrare din codul MAXIM:

SpO2 = (-45,06 * Z + 30,354) * Z + 94,845

Rețineți că această ecuație este valabilă numai pentru placa de proiectare MAX30102 achiziționată în 2017! Este probabil ca MAXIM să își recalibreze senzorii la o dată ulterioară.

Procedura de mai sus produce încă o mulțime de SpO false2 lecturi. Canalul roșu suferă de multe artefacte, la fel ca cel IR. Este rezonabil să presupunem că ambele semnale ar trebui să fie puternic corelate. De fapt, semnalele de bună calitate, precum exemplul din a treia figură, se corelează foarte bine. Coeficientul de corelație Pearson este în acest caz de până la 0,99. Nu este întotdeauna cazul, așa cum este ilustrat în figura a patra. Deși semnalul IR ar trece filtrul de calitate a ritmului cardiac cu rm / r0 = 0,76, semnalul R distorsionat are ca rezultat un coeficient de corelație slab între cele două egal cu doar 0,42. Această observație oferă al doilea filtru de calitate: având coeficientul de corelație între canale mai mare decât un anumit prag.

Ultimele două figuri exemplifică efectul net al unei astfel de filtrări de calitate. În primul rând, saturația de oxigen măsurată este reprezentată grafic cu un prag de calitate HR de 0,25, dar fără SpO2 filtru. Următorul grafic rezultă din filtrarea HR și SpO slabe2 rezultă la 0,5 rm / r0 și 0,8 praguri de coeficient de corelație. În general, punctele de date slabe, care reprezintă 12% din total, au fost filtrate de regimul mai strict.

În codul nostru, coeficientul de corelație, cc, este calculat conform formulei din a cincea figură, unde y reprezintă semnalul centrat mediu, nivel de bază, în timp ce r0 a fost definit în pasul anterior.

Pasul 6: Codul sursă

Codul sursă C pentru acest proiect, formatat pentru Arduino IDE, este disponibil din contul nostru Github la următorul link:

github.com/aromring/MAX30102_by_RF

Pagina Readme descrie componente individuale.

Aș dori să iau un moment pentru a-l lăuda pe Adafruit pentru că a făcut un produs atât de excelent precum Adalogger bazat pe M0. Procesorul său rapid de 48 MHz ARM Cortex M0, cu multă memorie RAM, a contribuit cu siguranță la realizarea acestui proiect viabil, în timp ce cititorul de card SD atașat direct (plus biblioteca SD a Adafruit) elimină toate durerile pasionaților asociate cu stocarea în timp real a unor cantități mari de date.

Recomandat: