Pulso Cardiaco

Se obtienen los datos para describir el comportamiento de un pulso cardiaco a partir de un «Sensor cardiaco» para arduino, luego pueden ser procesados con los conceptos teóricos del caso, por ejemplo: MATG1013 Análisis Numérico.

Un ejemplo de los datos capturados «en vivo» se muestran a continuación.

Los datos del sensor se transmiten por medio del puerto USB al computador, donde son capturados con el programa Python. Los datos se agregan a un arreglo o vector y se pueden procesar con los algoritmos desarrollados en el curso.

1. Piezas y Partes

Para el ejemplo se requieren los siguiente elementos:

  • Arduino Uno
  • Sensor de pulso cardiaco
  • cables de conexión

En las figuras se muestra el tipo de  sensor que se aproxima a un dedo índice del sujeto  bajo pruebas.

El sensor dispone de tres pines: Señal (S), Vcc(+) y GND (-)

2. Conexión Arduino

La señal obtenida es de tipo analógica, por lo que se debe conectar a pines analógicos del Arduino, en el ejemplo etiquetado A0. El arduino cuantifica el valor y lo envía al puerto serial para procesar los datos.

El diagrama básico de conexión se muestra en el esquema.

Para evitar interferencias en las lecturas, se recomienda cubrir el sensor durante el uso con material obscuro. De ésta forma el sensor recibirá solo la luz emitida por el LED (foquito).

La lectura se debe realizar en reposo para mantener consistencia de los datos entre los pulsos y evitar lecturas con errores por movimientos del sujeto bajo pruebas.

Los datos obtenidos se envían al puerto serial para ser procesados.

3. Instrucciones Arduino

Las instrucciones en arduino son sencillas, requieren identificar el pin de conexión, tiempo entre muestras o «retraso» y la lectura del valor.

Cargue las siguientes instrucciones en al arduino para obtener las lecturas.

// Monitor de pulso cardiaco
//  El sensor en PIN Analógico A0

int SensorPin = 0;
int retraso = 100;
void setup (){
  Serial.begin (9600);
  }
void loop (){
    double valor = analogRead (SensorPin);
    Serial.println (valor); 
    delay (retraso);
  }

Las lecturas se pueden observar en el IDE Arduino, menú de Herramientas/monitor Serie.
Sin embargo, para la captura de datos con Python, no se debe tener abierta la ventana del monitor serie del IDE Arduino, pues el puerto com puede ser usado por único un programa al mismo tiempo.

4. Captura y Gráfico de datos en Python

Las siguientes instrucciones de Python permiten la captura de datos desde el puerto serial, conexión USB, del arduino.

Para obtener el número del puerto «com#» se observa el valor en el IDE Arduino que tiene en el menú Herramientas/puerto, con lo que se actualiza la variable «puerto» en las instrucciones siguientes.

Para graficar los datos se conservan una ventana de 50 valores en el vector yi.
Si observa los valores de yi, se encuentran en el rango definido por los valores a y b, modifique si su sensor esta calibrado en otro rango.

# Grafica "en vivo" para actualizar datos
# recibidos por puerto serial
# Plantilla para proyecto, datos de prueba aleatorios
# http://blog.espol.edu.ec/edelros/pulso-cardiaco/
# Tarea: Actualizar los datos en la función una trama para yi
#        Con los obtenidos desde el puerto Serial

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import serial, time

# Datos Serial
puerto = 'com10'
baudios = 9600

# PARAMETROS DE LA GRAFICA
retraso = 5
ventana = 50
# rango de lectura
a = 495
b = 535

# Datos a graficar
yi = [500]*ventana

# PROCEDIMIENTO

# Inicializa comunicación con arduino
arduino = serial.Serial(puerto, baudios)
arduino.setDTR(False)  
time.sleep(0.3)  
# limpia buffer de datos anteriores
arduino.flushInput()  
arduino.setDTR()  
time.sleep(0.3)
print('\nEstado del puerto: ',arduino.isOpen())
print('Nombre del dispositivo conectado: ', arduino.name)
print('Dump de la configuración:\n ',arduino)
print('\n###############################################\n')


# GRAFICA figura
figura = plt.figure()
grafica = figura.add_subplot(111)
grafica.set_ylim(a,b)
grafica.set_title('Pulso Cardiaco')

# Linea de pulso y ventana de datos a graficar
tamano = ventana
# El gráfico usa radianes
pulso = yi[-tamano:]
lineaPulso, = grafica.plot(pulso, 'y')

# linea del pulso y puntoreferencia:
puntoPulso, = grafica.plot(len(yi)-1,yi[-1],'ro')

# Nueva Trama
def unatrama(i,yi,ventana):

    while (arduino.inWaiting()==0):
        pass #esperar hasta recibir un dato
    linea = arduino.readline() # lee puerto serial
    lectura = linea.decode().strip() # elimina /r/n
    undato = float(lectura)

    # actualiza datos xi, yi
    # xi.append(angulo) 
    yi.append(undato)# numero del dato ejemplo

    # ventana de datos a graficar
    Pulso = yi[-ventana:]
    lineaPulso.set_ydata(Pulso)
    
    # Linea y punto del Pulso
    puntoPulso.set_ydata(Pulso[-1])  

    # Presenta valores últimos valores en pantalla
    print(Pulso)

    # Si los datos son más de 1000
    # Elimina el más antiguo del historial
    if len(yi)>ventana:
        # xi.pop(0)
        yi.pop(0)
    
    return()

# Animación
ani = animation.FuncAnimation(figura,
                              unatrama,
                              fargs=(yi,ventana),
                              interval=retraso,
                              blit=True)

plt.show()

Referencias: Sensor https://pulsesensor.com/