INHOUDSOPGAWE:
- Stap 1: Hardeware
- Stap 2: Digitale seine wat deur MAX30102 teruggestuur word
- Stap 3: Voorverwerking van seine
- Stap 4: Die werkpaard: outokorrelasie funksie
- Stap 5: Bepaling van suurstofversadiging
- Stap 6: Die bronkode
Video: Pulsoksimeter met baie verbeterde presisie: 6 stappe (met foto's)
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:26
As u onlangs 'n dokter besoek het, is die kans goed dat u basiese vitale tekens deur 'n verpleegster ondersoek is. Gewig, lengte, bloeddruk, sowel as hartklop (HR) en suurstofversadiging in perifere bloed (SpO2). Miskien is die laaste twee verkry uit 'n rooi gloeiende elektroniese vingersonde wat binne enkele minute relevante getalle op 'n klein skerm vertoon. Die sonde word polsoksimeter genoem en u kan al die basiese inligting hieroor vind.
U kan maklik 'n eenvoudige polsoksimeter koop, maar waar is die pret daarin? Ek het besluit om eers my eie te bou, maar belangriker met 'n spesifieke toepassing in gedagte: nagtelike oksimetrie waar beide HR en SpO2 data word deurlopend oornag versamel en op 'n mikro -SD -kaart aangeteken. Instructables bevat reeds verskeie sulke projekte, byvoorbeeld twee waarby Arduino hier en hier betrokke is, en een wat Raspberry Pi gebruik. Myne gebruik 'n effens nuwer sensor MAX30102 van MAXIM Integrated en Adafruit's Feather M0 Adalogger vir beheer en data -opname.
Ons projek is dus nie besonder innoverend ten opsigte van hardeware nie, en as sodanig is dit nie die moeite werd om hierdie instruksies te skryf nie, maar tydens die skep daarvan het ek belangrike vooruitgang gemaak in sagteware wat my in staat gestel het om data uit MAX30102 te onttrek met 'n baie hoër konsekwentheid en veel meer minder geraas as sagteware wat deur MAXIM vir hierdie sensor geskryf is. Die prestasie van ons seinverwerkingsalgoritme word geïllustreer in die grafiek hierbo, waar die twee boonste grafieke 'n oornag -hartklop en suurstofversadiging bevat, bereken uit rou seine volgens ons metode (geïdentifiseer deur "RF"), terwyl die onderste twee grafieke die resultate van MAXIM toon presies dieselfde seine. Standaardafwykings vir HR is 4,7 bpm en 18,1 bpm, en vir SpO2 0,9% en 4,4%, onderskeidelik vir RF en MAXIM.
(Beide RF -grafieke stem ooreen met die minimale outokorrelasie -drempel van 0.25 en geen beperking op R / IR -korrelasie nie; sien stap 4 en 5 vir verduideliking van hierdie terme.)
Stap 1: Hardeware
- Pulsoksimeter en hartklop sensor MAX30102 stelselbord van MAXIM Integrated, Inc.
- Feather M0 Adalogger van Adafruit, Inc.
- Litiumionbattery van Adafruit, Inc.
Verbindings:
- Adalogger penne SCL en SDA na ooreenstemmende SCL en SDA penne op MAX30102 bord
- Adalogger pen 10 om INT vas te maak op MAX30102 bord
- Adalogger GND tot MAX30102 bord GND
- Adalogger 3V tot MAX30102 VIN
Stap 2: Digitale seine wat deur MAX30102 teruggestuur word
Die beginsels van die sensorbediening is baie eenvoudig: twee LED's, een rooi (660 nm) en een infrarooi (880 nm, IR) skyn lig deur die menslike vel. Die lig word gedeeltelik geabsorbeer deur onderliggende weefsels, insluitend perifere bloed. Sensor se fotodetektor versamel weerkaatste lig by beide golflengtes en gee twee ooreenstemmende relatiewe intensiteite met behulp van I2C -protokol. Aangesien absorpsiespektra vir geoksigeneerde en ontoksigeerde hemoglobien vir beide golflengtes verskil, het die weerkaatsende lig 'n veranderlike komponent, aangesien die hoeveelheid arteriële bloed wat onder die vel voorkom, met elke hartklop pulseer. Om die hartklop en suurstofversadiging uit te vind, hang af van die sagteware vir die verwerking van seine.
Voorbeelde van rou seine (slegs IR -kanaal) word in die bostaande beelde geïllustreer. U kan 'n periodieke komponent sien wat oor 'n veranderlike basislyn lê, wat verskuif as gevolg van verskeie faktore wat op die Wikipedia -bladsy genoem word. Bewegingsgeïnduceerde artefakte is veral irriterend, aangesien dit die nuttige HR -sein kan verberg en valse resultate kan veroorsaak. Gevorderde kommersiële oksimeters bevat dus versnellingsmeters wat help om hierdie artefakte te vernietig.
Ek kan 'n versnellingsmeter by die volgende weergawe van my oksimeter voeg, maar vir nagtelike HR/SpO2 opname, as die sensor meestal onbeweeglik bly, is dit voldoende om verwronge seine op te spoor en weg te laat.
Die MAX30102 -sensor self kom in 'n klein pakket op die oppervlak, maar MAXIM bied genadiglik 'n uitbreekbord (System Board 6300) plus seinverwerkingsagteware vir Arduino en mbed - alles in die verwysingsontwerppakket MAXREFDES117#. Ek het dit gelukkig gekoop met die verwagting om net 'n paar drade tussen die sensor en Adalogger te soldeer en binne 'n enkele dag 'n goeie oksimeter te kry. Ek het die RD117_ARDUINO -weergawe van MAXIM se sagteware aangepas om op die ARM Cortex M0 -verwerker van Adalogger te werk. Eintlik hoef ek net die onverenigbare SofI2C -funksies in max30102.cpp te vervang deur die ooreenstemmende oproepe van die Wire -biblioteek. Die kode is fyn saamgestel in die Arduino IDE v1.8.5 en loop sonder foute op M0. Die netto resultate was egter teleurstellend. In die inleidingsstap het ek al 'n baie groot variansie van beide HR en SpO getoon2. Uiteraard kan 'n mens beweer dat ek iets verkeerd gedoen het, en dit was ook my oorspronklike gedagte. In die instruksievideo van MAXIM kan u egter ook baie swaaiende HR -waardes sien wat op die skerm verskyn. Boonop bevestig die kommentaar onder die video dat ander ook 'n soortgelyke verskynsel opgemerk het.
Om 'n lang verhaal kort te maak, het ek na 'n paar eksperimente vasgestel dat die sensor goed werk, en 'n alternatiewe metode vir digitale seinverwerking lei tot baie beter stabiliteit. Hierdie nuwe metode, aangedui met "RF", word in die volgende stappe beskryf.
Stap 3: Voorverwerking van seine
In ons implementering word die ruwe sein vir 4 sekondes versamel teen 'n snelheid van 25 Hz (dieselfde as MAXIM) (die sagteware van MAXIM versamel slegs 1 sekonde), wat lei tot 100 gedigitaliseerde tydpunte per einddatapunt. Elke volgorde van 100 punte moet op die volgende manier vooraf verwerk word:
- Gemiddelde sentrering (ook bekend as "verwydering van die GS-komponent" na elektriese ingenieurs). Die rou data wat van die sensor afkomstig is, is 'n tydreeks van heelgetalle in die 105 reeks. Die nuttige sein is egter slegs 'n deel van die lig wat deur arteriële bloed gereflekteer word, wat wissel in die orde van slegs 102 - eerste figuur. Vir sinvolle seinverwerking is dit dus wenslik om die gemiddelde van elke reekspunt af te trek. Hierdie deel verskil nie van wat die MAXIM -sagteware reeds doen nie. Wat egter anders is, is die bykomende middelpunt van tydindekse self. Met ander woorde, in plaas daarvan om reekspunte met getalle van 0 tot 99 te indekseer, is die nuwe indekse nou getalle -49,5, -48,5, …, 49,5. Dit kan aanvanklik vreemd lyk, maar danksy hierdie prosedure val die seinkurwe se "swaartepunt" saam met die oorsprong van die koördinaatstelsel (tweede figuur). Hierdie feit word baie nuttig in die volgende stap.
- Grondlyn nivellering. 'N Ander blik op die golfvorme wat in stap 2 getoon word, illustreer dat die basislyn van werklike oksimetrie -seine nog lank nie horisontaal plat is nie, maar wissel deur verskillende hellings. Derde figuur toon 'n gemiddelde-gesentreerde IR-sein (blou kurwe) en sy basislyn (blou reguit lyn). In hierdie geval is die helling van die basislyn negatief. Die seinverwerkingsmetode wat vooraf beskryf word, vereis dat die basislyn horisontaal is. Dit kan bereik word deur eenvoudig die basislyn af te trek van die gemiddelde-gesentreerde sein. Danksy die middelpunt van beide die Y- en die X-koördinate, is die afsnypunt van die basislyn nul en die hellingvergelyking daarvan is besonder eenvoudig, soos in die vierde figuur getoon.
Die vooraf verwerkte sein is dus gereed vir die volgende stap.
Stap 4: Die werkpaard: outokorrelasie funksie
As ons terugkeer na die gewone 1, …, n indeksering, toon die eerste figuur die definisie van die outokorrelasie funksie rm - 'n hoeveelheid is baie nuttig om die periodisiteit van die sein sowel as die kwaliteit daarvan op te spoor. Dit is bloot 'n genormaliseerde skalaarproduk van die seine se tydreeks, wat met lag m verskuif word. In ons toepassing is dit egter gerieflik om elke outokorrelasiewaarde te skaal ten opsigte van die waarde daarvan by lag = 0, dit wil sê relatiewe outokorrelasie gedefinieer deur rm / r0.
Die voorstelling van die relatiewe outokorrelasie van 'n tipiese goeie kwaliteit IR -sein word in die tweede figuur getoon. Soos verwag, is die waarde by vertraging = 0 by die globale maksimum gelyk aan 1. Die volgende (plaaslike) maksimum kom voor by vertraging = 23 en is gelyk aan 0.79. Die teenwoordigheid van plaaslike minima en maksima in outokorrelasie -plot is maklik om te verstaan: namate die sein na regs skuif, val die pieke aanvanklik destruktief met mekaar in, maar op 'n sekere punt word die inmenging konstruktief en bereik dit maksimum met die vertraging gelyk aan die gemiddelde tydperk van die sein.
Die laaste frase is van kardinale belang: om die gemiddelde tydsduur tussen pieke te bepaal, waaruit die frekwensie van die sein (dws hartklop) bereken kan word, is dit voldoende om die eerste plaaslike maksimum van die outokorrelasiefunksie te vind! Standaard neem MAX30102 analoog insette teen 'n tempo van 25 punte per sekonde, dus op gegewe m is die periode in sekondes gelyk aan m / 25. Dit lei tot hartklop uitgedruk in slae per minuut (bpm) deur:
HR = 60*25 / m = 1500 / m
Dit is natuurlik nie nodig om duur berekeninge van r te doen niem teen alle vertragingswaardes. Ons algoritme maak die eerste raaiskoot van hartklop = 60 bpm, wat ooreenstem met m = 25. Outokorrelasie funksie word op daardie stadium geëvalueer en vergelyk met die waarde by sy linker buurman, m = 24. As die bure se waarde hoër is, dan is die optog gaan links na rm-1 <rm. So word die uiteindelike m dan teruggegee as die vertraging op maksimum. Die volgende iterasie begin vanaf die waarde in plaas van 25 en die hele proses word herhaal. As die eerste linker buurman laer is, wys die bogenoemde roetine -optogte op dieselfde manier na regs. Die maksimum vertraging vereis meestal slegs 'n paar evaluerings van die outokorrelasiefunksie. Boonop word maksimum en minimum aanvaarbare vertragings (wat ooreenstem met onderskeidelik minimale en maksimum hartklop) as beperkende waardes gebruik.
Bogenoemde werk baie goed vir seine van goeie gehalte, maar die werklike wêreld is verre van ideaal. Sommige seine kom verwring, meestal as gevolg van bewegingsartefakte. So 'n sein word in die derde figuur getoon. Swak periodisiteit word weerspieël in die vorm van sy outokorrelasie funksie sowel as in die lae waarde, 0,28, van die eerste plaaslike maksimum by m = 11. Vergelyk dit met die maksimum waarde van 0,79 wat bepaal is vir die goeie kwaliteit sein. Saam met vertragingsbeperkende waardes is die waarde van r dusm / r0 maksimum is 'n goeie aanduiding van seingehalte, en 'n vereiste dat dit sekere drempels moet oorskry, kan gebruik word om bewegingsartefakte uit te filter. Die "RF" -grafieke wat in die inleidings getoon word, is die gevolg van die drempel gelyk aan 0.25.
Stap 5: Bepaling van suurstofversadiging
Die vorige stap was voldoende om die hartklop te bepaal. Die SpO2 verg meer werk. Eerstens moet die tot dusver verwaarloosde sein in die rooi (R) kanaal in ag geneem word. Vervolgens word die verhouding van rooi tot infrarooi seine, Z = R/IR, albei gereflekteer uit die arteriële bloed, bereken. Die gedeelte "arteriële bloed" is van kardinale belang, aangesien die meeste lig eintlik deur weefsels en veneuse bloed gereflekteer word. Hoe om 'n gedeelte van die sein te kies wat ooreenstem met arteriële bloed? Dit is die pulserende komponent wat met elke hartklop wissel. In woorde van elektriese ingenieurs is dit die 'AC -deel', terwyl die oorblywende weerkaatste lig die 'DC -deel' is. Aangesien absolute intensiteite van R en IR -lig nie ooreenstem nie, word die Z -verhouding bereken uit relatiewe intensiteite, soos in die eerste figuur getoon. Wat werklike berekende hoeveelhede betref, gebruik ek die wortelgemiddelde-kwadraat (RMS) van die gemiddelde-gesentreerde, basislyn-gelykgemaakte sein, y, tot die reeds bekende gemiddelde van die rou sein, <Y>; sien tweede figuur. Die Z -verhouding is egter slegs die helfte van die werk. Die nie -lineêre sensorreaksie vereis 'n empiriese kalibrasie tussen Z en die finale SpO2 waardes. Ek het die kalibrasievergelyking uit MAXIM se kode geneem:
SpO2 = (-45.06*Z + 30.354)*Z + 94.845
Hou in gedagte dat hierdie vergelyking slegs geldig is vir MAX30102 ontwerpbord wat in 2017 gekoop is! Dit is waarskynlik dat MAXIM sy sensors later kan herkalibreer.
Bogenoemde prosedure lewer steeds baie vals SpO op2 lesings. Die rooi kanaal ly aan baie artefakte, net soos die IR -kanaal. Dit is redelik om aan te neem dat beide seine sterk gekorreleer moet word. Trouens, goeie kwaliteit seine, soos die voorbeeld in die derde figuur, korreleer baie goed. Die Pearson -korrelasiekoëffisiënt is in hierdie geval so hoog as 0,99. Dit is nie altyd die geval nie, soos geïllustreer in die vierde figuur. Alhoewel die IR -sein die hartklopkwaliteitfilter met sy r sou slaagm / r0 = 0,76, die verwronge R -sein lei tot 'n swak korrelasiekoëffisiënt tussen die twee gelykstaande aan slegs 0,42. Hierdie waarneming bied die tweede kwaliteitsfilter: die korrelasiekoëffisiënt tussen kanale groter as sekere drempel.
Die laaste twee syfers gee 'n voorbeeld van die netto effek van so 'n kwaliteit filter. Eerstens word die gemete suurstofversadiging met 'n HR -kwaliteitsdrempel van 0,25 geteken, maar sonder die SpO2 filter. Die volgende plot is die gevolg van die uitfiltering van swak HR en SpO2 resultate op die 0,5 rm / r0 en 0,8 korrelasiekoëffisiëntdrempels. In die algemeen is swak datapunte van 12% van die totaal deur die strenger regime gefiltreer.
In ons kode word die korrelasiekoëffisiënt, cc, bereken volgens die formule in die vyfde figuur, waar y die gemiddelde-gesentreerde, basislyn-vlak sein voorstel, terwyl r0 is in die vorige stap gedefinieer.
Stap 6: Die bronkode
Die C -bronkode vir hierdie projek, geformateer vir die Arduino IDE, is beskikbaar by ons Github -rekening op die volgende skakel:
github.com/aromring/MAX30102_by_RF
Die Readme -bladsy beskryf individuele komponente.
Ek wil 'n rukkie neem om Adafruit te prys vir sy uitstekende produk soos die M0-gebaseerde Adalogger. Sy vinnige 48 MHz ARM Cortex M0 -verwerker, met baie RAM, het beslis gehelp om hierdie projek lewensvatbaar te maak, terwyl direk aangehegte SD -kaartleser (plus Adafruit se SD -biblioteek) al die pyn van die stokperdjie wat verband hou met die stoor van groot hoeveelhede data, verwyder.
Aanbeveel:
Baie helder fietslig met PCB's met aangepaste ligpanele: 8 stappe (met foto's)
Baie helder fietslig met PCB's met aangepaste ligpanele: as u 'n fiets besit, weet u hoe onaangename slaggate op u bande en u liggaam kan wees. Ek het genoeg gehad om my bande uit te blaas, en ek het besluit om my eie led -paneel te ontwerp met die doel om dit as 'n fietslig te gebruik. Een wat daarop fokus om E te wees
Nuwe en verbeterde Geiger -toonbank - nou met WiFi !: 4 stappe (met foto's)
Nuwe en verbeterde Geiger -toonbank - nou met WiFi !: Dit is 'n bygewerkte weergawe van my Geiger -toonbank uit hierdie instruksies. Dit was baie gewild en ek het baie terugvoer gekry van mense wat belangstel om dit te bou, so hier is die vervolg: The GC-20. 'N Geiger -toonbank, dosimeter en stralingsm
Temperatuurbeheerder met hoë presisie: 6 stappe (met foto's)
Hoë-presisie temperatuurbeheerder: In die wetenskap en in die ingenieurswêrelde is die byhou van temperatuur aka (beweging van die atome in termodinamika) een van die fundamentele fisiese parameters wat u byna oral moet oorweeg, van selbiologie tot vuurpyl en
Verbeterde NRF24L01 -radio met 'n DIY -tweepool -antenna -aanpassing .: 5 stappe (met foto's)
Verbeterde NRF24L01 -radio met 'n DIY -tweepool -antenna -aanpassing.: Die situasie was dat ek slegs deur 2 of 3 mure met 'n afstand van ongeveer 50 voet kon stuur en ontvang met behulp van standaard nRF24L01+ modules. Dit was onvoldoende vir my beoogde gebruik. Ek het vroeër probeer om aanbevole kapasitors by te voeg, maar
Baie eenvoudig Tog 'n baie effektiewe grap (rekenaarprank): 3 stappe
Baie eenvoudig … Tog 'n baie effektiewe grap (rekenaarprankie): hierdie instruksie is baie eenvoudig, maar tog baie effektief! Wat sal gebeur, is: U verberg al die ikone op die lessenaar se lessenaar. Die slagoffer sal skrik as hy die rekenaar sien nadat u die grap gemaak het. Dit kan die rekenaar op geen manier benadeel nie