MAX30102: mòdul pulsímetre i oxímetre per a Arduino

MAX30102

Durant tot aquest temps, hem mostrat gran quantitat de components electrònics compatibles amb plaques com Arduino o compatibles, així com per a molts altres treballs de makers o DIY. Ara t'introduirem al mòdul MAX30102, que inclou sensor per mesurar el pols i l'oxigen a la sang.

D'aquesta manera, també podràs crear wearables com a polseres d'activitat fetes per tu mateix o maquinari per monitoritzar l'estat de salut d'una persona, aportant dades biomètriques o telemetria d'aquesta persona gràcies a la integració del pulsímetre i oxímetre en aquest dispositiu…

Què és un pulsímetre? Com funciona?

Un sensor de pols o pulsímetre és un dispositiu electrònic que sutilitza per mesurar la freqüència cardíaca duna persona en temps real. S'utilitza principalment en l'àmbit esportiu per monitoritzar el rendiment i l'esforç durant l'entrenament o el dia a dia. Els pulsòmetres són populars entre els esportistes, però també són un dispositiu fonamental als centres mèdics per conèixer la freqüència cardíaca, és a dir, les pulsacions o batecs del cor per minut:

  • PR Bpm: mostra la freqüència cardíaca, és a dir, les pulsacions per minut.

En tots els casos, els sensors capturen la variació en el volum de sang amb cada batec del cor. Aquesta variació es tradueix en un senyal elèctric que es processa per obtenir la freqüència cardíaca. Alguns pulsòmetres també inclouen circuits d'amplificació i cancel·lació de soroll per millorar la precisió de les lectures.

Què és un oxímetre? Com funciona?

Un oxímetre és un dispositiu mèdic o esportiu que s'utilitza per mesurar la saturació d'oxigen a la sang. Aquest dispositiu ofereix dades de saturació d'oxigen a la sang amb valors de 0 a 100%. És habitual que el mateix aparell també inclogui l'opció de pols cardíac, indicant tota la informació per a la seva monitorització o registre.

Els dades que mesura un oxímetre és:

  • % SpO2: es refereix al percentatge de saturació d'oxigen a la sang.

L'oxímetre es col·loca com una pinça de manera que quedi adaptat a la morfologia del nostre dit o també es pot col·locar en altres llocs del cos, com passa amb el pulsímetre, com pot ser el canell com es pot apreciar en moltes polseres d'activitat ,

Quant al funcionament, els oxímetres emeten diferents longituds d'ona de llum que passen a través de la pell. El que actua sobre aquesta llum és l'hemoglobina, una molècula de la sang encarregada de transportar l'oxigen, absorbint diferents quantitats de llum depenent del nivell d'oxigen que transporti. El procés detallat és el següent:

  1. Emissió de llum: l'oxímetre emet dues longituds d'ona de llum, una vermella i una altra infraroja, que passen a través del dit col·locat al dispositiu.
  2. Absorció de llum: l'hemoglobina, una molècula als glòbuls vermells que transporta l'oxigen, absorbeix diferents quantitats d'aquestes llums. L'hemoglobina carregada d'oxigen (oxihemoglobina) i l'hemoglobina sense oxigen (desoxihemoglobina) tenen propietats diferents d'absorció de llum.
  3. Detecció de llum: un detector al costat oposat de l'emissor de llum recull la llum que ha passat a través del dit.
  4. Càlcul de la saturació d'oxigen: el dispositiu calcula la proporció d'oxihemoglobina a la quantitat total d'hemoglobina present, tant oxihemoglobina com desoxihemoglobina. Aquesta proporció es presenta com el percentatge de saturació d'oxigen a la sang (%SpO2). Això ho fa mitjançant un processador capaç d'interpretar aquests senyals elèctrics per traslladar-lo a un valor numèric.

Què és el mòdul MAX30102?

el sensor MAX30102, produït per Maxim Integrated, és un dispositiu integrat que combina les funcionalitats d'un pulsòmetre i un oxímetre. Aquest sensor pot ser fàcilment utilitzat amb un microcontrolador com Arduino. El MAX30102 pertany a la sèrie MAX3010x de sensors òptics daquesta firma.

El seu funcionament es basa en la variació de l'absorció de llum per la sang, depenent de la seva nivell de saturació d'oxigen, i al pols com he esmentat als dos apartats anteriors. Aquest sensor està equipat amb dos LED, un vermell i un altre infraroig. Es col·loca sobre la pell, com al dit o el canell, i detecta la llum reflectida per determinar el grau de saturació d'oxigen.

La comunicació amb el MAX30102 es realitza a través del bus I2C, el que facilita la seva connexió amb un microcontrolador com Arduino. El MAX30102 necessita una doble font dalimentació: 1.8V per a la lògica i 3.3V per als LED. Normalment es troba en mòduls de 5V que ja inclouen ladaptació de nivell necessària.

El MAX30102 és un sensor utilitzat en projectes domèstics o esportius, és a dir, pot no tenir prou fiabilitat i sensibilitat per a ús mèdic professional.

La pulsioximetria òptica és un mètode no invasiu per determinar el percentatge de saturació d'oxigen a la sang. Com he comentat anteriorment, es basa en la diferència en els coeficients d'absorció de llum de l'hemoglobina (Hb) i l'oxihemoglobina (HbO2) per a diferents longituds d'ona. La sang rica en oxigen absorbeix més llum infraroja, mentre que la sang amb baix contingut d'oxigen absorbeix més llum vermella. En àrees del cos on la pell és prou prima i hi ha vasos sanguinis a sota, aquesta diferència es pot utilitzar per determinar el grau de saturació d'oxigen.

Característiques del mòdul MAX30102 amb sensor de pols i oxigen a la sang

El MAX30102 inclou:

  • 2x LED, un vermell (660nm) i un altre infraroig (880nm)
  • 2x fotodíodes per mesurar la llum reflectida
  • Conversor ADC de 18 bits amb una freqüència de mostreig de 50 a 3200 mostres per segon.
  • A més, compta amb l'electrònica necessària per a l'amplificació i el filtratge del senyal, la cancel·lació de la llum ambiental, el rebuig a les freqüències de 50-60Hz (llum artificial) i la compensació de temperatura.

El consum del mòdul pot arribar fins a 50mA durant el mesurament, encara que la intensitat pot ajustar-se mitjançant programació, amb una manera de baix consum de 0.7µA durant els mesuraments.

Preu i on comprar

Els sensors MAX30102 per mesurar el pols i l'oxigen a la sang són bastant barats. Aquests mòduls poden ser teus per tan sols uns euros a llocs com eBay, Aliexpress oa Amazon. Veuràs que hi ha diversos tipus, i et recomanem els següents:

Connexions i exemple amb Arduino

Arduino IDE, tipus de dades, programació

Per provar el MAX30102 amb Arduino, el primer és connectar aquest mòdul a la placa Arduino. Aquesta connexió és molt senzilla, tan sols has de connectar els següents:

  1. Vcc del mòdul s'ha de connectar a la sortida 5V de la placa Arduino.
  2. GND del mòdul s'ha de connectar a la presa GND de la placa Arduino.
  3. SCL del mòdul s'ha de connectar a una de les entrades analògiques de la placa Arduino, com ara l'A5.
  4. SDA del mòdul s'ha de connectar a una altra de les entrades analògiques de la placa Arduino, com l'A4.

Un cop establertes les connexions oportunes entre la placa MAX30102 i la placa Arduino, el següent serà escriure un codi font o esquetx per fer-lo funcionar i començar a rebre dades biomètriques de la persona en qüestió. Això és tan fàcil com escriure el següent codi a IDE Arduino i programar la placa:

Cal instal·lar també una biblioteca a Arduino IDE per al seu ús. La biblioteca ha estat desenvolupada per SparkFun, i està disponible a https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library.
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"

MAX30102 pulsioximetro;


#define MAX_BRIGHTNESS 255


#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno no tiene suficiente SRAM para almacenar 100 muestreos, por lo que hay que truncar las muestras en 16-bit MSB.
uint16_t pulsoBuffer[100]; //infrared LED sensor data
uint16_t oxiBuffer[100];  //red LED sensor data

#else
uint32_t pulsoBuffer[100]; //Sensores
uint32_t oxiBuffer[100];  

#endif

int32_t BufferLongitud; //Longitud de datos
int32_t spo2; //Valor de SPO2
int8_t SPO2valido; //Indicador de validez del valor SPO2
int32_t rangopulsacion; //PR BPM o pulsaciones
int8_t validrangopulsacion; //Indicador de validez del valor PR BPM

byte pulsoLED = 11; //Pin PWM
byte lecturaLED = 13; //Titila con cada lectura

void setup()
{
  Serial.begin(115200); // Inicia la comunicación con el microcontrolador a 115200 bits/segundo

  pinMode(pulsoLED, OUTPUT);
  pinMode(lecturaLED, OUTPUT);

  // Inicializar sensores
  if (!pulsioximetro.begin(Wire, I2C_SPEED_FAST)) //Usar el bus I2C a 400kHz 
  {
    Serial.println(F("MAX30102 no encontrado. Por favor, comprueba la conexión y alimentación del módulo."));
    while (1);
  }

  Serial.println(F("Pon el sensor en contacto con tu dedo y presiona cualquier tecla para iniciar la conversión."));
  while (Serial.available() == 0) ; //Esperar hasta que se pulsa una tecla
  Serial.read();

  byte brilloLED = 60; //Opciones: 0=Apagado hasta 255=50mA
  byte mediaMuestreo = 4; //Opciones: 1, 2, 4, 8, 16, 32
  byte ModoLED = 2; //Opciones: 1 = Rojo solo, 2 = Rojo + IR, 3 = Rojo + IR + Verde
  byte rangoMuestreo = 100; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int anchoPulso = 411; //Opciones: 69, 118, 215, 411
  int rangoADC = 4096; //Opciones: 2048, 4096, 8192, 16384

  pulsioximetro.setup(brilloLED, mediaMuestreo, ModoLED, rangoMuestreo, anchoPulso, rangoADC); //Configuración del módulo
}

void loop()
{
  BufferLongitud = 100; //10 almacenamientos en el buffer con 4 segundos corriendo a 25sps

  //Leer las primeras 100 muestras
  for (byte i = 0 ; i < BufferLongitud ; i++)
  {
    while (pulsioximetro.available() == false) //Comprobar nuevos datos
      pulsioximetro.check(); 
    oxiBuffer[i] = pulsioximetro.getRed();
    pulsoBuffer[i] = pulsioximetro.getIR();
    pulsioximetro.siguienteMuestreo(); //Muestreo terminado, ir al siguiente muestreo

    Serial.print(F("red="));
    Serial.print(oxiBuffer[i], DEC);
    Serial.print(F(", ir="));
    Serial.println(pulsoBuffer[i], DEC);
  }

  //Calcular el valor del pulso PM y SpO2 tras los primeros 100 samples
  maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);

  //Calcular muestreos continuos
  while (1)
  {
    //Volcar los 25 primeros valores en memoria y desplazar los últimos 75 arriba
    for (byte i = 25; i < 100; i++)
    {
      oxiBuffer[i - 25] = oxiBuffer[i];
      pulsoBuffer[i - 25] = pulsoBuffer[i];
    }

    for (byte i = 75; i < 100; i++)
    {
      while (pulsioximetro.available() == false) //Comprobar si existen nuevos datos
        pulsioximetro.check(); 

      digitalWrite(lecturaLED, !digitalRead(lecturaLED)); //Parpadea el LED on-board con cada dato

      oxiBuffer[i] = pulsioximetro.getRed();
      pulsoBuffer[i] = pulsioximetro.getIR();
      pulsioximetro.siguienteMuestreo(); //Al finalizar, moverse al siguiente muestreo

      Serial.print(F("Oxígeno="));
      Serial.print(oxiBuffer[i], DEC);
      Serial.print(F(", Pulso="));
      Serial.print(pulsoBuffer[i], DEC);

      Serial.print(F(", HR="));
      Serial.print(rangopulsacion, DEC);

      Serial.print(F(", HRvalid="));
      Serial.print(validrangopulsacion, DEC);

      Serial.print(F(", SPO2="));
      Serial.print(spo2, DEC);

      Serial.print(F(", SPO2 válido="));
      Serial.println(SPO2valido, DEC);
    }

    //Recalcular tras los primeros muestreos
    maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);
  }
}

Per descomptat, pots modificar el codi segons les teves necessitats, això és només un exemple…


Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.