Sadržaj:
- Korak 1: Hardver
- Korak 2: Digitalni signali vraća MAX30102
- Korak 3: Predprocesiranje signala
- Korak 4: Radni konj: funkcija autokorelacije
- Korak 5: Određivanje zasićenja kisikom
- Korak 6: Izvorni kod
Video: Pulsni oksimetar sa znatno poboljšanom preciznošću: 6 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:35
Ako ste nedavno posjetili liječnika, velika je vjerojatnost da je medicinske sestre pregledala vaše osnovne vitalne znakove. Težina, visina, krvni tlak, kao i broj otkucaja srca (HR) i zasićenje kisikom u perifernoj krvi (SpO2). Možda su posljednja dva dobivena iz elektronske sonde za prste koja je svijetlila u crvenom i koja je prikazala relevantne brojeve na malom ekranu u nekoliko minuta. Ta se sonda naziva pulsni oksimetar i ovdje možete pronaći sve osnovne podatke o njoj.
Sigurno se može kupiti jednostavan pulsni oksimetar, ali gdje je tu zabava? Odlučio sam izgraditi vlastiti, prvo za vrag, ali što je još važnije imajući na umu specifičnu primjenu: noćnu oksimetriju u kojoj i HR i SpO2 podaci bi se kontinuirano prikupljali preko noći i snimali na mikro SD karticu. Instructables već sadrži nekoliko projekata ove vrste, npr. Dva koja uključuju Arduino ovdje i ovdje, i jedan koji koristi Raspberry Pi. Moj koristi nešto noviji senzor MAX30102 iz integriranog MAXIM -a i Adafruit -ov Mather Adalogger za kontrolu i snimanje podataka.
Naš projekt stoga nije osobito inovativan u hardverskom smislu i kao takav ne bi bio vrijedan pisanja ovog Instructable -a, ali u procesu njegovog stvaranja napravio sam ključni napredak u softveru koji mi je omogućio da izvlačim podatke iz MAX30102 s mnogo većom dosljednošću i mnogo manje buke od softvera koji je za ovaj senzor napisao MAXIM. Performanse našeg algoritma za obradu signala ilustrirane su na gornjoj tabeli gdje dva gornja grafikona sadrže otkucaje srca i zasićenje kisikom preko noći izračunato iz sirovih signala našom metodom (identificirano s "RF"), dok dva donja grafikona prikazuju MAXIM -ove rezultate dobivene iz potpuno isti signali. Standardna odstupanja za HR su 4,7 bpm i 18,1 bpm, a za SpO2 0,9% i 4,4%, za RF i MAXIM, respektivno.
(Oba RF grafikona odgovaraju minimalnom pragu autokorelacije od 0,25 i nema ograničenja u R / IR korelaciji; za objašnjenje ovih pojmova pogledajte korake 4 i 5.)
Korak 1: Hardver
- Pulsni oksimetar i senzor pulsa MAX30102 matična ploča tvrtke MAXIM Integrated, Inc.
- Adapterger za pero M0 iz Adafruit, Inc.
- Litij -ionska baterija iz Adafruit, Inc.
Priključci:
- Priključni pinovi SCL i SDA odgovarajućim SCL i SDA pinovima na ploči MAX30102
- Adalogger pin 10 za pin INT na ploči MAX30102
- Adalogger GND na ploču GND MAX30102
- Adalogger 3V na MAX30102 VIN
Korak 2: Digitalni signali vraća MAX30102
Principi rada senzora vrlo su jednostavni: dvije LED diode, jedna crvena (660 nm) i jedna infracrvena (880 nm, IC) svjetlucaju kroz ljudsku kožu. Svjetlost se djelomično apsorbira u temeljnim tkivima, uključujući perifernu krv. Senzorski fotodetektor prikuplja reflektirano svjetlo na obje valne duljine i vraća dva odgovarajuća relativna intenziteta koristeći I2C protokol. Budući da se spektri apsorpcije oksigeniranog i deoksigeniranog hemoglobina razlikuju za obje valne duljine, reflektirano svjetlo ima promjenjivu komponentu kao količinu arterijske krvi koja je prisutna pod kožom pulsira pri svakom otkucaju srca. Određivanje brzine otkucaja srca i zasićenja kisikom ovisi o softveru za obradu signala.
Primjeri sirovih signala (samo IC kanal) ilustrirani su na gornjim slikama. Može se primijetiti periodična komponenta prekrivena promjenjivom osnovnom linijom koja se mijenja zbog više faktora spomenutih na stranici Wikipedia. Artefakti izazvani kretanjem posebno su neugodni jer mogu prikriti korisni signal HR -a i uzrokovati lažne rezultate. Stoga napredni komercijalni oksimetri imaju akcelerometre koji pomažu poništiti ove artefakte.
Sljedećoj verziji svog oksimetra mogu dodati akcelerometar, ali za noćni HR/SpO2 snimanje, kada senzor većinu vremena ostaje nepomičan, dovoljno je detektirati i izostaviti izobličene signale.
Sam senzor MAX30102 dolazi u malom površinski montiranom pakiranju, ali MAXIM ljubazno nudi ploču za razbijanje (System Board 6300) plus softver za obradu signala za Arduino i mbed - sve u referentnom dizajnerskom paketu MAXREFDES117#. Sretno sam ga kupio očekujući da ću samo zalemiti neke žice između senzora i Adaloggera i imati ispravan, dobar oksimetar u jednom danu. RD117_ARDUINO verziju MAXIM -ovog softvera prilagodio sam za rad na Adalogger -ovom ARM Cortex M0 procesoru. U osnovi, sve što sam trebao učiniti je zamijeniti nekompatibilne funkcije SofI2C u max30102.cpp odgovarajućim pozivima knjižnice Wire. Kôd se dobro sastavio u Arduino IDE v1.8.5 i radio je na M0 bez ikakvih pogrešaka. Neto rezultati su, međutim, bili razočaravajući. U uvodnom koraku već sam pokazao vrlo veliku varijaciju HR i SpO2. Naravno, netko može tvrditi da sam učinio nešto loše i to je bila i moja prvotna misao. Međutim, u videu MAXIM -ovog uputstva možete promatrati i divlje ljuljanje HR vrijednosti prikazanih na ekranu. Štoviše, komentari ispod videa potvrđuju da su i drugi primijetili sličnu pojavu.
Da skratim priču, nakon nekog eksperimentiranja utvrdio sam da senzor radi u redu i da alternativna metoda digitalne obrade signala rezultira puno boljom stabilnošću. Ova nova metoda, označena s "RF", opisana je u sljedećim koracima.
Korak 3: Predprocesiranje signala
U našoj implementaciji, neobrađeni signal se prikuplja brzinom od 25 Hz (isto kao i MAXIM -ov) tijekom pune 4 sekunde (MAXIM -ov softver prikuplja samo 1 sekundu), što rezultira sa 100 digitaliziranih vremenskih točaka po krajnjoj podatkovnoj točki. Svaki niz od 100 točaka mora se prethodno obraditi na sljedeći način:
- Središnje centriranje (tzv. "Uklanjanje istosmjerne komponente" elektroinženjerima). Sirovi podaci koji dolaze od senzora vremenski su niz cijelih brojeva u 105 domet. Korisni signal je, međutim, samo dio svjetlosti odbijene od arterijske krvi koji varira samo 102 - prva brojka. Za smislenu obradu signala stoga je poželjno oduzeti srednju vrijednost od svake točke serije. Ovaj se dio ne razlikuje od onoga što već radi softver MAXIM. Ono što je različito, međutim, je dodatno centriranje samih vremenskih indeksa. Drugim riječima, umjesto indeksiranja točaka serije brojevima od 0 do 99, novi indeksi sada su brojevi -49,5, -48,5, …, 49,5. U početku se može činiti čudnim, ali zahvaljujući ovom postupku "težište" krivulje signala podudara se s ishodištem koordinatnog sustava (druga slika). Ova činjenica postaje vrlo korisna u sljedećem koraku.
- Osnovno izravnavanje. Drugi pogled na valne oblike prikazane u koraku 2 ilustrira da osnovna linija realnih oksimetrijskih signala daleko od toga da je vodoravno ravna, ali varira kroz različite nagibe. Treća slika prikazuje infracrveni IR signal (plava krivulja) i njegovu osnovnu liniju (plava ravna linija). U ovom je slučaju nagib osnovne linije negativan. Naprijed opisana metoda obrade signala zahtijeva da osnovna linija bude vodoravna. To se može postići jednostavnim oduzimanjem osnovne vrijednosti od signala usredotočenog na sredinu. Zahvaljujući srednjem centriranju koordinata Y i X, presjek osnovne linije je nula, a jednadžba nagiba posebno je jednostavna, kao što je prikazano na četvrtoj slici. Signal niveliran osnovnom linijom prikazan je narančastom krivuljom na trećoj slici.
Tako unaprijed obrađen signal spreman je za sljedeći korak.
Korak 4: Radni konj: funkcija autokorelacije
Vraćajući se na uobičajeno indeksiranje 1,…, n, prva slika prikazuje definiciju funkcije autokorelacije rm - količina za koju se utvrdilo da je vrlo korisna u otkrivanju periodičnosti i kvalitete signala. To je jednostavno normalizirani skalarni produkt vremenske serije signala sa samim pomakom za zaostatak m. U našoj je aplikaciji ipak prikladno skalirati svaku vrijednost autokorelacije s obzirom na njezinu vrijednost pri lag = 0, tj. Koristiti relativnu autokorelaciju definiranu s rm / r0.
Grafikon relativne autokorelacije tipičnog IC signala dobre kvalitete prikazan je na drugoj slici. Očekivano, njegova vrijednost pri zaostajanju = 0 je na globalnom maksimumu jednakom 1. Sljedeći (lokalni) maksimum javlja se pri zaostajanju = 23 i jednak je 0,79. Prisutnost lokalnih minimuma i maksimuma u grafikonu autokorelacije lako je razumjeti: kako se signal pomiče udesno, njegovi se vrhovi isprva destruktivno međusobno ometaju, ali u određenom trenutku smetnje postaju konstruktivne i postižu maksimum pri zaostajanju jednakom prosjeku razdoblje signala.
Posljednja fraza je ključna: kako bi se odredilo prosječno vremensko razdoblje između vrhova, iz kojeg se može izračunati frekvencija signala (tj. Broj otkucaja srca), dovoljno je pronaći prvi lokalni maksimum funkcije autokorelacije! Prema zadanim postavkama, MAX30102 uzorkuje analogni ulaz brzinom od 25 točaka u sekundi, stoga je pri zadanom m razdoblje u sekundama jednako m / 25. To dovodi do brzine otkucaja srca izražene u otkucajima u minuti (bpm):
HR = 60*25 / m = 1500 / m
Naravno, nije potrebno raditi skupe izračune rm pri svim zaostalim vrijednostima. Naš algoritam prvi pogađa brzinu otkucaja srca = 60 otkucaja u minuti, što odgovara m = 25. Funkcija autokorelacije se u tom trenutku procjenjuje i uspoređuje s vrijednošću na lijevom susjedu, m = 24. Ako je vrijednost susjeda veća, tada marš nastavlja lijevo do rm-1 <rm. Tako određeno konačno m tada se vraća kao zaostatak na maksimumu. Sljedeća iteracija počinje od te vrijednosti umjesto 25 i cijeli se proces ponavlja. Ako je prvi lijevi susjed niži, tada gornji rutinski marševi kašnjenja pokazuju udesno na sličan način. Većinu vremena maksimalno kašnjenje zahtijeva samo nekoliko procjena funkcije autokorelacije. Osim toga, maksimalne i minimalne prihvatljive zaostatke (koje odgovaraju minimalnoj i maksimalnoj brzini otkucaja srca) koriste se kao granične vrijednosti.
Gore navedeno radi vrlo dobro za signale dobre kvalitete, ali stvarni svijet daleko je od idealnog. Neki signali izlaze izobličeni, uglavnom zbog artefakata kretanja. Takav signal prikazan je na trećoj slici. Loša periodičnost odražava se u obliku funkcije autokorelacije, kao i u niskoj vrijednosti, 0,28, prvog lokalnog maksimuma pri m = 11. Usporedite je s najvećom vrijednošću od 0,79 utvrđenom za signal dobre kvalitete. Uz granične vrijednosti zaostajanja, stoga je i vrijednost rm / r0 maksimalno je dobar pokazatelj kvalitete signala, a zahtjev za prelaskom određenog praga može se koristiti za filtriranje artefakata pokreta. Grafikoni "RF" prikazani u uvodima rezultat su takvog praga jednakog 0,25.
Korak 5: Određivanje zasićenja kisikom
Prethodni korak bio je dovoljan za određivanje brzine otkucaja srca. SpO2 zahtijeva više rada. Prvo se mora uzeti u obzir do sada zanemareni signal u crvenom (R) kanalu. Zatim se izračunava omjer crvenih i infracrvenih signala, Z = R/IR, oba reflektirana od arterijske krvi. Dio "arterijske krvi" ključan je jer se većina svjetla zapravo reflektira od tkiva i venske krvi. Kako odabrati dio signala koji odgovara arterijskoj krvi? Pa, ovo je pulsirajuća komponenta koja varira sa svakim otkucajem srca. Riječima elektrotehničara, to je "AC dio", dok je preostalo reflektirano svjetlo "DC dio". Budući da apsolutni intenziteti R i IR svjetlosti nisu razmjerni, omjer Z izračunava se iz relativnih intenziteta, kao što je prikazano na prvoj slici. U smislu stvarno izračunatih veličina, koristim srednji kvadrat (RMS) srednje centriranog signala, niveliranog na osnovnoj liniji, y, na već poznatu srednju vrijednost sirovog signala, <Y>; vidi drugu sliku. Z omjer je samo polovica posla. Odziv nelinearnog senzora zahtijeva empirijsku kalibraciju između Z i konačnog SpO2 vrijednosti. Uzeo sam kalibracijsku jednadžbu iz MAXIM -ovog koda:
SpO2 = (-45,06*Z + 30,354)*Z + 94,845
Imajte na umu da ova jednadžba vrijedi samo za dizajnersku ploču MAX30102 kupljenu 2017. godine! Vjerojatno će MAXIM kasnije ponovno kalibrirati svoje senzore.
Gore navedeni postupak i dalje proizvodi mnogo lažnih SpO2 čitanja. Crveni kanal pati od mnogih artefakata, baš kao i IC. Razumno je pretpostaviti da bi oba signala trebala biti snažno povezana. Zapravo, signali dobre kvalitete, poput primjera na trećoj slici, jako dobro koreliraju. Pearsonov koeficijent korelacije u ovom je slučaju čak 0,99. To nije uvijek slučaj, kao što je prikazano na četvrtoj slici. Iako bi IC signal prošao filtar kvalitete otkucaja srca sa svojim rm / r0 = 0,76, iskrivljeni signal R rezultira lošim koeficijentom korelacije između njih jednakim samo 0,42. Ovo opažanje nudi drugi filter kvalitete: koji ima koeficijent korelacije između kanala veći od određenog praga.
Posljednje dvije brojke ilustriraju neto učinak takvog kvalitetnog filtriranja. Prvo, izmjereno zasićenje kisikom iscrtano je s pragom kvalitete HR od 0,25, ali bez SpO2 filtar. Sljedeća ploha rezultat je filtriranja loših HR i SpO2 rezultati pri 0,5 rm / r0 i 0,8 pragova koeficijenta korelacije. Sveukupno, loši podaci koji iznose 12% ukupnog iznosa filtrirani su po strožem režimu.
U našem kodeksu koeficijent korelacije, cc, izračunat je prema formuli na petoj slici, gdje y predstavlja signal usredsreden na osnovnu razinu, dok r0 definirano je u prethodnom koraku.
Korak 6: Izvorni kod
C izvorni kod za ovaj projekt, formatiran za Arduino IDE, dostupan je s našeg Github računa na sljedećoj poveznici:
github.com/aromring/MAX30102_by_RF
Njegova stranica Readme opisuje pojedinačne komponente.
Htio bih uzeti trenutak da pohvalim Adafruit za izradu tako izvrsnog proizvoda kao što je Adalogger na bazi M0. Njegov brzi ARM Cortex M0 procesor od 48 MHz, s puno RAM -a, zasigurno je pomogao da ovaj projekt postane održiv, dok je izravno priključeni čitač SD kartica (plus Adafruitova SD biblioteka) uklonio sve hobističke boli povezane sa pohranjivanjem velikih količina podataka u stvarnom vremenu.
Preporučeni:
Pingo: pokretač loptica za ping pong s detekcijom pokreta i preciznošću: 8 koraka
Pingo: bacač loptica za ping pong s detekcijom pokreta i preciznošću: Kevin Nitiema, Esteban Poveda, Anthony Mattacchione, Raphael Kay
Arduino pulsni oksimetar: 35 koraka (sa slikama)
Arduino pulsni oksimetar: Pulsni oksimetri standardni su instrumenti za bolničke postavke. Koristeći relativne apsorpcije oksigeniranog i deoksigeniranog hemoglobina, ovi uređaji određuju postotak krvi pacijenta koja prenosi kisik (zdrav raspon je 94-9
Mikrokontrolirani pulsni oksimetar: 5 koraka
Mikrokontrolirani pulsni oksimetar: Za ovaj projekt planiram vam pokazati što sam do sada učinio sa svojim projektom mikrokontroliranog pulsnog oksimetra. Moja strast prema elektronici i fitnesu vrlo je jaka pa sam odlučila stvoriti projekt koji će mi omogućiti korištenje obje moje strasti
Uređaj za pulsni oksimetar koji koristi Arduino Nano, MAX30100 i Bluetooth HC06 .: 5 koraka
Uređaj za pulsni oksimetar koji koristi Arduino Nano, MAX30100 i Bluetooth HC06 .: Hej dečki, danas ćemo izgraditi senzorni uređaj za očitavanje razine kisika u krvi i brzine otkucaja srca na neinvazivan način pomoću senzora MAX30100. MAX30100 je otopina senzora za mjerenje pulsa i oksimetrije. Kombinira dva
Arduino DCF77 pulsni sat: 13 koraka (sa slikama)
Arduino DCF77 pulsni sat: UvodOva instrukcija vam pokazuje kako napraviti digitalni pulsni sat i dodati ga u stari 12 " (300 mm) kućište sata ili brojčanik & okvir. Koristio sam stari engleski sat za biranje sa 12 " birajte, ali upotrijebite bilo koji sat s dovoljno velikim kućištem