martes, 5 de febrero de 2019

Electrocardiograma arduino con filtro de señal. Por Brandon Antonio Segura Torres & Priscilla Vieto Bonilla.

Saludos amantes del mundo maker, si estás aquí es porque ya debes de estar como loco de estar buscando alguna solución para limpiar la señal de tu electrocardiograma de todo el ruido que parece imposible de eliminar por completo.

Antes de llegar a la solución mágica vamos a hablar un poco de qué se trata este problema y por qué es tan molesto.

Bueno, wikipedia lo explica bien concreto "Se denomina ruido eléctrico, a todas aquellas señales de interferencias, de origen eléctrico, no deseadas y que están unidas a la señal principal, o útil, de manera que la pueden alterar produciendo efectos que pueden ser más o menos perjudiciales."

En otras palabras, en algo tan sensible como lo es un electrocardiograma, básicamente hay miles de señales que le pueden estar afectando para dar lecturas erróneas, la señal ruidosa puede venir del lugar más inimaginable como de la bombilla de luz por ejemplo, si la apagan verán como el ruido disminuye, incluso no hace falta que los aparatos electrónicos estén encendidos, si tienen cerca conectada una (zapatilla o regleta) el ruido que produce es impresionante. En nuestro caso el monitor electrocardiograma fue un encargo que un cardiólogo nos realizó a mi y a mi esposa (ambos makers) ya que él está realizando su tesis sobre paros cardiacos, por lo cuál necesita ver un electrocardiograma en vivo no en una máquina normal de electrocardiograma sino en la PC para poder tomarle pantallazos a la gráfica y así estudiarla después con más detenimiento. 

Aparentemente algunas de estas máquinas con su propio oscilloscopio tienen un software para poder mirar la gráfica en la PC el problema es que este software tiene un valor de entre $500usd y $1000usd dólares, una suma grande para la mayoría de personas por un software, entonces el reto era realizar este monitor con todas las herramientas OpenSource de internet y claro que fuera asequible para cualquier persona que tenga la necesidad de un monitor electrocardiograma en su PC y lo más importante que en realidad funcionara. 

¿Supongo que han oído hablar sobre la ley de Murphy? ¿Donde dice que todo lo que podría salir mal pues saldrá mal? Bueno eso fue exactamente lo que nos sucedió cuando comenzamos con este proyecto, el esfuerzo por limpiar la señal fue tal que al final decidimos compartirlo con todos para ahorrarles trabajo y muchas horas de su tiempo.


Esta fue la señal del primer electrocardiograma que realizamos.





Pues claro, totalmente decepcionante cuando esperaba algo similar a esto:


No tenía onda P,Q,R,S,T ni U, no era que en ese momento estuviera teniendo un infarto, básicamente solo graficaba ruido, así que entramos al manual del sensor electrocardiograma, el AD8232 Heart Rate Monitor.


Realizamos paso a paso lo que se indicaba esperando una señal así tal y como indicada el manual utilizando processing.



Pero el resultado fue este (en el mejor momento):


Claro para un conformista esto estaría bien pero para un cardiólogo esto es inaceptable, así que se empezó con la proesa de limpiar la señal. 

El primer paso era detectar las fuentes de ruido y para nuestra sorpresa las fuentes de ruido pues eran "todo" literalmente todo. 

Esta era la señal de el electrocardiograma cuando la computadora estaba desconectada (usando batería) lejos de todos los enchufes y sin ningún componente electrónico encendido cerca.

Voilá, al fin una señal relativamente limpia de un electrocardiograma, pero la cosa no se soluciona así tan sencillo, pues el cardiólogo que nos encargó el proyecto lo necesita para detectar paros cardíacos en tiempo real, donde utiliza lámparas para una buena iluminación, una camilla caliente para dilatar los vasos sanguíneos, una máquina de respiración artificial y bueno hasta su teléfono celular cerca, conclusión = mucho pero mucho ruido para el sensor electrocardiograma. 


Así que empezamos a probar poco a poco las fuentes de ruido. 


Esta es la gráfica con el cargador de la computadora conectado al puerto de carga pero no conectado al tomacorriente, simplemente conectado a la PC sin estar conectado a la red eléctrica. 





Ya algo de ruido se suma a la gráfica.

Ahora la gráfica con el cable de internet conectado a la PC.

La siguiente gráfica es con el cargador de la computadora conectado a la red eléctrica pero no a la computadora, estando posado en el suelo.


Ahora esto es lo que sucede cuando acercamos el cargador a los electrodos o el arduino.




Además del ruido parasitario la señal adquiere un baile que va de arriba hacia abajo.

Y bueno no podía faltar el golpe de gracia, al conectar el cargador a la computadora y sumar todos los ruidos (básicamente como realizamos una de las primeras pruebas con la PC conectada, las luces encendidas y un ventilador cerca con el teléfono cargando en la mesa)

Ahí lo tienen, un monstruo, una señal de terror que básicamente solo es ruido y nada reconocible en ella.


Entonces vamos paso a paso, lo primero si quieren tener una buena experiencia realizando electrocardiogramas sería eliminar esas molestas gelatinas pegajosas que trae el Kit.
Aparte de que solamente se pueden utilizar una vez (porque quedan sucias, pierden adhesividad) también es bastante incómodo tener que pedirle a personas que se levanten la ropa para colocarles los electrodos en estas posiciones.


No es que esté mal pero sí que es incómodo.
En este punto el cardiólogo nos asesoró y nos explicó que para hacer un electrocardiograma no hace falta conectar estrictamente en los puntos indicados en la imagen, sino que en realidad los electrodos pueden ir casi en cualquier lugar del cuerpo siempre y cuando formen un triángulo entre las conexiones (claramente la explicación es mucho más profunda pero a grandes rasgos así funciona) así que nos recomendó que podríamos conectar los electrodos en los dedos de esta manera.




El cardiólogo cambiará los electrodos de lugares para ver cuestiones distintas en la gráfica, puede cambiar el derecho por el izquierdo y viceversa para ver la gráfica invertida o buscar síntomas específicos según su especialidad, el GND incluso puede ir hasta en la oreja (lo probamos y funciona).
En este punto eliminamos las almohadillas pegajosas e implementamos pinzas impresas en 3D con una franja de cobre (puede ser cualquier metal, entre mejor conductor mejor, podría ser una franja de plata u oro) como electrodo.










Aquí les dejamos el modelo en 3D de las pinzas para que lo puedan descargar [click]. 



Entonces avanzamos, ahora con una mejor versión de los electrodos damos paso a limpiar la señal.
Como observamos al inicio todo el ruido aparentemente proviene de la red eléctrica, la red eléctrica en Argentina funciona a 50Hz, en Costa Rica a 60Hz y puede variar un poco según algunas regiones, así que en la buena teoría la señal ruidosa que se suma a nuestro electrocardiograma es la señal de la red a 50Hz, por lo cual hay que aplicar algunos filtros como el filtro Paso bajo, filtro FIR, el Butterworth, el media móvil y bueno todo depende de la señal que recibimos y lo que pretendemos plasmar se agregan más o menos filtros, en este documento científico se explica bastante bien e implementan todos los filtros en MatLab sin embargo no logramos hacerlos correr en arduino en el sentido que intentamos cargarlos en la placa con la función embebida de simulink en MatLab pero arrojaba error tras error.

Si empiezan a buscar todos estos filtros en internet notarán que como cada filtro detrás lleva una ecuación matemática pues se pueden aplicar tanto en hardware como en software así que primero decidimos empezar a intentar aplicarlos en el hardware como en este ejemplo  pero por más que intentamos, buscamos miles de diagramas diferentes, comprendimos las fórmulas y modificamos los circuitos a gusto, en realidad (en nuestro caso) lo único que lográbamos era hacer la señal más pequeña, en otras palabras, sí se reducía el ruido en la señal pero también se reducía la señal original pero se seguía manteniendo un poco de ruido. Cuando mantenía una fuente de ruido fija sí se lograba filtrar pero si se agregaba otra fuente de ruido ya todo el diagrama eléctrico que habiamos montado ya no funcionaba para nada, así que por lo menos en nuestro caso no funcionó ninguna manera eléctrica para filtrar el ruido ya que nuestras fuentes de ruido son cambiantes por lo que requería de un filtro de ruido adaptable a eventos que según lo que investigamos, armar un filtro eléctrico adaptativo y efectivo salía algo caro y se convertía básicamente en un oscilloscopio como los normales para estas cosas, entonces si se tenía que agregar mucho dinero para limpiar la señal al punto que se tenía que armar un oscilloscopio común con todos sus filtros pues el proyecto ya perdía sentido (porque había que hacerlo lo más barato posible y funcional) entonces fue cuando el único camino era optar por la implementación  de filtros digitales adaptativos a eventos.


Estos son algunos de los problemas que hay que solucionar con filtros digitales.

Encontramos muchas maneras de aplicar estos filtros en MatLab como en este caso  o en este y este pero al final ninguno nos funcionó, quizás una persona con más conocimientos sí lo lograría pero en nuestro caso no pudo ser, así que tuvimos que eliminar a Matlab de nuestras opciones, porque luego de utilizar algunos filtros en Matlab enviando la señal desde el arduino, claro se generaba un retraso importante en el muestreo en la señal, donde sí se limpiaba pero el fin de este proyecto era hacer un monitor electrocardiograma en tiempo real para observar paros cardiacos, así que la señal filtrada en Matlab no servía porque necesitamos los filtros en tiempo real sin retraso o con un retraso mínimo, Matlab  atrasaba la señal en al menos 5 segundos produciendo desfaces gigantes que al final la señal no era útil.

Navegando más y más en internet logramos encontrar implementaciones y adaptaciones de los filtros necesarios en código arduino ya probados como en este caso  y en este pero en nuestro caso de nuevo no funcionó ninguna de estas opciones por distintos motivos, el principal era por el retraso en el muestreo o porque no lográbamos que el código filtrara la señal que enviaba el sensor, como mencionamos antes, quizás a otra persona sí le sirvan estos ejemplos que adjuntamos pero en nuestro caso no funcionaron.

Después el único ejemplo más prometedor de un filtro aplicado al código arduino fue la librería de sobremuestreo recomendada por un colega, donde realmente funciona perfecto para básicamente cualquier sensor pero no logramos hacerla funcionar óptimamente con la señal del electrocardiograma y la velocidad de muestreo que necesitábamos, sin embargo para otros proyectos esta librería es fabulosa.




Entonces en este punto ya se preguntarán, ¿cuál es la solución? bueno de aquí en adelante presentamos la solución pero nos parecía muy importante mencionar todo lo anterior para que se pueda comprender en realidad el problema y todo lo que se investigó además de conocer todas las posibilidades.

Después de intensa investigación encontramos que los algritmos en Phyton para lectura de audio funcionaban perfecto para realizar la lecturas de señales de audio a través del puerto del micrófono de la computadora y las señales de audio también necesitan ser filtradas del ruido, el mismo ruido que afecta al electrocardiograma, lo bueno aquí es que tanto la señal de audio que el joven recibía y la señal de nuestro electrocardiograma ambas son analógicas por lo cuál utilizamos las librerías para realizar un electrocardiograma aprovechando todos los filtros necesarios en python, en el datasheet del AD8232 de Sparkfun notarán que ya tiene algunos filtros en su circuitería, entonces la idea era leer la señal analógica del AD8232 con este las librerías en Python que ya tenía todos los filtros necesarios además de que la frecuencia de filtrado es adaptable, lo cual es genial.

Una vez realizado el programa para que funcionara bien con el sensor de Sparkfun, este es nuestro electrocardiograma con todas las fuentes de ruido sumadas utilizando el software en python y filtrando a 35Hz.



La gráfica es negra, el fondo blanco y la cuadrícula dividida en cuadritos de 40ms con una ventana que muestra 5 segundos en total, por solicitud del cardiólogo que nos mencionó que así es la manera más ideal de estudiar un electrocardiograma.

Entonces si comparamos las gráficas expuestas al ruido máximo este sería el resultado.(Al final dejamos el vídeo comparando en tiempo real las señales del electrocardiograma con dos programas distintos, con filtros y sin filtros).

En nuestra opinión el resultado es fabuloso ya que el filtrado se aplica en tiempo real y además se aprovecha el filtro electrónico del sensor de sparkfun y se pueden apreciar todas las ondas del electrocardiograma, una curiosidad es que en nuestro caso el ruido a filtrar era de 35Hz y no de 50Hz, esto se puede explicar gracias a la naturaleza misma de las ondas, por ejemplo con el experimento de doble ranura de Young podemos comprender que aunque la procedencia del ruido de la red sean 50Hz si tenemos más de una fuente se produce el efecto Young ilustrado en el gif de abajo, donde unas ondas anulan otras y otras se fusionan, el resultado  es un ruido parasitario totalmente diferente al de la red (aquí al demostración del problema de la doble ranura deYoung), sin este software jamás nos habríamos dado cuenta de esto, cuando ustedes lo utilicen deberán de cambiar los Hz de filtrado donde más les convenga.



Otra ventaja es que este software al poseer "autoescala" de voltaje es que es útil tanto para humanos como para ratas en caso de investigadores que necesiten realizar electrocardiogramas en ratas.

De hecho si comparamos nuestra señal con señales de electrocardiogramas en oscilloscopios, notaremos a simple vista que nuestra señal en realidad es mucho más limpia que la de muchos proyectos con oscilloscopios que andan por toda la internet, además de la ventaja de poder tomar pantallazos y tener la gráfica en HD y solamente utilizando la placa de Sparkfun y un arduino común.



Aquí están los links de los proyectos de las imágenes en su respectivo orden.
Primer imagen.   Segunda imagen. Tercer imagen.


Entonces ¿cómo lo hacemos funcionar?
Esta sería la conexión.



En este caso como ya no vamos a utilizar en cable USB entonces el puerto A0 no es necesario, lo que estamos haciendo básicamente es secuestrando la señal del AD8223 y los pines 10 y 11 como inputs simplemente para estabilizar la señal con voltajes de referencia.

- Utilizamos baterías como fuente para eliminar todo el ruido que genera el puerto USB, para limpiar el ruido del puerto USB necesitamos un filtro de señal para puerto USB  que son $40usd que no queremos gastar.

- Cabe resaltar que el filtro USB solo limpia el ruido generado en el mismo USB no el ruido que se envía originario del electrocardiograma ya que debemos de recordar que cada electrodo funciona como una antena y es ahí dónde principalmente se capta el ruido.

-Puede ser un arduino UNO o Nano o cualquiera, nosotros utilizamos Nano por su tamaño y comodidad.

Sin embargo al igual que el vídeo que dejamos al final si ustedes mismos quieren comparar la señal captada del serial plotter del arduino y la señal captada del software en python al mismo tiempo, ahí sí pueden conectar el output del AD8232 al arduino y al micrófono con el USB, todo al mismo tiempo, no hay problema, solo que este caso el arduino toma la energía del USB así que habría que desconectar las baterías del arduino (demostración en el vídeo).

Aquí dejamos los ((drivers USB del arduino nano)) en caso de que la computadora no se los reconozca y si el nano es chino tienen que seleccionar "old bootloader" en el IDE de arduino.

Ahora es muy importante que la PC nos reconozca el conector de micrófono de inmediato.
Para comprobar esto podemos ir al ícono de sonido, presionar click derecho, entramos a /sonido/ y /grabación/, ahí vamos a ver esto:

Conectamos la entrada de micrófono teniendo el arduino totalmente ""apagado"", y deberíamos de ver esto de inmediato.
Si se dificulta saber qué cable va con qué parte del conector de micrófono, pueden probar con la continuidad de un multímetro y lo hallarán de manera sencilla.


Donde pasó de tener el micrófono de la PC por default a utilizar nuestro micrófono. En este punto aún no es necesario encender el arduino.

Si el ícono no cambia, eso quiere decir que la computadora no logra reconocer lo que le hemos conectado, esto me sucedió en algunas ocasiones y lo que pasa es que el conector del micrófono que estamos utilizando no es el correcto, compré estos conectores en una electrónica pero ninguno me sirvió ya que aunque no lo parezca son aproximadamente medio milímetro de diámetro más gruesos de lo común así que tuve que sacrificar unos audífonos viejos y ahí sí que me funcionó perfecto.

Ahora este sería el código que le cargamos al arduino [github].




Como podemos ver no es nada del otro mundo, nosotros en realidad solamente utilizamos los inputs, pero si desean comprar las gráficas este código es el necesario para poder ver la señal en el serial plotter de arduino, ya para utilizar nuestro software en python pueden dejar este código cargado ya que no genera ningún problema, pero si desean modificarlo para tener solo los inputs pues no pasa nada, es decisión de ustedes.

Otro dato importante para cuando vean el vídeo es que realizamos esta modificación en el color de los cables.




Cambiamos el negro por el rojo y el rojo por el negro, esto con el fin de que estamos acostumbrados a que el COM/GND siempre es el negro, no sabemos porqué el AD8232 lo tiene en el rojo cuando se utilizan los electrodos que trae, entonces para aprovechar el cable y el conector realizamos este cambio haciendo que el cable negro sea en común.

Ya con todo correctamente conectado procedemos a ejecutar el software (al final del blog dejamos el link de descarga de la versión que nosotros compilamos para este proyecto y al lado dejamos el link del código fuente)

- El programa pesa al rededor de 200MB ya que tiene todas las librerías necesarias de python empaquetadas en un solo ejecutable, así que cuando lo ejecuten deben de esperar unos 40 segundos a que se abra (no desesperar, sí se abrirá) por las dudas denle click derecho y abrir.

Ya con los electrodos conectados en nuestros dedos, el micrófono correctamente conectado y reconocido, una conexión bien hecha, esto es lo que deberíamos de observar en la pantalla. Recuerden que si ustedes se mueven mucho van a generar mucho ruido muscular, deben de estar relajados y muy quietos.

Por si las dudas procuren tener la computadora desconectada (en caso de que sus casas no tenga conexión a tierra), mientras se carga genera mucho ruido que el software sí logra filtrar pero luego de unos minutos de muestreo o si la computadora ya está cargada, ya con la computadora cargada el programa elimina mucho más fácil el ruido.




Aquí les dejamos el vídeo donde comparamos la señal captada por el serial plotter de arduino sin ningún filtro y la señal filtrada con el software en python.





Ahora algunos consejos finales para pulir un poco más nuestro proyecto.

Para el cable que se conecta al micrófono es ideal utilizar un cable apantallado, ya que esto ayuda muchísimo a reducir el ruido que podría ser captado por este cable.


Naturalmente los cables de micrófono ya traen este apantallamiento y se consigue fácilmente en las electrónicas, suele ser bastante barato el metro.

Otra buena idea es introducir todo el dispositivo dentro de una jaula Faraday  que no es más que una simple jaula hecha de maya metálica que sirve para eliminar muchas señales electromagnéticas que andan por el aire como las señales de radio y teléfono celular. Aquí un vídeo demostrativo. 





Si implementan la jaula Faraday deben de tener cuidado de que ninguna parte metálica esté tocando los puntos de soldadura debajo del arduino, ya que se generaran cortos que provocarán que nada funcione.

Luego si después de toda la experiencia quedaron traumados con el ruido en la señales, podemos envolver el dispositivo en un poco de papel aluminio para filtrar un poquito más las señales en el aire que también molestan un poco.


Ya una vez que nuestro dispositivo tiene apariencia de alfajor es cuando podemos ponerlo en la caja que más nos guste o bien diseñar una en 3D a nuestro gusto.



Aquí les dejamos la [pista electrónica en word lista para imprimir] que diseñamos para utilizar con el arduino nano.



Así se ve la baquelita con todo montado.





Y aquí terminamos queridos makers, cualquier duda con mucho gusto la contestamos, la aplicación compilada es totalmente gratuita y de uso libre con licencia GPL.


                                   
                            Aplicación compilada.                         Para el código fuente se solicita una 
                                                                                         donación a conciencia.



Cualquier duda específica pueden escribirnos al emial, si desean adquirir un dispositivo ya armado porque no tienen tiempo para hacerlo, también podemos coordinar envío.

antoniovangritte@gmail.com





Somos Brandon Antonio Segura Torres y Priscilla Vieto Bonilla estudiantes de Ciencias Biológicas.