Tabla de contenido:

Registrar ECG de alta velocidad u otros datos, de forma continua durante más de un mes: 6 pasos
Registrar ECG de alta velocidad u otros datos, de forma continua durante más de un mes: 6 pasos

Video: Registrar ECG de alta velocidad u otros datos, de forma continua durante más de un mes: 6 pasos

Video: Registrar ECG de alta velocidad u otros datos, de forma continua durante más de un mes: 6 pasos
Video: Este ECG es normal 6 pasos básicos para analizar un electrocardiograma 2024, Mes de julio
Anonim
Registre ECG de alta velocidad u otros datos, de forma continua durante más de un mes
Registre ECG de alta velocidad u otros datos, de forma continua durante más de un mes

Este proyecto fue desarrollado para apoyar a un equipo de investigación médica de la universidad, que necesitaba un dispositivo portátil que pudiera registrar 2 señales de ECG a 1000 muestras / seg cada una (2K muestras / seg en total) de forma continua durante 30 días, con el fin de detectar arritmias. El proyecto que aquí se presenta incluye control remoto y monitoreo del registro. El control remoto se realiza a través de menús presentados en un terminal en serie, ya sea en una computadora o en un teléfono móvil. Este proyecto no cubre la medición de ECG o el embalaje o la batería necesaria para el dispositivo portátil final.

Esta versión de alta velocidad / larga duración utiliza Teensy 3.2, módulo de ruptura Adafruit Micro-SD, una tarjeta SD 16G SDHC clase 10 de calidad para registrar los datos y un módulo de comunicaciones Bluetooth para control y monitoreo. También está disponible una versión UNO / Mega2560 menos desarrollada y más lenta de este proyecto. Si bien este proyecto usa un módulo de comunicaciones Bluetooth para controlar y monitorear el registro, también puede usar módulos WiFi o BLE.

Esta versión, basada en Teensy 3.2, es capaz de velocidades de muestreo mucho más altas que la versión UNO / Mega2560. Con este código, Teensy 3.2 puede muestrear y registrar dos muestras de ADC a> 30Khz con un promedio de hardware de más de 4 muestras y, por lo tanto, satisface fácilmente el requisito de 1000 muestras / seg. El código admite guardar 100 archivos.bin de 128K cada uno. A 30Khz que cubre 29 horas 30 minutos. A 1000 muestras / seg, cubre 37 días. El código se puede extender fácilmente para manejar más de 100 archivos, extendiendo así la duración de la ejecución. Al final de la ejecución, tendrá> 10 GB de datos,.bin, archivos y un archivo.met de metadatos que describen la ejecución y los resultados. El SDtoCSV.jar suministrado (código fuente SDtoCSV_src.zip) se puede utilizar para convertir los archivos.bin en archivos.csv en su computadora para su posterior procesamiento. Los datos resultantes son> 60 Gig. La versión UNO / Mega2560 tiene la conversión de.bin a.csv incluida en el boceto de Arduino, pero dado el volumen de datos registrados por la versión de Teensy, esa no es una forma eficiente de hacer la conversión.

Suministros

Teensy 3.2 por PJRC

Placa de conexión para tarjeta Adafruit MicroSD + o similar.

Tarjeta MicroSD 16G SDHC clase 10 de buena calidad, p. Ej. SanDisk.

Suministro USB de 5V

Un led con resistencia 470R en serie.

2 resistencias 100R (proporciona protección contra daños debido a errores de cableado Tx / Rx)

Bluetooth Mate Silver O uno de los módulos descritos en Arduino UNO / Mega Starter, controlado por Android / pfodApp

Paso 1: construcción

Construcción
Construcción

Descargue e instale Arduino IDE V1.8.9 + desde https://arduino.cc/en/Main/Software. Esa página web tiene enlaces para varios sistemas operativos y un enlace a GettingStarted (https://arduino.cc/en/Guide/HomePage).

Descargue e instale Teensyduino (Teensy Support para Arduino IDE). OBSERVE atentamente las instrucciones de primer uso.

Seleccione Teensy 3.2 como placa y compruebe que el programa de ejemplo BLINK se carga y se ejecuta.

Descargue e instale las siguientes bibliotecas: - millisDelay y SdFat (aquí encontrará una instantánea local de la biblioteca SdFat utilizada para estas pruebas) y pfodParser.zip (para las clases pfodBufferedStream y pfodNonBlockingInput)

Descargue los archivos zip de la biblioteca y luego use el IDE de Arduino → Sketch → Incluir biblioteca → Agregar menú de biblioteca. ZIP para instalar las bibliotecas desde los archivos zip.

Descomprima el archivo Teensy32AnalogLogger.zip en su directorio de bocetos de Arduino y programe la placa Teensy 3.2 con Teensy32AnalogLogger.ino (Versión 0.01)

Conecte el Teensy 3.2, el módulo Bluetooth y el módulo de la tarjeta SD como se muestra arriba (versión pdf)

Paso 2: Ejecución del programa: prueba

Primero formatee su tarjeta SD usando

La tarjeta SD debe estar vacía para comenzar a registrar.

Para la prueba inicial, no necesita conectar el módulo de comunicaciones, simplemente conecte el módulo Teensy 3.2 + SD (con una tarjeta vacía instalada) al Arduino IDE a través del cable serial USB. Como se proporciona, el boceto de Teensy32AnalogLogger.ino usa la conexión USB para control y monitoreo. Consulte el paso Registro de datos reales a continuación para utilizar un dispositivo de comunicación para el control y la supervisión.

Edite la parte superior del boceto Teensy32AnalogLogger.ino para configurar COM_SERIAL en Serial, para enviarlo a la conexión USB Teensy.

#define COM_SERIAL Serie

Luego sube el boceto al Teensy 3.2

Abra el monitor serial IDE de Arduino a 115200 baudios (con NL y CR configurados). Después de unos segundos, Teensy 3.2 mostrará un menú de comandos.

Ver: 0.01 ingrese uno de los siguientes comandos:? - estado actual y metadatos - inicializar archivos - listar archivos>

Los ? cmd muestra detalles de la configuración actual. (Consulte la parte superior de Teensy32AnalogLogger.ino para cambiar esta configuración) Los cmds deben terminar con un NL o CR o ambos.

0: 00: 00.000 de 720: 00: 00.000

Pines de muestra: 16 Orden de 17 bytes: bits de ADC Little-Endian: 10 promedios de muestra de ADC sobre: 4 Frecuencia de muestreo: 1000,00 Intervalo de muestra: 1000uS Muestras por bloque: 127 Tiempo para llenar el bloque: 127000uS Tiempo para llenar un archivo: 9:01: 52.000 Tiempo para llenar TODOS los archivos: 894: 04: 48.000 Latencia SD máxima (incluye cierre / apertura de archivo): 0uS Latencia máxima de cierre / apertura de archivo: 0uS Número de bloques de búfer: 28 Tiempo para llenar TODOS los búferes de bloque: 3556000uS Número máximo de búferes guardado en la llamada a storeSampleBuffers (): 0 Total de temporizadores perdidos: 0 Total de muestras perdidas hasta ahora: 0 Total de bloques escritos: 0 Total de muestras escritas: 0 que cubren: 0: 00: 00.000 Archivo actual:

En este caso, el tiempo de ejecución de registro actual es 0 de las 720 horas solicitadas (30 días), muestreando D16 / A2 y D17 / A3 (consulte a continuación las restricciones sobre la elección de entradas ADC a continuación) 1000 veces por segundo. El tiempo de ejecución máximo puede ser de hasta 894 horas (37,25 días). El bucle principal () se puede ocupar hasta 3,5 segundos (tiempo para llenar TODOS los búferes de bloque) antes de que se llenen todos los búferes disponibles y las muestras comiencen a perderse. Los búferes guardados, etc. se actualizan a medida que avanza la ejecución.

Inserte una tarjeta SD vacía, use el cmd 'i' para inicializar los 99 archivos usados para almacenar los datos. Preinicializarlos aquí reduce el retardo de tiempo al cambiar de un archivo al siguiente y permite un muestreo más rápido.

Inicializando 99 archivos

Creando nuevo archivo: log00.bin Tiempo transcurrido: 368mS Creando nuevo archivo: log01.bin Tiempo transcurrido: 520mS… Creando nuevo archivo: log98.bin Tiempo transcurrido: 15660mS Creando nuevo archivo: log99.bin Tiempo transcurrido: 15812mS

A continuación, puede utilizar r cmd para iniciar una ejecución de registro. La ejecución se ejecutará durante el tiempo solicitado o hasta que se utilice s cmd para detenerla. También puede utilizar el? cmd mientras se registra para obtener tiempos y recuentos actualizados. A continuación, se muestra una ejecución breve detenida antes con el comando s cmd.

REGISTRO DE DATOS…..

Ver: 0.01 ingrese uno de los siguientes comandos:? - estado actual y metadatos - detener el registro de datos

REGISTRO DE DATOS… ¿Consultar con? mando

Tiempo de ejecución transcurrido: 0: 00: 10.000 de 720: 00: 00.000 Tiempo de ejecución transcurrido: 0: 00: 20.000 de 720: 00: 00.000…

Detener el registro y eliminar archivos no utilizados.

… Eliminando el archivo no utilizado: log98.bin Eliminando el archivo no utilizado: log99.bin

0: 01: 04.976 de 720: 00: 00.000

Pines de muestra: 16 Orden de 17 bytes: bits de ADC Little-Endian: 10 promedios de muestra de ADC sobre: 4 Frecuencia de muestreo: 1000,00 Intervalo de muestra: 1000uS Muestras por bloque: 127 Tiempo para llenar el bloque: 127000uS Tiempo para llenar un archivo: 9:01: 52.000 Tiempo para llenar TODOS los archivos: 894: 04: 48.000 Latencia SD máxima (incluye cierre / apertura de archivo): 204uS Latencia máxima de cierre / apertura de archivo: 0uS Número de bloques de búfer: 28 Tiempo para llenar TODOS los búferes de bloque: 3556000uS Número máximo de búferes guardado en la llamada a storeSampleBuffers (): 1 Total de temporizadores perdidos: 0 Total de muestras perdidas hasta ahora: 0 Total de bloques escritos: 511 Total de muestras escritas: 64832 que cubren: 0: 01: 04.832 Archivo actual: log00.bin

ls:

2000-01-01 01:00:00 261632 log00.bin 2000-01-01 01:00:00 240 log.met

REGISTRO DE DATOS COMPLETADO!

Ver: 0.01 ingrese uno de los siguientes comandos:? - estado actual y metadatos ** r - registro de datos ADC ** no disponible. Los datos ya existen ** i - archivos de inicialización ** no disponibles. Los datos ya existen l - lista de archivos

LOS DATOS YA SE HAN REGISTRADO, consulte con?

Pantalla LED

El LED conectado a D3 (con D2 proporcionando la conexión GND) se encenderá fijo si falta alguna muestra y parpadeará si hay un error. El boceto intenta continuar después de los errores, pero es posible que no lo haga correctamente.

Paso 3: registro de datos reales

Al registrar datos reales durante períodos prolongados, es más conveniente conectar un módulo de comunicaciones a los pines D0 / D1 y controlar y monitorear el registro de forma remota. Aquí se utilizó un módulo Bluetooth Mate Silver con su configuración predeterminada, 115200 baudios, sin protocolo de enlace de hardware (RTC, CTS), código pin 1234.

Nota: Cuando se aplica energía al módulo Mate Silver, entra en modo de configuración, el LED rojo parpadea rápidamente durante 60 segundos. Durante este tiempo, puede enviar $$$ a través de la conexión en serie al módulo para configurarlo, pero no puede conectar el módulo. Una vez que el led rojo parpadee lentamente, el módulo bluetooth aceptará conexiones.

Cambie la definición COM_SERIAL en el Teensy32AnalogLogger.ino a la conexión serial del hardware (D0 / D1), Serial1

#define COM_SERIAL Serial1

Después de emparejarlo con la computadora, se creó un nuevo puerto COM en la computadora y CoolTerm se puede usar para conectar, controlar y monitorear el registro. También se pueden utilizar otros módulos de comunicación conectados en serie, como WiFi o BLE; consulte Arduino UNO / Mega Starter, controlado por Android / pfodApp para obtener más detalles.

También puede controlar y monitorear el registro desde su móvil Android usando una aplicación de terminal bluetooth como la aplicación Bluetooth Terminal, o usando una aplicación de terminal TCP y WiFi como TCP Telnet Terminal Pro, o un mdoule Uart to BLE y una aplicación de terminal BLE como nRF UART V2

Paso 4: restricciones en la elección de entradas ADC

Restricciones en la elección de entradas ADC
Restricciones en la elección de entradas ADC

El Teensy 3.2 tiene dos módulos de hardware ADC separados, ADC_0 y ADC_1, en su microprocesador para que pueda muestrear dos entradas al mismo tiempo. También tiene un promedio de hardware integrado que toma múltiples muestras de ADC y las promedia antes de convertir el resultado.

Existen restricciones sobre las entradas que se pueden conectar a ADC_0, ADC_1. La imagen Teensy3_1_AnalogCard-p.webp

En resumen: -Para lecturas de un solo extremo, es decir, + voltios referenciados a GND ADC_0 puede leer A0 a A9, A10, A11, A12, A14 ADC_1 puede leer A2, A3, A10, A13, A15 a A20 Si selecciona un pin que el ADC no se puede leer devolverá 0 (siempre)

Este proyecto utiliza A2, A3 a los que se puede acceder mediante ADC_0 o ADC_1.

Paso 5: conversión de archivos.bin a archivos.csv

Teensy32AnalogLogger.ino guarda las muestras como binarios en archivos logxx.bin, es decir, log00.bin a log99.bin. Teensy32AnalogLogger.ino también guarda un archivo log.met de metadatos sobre la ejecución.

Puede utilizar SDtoCSV.jar (código fuente SDtoCSV_src.zip) para convertir los archivos.bin a.csv para su posterior procesamiento. Copie los archivos de la tarjeta SD al disco duro de su computadora con al menos 70Gig de espacio libre y copie SDtoCSV.jar en el mismo directorio. Abra una ventana de comando en ese directorio y ejecute

java -jar registro SDtoCSV.jar

Si su computadora no tiene la instalación de Java, instálelo desde www.java.com

SDtoCSV procesará el archivo log.met y luego cada uno de los archivos logxx.bin disponibles en el directorio y generará un archivo.csv para cada.bin. El archivo.csv tiene el número de secuencia de la muestra seguido de las dos lecturas.

Aquí, output.txt, se muestra una salida de consola de muestra para una lectura de 2 adc muestreada 30303 veces / seg. Ilustra cómo se informan las muestras perdidas. (Duplicar la cantidad de búferes en el boceto final solucionó esto, estas muestras perdidas)

Conversión de SD_Logging a CSV. Verifique SDtoCSV.log para ver el progreso y los mensajes de error. Procesando log00 Procesados 256000 bloques Procesando log01 Procesados 256000 bloques… Registro de procesamiento25 256000 bloques procesados Registro de procesamiento26 256000 bloques procesados Registro de procesamiento27 256000 bloques procesados Muestras perdidas: 2715 Registro de procesamiento28 256000 bloques procesados… Registro de procesamiento 29 Procesó 256000 bloques… Registro de procesamiento 47 Procesado 256000 bloques Registro de procesamiento 48 Procesado 35935 bloques --- Procesado terminado

Cada ejecución de SDtoCSV agrega un archivo de registro más completo, SDtoCSV.log. Incluye la salida de metadatos y cualquier mensaje de error. Aquí el recuento: 254 es el recuento de los datos almacenados en ese bloque, es decir, 127 muestras x 2 lecturas de adc por bloque. Las muestras perdidas es el número de pares de lectura perdidos, es decir, líneas en la salida.csv.

=== Archivo de registro para conversión SD_Logging a CSV Sáb 13 de julio 13:19:51 AEST 2019 Para ver los mensajes de progreso en la consola, use java -jar SDtoCSV.jar Nombre de archivo base 'log' Versión de metadatos: 0 (Little Endian) sampleInterval uS: 33 adcBits: 10 adcAvgs: 4 pinCount: 2 Pines: 16, 17 samplesPerBlock: 127 noBufferBlocks: 28 duración mS: 51649820 tiempo de ejecución solicitado mS: 106216704 maxBuffersUsed: 32 Advertencia: Supera el número de búferes disponibles (28). Es posible que falten algunas muestras. maxLatency uS: 221476 Advertencia: Excede el tiempo proporcionado por los bloques de búfer (117348uS). Faltarán algunas muestras. maxFileOpenTime uS: 20998 missingTimers: 0 missingSamplesTotal: 2715 totalBlocksWritten: 12323935 totalSamplesWritten: 1565139665 Procesando log00.bin Procesado 256000 bloques Procesando log01.bin Procesado 256000 bloques… Procesando log26.bin Procesado 256000 bloques Procesando log27.bin !!! Bloque: 57696 recuento: 254 muestras perdidas: 2339 !!! Bloque: 57697 recuento: 254 muestras perdidas: 376 procesados 256000 bloques --- Total de muestras perdidas: 2715

Procesando log28.bin Procesado 256000 bloques

… Procesando log47.bin Procesado 256000 bloques Procesando log48.bin Procesado 35935 bloques --- Finalizado Procesamiento

Una muestra del archivo de salida log00.csv es

Contador de muestras (por 33uS), Pin 16, Pin 170, 248, 205 1, 273, 195 2, 228, 337 3, 360, 302 4, 355, 369 5, 220, 281…

El contador de muestras aumenta de un archivo a otro, por lo que se puede utilizar como marca de tiempo. Si faltan muestras, el contador de muestras se incrementa por el recuento perdido antes de generar la siguiente línea para que el contador / sello de tiempo siga siendo preciso para las muestras grabadas.

Paso 6: comentarios sobre el código y las extensiones

El Teensy32AnalogLogger es una versión muy modificada del ejemplo AnalogBinLogger de Bill Greiman en su biblioteca SdFat Arduino. Aquí, la biblioteca ha sido reescrita para ejecutarse en Teensy 3.2.

Teensy32AnalogLogger usa timer0 para establecer el intervalo de muestra. El manejador de interrupciones para timer0 inicia las dos conversiones ADC. Se llama continuamente a un controlador de interrupciones para el segundo módulo ADC hasta que ambos terminan, por lo general, el primer módulo ADC iniciado ADC_0 terminará antes que el segundo, por lo que el controlador de interrupciones solo se llama una vez. El manejador de interrupciones ADC_1 guarda las muestras en un búfer de datos.

En el bucle principal (), storeSampleBuffer () guarda cualquier búfer completo en la tarjeta SD y recicla los búferes en la cola de búfer vacía. La gran cantidad de RAM disponible en Teensy 3.2 significa que se pueden asignar una gran cantidad de búferes y, por lo tanto, no es necesario llamar a storeSampleBuffer () con frecuencia. Esto deja tiempo para que el bucle principal () realice otro trabajo, como procesar comandos y enviar resultados.

Extensiones

Si bien este proyecto es funcional como un registrador de datos de alta velocidad, para un wearable completo aún necesita empaquetarse y un sistema de batería y sensores de ECG suministrados. Además de eso, hay algunas extensiones que deben considerarse.

  1. Agregue control y monitoreo en tiempo real de la forma de onda muestreada a través de pfodApp utilizando la función de trazado de pfodApp para mostrar instantáneas de la forma de onda
  2. Extienda los números de archivo más allá de 99 para ejecuciones de muestreo más largas
  3. Muestra más de 2 entradas. Dado que Teensy 3.2 tiene módulos ADC duales, puede modificar el código para agregar entradas adicionales en pares para maximizar la frecuencia de muestreo.
  4. Agregue monitoreo de batería para rastrear la carga de la batería. El Teensy 3.2 usa aproximadamente 1100 mAh durante 24 horas, incluido el módulo Bluetooth y SD, pero excluyendo el módulo del sensor.
  5. Agregue un circuito de suministro de batería dual para permitir cambios de batería sin interrumpir el registro.

Recomendado: