TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Alquimus en 05 de Enero de 2007, 20:02:07
-
El proyecto es para el area de BIOMEDICA
Se trata de capturar las señales electrocardiograficas emitidas por el corazon y subirlas a la computadora utilizando el PIC 18F4550, utilizando el puerto USB.
-
Hola alquimus.
Me encanta el proyecto. En lo que pueda ayudar cuenta conmigo con algún aporte técnico.
En que fase de desarrollo lo tienes?
Ya tienes claro de cuantos cables va a ser, de tres, de cuatro, de cinco ?
Ya tienes definido como serán los amplificadores de entrada ?
En que lenguaje estás desarrollando el soft ?
En fin; cuéntanos un poco más por donde vás, para poder sumarnos a la marcha. :)
Saludos
Mario
-
me sumo al interes por el proyecto, no me interesa la electromdicina pero si uso un cardiometro cuando salgo a correr que es una banda que va al pecho y le transmite en 5khz mis pulsos al reloj
-
yo tambien me apunto al proyecto, de hecho ya tengo algunos diagramas y documentacion medica al respecto, dejen la organizo y la comienzo a postear
-
No entiendo nada, ¿pero no lo tienes ya hecho y lo posteaste aquí?
http://www.todopic.com.ar/foros/index.php?topic=2252.0
-
Estas cositas me embroncan lo suficiente, como para tomarme mi tiempo y no responder "en caliente".
Gracias Manolo.
Definitivamente eres nuestro Héroe salvador.
Saludos
Mario
-
Parece que no a recibido la atención que creia merecer :D :D :D
Un saludo y lamento que estas cosas pacen.
Atte. CARLOS.
-
Asi es, lo tenia posteado dentro del tema del Osciloscopio, pero considero que es un tema para ser posteado individualmente, por eso pienso postearlo aqui para que se tenga un acceso mas simple.
-
El primer paso es el tema de la adquisicion de datos, por ser una señal de mucho ruido y por ser del orden de los 1 a 6 mV, se utiliza un Amplificador Instrumental, especificamente el AD620, por eso la primera parte se trata simplemente de hacer lo que nos dice el datasheet en la pagina 12, sin embargo utilizaremos un TL082 en vez del AD705J por ser de similares caracteristicas (y pork no estaba disponible en mi ciudad). Haciendo estos arreglos, el circuito nos quedara de la siguiente forma:
-
Como se nota en los graficos anteriores, seran necesarios 3 electrodos que iran conectado al paciente, la calidad de estos es muy importante, asi como los contactos y el cable que utilicemos, porke todos ellos agregaran ruido, lo ideal seria que los contactos fueran de PLATA (solo para la parte de los electrodos). Otra modificacion hecha al circuito es alimentar el instrumental con +-5V. Como ven en el circuito de Eagle, he puesto un jumper para facilitar la lectura de la señal en este punto. El jumper conectara la siguiente etapa, que sera un amplificador. El amplificador consta de 2 TL082 con la configuracion mostrada en la figura, se utilizan potenciometros para poder variar la ganancia.
-
La siguiente etapa es la de filtrado. El filtro en este punto es muy importante, porque eliminara ruidos ubicados en frecuencias muy cercanas a la frecuencia de nuestra señal ECG. El mas importante y el mas molesto es el ruido generado por la red electrica (60 Hz en PERU). A pesar de tener filtros en la fuente de alimentacion e incluso en el mismo circuito de alimentacion del ECG, estos 60 Hz se logran infiltrar en nuestro circuito. Por eso es necesario tener un filtro PASABAJAS con una frecuencia de corte de aproximadamente 45 Hz. Ademas, se incluira un filtro PASA ALTAS con una frecuencia de corte mucho menor a la frecuencia en la cual se encuentra la señal de ECG, estamos hablando del orden de los 0.03 Hz (como nos indica el datasheet del Instrumental).
Para hace el diseño del filtro, se simulo el circuito en el programa PROTEUS 6.5 SP5, adjunto el archivo (zipeado ) tambien para quienes deseen ver la respuesta del circuito en frecuencia.
En este punto ademas incluiremos otra etapa necesaria que es una amplificacion final y el pedestal.
Antes de seguir, debo aclarar en este punto que se decidio utilizar baterias para alimentar el circuito ya que el ruido generado por la red era bastante molesto (en realidad fue consejo que tome de otros ECG publicados en la web) , la inlcusion de baterias obligo a hacer un circuito de adaptacion para llevar los +-9V a +-5V.
Hechas las pruebas con estas modificaciones, ya teniamos la señal ECG a la salida del filtro, y era muy buena, pero muy pequeña, fue por eso que se decidio incluir una etapa de amplificacion mas. Es importante notar tambien, que la disposicion de los electrodos en brazos y pierna es importante, ya que una confusion en el orden podria llevar a obtener una señal ECG invertida, fue debido a esto que utilizamos un amplificador inversor en esta etapa, aun asi, hubieron pruebas en las cuales nuestra señal seguia saliendo invertida (desconozco el porque) por ello decidimos implementar ya en el software un algoritmo de inversion muy sencillo que se vera mas adelante.
Finalmente el pedestal para llevar nuestra señal en el rango de 0 a 5V para que pueda ser capturado por nuestro PIC.
Como veran, la placa de adquisicion solo incluye el Instumental, El amplificador inicial y el filtro. La amplificacion final y el pedestal fueron incluidos en la placa del PIC.
En el archivo ZIP se incluyen el archivo del PROTEUS 6.5 SP5 y el diseño en EAGLE 4.15 del esquematico del PIC18F4550
-
Pues bien, hasta aqui queda la parte del hardware. La parte del PIC18F4550 es bastante simple, he utilizado basicamente el diseño de J1M en su maravilloso proyecto de prender y apagar leds por USB, por eso los 2 leds conectados al pic. La parte del software tambien hara uso de estos leds y como se imaginaran, tambien se basa en el proyecto de J1M, al cual se le añadio la parte del ADC y la visualizacion de imagen. Bueno, lo dejo ahi por ahora, mas tarde sigo con la parte del software.
-
Pues bien, empecemos con la parte del software.
Empecemos por el PIC18F4550
Usaremos uno de los canales ADC que tiene, especificamente el AN0 o pin2 como vemos en el esquema. Recoremos que este pic tiene una resolucion de 10 bits, sin embargo solo usaremos 8 de ellos, para lo cual haremos uso del compilador CCS.
La idea era mandar tantas muestras como sea posible al computador, sin embargo aqui encontre una traba, el tamaño maximo que pude mandar en el ENDPOINT 1 es de 64 bytes.
Como bien dice J1M, es posible usar la funcion usb_puts() para mandar varios paquetes de 64 bytes, abriendo y cerrando la transferencia solo una vez.
Aqui va el programa:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#device ADC=8
#use delay(clock=48000000)
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 64 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <ECGPICUSBconfig.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports
#define LEDV PIN_B6
#define LEDR PIN_B7
#define LED_ON output_high
#define LED_OFF output_low
#define modo recibe[0]
#define param1 recibe[1]
#define param2 recibe[2]
#define resultado envia[0]
retardo(BYTE speed1, BYTE speed2)
{
BYTE i;
for(i=0;i<speed1;++i) { delay_us(255); }
delay_us(speed2);
}
void usb_scope_task(BYTE veloH, BYTE veloL) {
int8 message[64],e;
for (e=0;e<64;e++) {
message[e]=Read_ADC();
retardo(veloH,veloL);
}
usb_put_packet(1,message,64,USB_DTS_TOGGLE);
}
void main(void) {
int8 recibe[3]; //declaramos variables
int8 envia[1];
int i;
int8 mensaje[64] = {
20, 20, 20, 20, 20, 24, 25, 20, 18,
20, 60, 90, 128, 230, 128,90 , 60, 20,
18, 16, 18, 20, 25, 22, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 24, 25, 20, 18,
20, 60, 90, 128, 230, 128,90 , 60, 20,
18, 16, 18, 20, 25, 22, 20, 20, 20,
20
};
LED_OFF(LEDV); //encendemos led rojo
LED_ON(LEDR);
usb_init(); //inicializamos el USB
usb_task(); //habilita periferico usb e interrupciones
usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host
LED_OFF(LEDR);
LED_ON(LEDV); //encendemos led verde
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while (TRUE)
{
if(usb_enumerated()) //si el PicUSB está configurado
{
if (usb_kbhit(1)) //si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
if (modo == 1) // Modo_Led
{
if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
}
if (modo == 3) // Modo_Envio Paquete de 64 bytes
{
usb_put_packet(1, mensaje, 64, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 64byte del EP1 al PC
}
if (modo == 4) // Modo_ADC
{
usb_scope_task(param1,param2);
}
}
}
}
}
--------------------------------------
Como veran, la funcion mas importante es:
usb_scope_task(param1,param2);
La cual sera usada continuamente siempre y cuando la PC le diga que se quede en esta funcion.
Utiliza 2 parametros que en realidad es el retardo que habra entre cada toma de datos del ADC, es necesario utilizar una pequeña funcion para hacer este retardo, ya que la funcion delay_us() tiene como maximo 255 cuando se utiliza como variable.
Pues bien, una vez tomados las 64 muestras, se envian a la computadora con la funcion usb_put_paquet().
Por alli tambien hay un "mensaje" , era simplemente una prueba para ver la cantidad de datos que podia enviar. Lo deje alli, pero si quieren pueden quitarlo.
-
Una anotacion mas, en el programa anterior, como siempre se utiliza el archivo de configuracion, que en realidad es el mismo del proyecto de J1M, sin embargo aqui se los dejo, con algunas modificaciones por cierto.
#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__
#include <usb.h>
#DEFINE USB_TOTAL_CONFIG_LEN 32 //config+interface+class+endpoint
//configuration descriptor
char const USB_CONFIG_DESC[] = {
//config_descriptor for config index 1
USB_DESC_CONFIG_LEN, //length of descriptor size
USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (0x02)
USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config
1, //number of interfaces this device supports
0x01, //identifier for this configuration. (IF we had more than one configurations)
0x00, //index of string descriptor for this configuration
0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
0x32, //maximum bus power required (maximum milliamperes/2) (0x32 = 100mA)
//interface descriptor 0 alt 0
USB_DESC_INTERFACE_LEN, //length of descriptor
USB_DESC_INTERFACE_TYPE, //constant INTERFACE (0x04)
0x00, //number defining this interface (IF we had more than one interface)
0x00, //alternate setting
2, //number of endpoints, not counting endpoint 0.
0xFF, //class code, FF = vendor defined
0xFF, //subclass code, FF = vendor
0xFF, //protocol code, FF = vendor
0x00, //index of string descriptor for interface
//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (0x05)
0x81, //endpoint number and direction (0x81 = EP1 IN)
0x02, //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
USB_EP1_TX_SIZE,0x00, //maximum packet size supported
0x01, //polling interval in ms. (for interrupt transfers ONLY)
//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (0x05)
0x01, //endpoint number and direction (0x01 = EP1 OUT)
0x02, //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
USB_EP1_RX_SIZE,0x00, //maximum packet size supported
0x01, //polling interval in ms. (for interrupt transfers ONLY)
};
//****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
//since we can't make pointers to constants in certain pic16s, this is an offset table to find
// a specific descriptor in the above table.
//NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
// FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
#define USB_NUM_HID_INTERFACES 0
//the maximum number of interfaces seen on any config
//for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
#define USB_MAX_NUM_INTERFACES 1
//define how many interfaces there are per config. - is the first config, etc.
const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};
#if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
#error USB_TOTAL_CONFIG_LEN not defined correctly
#endif
//////////////////////////////////////////////////////////////////
///
/// start device descriptors
///
//////////////////////////////////////////////////////////////////
//device descriptor
char const USB_DEVICE_DESC[] ={
USB_DESC_DEVICE_LEN, //the length of this report
0x01, //constant DEVICE (0x01)
0x10,0x01, //usb version in bcd
0x00, //class code (if 0, interface defines class. FF is vendor defined)
0x00, //subclass code
0x00, //protocol code
USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
0xD8,0x04, //vendor id (0x04D8 is Microchip)
0x11,0x00, //product id, me gusta el 11 ;)
0x01,0x00, //device release number
0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)
0x02, //index of string descriptor of the product
0x00, //index of string descriptor of serial number
USB_NUM_CONFIGURATIONS //number of possible configurations
};
//////////////////////////////////////////////////////////////////
///
/// start string descriptors
/// String 0 is a special language string, and must be defined. People in U.S.A. can leave this alone.
///
/// You must define the length else get_next_string_character() will not see the string
/// Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////
//the offset of the starting location of each string.
//offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
const char USB_STRING_DESC_OFFSET[]={0,4,14};
#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)
char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1 --> la compañia del producto ???
10, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'U',0,
'N',0,
'S',0,
'A',0,
//string 2 --> nombre del dispositivo
20, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'B',0,
'I',0,
'O',0,
'M',0,
'E',0,
'D',0,
'I',0,
'C',0,
'A',0
};
#ENDIF
-
Bien, hasta alli la parte del PIC, entremos ahora con la PC.
Para ello utilizaremos 2 programas, el Visual Studio 2005 ( C# ) y el Measurement Studio 8.0
El Measurement Studio 8.0 es una herramienta que repotencia las capacidades del Visual Studio para poder trabajar con señales, filtrarlas, etc etc etc. Es una herramienta muy util, para este proyecto fueron utilizados el visualizador de graficos, un filtro, y algunas otras opciones que veremos mas adelante. Los puntos en contra del Measurement Studio 8.0 son que, en primer lugar no es gratuito, sin embargo con la version de prueba que dura como 3 meses es posible desarrollar con trankilidad un buen proyecto como este. La segunda desventaja es que solo funciona con la version Profesional del Visual Studio, es decir, con versiones Express Edition del Visual C# por ejemplo, no funcionara.
Pues bien, aqui les dejo el link para ke puedan bajarse el Measurement Studio 8.0 y para que se enteren un poco mas que es esta herramienta para quienes no la conocian.
http://www.ni.com/mstudio/
Para poder bajar el software (que son como 368 Mb) deberan registrarse en national instruments, lo cual no les llevara mucho tiempo.
Bien, una vez instalado el measurement studio 8.0, veran las herramientas correspondientes en el Visual Studio.
Aqui les adjunto el programa en Visual C#, ojo que necesitan el Visual Studio 2005 y el Measurement Studio 8.0 para poder correrlo.
-
Bien, ahora veamos un poco el programa en Visual C#
El programa empezara a correr una vez que se presione el boton: INICIO.
El boton inicio hara que una rutina se corra constantemente, utilizando un Timer del C#, el intervalo en el cual sera mostrada la imagen, depende del tiempo que tome este intervalo, y este intervalo demorara tanto como demore el PIC en tomar las muestras deseadas y enviarlas a la PC.
Antes de dar inicio al programa, veamos la funcion mas importante, la que captura paquetes desde el PIC:
(Paquete = 64 Muestras)
-----------------------------------------------------------------------------------------------------------------------------------
public double[] ReciboADC(uint velo, int paquet)
{
int i;
uint veloH,veloL;
veloH = velo / 256;
veloL = velo % 256;
DWORD RecvLength4 = 64;
double[] resultado2 = new double[64 * paquet];
byte* send_buf = stackalloc byte[1];
byte* receive_buf4 = stackalloc byte[64];
send_buf[0] = 0x04;
send_buf[1] = (byte)veloH;
send_buf[2] = (byte)veloL;
for (int u = 0; u < paquet; u++)
{
SendPacket(send_buf, 3); //Aqui enviamos la orden para que haga las conversiones
ReceivePacket(receive_buf4, &RecvLength4);
for (i = (u*64); i < 64*(u+1); i++) { resultado2 = receive_buf4[i-(u*64)]; }
}
return resultado2;
}
---------------------------------------------------------------------------------------
Esta funcion toma 2 argumentos, el numero de paquetes que queremos y el intervalo de tiempo que queremos entre cada muestra. El array "resultado2" del tipo double es el resultado de la llamada a esta funcion, es importante decir que debe ser del tipo double ya que tanto la grafica, el filtro y el detector de picos, trabajan con este tipo de datos, por eso se convierten los datos UNO POR UNO al tipo double. (Si alguien sabe de alguna manera mas eficiente, por favor aviseme jejeje).
Como veran "resultado2" es un array que resulta de concatenar varios paquetes de 64 bytes cada uno. El numero de paquetes sera determinado por nosotros.
-
Pues bien, como decia, una vez pulsado el boton de INICIO, se repetira constantemente la siguiente funcion:
-------------------------------------------------------------------------------------------------------------------------------
private void maintimer_Tick(object sender, EventArgs e)
{
int i;
double[] filtrada = new double[64 * (int)paquetes.Value];
double[] resultaadc = new double[64 * (int)paquetes.Value];
double[] invertida = new double[64 * (int)paquetes.Value];
double[] recortada = new double[64 * ((int)paquetes.Value - 5)];
resultaadc = usbapi.ReciboADC((uint)samplingpic.Value, (int)paquetes.Value);
for (i = 0; i < (64 * (int)paquetes.Value); i++)
{
invertida = (-1 * (resultaadc)) + (2 * referencia.Value);
}
if (switch2.Value == false)
{
invertida = resultaadc;
}
invertidafig.PlotY(invertida);
ButterworthLowpassFilter jose = new ButterworthLowpassFilter((int)ordenfiltro.Value, (1000000 / samplingpic.Value), freccorte.Value);
filtrada = jose.FilterData(invertida);
filtradafig.PlotY(filtrada);
for (i = 64*5; i < (64 * (int)paquetes.Value); i++)
{
recortada[i- 64*5] = filtrada;
}
recort.PlotY(recortada);
PeakPolarity peakPolarity = PeakPolarity.Peaks;
NationalInstruments.Analysis.Monitoring.PeakDetector peakDetect
= new NationalInstruments.Analysis.Monitoring.PeakDetector(reference.Value, 3, peakPolarity);
peakDetect.Detect(recortada, true, out amplitudesPeak, out locationsPeak, out secondDerivativesPeak);
numberOfPeaksFound = amplitudesPeak.Length;
peaksFoundNumericEdit.Value = numberOfPeaksFound;
if (locationsPeak.Length > 1)
{
frec_calculada.Value = 60 * (samplingpic.Value /1000000) * (locationsPeak[(locationsPeak.LongLength)-1] - locationsPeak[(locationsPeak.LongLength) - 2]);
}
}
---------------------------------------------------------------------------------------------
Esta vendria a ser la funcion principal, como veran, la parte mas importante esta en la llamada a la funcion ReciboADC que sera la que nos devuelva el array con los datos a procesar.
Si analizan un poco mas el codigo, veran que se incluye tambien un algoritmo para invertir la señal, esto en caso de que la señal les salga invertida.
Se puede ver tambien el proceso de filtrado, en este caso como veran, la señal capturada es bastante ruidosa, por eso el filtro, la frecuencia de corte del filtro y el orden tambien pueden ser configurados desde el panel. (En este caso un filtro pasabajas).
Ademas se incluye un pequeño algoritmo para calcular los latidos por minuto, se hace simplemente determinando los picos mas altos, sabiendo su ubicacion y el tiempo entre cada muestra, podemos determinar este valor.
Pues bien, aqui les dejo una imagen capturada con el ECG funcionando.
-
Cuando vemos el panel, encontramos los datos mas importantes:
SamplingRate (us) : Es el tiempo en microsegundos que habra entre cada toma de muestra.
Paquetes : Es la cantidad de paquetes que seran mostrados en la grafica (1 paquete = 64 Muestras)
Nivel de Referencia: Es el nivel de referencia tomado en cuenta para calcular los picos mas altos.
Nivel de Referencia Para Inversion: Nivel de referencia tomado para invertir la señal.
Ademas vemos 3 imagenes, la superior muestra la señal ECG tal y como es recibida desde el ADC.
La segunda es el resultado de filtrar la señal.
Y la tercera es simplemente una señal en la cual 5 paquetes han sido recortados del inicio de la señal filtrada, porque como veran, el filtro genera un transitorio (se llama asi??). Y bueno simplemente para tener una señal limpia y mejor visualizada.
-
Bien, eso es todo.
El proyecto fue hecho para el curso de Ingenieria Biomedica de la Escuela Profesional de Ingenieria Electronica de la Facultad de Ingenieria de Produccion y Servicios en la Universidad Nacional San Agustin de Arequipa - Peru, en el mes de diciembre del 2006.
Los desarrolladores:
Angel Del Carpio Morales
Jose Salinas Sanchez
Luis Portugal Coasaca
Seguramente hay bastantes errores por ahi, pero el proyecto funciona muy bien. Ademas a partir de este punto se pueden hacer muchas mejoras, la intencion de publicarlo era simplemente compartirlo con ustedes, porque sin la ayuda de estos foros no hubieramos logrado hacerlo en primer lugar. Sobre todo gracias al proyecto de J1M. Por ahi tambien tengo un proyecto de control de 4 motores Paso a Paso utilizando el USB que publicare prontamente.
Una vez mas agradezco por la ayuda brindada y espero no haber causado muchos problemas al publicar el proyecto en 2 sub foros distintos.
-
Aqui les dejo un link que podria decirles un poco mas de lo relacionado al electrocardiografo.
http://dac.escet.urjc.es/PFC/cristina_rodriguez/node1.html
De aqui salio la idea de utilizar 2 baterias para alimentar el circuito.
Los electrodos que se muestran aqui son muy buenos y muy caros tambien.
Algo que me olvidada decirles es que mejor funcionara el circuito mientras mas tierra tenga, es por eso que todas las placas que hagan deberan tener tanta tierra como sea posible, y aun mas, utilizar un cable para poder conectar el circuito a tierra externa.
-
Aqui les dejo una imagen de los electrodos, son bastante baratos (aprox $0.35 c/u), se adhieren con fuerza y ya vienen con gel. (Ojo para los belludos, antes de aplicarlos, rasurarse jajajjaa) (No es broma).
-
Felicitaciones Alguimis, un excelente proyecto... Y lo de publicarlo en 2 lugares pues para mi estuvo bien que lo pusieras aqui si no ni por enterado.
Muchas felicidades a tu equipo de trabajo por el desarrollo y la aplicacion y sobre todo gracias por compartirlo :-/
-
¡Felicitaciones alquimus! yo no conocía este proyecto, aunque la medicina no es mi área(aunque si una necesidad :D), estudiaré tu código en la parte de transmisión por usb, para cuando llegue allá.
Salu2
Pedro
-
impresionante trabajo :shock:
-
Fantástico Alquimus, gracias por compartirlo.
-
¡¡¡Wow !!! Buen trabajo Alquimus.
-
muy muy buen trabajo alquimus, mi enhorabuena por ese ECG USB :)
-
Hola a todos !
Lo primero es lo primero.
Antes que nada, PEDIR DISCULPAS PÚBLICAMENTE (ya lo he hecho en privado) con alquimus, por haber pensado mal acerca de su accionar, al creer errónea y apresuradamente, que las intenciones del mismo eran otras.
Ahora vamos al ECG.
Me parece un muy buen desarrollo, que evidentemente ha llevado muchas noches de desvelo en el proceso de realización y donde es notable el trabajo corporativo de un grupo importante de personas.
Los desarrolladores:
Angel Del Carpio Morales
Jose Salinas Sanchez
Luis Portugal Coasaca
Bien. Mis felicitaciones por el hecho de que les haya servido para vuestros estudios.
Por otro lado, lamento que todo esté en un lenguaje de programación que no manejo actualmente, pero ello no quita que en un futuro lo pueda comprender e implementar.
Ahora, haciendo uso del derecho que me confiere esta frase :
Seguramente hay bastantes errores por ahi, pero el proyecto funciona muy bien. Ademas a partir de este punto se pueden hacer muchas mejoras ....
Me alegra que el proyecto funcione muy bien, pero ....
Hay fotos del equipo funcionando o armado al menos ?
Mi pregunta se basa en el hecho de que si promociono haber fabricado un cohete, lo menos que puedo hacer, es colocar una foto del mismo y luego sí, escribir todo lo que aprendí de Wernher von Braun (http://es.wikipedia.org/wiki/Wernher_von_Braun).
Porqué no utilizaron filtros de capacitores conmutados como el LMF100 o algun otro de similares características para el filtrado, con el cuál hubieran logrado un resultado notoriamente superior en esa parte tan vital del proyecto ?
Otra cosa.
El más mínimo error en el diseño del PCB convierte a
éste (http://www.todopic.com.ar/foros/index.php?topic=15419.msg97459#msg97459) filtro en un oscilador perfecto, cuestión que es definitivamente evitable al usar filtrods de capacitores conmutados.
Avalo esta teoría luego de haber renegado mucho con filtros, hasta descubir lo que antes se conoció como MF10 (hoy LMF100) para realizar este (http://www.servisystem.com.ar/doppler/audio.html) diseño que es parte de todo un sistema de rastreo de señales de radio publicado aquí, (http://www.servisystem.com.ar/doppler/main.html) hace ya muchos años.
Una más.
Me parece de bastante mal gusto, citar a
........el curso de Ingenieria Biomedica de la Escuela Profesional de Ingenieria Electronica de la Facultad de Ingenieria de Produccion y Servicios en la Universidad Nacional San Agustin de Arequipa - Peru .....
luego de ver esta imagen (http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15419.0;attach=3319)
En estos dos últimos años, lamentablemente he visto más Electrocardiogramas que al Sol, y más allá de ser un soft muy bien logrado, si un cardiólogo viera ese ECG, diganosticaría severas lesiones por IAM, con propensión inmediata a fibrilación.
Me parece que hacer referencia a una carrera tan importante y a una casa de altos estudios, requeriría un poco más de tacto cuando se habla de electromedicina.
Entiendo que es un proyecto, entiendo lo que se dijo antes ,
.....Seguramente hay bastantes errores por ahi, pero el proyecto funciona muy bien. Ademas a partir de este punto se pueden hacer muchas mejoras....
Sólo estoy opinando.
No estoy diciendo que el trabajo esté mal hecho, o no vaya a funcionar, o que yo lo vaya a hacer mejor, NO (si pensara asi lo hubiera hecho yo y sería millonario fabricando Electrocardiógrafos), al contrario, vuelvo a felicitar el esfuerzo del trabajo investigativo, que evidentemente ha sido mucho.
Sólo quiero opinar.
No quisiera ofender ni molestar a nadie con este post, y así resultare, pediré las disculpas correspondientes como ya lo hice en una oportunidad con alquimus.
Al menos a mí no me cuesta pedir disculpas cuando me equivoco.
Cuando se obra de buena fé, reconocer errores y pedir disculpas es una necesidad de todo hombre de bien, como trato de ser día a día.
RESUMIENDO:
alquimus : Gran trabajo. Denota mucha dedicación, esfuerzo, estudio, insomnio, alegrías y tristezas, avances y retrocesos.
Pero no me convence como Electrocardiógrafo, técnicamente hablando.
POR LO TANTO, QUIERO SUMAR, NO RESTAR :
1) La parte del filtro de ruido, la haría desarrollando y ensayando un pasabandas a base del LMF100 u otro similar, para mejorar la performance del equipo.
2) "Intentaría" ("" léase, no sé hacerlo, investigaría) ampliar la entrada a 5 cables para poder monitorear desde V1 a V5.
3) Lo haría integramente SMD (en ninguna parte del hilo encontré el PCB) para que junto a una Pocket PC, cualquier cardiólogo pueda realizar un ECG en lugar tan inesperados como un baño de un estadio de fútbol hasta en una playa.
4) Haría el soft independiente de paquetes "extras".
Espero no haber sumado muchos amigos que me odien (yo no tengo enemigos, tengo amigos que me odian) con este post, pero si lo releen muchas veces, verán que no hay mala intención.
Un abrazo a todos. :)
Mario
-
Hola Mario, agradezco tus sugerencias y criticas, me parecen correctas y adecuadas.
La verdad este vendria a ser el primer trabajo que publico en internet, quizas por ahi no tuve la delicadeza de omitir el nombre de mi casa de estudios, lo cual no hare en el futuro, buen consejo.
Bueno, me complace mucho que una persona que haya visto bastantes ECG's evalue el mio, tienes razon en decir que esta aun muy verde como para algun producto profesional o incluso comercial, y quien sabe por ahi le doy mas duro y me gano esos millones jejeje.
Veamos los comentarios:
1. El filtro pasabandas fue logrado utilizando componentes que encontramos en el mercado comercial Arequipeño, asi que esa fue nuestra limitante, agradezco la sugerencia de utilizar los LMF100, sabiamos a primera vista que era uno de los primeros puntos a mejorar.
2. Ampliar la entrada a mas electrodos seria genial, estariamos hablando entonces de cambiar casi todo el ckto de adquisicion, incluyendo una mejora mucho mas grande.
3. SMD ... lo maximo... seria genial utilizarlos. Ahora, no soy tan ducho en programacion, pero imagino que programar para una Pocket PC seria algo mas dificil, pero sin duda seria el objetivo a alcanzar para convertir este proyecto en algo mucho mas serio.
4. Los paquetes extra ayudaron muchisimo sobre todo por el tiempo que teniamos para lograrlo. Pero estoy convencido que con algo mas de tiempo y estudio se podria lograr facilmente sin ayuda de los paquetes extra. (Aunk a decir verdad la parte del filtro y la ubicacion de picos resultaria bastante dificil desde mi punto de vista, repito, no soy un experto en programacion)
Tienes razon en lo de las fotos, tratare de conseguir algunas y digo tratare porque aunque parezca increible, para poder aprobar el curso que llevamos, el ingeniero nos "sugiere" donar el proyecto a la facultad (no hay nadie que haya aprobado ese curso sin donar su proyecto). Sin embargo puedo hablar con el ingeniero para que me lo "preste" jajaja un rato para sacarle fotos.
Una vez mas agradezco las criticas vertidas sobre este proyecto. Gracias Mario.
-
Por sobre todas las cosas alquimus, yo te agradezco a vós que hayas sabido "leer" mi post, que como dije, tal vez a primera impresión parecía hostil (incluso había momentos mientras escribía, que a mí me parecía hostil), pero muy lejos estaba mi intención de eso.
Respecto a que haya visto muchos ECG, tampoco significa que "sepa" leerlos correctamente, pero a raíz de un infarto que sufrí, he preguntado mucho y he leído otro tanto, pero nada profundo.
Cuando trabajé con el MF10, se conseguía aquí en Argentina por un valor nada alto y hasta te puedo decir que no hace mucho he visto en algún listado de precios al LMF100, es decir, se consiguen aquí.
Si se te complica para conseguirlos en Arequipa o en Lima, házmelo saber, que muy gustosamente te podría enviar un par desde aquí, para que usen y experimenten la presición de dichos filtros.
Va a ser un gusto colaborar al menos un poquito en el proyecto, enviándotelos.
Recuerda, no dejes de avisarme.
No existe comparación respecto a otros filtros.
Es tan superior en presición y por sobre todo en "ancho de banda pasante seleccionable" , que hace que uno no vuelva a usar otro tipo de filtros cuando necesita presición.
Ahora me están llamando a cenar.
Más tarde vuelvo con más comentarios.
Saludos y Gracias.
Mario
-
Aquí estoy con más comentarios.
Lo que te decía de ampliar a cinco cables de entrada, era por la posibilidad como te dije, de poder medir en las distintas caras del corazón (V1 a V5). Eso me parece hasta casi necesario.
Te / les cuento.
Mi infarto es en una zona determinada del corazón, que sólo se "vé" en el ECG en una posición que es V2.
Para aquellos que no sepan, la medición V2 se hace en la zona inmediatamente contigua al esternón hacia el brazo izquierdo del paciente, a la altura de la axila.
Si a mí me hicieran un ECG con equipo de tres o cuatro cables, saldría que soy un tipo normal.
De ahí la idea de un equipo de 5 cables.
Sobre el tema de programación para la Pocket PC, no creo que sea mayor ciencia.
Yo antes de conocer VB6 creía que los programas de PC eran realizados por equipos de superdotados informáticos.
Para mí hoy, C# es una ciencia de monjes budistas que requiere una mente sobrenatural para entenderlo .... será porque nunca salí del Basic.
Si algún dia salgo del Basic (utilizo Protón + para jugar con mis experimentitos), tal vez descubra que no es tanto misterio.
Y volviendo al soft, una vez que hayas optimizado el hardware los suficiente, verás que sólo se tratará de graficar lo que hace la punta caliente del Electrocardiógrafo en el papel.
Dicho en otras palabras, "que el trabajo sucio" lo haga el Hardware.
Que el soft sirva sólo para graficar, almacenar en memoria y algun otro adicional que seguramente, charlando con algún cardiólogo, descubrirás.
A SMD no le temas. Hay mucha gente en este maravilloso Foro que sabe mucho del tema, como para apoyarte y ayudarte en esa empresa.
Naturalmente cuenta conmigo para lo que pueda ayudarte.
Vuelvo a ofrecerte enviarte los LMF100. No dejes de tenerlo en cuenta, si no los consigues..
Un abrazo.
Ya te lo dije y te lo repito. Buen trabajo.
Mis respetos a tus compañeros de labor.
Saludos.
Mario.
-
Hola Mario, una vez mas agradezco tus sugerencias, criticas y comentarios.
La verdad me he quedado muy sorprendido con la existencia de los Filtros a base de Capacitores Conmutados, me puse a investigar y realmente parecen ser la mejor alternativa.
Me pondre en contacto con algunos amigos para ver si los logro conseguir ya sea aqui o en Lima, si no lo logro me pondre en contacto contigo para probarlos.
Gracias una vez mas.
-
hola paisanos no se si an vistyo esta pagina tiene el sofware en v basic y utiliza la tarjet de sonido para hacer la conversion nada mal la idea :lol:
http://www.eng.utah.edu/~jnguyen/ecg/long_story_6.html
yo trate de hacer uno con opams de anolog device son muy buenos pero no se si en arequipa los consigas pero aca valen 9 dolares ad 624
felicidades por tu trabaj :-/
-
que tal alquimus me parece estupendo tu proyecto ah y que bueno que te animas a compartirlo con los demas, y por mi parte creo que el proyecto para el tiempo impuesto esta bien trabajado ya es cosa d c/u si desea mejorar sus proyectos. y recibe mis Saludos desde el Rico chiclayo-Perú.
-
sweet tu trabajo felicitaciones me gusta.yo soy medio pokemon todavia con mi ecg estoy haciendo un heart rater con diodos y fotoresistencia como parte de una practica en la universidad. de todas maneras para reducir los problemas de los filtros seria chevere usar algun metodo de tratamiento digital. segun mi profesor de instrumentacion medica ing. alvaro sandoval ;) si alguien sabe de eso un mensajito no cae mal cuidate y felicitaciones ;)
-
mirando otras partes de tu post se me ocurrio como aislarlo de la parte electrica de la red. lo malo esq vas a usar baterias y usas un modulo bluetooth en mi pais lo ubicas en www.electronica.com.ve no es tan caro para una aplicacion y lo haces inalambrico y pintas igualitow . una chica en mi universidad presento una tesis con lo que tu planteas utilizando comunicacion inalambrica con ese modulito. hechale un ojo y asi podes aislar electricamente al paciente del tendido electrico comercial
Frozen
-
Hola.
Felicitaciones por el ECG, es muy valioza la informacion.
Hace tiempo cuando trate de hacer uno me tope con el inconveniente de que se necesitaba un amplificador de instrumentacion, en ese tiempo valia 300 dolares. La solucion era hacer uno con algun operacional, puede funcionar pero al investigar un poco mas, me entere que si en algun caso, una corrienta llega a fugar por los electrodos, es peligroso para el corzon. Por tal motivo me comentaron que algunos proyectos para tesis realizados, unicamente se los probaba colocando los electrodos en las manos.
Creo que si se desea hacer algo seguro se debe utilizar un amplificador de instrumentacion, lo malo de estos es que son caros, y como tienen a la entrada un FET, los cuales son muy sensibles, solo con verlos se queman... :D :D :D :D
-
Son muy útiles sus respuestas, pero si quisiera establecer una comunicación bidireccional entre una PocketPC con Windows CE y un PIC18F4550, algúno tiene idea acerca de como generar el driver necesario. Desde ya muchas gracias por el conocimiento y la experiencia que ponen al alcance de todos.
-
Hola a todos, con la ayuda de san google encontre que existen circuitos integrados a los que llaman Completed Analog Front End, estos son dispositivos que contienen en su interior la mayor parte del circuito necesario para la aplicación.
Texas Instrument Fabrica Analog Front End para electrocardiogramas uno de ellos es el ADS1298 (http://www.ti.com/ww/en/analog/ads1298/index.shtml?DCMP=hpa_ads1298_campaign&HQS=NotApplicable+OT+ads1298-tl) que no solo se encarga de amplificar la señal y emitir los pulsos hacia los pacientes, sino que contienen en su interior los ADC y otros sistemas de filtrado así como los buffer para transmitirlos hacia el MCU mediante SPI.
Lo otro es que por ahí en la web tambien encontré que se podia utilzar la tarjeta de sonido como osciloscopio, por lo tanto creo que tambien podría ser posible que utilicemos esta tarjeta para un ECG simplemente haciendo el circuito de acondicionamiento.