Sunteți pe pagina 1din 9

Sistemas embebidos

ECG

Introduccin
Los electrocardigrafos son aparatos capaces de detectar y amplificar las
seales elctricas generadas por el corazn durante su actividad, y la
grafica de la seal de salida de un electrocardigrafo se llama
electrocardiograma (ECG), a su vez al estudio diagnostico para obtener el
ECG se llama electrocardiografa.
Es bien sabido que las enfermedades cardiacas estn dentro de las
principales causas de muerte en Mxico, y el mtodo de diagnostico de la
mayora de estas enfermedades estn apoyados en el ECG.
Adems de lo mencionado anteriormente en el mbito de educacin y
formacin de ingeniera biomdica y reas afines, el diseo y elaboracin de
un electrocardigrafo, permiten la consolidacin del conocimiento y
habilidades obtenidos a lo largo de la carrera.

Objetivo
Obtener una seal de ECG mediante un amplificador de instrumentacin, y
obtener la frecuencia cardiaca mediante el algoritmo de Pan-Tompkins
implementado en una tarjeta Arduino, la seal digital de ECG se debe
graficar en una computadora y la frecuencia cardiaca en una pantalla LCD
independiente a la computadora.
Desarrollo
Para la realizacin del electrocardigrafo se requieren tres fases, la
analgica, digitalizacin y la digital.
La fase analgica se encarga de detectar, amplificar y filtrar la seal de
ECG, la etapa de digitalizacin requiere de un convertidor analgico-digital
(ADC) y por ltimo la etapa digital que se encarga del tratamiento de la
seal para su uso final.
Para el desarrollo de este proyecto se utiliz un electrocardigrafo de
diseo convencional, una tarjeta Arduino uno para la digitalizacin y filtrado
digital de la seal, adems para la interfaz grafica de ECG una PC.

Fase analgica

Digitalizacin y Fase digital


Para ambas etapas es necesario el uso de la tarjeta Arduino uno, esta solo
requiere ser programada para que realice los ambas etapas, adems de
mandar los datos a la pantalla LCD y a la PC.
A continuacin de muestra el cdigo que se utilizo para programar la tarjeta
#include <LiquidCrystal.h>
//se declara la librera para utilizar la pantalla LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//se inicializa la variable que va a controlar la pantalla LCD con los pines que va
a utilizar
float X[13], Ypb[33], Ypa[5], InT[50];
//se declaran los vectores para almacenar los datos del filtro pasa banda, del
derivador y del integrador
float POW = 0, prom = 0, Yd = 0, suma = 0, ecg = 0;
//se declaran las variables para calcular el promedio (integracin) del filtro y
variable para guardar la lectura del puerto serial
int i, j, umbral = 4000, cont = 0, F = 0, m = 0, clcd = 0;
//se declaran contadores
unsigned long ltime = 0, ctime = 0;
//variables
auxiliares para determinar el tiempo de ejecucin del algoritmo
void setup() {
//se establecen las condiciones iniciales del Arduino
lcd.begin(16, 2);
//se establecen las filas y columnas de impresin de la pantalla lcd
for (i = 0; i < 13; i++)
//se inicializan todos los vectores de los filtros a cero
X[i] = 0;
for (i = 0; i < 33; i++)
Ypb[i] = 0;
for (i = 0; i < 5; i++)
Ypa[i] = 0;
for (i = 0; i < 38; i++)
InT[i] = 0;
Serial.begin(9600);
//se inicializa el puerto serial
}
void loop() {
//ciclo que va a realizar el
filtrado de la se?al de ECG y calculo de la frecuencia cardiaca
ctime = micros();
//se comienza a contar el tiempo de ejecucin del programa y se guarda en
ctime
suma = 0;
//se iguala a cero la variable suma
for (j = 12; j > 0; j--)

//se recorren los valores del vector de entrada


X[j] = X[j - 1];
X[0] = analogRead(A0);
//se asigna la lectura del ECG al primer elemento del vector de seal de entrada
for (j = 32; j > 0; j--)
//se recorren los valores del vector de filtro pasabajas
Ypb[j] = Ypb[j - 1];
Ypb[0] = 2 * Ypb[1] - Ypb[2] + (X[0] - 2 * X[6] + X[12]);
//se realiza el filtrado pasabajas segn la ecuacin en diferencias dada para el
algoritmo y se asigna al primer elemento del vector de filtro pasabajas
for (j = 4; j > 0; j--)
//se recorren los elemento del vector de filtro pasa-altas
Ypa[j] = Ypa[j - 1];
Ypa[0] = Ypb[16] - (1 / 32) * (Ypa[1] + Ypb[0] - Ypb[32]);
//se realiza el filtrado pasa-altas segn la ecuacin en diferencias dada para el
algoritmo y se asigna al primer elemento del vector de filtro pasa-altas
Yd = (2 * Ypa[0] + Ypa[1] - Ypa[3] - 2 * Ypa[4]) / 8;
//se realiza el filtrado derivativo segn la ecuacin en diferencias dada para el
algoritmo y se asigna a la variable Yd
POW = pow(Yd, 2);
//se eleva al cuadrado el resultado del filtro derivativo
for (j = 49; j > 0; j--) {
//se realiza el sumador del filtro pasabandas
InT[j] = InT[j - 1];
suma = suma + InT[j];
}
InT[0] = POW;
prom = (suma + POW) / 50;
//se realiza el promedio de la seal sumada
m++;
//se actualizan los contadores
clcd++;
if (prom > umbral && cont == 0)
//se detectan los bordes de la seal filtrada
cont = 1;
if (prom < umbral && cont == 1) {
F = 7250 / m;
//clculo de la frecuencia cardiaca
m = 0;
cont = 0;
}
if (clcd > 45) {

//actualizacin de contadores

//se actualiza la pantalla LCD aproximadamente cada segundo


lcd.setCursor(0,0);
lcd.print("frec cardiaca:");
//mensaje que siempre va a mostrar la pantalla LCD
lcd.setCursor(0,1);
lcd.print(F);
//se muestra la frecuencia cardiaca en la pantalla LCD
clcd = 0;
}
Serial.println(X[0]);
//se manda la seal de ECG al puerto serial
delay(5);
}

lcd.clear();

Graficacin
Para la graficacin se toman los datos que se manda Arduino al puerto serial
de la PC, para esto se utiliza el siguiente cdigo de prossecing2
import processing.serial.*; //librera para utilizar el puerto serial
Serial port;
//declara el puerto serial
int ECG,x1=0,y1=0,y=0;
int fr=50, time=10, k=0;
//variables de frame rate, tiempo de muestra e
indice de x
void setup() {
size(750, 500);
//declara ventana
background(255,255,255);
for(int i=1;i<10;i++){
stroke(255,160,160);
line(75*i, 0, 75*i, 500);
line(0, 50*i, 750, 50*i);
}
port = new Serial(this, "COM3", 9600);//prepara el puerto serial
port.bufferUntil('\n');
//almacena datos del puerto hasta que se
encuentra un salto de lnea
}
void serialEvent(Serial port) {
//funcin que lee el puerto serial
ECG= int(port.readStringUntil('\n')); //asigna el valor en cdigo ASCII del
puerto serial a una variable entera
}
void draw() {
k=floor(k+750/(fr*time));
y= -(ECG)+500;
stroke(0,0,255);
line(x1,y1,k,y);

//calcula x

x1=k;
y1=y;
if (k==750) {
//condicional que limpia la pantalla cuando
esta se llena
k=0;
x1=0;
background(255,255,255);
for(int i=1;i<10;i++){
stroke(255,160,160);

line(75*i, 0, 75*i, 500);


line(0, 50*i, 750, 50*i);
}
}
}

S-ar putea să vă placă și