Come realizzare un pulsossimetro con Arduino

Un pulsossimetro è un dispositivo utilizzato per monitorare sia la frequenza cardiaca sia, soprattutto, la concentrazione di ossigeno nel sangue. Questo dispositivo è particolarmente importante per le persone che hanno bisogno di monitorare questi parametri a causa di determinate condizioni di salute, come l’asma o l’insufficienza cardiaca congestizia. Ma è utile anche per chi viene contagiato dal nuovo coronavirus SARS-CoV-2, poiché la malattia associata, il COVID-19, può portare in poche ore a gravi difficoltà respiratorie che possono essere anticipate con un ricovero solo monitorando il livello di ossigeno nel sangue.

In questa implementazione di un pulsossimetro, utilizzeremo il chip MAX30100 all’interno di una scheda breakout, integrata con Arduino Uno e uno schermo LCD con tastiera. Il circuito integrato in questione funge da sensore per la pulsossimetria e da sensore per cardiofrequenzimetro. Va notato che il MAX30100 non è un dispositivo medico approvato dalle autorità e pertanto stiamo proponendo il pulsossimetro solo come progetto su piccola scala per la nostra categoria di bio-strumentazione.

Il nostro obiettivo generale è quello di realizzare un pulsossimetro da polso che:

  • Moduli la luce da un LED IR e da un LED a luce rossa
  • Utilizzi il sensore multiplo MAX30100 e una scheda Arduino
  • Visualizza la frequenza cardiaca o i livelli di saturazione di ossigeno su uno schermo LCD
  • Consenta all’utente di selezionare quale uscita visualizzare premendo i pulsanti sul display LCD.

Un esempio di pulsossimetro commerciale. Ne puoi trovare vari tipi, molti dei quali relativamente economici a differenza di altri più professionali, qui.

La concentrazione di ossigeno nel sangue, definita come SpO2, viene misurata in percentuale e la frequenza cardiaca / battito cardiaco viene misurata in battiti per minuto (BPM). Si può facilmente acquistare un semplice pulsossimetro, certo, ma quelli economici sono prodotti scadenti. Potete costruirne uno tutto vostro con una specifica applicazione in mente: pulsossimetria “spot” oppure continua, in cui i dati su ossigenazione e battito cardiaco vengono continuamente raccolti e registrati.

Introduzione alla pulsossimetria

L’ossigeno entra nei polmoni e quindi viene trasmesso nel sangue. Il sangue trasporta ossigeno ai vari organi del nostro corpo. Il modo principale in cui l’ossigeno viene trasportato nel nostro sangue è per mezzo dell’emoglobina (una proteina presente nel sangue). Durante una lettura della pulsossimetria, un piccolo dispositivo a pinza viene posizionato su un dito, un lobo dell’orecchio o una punta. Piccoli fasci di luce attraversano il sangue nel dito, misurando la quantità di ossigeno.

Schema di funzionamento di un pulsiossimetro. Si noti che in alcuni sensori, come quello illustrato in questo articolo, vi è un unico fotorivelatore (ad es. un fotodiodo) e viene in realtà rivelata la radiazione riflessa anziché quella trasmessa da parte a parte del dito.

La pulsossimetria, infatti, agisce sulle caratteristiche di assorbimento della luce rossa e infrarossa (IR), rispettivamente, dell’emoglobina ossigenata e di quella deossigenata. La concentrazione di ossigeno nel sangue può essere calcolata dal rapporto tra l’assorbimento della luce rossa e della luce IR da parte dell’emoglobina. La frequenza cardiaca viene rilevata dal cambiamento del volume del sangue in tutto il dito, che viene quindi quantificato dalla quantità di luce che passa attraverso il dito.

Il chip MAX30100 integra due LED: rosso (alla lunghezza d’onda di 660 nm) e infrarosso (IR, 880 nm), un fotorilevatore e l’elaborazione del segnale a basso rumore per rilevare ossimetria e segnali di frequenza cardiaca. Dai LED, la luce rossa e IR viene trasmessa attraverso il dito e il fotorilevatore integrato all’interno del chip rileva l’assorbimento della luce delle due lunghezze d’onda separate. I dati di assorbimento per IR e luce rossa sono memorizzati in un buffer FIFO fino a 64 byte.

Poiché gli spettri di assorbimento dell’emoglobina ossigenata e deossigenata differiscono per entrambe le lunghezze d’onda, la luce trasmessa attraverso il dito ha una componente variabile come la quantità di sangue arterioso presente sotto gli impulsi cutanei con ogni battito cardiaco. Capire la frequenza cardiaca e la saturazione di ossigeno da questi dati grezzi dipende dal software di elaborazione del segnale, che nel nostro caso è contenuto nello sketch di Arduino illustrato più avanti.

L’assorbimento, a diverse lunghezze d’onda della luce, da parte ell’emoglobina ossigenata e di quella deossigenata (desossiemoglobina).

Si scopre che il sangue ossigenato assorbe più luce infrarossa e lascia passare più luce rossa, mentre il sangue deossigenato assorbe luce rossa e lascia passare più luce infrarossa. Questa è la funzione principale del MAX30100: legge i livelli di assorbimento per entrambe le sorgenti luminose e li memorizza nel citato buffer che può essere letto tramite I2C. Dopodiché, la percentuale di ossigeno nel sangue può essere determinata applicando un’opportuna formula ai due tipi di dati raccolti.

Dai segnali grezzi ai parametri vitali

Innanzitutto, viene calcolato il rapporto tra segnali rosso e infrarosso, Z = R / IR, entrambi trasmessi dal sangue arterioso. La parte “sangue arterioso” è cruciale, poiché la maggior parte della luce viene trasmessa dai tessuti e dal sangue venoso. Come scegliere la porzione del segnale corrispondente al sangue arterioso? Beh, questa è la componente pulsante che varia con ogni battito cardiaco. Con le parole degli ingegneri elettrici, è la “parte AC”, mentre la luce trasmessa rimanente è la “parte DC”.

Esempi di segnali grezzi (solo canale IR). Si può notare una componente periodica sovrapposta su una linea di base variabile che si sta spostando a causa di molteplici fattori. I pulsossimetri commerciali avanzati dispongono di accelerometri che aiutano a annullare gli artefatti dovuti al movimento.

La saturazione di ossigeno nel sangue (SpO2) è il rapporto tra l’emoglobina ossigenata (HbO2) e l’emoglobina totale, che indica la concentrazione di ossigeno nel sangue del corpo umano, somma della HbO2 e della desossiemoglobina (Hb). L’SpO2 è dunque misurabile dalla risposta in uscita del fotorilevatore. Il valore SpO2 è fornito dall’espressione qui sotto. Quindi, calcolando il valore DC e AC del segnale, e usando l’equazione qui sotto, in linea di principio è possibile misurare l’SpO2.

Il tasso di assorbimento dei due tipi di emoglobina ha la massima differenza a 660 nm. Poiché le intensità assolute della luce R e IR non sono commisurate, il rapporto Z che esprime l’SpO2 viene calcolato dalle intensità relative. In termini di quantità effettivamente calcolate, la risposta non lineare del sensore richiede una calibrazione empirica tra Z ed i valori finali di SpO2. Ad esempio, l’equazione di calibrazione da usare con il sensore MAX30102 è la seguente (in generale, è diversa con un altro sensore):

SpO2 = (-45.06 * Z + 30.354) * Z + 94.845

La procedura sopra descritta produce ancora molte letture false di SpO2. Il canale rosso soffre di molti artefatti, proprio come quello IR. È ragionevole supporre che entrambi i segnali debbano essere fortemente correlati. In effetti, segnali di buona qualità si correlano molto bene. Il coefficiente di correlazione di Pearson può essere alto, come 0,99. Un segnale R distorto risulta in uno scarso coefficiente di correlazione, ad es. 0,42. Occorre avere il coefficiente di correlazione tra i canali maggiore di una certa soglia.

Due versioni, di diversi produttori, del sensore MAX30100. Lo puoi acquistare direttamente su Internet, ad esempio qui.

La funzione di cardiofrequenzimetro del sensore MAX30100 funziona invece in modo diverso, analogo a quello dei cardiofrequenzimetri più accurati, che sono quelli a fascia toracica. Quando il cuore pompa il sangue, c’è un aumento del sangue ossigenato a causa di avere più sangue. Mentre il cuore si rilassa, diminuisce anche il volume di sangue ossigenato. Conoscendo il tempo t (in millisecondi) che intercorre tra l’aumento e la riduzione del sangue ossigenato, viene determinata la frequenza del polso. In pratica, quest’ultima è data dalla semplice formula: BPM = (1000 x 60) / t.

Il chip MAX30100 è alimentato a 3,3 V e fornisce all’utente due possibili modalità operative: la modalità di frequenza cardiaca e la modalità di saturazione della frequenza cardiaca e dell’ossigeno. Nella prima modalità, è acceso solo il LED IR, mentre nella modalità doppia sono accesi sia i LED IR che quello rosso. Ha anche un filtro passa-basso 60 Hz integrato. Sebbene possa filtrare il rumore della linea di alimentazione, non tiene conto del rumore ambientale e delle fluttuazioni, né di forti luci ambiente.

Come costruire un pulsossimetro

In questo progetto, abbiamo utilizzato entrambe le operazioni di ossimetria e rilevamento della frequenza cardiaca con il MAX30100, in modo da poter rilevare contemporaneamente sia la frequenza cardiaca sia la saturazione di ossigeno. Il materiale necessario per realizzare il pulsossimetro è il seguente:

  • Arduino Uno x1
  • MAX30100 Breakout Board x1
  • Shield schermo LCD per Arduino
  • Una lunghezza adeguata di velcro
  • Un laptop con installato il SW per Arduino
  • Cavi jumper
  • Fili per saldatura
  • Strumenti di saldatura

I collegamenti fra i diversi componenti del nostro progetto, uno dei quali è lo schermo LCD con la relativa tastiera. I collegamenti nell’area in giallo sono solo indicativi.

Possiamo procurarci una scheda breakout MAX30100, ad esempio, di ProtoCentral, che è fornita con degli slot per inserire il velcro in modo che il dispositivo possa essere avvolto attorno al dito. Costruisci quindi un bracciale per dito in grado di modulare la luce da due diversi LED (uno IR e uno in luce rossa) e di raccogliere la luce trasmessa, dopo essere passata attraverso il dito, su un fotodiodo. Abbiamo anche dovuto saldare i fili dei ponticelli ai pin della scheda di breakout per collegarlo all’Arduino.

Il MAX30100 è un dispositivo I2C, quindi tramite il codice richiede che la libreria Wire si interfacci con Arduino. Fisicamente, il MAX30100 (in questo caso, la breakout board) è collegato all’Arduino tramite speciali pin in grado di leggere i dati dalle linee SCL e SDA, che sono A4 e A5. Le linee SCL e SDL forniscono il segnale dati e il segnale di clock. Le linee di terra e Vin sono collegate, rispettivamente, alle linee GND e 5V. Lo schermo LCD per tastiera è collegato all’Arduino tramite i pin 4-8.

Una versione semplificata del pulsossimetro, senza schermo LCD, che illustriamo più avanti.

I due pulsanti sulla tastiera dello schermo LCD vengono utilizzati per selezionare tra due modalità: il cardiofrequenzimetro e il monitor della concentrazione di ossigeno. Lo sketch – ovvero il programma da copiare e incollare su Arduino – necessario per far funzionare il nostro apparecchio può essere scaricato da qui. Il codice che abbiamo fornito in questo progetto si basa su una libreria open source di Raivinis Strogonovs, che aveva implementato la propria versione del pulsossimetro con il MAX30100.

Se non vuoi usare il display LCD e leggere i dati su concentrazione di ossigeno del sangue e frequenza cardiaca direttamente dal monitor seriale di Arduino, puoi usare un altro sketch, scaricabile da qui. I file della libreria del MAX30100 possono essere scaricati da qui. Il vantaggio di questa implementazione è che puoi leggere contemporaneamente i dati dei due parametri e salvarli sul PC, nonché usarli per fare dei grafici in tempo reale del loro andamento nel tempo.

Il semplice collegamento di Arduino al sensore MAX30100 se non si usa lo schermo LCD.

Uso pratico e interpretazione dei dati

Con la nostra implementazione del sensore MAX30100, abbiamo notato che la posizione e il movimento del dito influiscono notevolmente sulle letture registrate. Ciò può essere causato dal modo in cui la misurazione della frequenza cardiaca dipende, in larga misura, dal volume del sangue che scorre attraverso il dito e qui entra in gioco anche lo spessore della pelle. Se le dita si muovono, in particolare, ciò può causare livelli di luce non uniformi durante l’acquisizione di una lettura.

I dati del sensore letti direttamente sul monitor seriale di Arduino.

Le persone che testano il nostro progetto non devono muovere le dita / le mani per acquisire una lettura stabile. Questo progetto può essere migliorato posizionando il sensore all’interno di un vero manicotto per le dita che può ridurre ulteriormente gli effetti della luce ambientale e anche mantenere il dito in posizione, invece di usare semplicemente una striscia di velcro. Evitare di usare il sensore sulle dita fredde e preferire quelle più grandi: il pollice può essere il dito più adatto per la misurazione.

Un normale livello di ossigeno nel sangue (SpO2), per polmoni sani, è compreso in genere tra il 95 e il 100 percento. Normalmente, una lettura SpO2 inferiore al 95 percento è considerata bassa. Un livello di ossigeno nel sangue inferiore al normale si chiama ipossiemia. L’ipossiemia è spesso motivo di preoccupazione. Più basso è il livello di ossigeno, più grave è l’ipossiemia. Ciò può portare a complicazioni nel tessuto e negli organi del corpo, perciò in tal caso contatta il tuo medico.

Un pulsossimetro commerciale (a sinistra) ed i livelli di ossigeno nel sangue normali e pericolosi (a destra).

Quando il livello di ossigeno nel sangue è al di sotto del livello tipico, è possibile che si verifichino sintomi quali mancanza di respiro, dolore al petto, confusione, mal di testa, battito cardiaco accelerato. Se continui ad avere bassi livelli di ossigeno nel sangue, potresti mostrare sintomi di cianosi. Il segno distintivo di questa condizione è una decolorazione blu dei letti ungueali, della pelle e delle mucose. La cianosi può portare a insufficienza respiratoria, che può essere pericolosa per la vita.