Taula de continguts:

Registre d'ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes: 6 passos
Registre d'ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes: 6 passos

Vídeo: Registre d'ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes: 6 passos

Vídeo: Registre d'ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes: 6 passos
Vídeo: Java tech talk: Spring Boot and GraphQl integration. Как сделать это просто? 2024, Juliol
Anonim
Registreu ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes
Registreu ECG d'alta velocitat o altres dades, de manera contínua durant més d'un mes

Aquest projecte es va desenvolupar per donar suport a un equip d’investigació mèdica de la universitat, que necessitava un dispositiu portàtil que pogués registrar 2 x senyals d’ECG a 1000 mostres / s cadascuna (2 K mostres / s en total) contínuament durant 30 dies, per tal de detectar arítmies. El projecte aquí presentat inclou control remot i supervisió del registre. El control remot es realitza mitjançant menús presentats en un terminal sèrie, ja sigui en un ordinador o en un telèfon mòbil. Aquest projecte no cobreix la mesura de l’ECG, ni l’embalatge ni la bateria necessaris per a l’ús final.

Aquesta versió d’alta velocitat / llarga durada utilitza Teensy 3.2, el mòdul Adafruit Micro-SD breakout, una targeta SD de qualitat SD 16G SDHC classe 10 per registrar les dades i un mòdul de comunicacions Bluetooth per a control i supervisió. També hi ha disponible una versió UNO / Mega2560 menys desenvolupada i més lenta d’aquest projecte. Tot i que aquest projecte utilitza un mòdul de comunicacions Bluetooth per controlar i supervisar el registre, també podeu utilitzar mòduls WiFi o BLE.

Aquesta versió, basada en el Teensy 3.2, és capaç d’obtenir taxes de mostreig molt més altes que la versió UNO / Mega2560. Mitjançant aquest codi, el Teensy 3.2 pot mostrejar i registrar dues mostres ADC a> 30Khz amb una mitjana de maquinari de més de 4 mostres i que compleix fàcilment els requisits de 1000 mostres / seg anteriors. El codi permet guardar 100 fitxers.bin de 128K cadascun. A 30 Khz que cobreix 29 hores 30 minuts. A 1000 mostres / seg cobreix 37 dies. El codi es pot ampliar fàcilment per gestionar més de 100 fitxers, de manera que s’amplia la durada de l’execució. Al final de l'execució, tindreu> 10Gig de dades,.bin, fitxers i un fitxer.met de meta dades que descriuen l'execució i els resultats. El SDtoCSV.jar subministrat (codi font SDtoCSV_src.zip) es pot utilitzar per convertir els fitxers.bin a fitxers.csv del vostre ordinador per processar-los posteriorment. Les dades resultants són> 60Gig. La versió UNO / Mega2560 inclou la conversió.bin a.csv inclosa a l'esbós d'Arduino, però tenint en compte el volum de dades registrades per la versió Teensy, aquesta no és una manera eficient de fer la conversió.

Subministraments

Teensy 3.2 de PJRC

Tauler de separació de targeta MicroSD Adafruit + o similar.

16G SDHC classe 10 targeta MicroSD de bona qualitat, p. SanDisk.

Alimentació USB de 5V

Un led amb un resistent 470R en sèrie.

2 resistències 100R (proporciona protecció contra danys a causa d’errors de cablejat Tx / Rx)

Bluetooth Mate Silver O un dels mòduls descrits a Arduino UNO / Mega Starter, controlat per Android / pfodApp

Pas 1: construcció

Construcció
Construcció

Descarregueu i instal·leu Arduino IDE V1.8.9 + des de https://arduino.cc/en/Main/Software. Aquesta pàgina web té enllaços per a diversos sistemes operatius i un enllaç a GettingStarted (https://arduino.cc/en/Guide/HomePage).

Descarregueu i instal·leu Teensyduino (suport Teensy per a l'IDE Arduino). Tingueu en compte les instruccions de primer ús.

Seleccioneu Teensy 3.2 com a tauler i comproveu que el programa d'exemple BLINK es carrega i s'executa.

Descarregueu i instal·leu les biblioteques següents: - millisDelay i SdFat (aquí hi ha una instantània local de la biblioteca SdFat que s’utilitza per a aquestes proves) i el pfodParser.zip (per a la classe pfodBufferedStream i pfodNonBlockingInput)

Descarregueu els fitxers zip de la biblioteca i, a continuació, utilitzeu l'IDE Arduino → Sketch → Inclou biblioteca → Afegeix el menú de biblioteca. ZIP per instal·lar les biblioteques des dels fitxers zip.

Descomprimiu el fitxer Teensy32AnalogLogger.zip al directori d'esbossos d'Arduino i programa la placa Teensy 3.2 amb Teensy32AnalogLogger.ino (versió 0.01)

Connecteu el mòdul Teensy 3.2, Bluetooth i el mòdul de la targeta SD tal com es mostra a la versió anterior (versió pdf)

Pas 2: Execució del programa: proves

Primer formateu la targeta SD mitjançant

La targeta SD ha d'estar buida per poder iniciar el registre.

Per a les proves inicials no cal connectar el mòdul de comunicacions, només cal que connecteu el mòdul Teensy 3.2 + SD (amb una targeta buida instal·lada) a l'IDE Arduino mitjançant el cable sèrie USB. Tal com es proporciona, l'esbós Teensy32AnalogLogger.ino utilitza la connexió USB per controlar i supervisar. Consulteu el pas següent Registre de dades reals per utilitzar un dispositiu de comunicació per al control i la supervisió.

Editeu la part superior de l'esbós Teensy32AnalogLogger.ino per configurar COM_SERIAL a Serial, per a la sortida a la connexió USB Teensy.

#define COM_SERIAL Serial

A continuació, pengeu l’esbós a Teensy 3.2

Obriu Arduino IDE Serial Monitor a 115200 baud (amb NL i CR configurats). Després d'uns segons, el Teensy 3.2 mostrarà un menú d'ordres

Ver: 0,01 introduïu una de les ordres següents:? - estat actual i metadades - inicialitzar fitxersl - llistar fitxers>

El? cmd mostra detalls de la configuració actual. (Consulteu la part superior del Teensy32AnalogLogger.ino per canviar aquests paràmetres) Els CDM s'han de finalitzar amb un NL o CR o ambdós.

0: 00: 00.000 de 720: 00: 00.000

Pins de mostra: 16 Ordre de 17 bytes: bits ADC de Little-Endian: 10 mostres ADC superiors a: 4 Freqüència de mostra: 1000,00 Interval de mostra: 1000uS Mostres per bloc: 127 Temps per omplir el bloc: 127000uS Temps per omplir un fitxer: 9:01: 52.000 Temps per omplir TOTS els fitxers: 894: 04: 48.000 Latència SD màxima (inclou tancament / obertura del fitxer): 0uS Latència màxima de tancament / obertura del fitxer: 0uS Nombre de blocs de memòria intermèdia: 28 Temps per omplir TOTS els memòria intermèdia de blocs: 3556000uS Nombre màxim de memòria intermèdia guardat a la trucada a storeSampleBuffers (): 0 Total temporitzadors perduts: 0 Total de mostres perdudes fins ara: 0 Total de blocs escrits: 0 Total de mostres escrites: 0 cobertes: 0: 00: 00.000 Fitxer actual:

En aquest cas, el temps d'execució del registre actual és 0 de 720 hores sol·licitades (30 dies), mostrejant D16 / A2 i D17 / A3 (vegeu més avall les restriccions sobre l'elecció de les entrades ADC) 1000 vegades per segon. El temps d'execució màxim pot arribar a ser de 894 hores (37,25 dies). El bucle principal () es pot ocupar fins a 3,5 segons (temps per omplir TOTES les memòries intermèdies de blocs) abans que s'omplin totes les memòries interiors disponibles i es comencin a perdre mostres. Els buffers desats, etc., s’actualitzen a mesura que avança l’execució.

Inseriu una targeta SD buida, utilitzeu el cmd "i" per inicialitzar els 99 fitxers utilitzats per emmagatzemar les dades. La seva inicialització prèvia redueix el retard en canviar d’un fitxer al següent i permet un mostreig més ràpid.

Inicialització de 99 fitxers

Creació d'un fitxer nou: log00.bin Temps transcorregut: 368mS Creació d'un fitxer nou: log01.bin Temps transcorregut: 520mS… Creació d'un fitxer nou: log98.bin Temps transcorregut: 15660mS Creació d'un fitxer nou: log99.bin Temps transcorregut: 15812mS

A continuació, podeu utilitzar el r cmd per iniciar una execució de registre. L'execució serà durant el temps sol·licitat o fins que s'utilitzi el s cmd per aturar-la. També podeu utilitzar el? cmd mentre es registra per obtenir temps i recomptes actualitzats. Aquí teniu una tirada curta aturada primerenca amb el s cmd.

DADES DE REGISTRE …

Ver: 0,01 introduïu una de les ordres següents:? - estat actual i metadades s - atura el registre de dades

DADES DE REGISTRE … Consulta amb? comandament

Temps d'execució transcorregut: 0: 00: 10.000 de 720: 00: 00.000 Temps d'execució transcorregut: 0: 00: 20.000 de 720: 00: 00.000…

Aturar el registre i eliminar fitxers no utilitzats.

… Eliminació del fitxer no utilitzat: log98.bin Eliminació del fitxer no utilitzat: log99.bin

0: 01: 04.976 de 720: 00: 00.000

Pins de mostra: 16 Ordre de 17 bytes: bits ADC de Little-Endian: 10 mostres ADC superiors a: 4 Freqüència de mostra: 1000,00 Interval de mostra: 1000uS Mostres per bloc: 127 Temps per omplir el bloc: 127000uS Temps per omplir un fitxer: 9:01: 52.000 Temps per omplir TOTS els fitxers: 894: 04: 48.000 Latència SD màxima (inclou tancament / obertura de fitxers): 204uS Latència màxima de tancament / obertura de fitxers: 0uS Nombre de blocs de memòria intermèdia: 28 Temps per omplir TOTS els memòria intermèdia de blocs: 3556000uS Nombre màxim de memòria intermèdia desat a la trucada a storeSampleBuffers (): 1 Total temporitzadors perduts: 0 Total de mostres perdudes fins ara: 0 Total de blocs escrits: 511 Total de mostres escrites: 64832 cobertes: 0: 01: 04.832 Fitxer actual: log00.bin

ls:

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

EMPLENAMENT DE REGISTRE DE DADES

Ver: 0,01 introduïu una de les ordres següents:? - estat actual i metadades ** r - registre de dades ADC ** no disponible. Les dades ja existeixen ** i - inicialitzar fitxers ** no disponibles. Les dades ja existeixen fitxers de llista l

LES DADES JA HAN ESTAT REGISTRADES, consulteu-ho?

Pantalla LED

El LED connectat a D3 (amb D2 que proporciona la connexió GND) s’encén si s’escapa una mostra i parpellejarà si hi ha un error. L'esbós intenta continuar després d'errors, però és possible que no ho faci amb èxit.

Pas 3: registre de dades reals

Quan es registren dades reals durant llargues durades, és més convenient connectar un mòdul de comunicacions als pins D0 / D1 i controlar i controlar el registre de forma remota. Aquí s’utilitzava un mòdul Bluetooth Mate Silver amb els seus paràmetres predeterminats, 115200 baud, sense apretament de mans de maquinari (RTC, CTS), codi PIN 1234.

Nota: Quan s’aplica l’alimentació al mòdul Mate Silver, entra en mode de configuració, un LED vermell ràpid parpelleja durant 60 segons. Durant aquest temps podeu enviar $$$ a través de la connexió sèrie al mòdul per configurar-lo, però no podeu connectar-lo. Un cop el led vermell parpelleja lentament, el mòdul bluetooth acceptarà connexions.

Canvieu la definició COM_SERIAL a Teensy32AnalogLogger.ino per la connexió de maquinari serial (D0 / D1), Serial1

#define COM_SERIAL Serial1

Després de l’aparellament amb l’ordinador, es va crear un nou port COM a l’ordinador i es pot utilitzar CoolTerm per connectar-se, controlar i controlar el registre. També es poden utilitzar altres mòduls de comunicació connectats en sèrie, com ara WiFi o BLE, per obtenir més informació, consulteu Arduino UNO / Mega Starter, controlat per Android / pfodApp.

També podeu controlar i supervisar el registre des del vostre mòbil Android mitjançant una aplicació de terminal Bluetooth com ara l’aplicació Bluetooth Terminal o mitjançant una aplicació de terminal WiFi i TCP com TCP Telnet Terminal Pro, o un mdoule Uart to BLE i una aplicació de terminal BLE com nRF UART V2

Pas 4: restriccions sobre l'elecció de les entrades ADC

Restriccions a l’elecció de les entrades ADC
Restriccions a l’elecció de les entrades ADC

El Teensy 3.2 té dos mòduls de maquinari ADC separats, ADC_0 i ADC_1, al microprocessador, de manera que pot provar dues entrades al mateix temps. També té una mitjana de maquinari integrada que pren diverses mostres ADC i les fa mitjanes abans de convertir el resultat.

Hi ha restriccions sobre les entrades que es poden connectar a ADC_0, ADC_1. La imatge Teensy3_1_AnalogCard-p.webp

En resum: -Per a lectures de finalització senzilla, és a dir, + volts a què fa referència GND ADC_0 es pot llegir A0 a A9, A10, A11, A12, A14 ADC_1 pot llegir A2, A3, A10, A13, A15 a A20 Si seleccioneu un pin que l'ADC no es pot llegir, tornarà 0 (sempre)

Aquest projecte utilitza A2, A3 als quals es pot accedir mitjançant ADC_0 o ADC_1.

Pas 5: convertir els fitxers.bin a fitxers.csv

Teensy32AnalogLogger.ino desa les mostres com a binaris als fitxers logxx.bin, és a dir, log00.bin a log99.bin. Teensy32AnalogLogger.ino també desa un fitxer log.met de meta dades sobre l'execució.

Podeu utilitzar SDtoCSV.jar (codi font SDtoCSV_src.zip) per convertir els fitxers.bin a.csv per a un posterior processament. Copieu els fitxers de la targeta SD al disc dur de l'ordinador amb almenys 70 Gig d'espai lliure i copieu el SDtoCSV.jar al mateix directori. Obriu una finestra d'ordres en aquest directori i executeu

java -jar Registre SDtoCSV.jar

Si el vostre ordinador no té instal·lada Java, instal·leu-la des de www.java.com

SDtoCSV processarà el fitxer log.met i, a continuació, cadascun dels fitxers logxx.bin disponibles al directori i generarà un fitxer.csv per a cada.bin. El fitxer.csv té el número de seqüència de mostra seguit de les dues lectures.

Aquí es mostra una sortida de la consola de mostra per a una lectura de 2 adc mostrada 30303 vegades / s, output.txt. Il·lustra com s’informen de les mostres perdudes. (El doble del nombre de memòries intermèdies a l'esbós final solucionava aquestes mostres perdudes)

SD_Logging a la conversió CSV. Comproveu si hi ha missatges d’error i progrés en SDtoCSV.log. Processing log00 Processat 256000 blocs Processament log01 Processat 256000 blocs… Processament de registre25 Processat 256000 blocs Processament de registre26 Processat 256000 blocs Processament de registre27 Processat 256000 blocs Mostres perdudes: 2715 Processament de registre28 Processat 256000 blocs… Registre de processament29 Processat 256.000 blocs… Processament del registre47 Processat 256000 blocs Processament del registre48 Processat 35935 blocs --- Finalitzat el processament

Cada fitxer de registre SDtoCSV.log s'afegeix a cada execució de SDtoCSV. Inclou la sortida de meta dades i qualsevol missatge d'error. Aquí el recompte: 254 és el recompte de les dades emmagatzemades en aquest bloc, és a dir, 127 mostres x 2 lectures adc per bloc. The missedSamples és el nombre de parells de lectura perduts, és a dir, línies a la sortida.csv.

=== Fitxer de registre per a la conversió SD_Logging a CSV Ds 13 de juliol 13:19:51 AEST 2019 Per veure els missatges de progrés a la consola, utilitzeu java -jar SDtoCSV.jar Nom del fitxer base 'log' Versió de metadades: 0 (Little Endian) sample Interval uS: 33 adcBits: 10 adcAvgs: 4 pinCount: 2 Pins: 16, 17 samples PerBlock: 127 noBufferBlocks: 28 duració mS: 51649820 execució sol·licitada Time mS: 106216704 maxBuffersUsed: 32 Advertència: excedeix el nombre de buffers disponibles (28). És possible que falten algunes mostres. maxLatency uS: 221476 Advertència: supera el temps proporcionat pels blocs de memòria intermèdia (117348uS). Faltaran algunes mostres. maxFileOpenTime uS: 20998 Temporitzadors faltats: 0 Faltats de mostres Total: 2715 total Blocs Escrits: 12323935 totalSamples Escrits: 1565139665 Processant registre00.bin Processat 256000 blocs Processat registre01.bin Processat 256000 blocs… Processant log26.bin Processat 256000 blocs Processant log27.bin !!! Bloc: 57696 recompte: 254 mostres perdudes: 2339 !!! Bloqueig: 57697 recompte: 254 mostres perdudes: 376 processats 256.000 blocs --- Total de mostres perdudes: 2715

Processament de registre28.bin 256.000 blocs processats

… Processament log47.bin Processat 256.000 blocs Processament log48.bin Processat 35935 blocs --- Processat finalitzat

Una mostra del fitxer de sortida log00.csv és

SampleCounter (per 33uS), pin 16, pin 170, 248, 205 1, 273, 195 2, 228, 337 3, 360, 302 4, 355, 369 5, 220, 281…

El comptador de mostres augmenta de fitxer en fitxer, de manera que es pot utilitzar com a marca de temps. Si hi ha mostres que falten, el comptador de mostres s'incrementa amb el recompte perdut abans de generar la següent línia, de manera que el comptador / temps segueix sent precís per a les mostres registrades.

Pas 6: comentaris sobre el codi i les extensions

El Teensy32AnalogLogger és una versió molt modificada de l’exemple AnalogBinLogger de Bill Greiman a la seva biblioteca SdFat Arduino. Aquí la biblioteca s'ha reescrit per funcionar a Teensy 3.2.

Teensy32AnalogLogger utilitza timer0 per establir l'interval de mostra. El controlador d'interrupcions per al temporitzador0 inicia les dues conversions ADC. Es crida contínuament un controlador d'interrupcions per al segon mòdul ADC fins que tots dos acaben, normalment el primer mòdul ADC que s'inicia ADC_0 s'acaba abans del segon activat, de manera que el controlador d'interrupcions només es crida una vegada. El controlador d'interrupcions ADC_1 desa les mostres en un buffer de dades.

Al bucle principal (), storeSampleBuffer () desa qualsevol memòria intermèdia completa a la targeta SD i els recicla a la cua de memòria intermèdia buida. La gran quantitat de memòria RAM disponible al Teensy 3.2 significa que es pot assignar un gran nombre de memòries intermèdies i, per tant, no cal que crideu storeSampleBuffer () sovint. Això deixa temps al bucle principal () per fer altres treballs, com ara ordres de procés i enviar sortida.

Extensions

Tot i que aquest projecte és funcional com a registrador de dades d’alta velocitat, encara es necessita un embalatge complet i un subministrament d’un sistema de bateria i sensors ECG. A més, cal tenir en compte algunes extensions.

  1. Afegiu control i supervisió en temps real de la forma d'ona mostrada mitjançant pfodApp mitjançant la funció de traçat de pfodApp per mostrar instantànies de la forma d'ona
  2. Amplieu els números de fitxer passats els 99 per a proves de mostreig més llargues
  3. Mostra més de 2 entrades. Com que el Teensy 3.2 té mòduls ADC dobles, podeu modificar el codi per afegir entrades addicionals en parells per maximitzar la freqüència de mostreig.
  4. Afegiu la supervisió de la bateria per fer un seguiment de la càrrega de la bateria. El Teensy 3.2 utilitza uns 1100 mAhrs durant 24 hores, inclosos el mòdul bluetooth i SD, però excloent el mòdul de sensor
  5. Afegiu un circuit de subministrament de bateria dual per permetre el canvi de bateria sense interrompre el registre.

Recomanat: