MAX30102: módulo pulsímetro y oxímetro para Arduino

MAX30102

Durante todo este tiempo, hemos mostrado gran cantidad de componentes electrónicos compatibles con placas como Arduino o compatibles, así como para otros muchos trabajos de makers o DIY. Ahora te introduciremos en el módulo MAX30102, que incluye sensor para medir el pulso y el oxígeno en sangre.

De esta forma, también podrás crear wearables como pulseras de actividad hechas por ti mismo o hardware para monitorizar el estado de salud de una persona, aportando datos biométricos o telemetría de dicha persona gracias a la integración del pulsímetro y oxímetro en este dispositivo…

¿Qué es un pulsímetro? ¿Cómo funciona?

Un sensor de pulso o pulsímetro es un dispositivo electrónico que se utiliza para medir la frecuencia cardíaca de una persona en tiempo real. Se utiliza principalmente en el ámbito deportivo para monitorizar el rendimiento y el esfuerzo durante el entrenamiento o en el día a día. Los pulsómetros son populares entre los deportistas, pero también son un dispositivo fundamental en los centros médicos para conocer la frecuencia cardíaca, es decir, las pulsaciones o latidos del corazón por minuto:

  • PR Bpm: muestra la frecuencia cardíaca, es decir, las pulsaciones por minuto.

En todos los casos, los sensores capturan la variación en el volumen de sangre con cada latido del corazón. Esta variación se traduce en una señal eléctrica que se procesa para obtener la frecuencia cardíaca. Algunos pulsómetros también incluyen circuitos de amplificación y cancelación de ruido para mejorar la precisión de las lecturas.

¿Qué es un oxímetro? ¿Cómo funciona?

Un oxímetro es un dispositivo médico o deportivo que se utiliza para medir la saturación de oxígeno en la sangre. Este dispositivo, ofrece datos de saturación de oxígeno en sangre con valores de 0 a 100%. Es habitual que el mismo aparato también incluya la opción de pulso cardíaco, indicando toda la información para su monitorización o registro.

Los datos que mide un oxímetro es:

  • %SpO2: se refiere al porcentaje de saturación de oxígeno en sangre.

El oxímetro se coloca como una pinza de tal manera que quede adaptado a la morfología de nuestro dedo o también se puede colocar en otros lugares del cuerpo, como ocurre con el pulsímetro, como puede ser la muñeca como se puede apreciar en muchas pulseras de actividad,

En cuanto a su funcionamiento, los oxímetros emiten diferentes longitudes de onda de luz que pasan a través de la piel. Lo que actúa sobre esa luz es la hemoglobina, una molécula de la sangre encargada de transportar el oxígeno, absorbiendo diferentes cantidades de luz dependiendo del nivel de oxígeno que transporte. El proceso detallado es el siguiente:

  1. Emisión de luz: el oxímetro emite dos longitudes de onda de luz, una roja y otra infrarroja, que pasan a través del dedo colocado en el dispositivo.
  2. Absorción de luz: la hemoglobina, una molécula en los glóbulos rojos que transporta el oxígeno, absorbe diferentes cantidades de estas luces. La hemoglobina cargada de oxígeno (oxihemoglobina) y la hemoglobina sin oxígeno (desoxihemoglobina) tienen diferentes propiedades de absorción de luz.
  3. Detección de luz: un detector en el lado opuesto del emisor de luz recoge la luz que ha pasado a través del dedo.
  4. Cálculo de la saturación de oxígeno: el dispositivo calcula la proporción de oxihemoglobina a la cantidad total de hemoglobina presente, tanto oxihemoglobina como desoxihemoglobina. Esta proporción se presenta como el porcentaje de saturación de oxígeno en sangre (%SpO2). Esto lo realiza mediante un procesador capaz de interpretar estas señales eléctricas para trasladarlo a un valor numérico.

¿Qué es el módulo MAX30102?

El sensor MAX30102, producido por Maxim Integrated, es un dispositivo integrado que combina las funcionalidades de un pulsómetro y un oxímetro. Este sensor puede ser fácilmente utilizado con un microcontrolador como Arduino. El MAX30102 pertenece a la serie MAX3010x de sensores ópticos de esta firma.

Su funcionamiento se basa en la variación de la absorción de luz por la sangre, dependiendo de su nivel de saturación de oxígeno, y en el pulso como he mencionado en los dos apartados anteriores.  Este sensor está equipado con dos LED, uno rojo y otro infrarrojo. Se coloca sobre la piel, como en el dedo o la muñeca, y detecta la luz reflejada para determinar el grado de saturación de oxígeno.

La comunicación con el MAX30102 se realiza a través del bus I2C, lo que facilita su conexión con un microcontrolador como Arduino. El MAX30102 necesita una doble fuente de alimentación: 1.8V para la lógica y 3.3V para los LED. Normalmente, se encuentra en módulos de 5V que ya incluyen la adaptación de nivel necesaria.

El MAX30102 es un sensor utilizado en proyectos domésticos o deportivos, es decir, puede no tener la fiabilidad y sensibilidad suficientes para uso médico profesional.

La pulsioximetría óptica es un método no invasivo para determinar el porcentaje de saturación de oxígeno en la sangre. Como he comentado anteriormente, se basa en la diferencia en los coeficientes de absorción de luz de la hemoglobina (Hb) y la oxihemoglobina (HbO2) para diferentes longitudes de onda. La sangre rica en oxígeno absorbe más luz infrarroja, mientras que la sangre con bajo contenido de oxígeno absorbe más luz roja. En áreas del cuerpo donde la piel es lo suficientemente delgada y hay vasos sanguíneos debajo, esta diferencia puede utilizarse para determinar el grado de saturación de oxígeno.

Características del módulo MAX30102 con sensor de pulso y oxígeno en sangre

El MAX30102 incluye:

  • 2x LED, uno rojo (660nm) y otro infrarrojo (880nm)
  • 2x fotodiodos para medir la luz reflejada
  • Conversor ADC de 18 bits con una frecuencia de muestreo de 50 a 3200 muestras por segundo.
  • Además, cuenta con la electrónica necesaria para la amplificación y filtrado de la señal, la cancelación de la luz ambiental, el rechazo a las frecuencias de 50-60Hz (luz artificial) y la compensación de temperatura.

El consumo del módulo puede llegar hasta 50mA durante la medición, aunque la intensidad puede ajustarse mediante programación, con un modo de bajo consumo de 0.7µA durante las mediciones.

Precio y dónde comprar

Los sensores MAX30102 para medir el pulso y el oxígeno en sangre son bastante baratos. Estos módulos pueden ser tuyos por tan solo unos euros en sitios como eBay, Aliexpress o en Amazon. Verás que existen varios tipos, y te recomendamos los siguientes:

Conexiones y ejemplo con Arduino

Arduino IDE, tipos de datos, programación

Para probar el MAX30102 con Arduino, lo primero es conectar este módulo a la placa Arduino. Esta conexión es muy sencilla, tan solo tienes que conectar los siguiente:

  1. Vcc del módulo debe conectarse a la salida 5V de la placa Arduino.
  2. GND del módulo debe conectarse a la toma GND de la placa Arduino.
  3. SCL del módulo tiene que conectarse a una de las entradas analógicas de la placa Arduino, como la A5.
  4. SDA del módulo tiene que conectarse a otra de las entradas analógicas de la placa Arduino, como la A4.

Una vez establecidas las conexiones oportunas entre la placa MAX30102 y la placa Arduino, lo siguiente será escribir un código fuente o sketch para hacerlo funcionar y comenzar a recibir datos biométricos de la persona en cuestión. Esto es tan fácil como escribir el siguiente código en Arduino IDE y programar la placa:

Se necesita instalar también una biblioteca en Arduino IDE para su uso. La biblioteca ha sido desarrollada por SparkFun, y está disponible en 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);
  }
}

Por supuesto, puedes modificar el código según tus necesidades, esto es solo un ejemplo…


Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.