Índice:

Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês: 6 etapas
Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês: 6 etapas

Vídeo: Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês: 6 etapas

Vídeo: Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês: 6 etapas
Vídeo: COMANDO PARA CORRIGIR FALHAS DO WINDOWS 2024, Julho
Anonim
Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês
Registrar ECG de alta velocidade ou outros dados, continuamente por mais de um mês

Este projeto foi desenvolvido para apoiar uma equipe de pesquisa médica de uma universidade, que precisava de um wearable que pudesse registrar 2 x sinais de ECG a 1000 amostras / segundo cada (2 mil amostras / segundo no total) continuamente por 30 dias, a fim de detectar arritmias. O projeto aqui apresentado inclui controle remoto e monitoramento da exploração madeireira. O controle remoto é feito por meio de menus apresentados em um terminal serial, seja em um computador ou telefone celular. Este projeto não cobre a medição de ECG ou embalagem ou bateria necessária para o vestível final.

Esta versão de alta velocidade / longa duração usa Teensy 3.2, módulo de breakout Adafruit Micro-SD, um cartão SD de qualidade 16G SDHC classe 10 para registrar os dados e um módulo de comunicação Bluetooth para controle e monitoramento. Uma versão UNO / Mega2560 menos desenvolvida e mais lenta deste projeto também está disponível. Embora este projeto use um módulo de comunicação Bluetooth para controle e monitoramento do registro, você também pode usar módulos WiFi ou BLE.

Esta versão, baseada no Teensy 3.2, é capaz de taxas de amostragem muito mais altas do que a versão UNO / Mega2560. Usando este código, o Teensy 3.2 pode amostrar e registrar duas amostras ADC em> 30Khz com média de hardware acima de 4 amostras e, assim, atender facilmente ao requisito de 1000 amostras / s acima. O código suporta o salvamento de 100 arquivos.bin de 128K cada. A 30 kHz que cobre 29 horas e 30 minutos. A 1000 amostras / s, cobre 37 dias. O código pode ser facilmente estendido para lidar com mais de 100 arquivos, estendendo assim a duração da execução. No final da execução, você terá> 10 Gig de dados,.bin, arquivos e um arquivo.met de metadados que descrevem a execução e os resultados. O SDtoCSV.jar fornecido (código-fonte SDtoCSV_src.zip) pode ser usado para converter os arquivos.bin em arquivos.csv em seu computador para processamento posterior. Os dados resultantes são> 60Gig. A versão UNO / Mega2560 tem conversão de.bin para.csv incluída no esboço do Arduino, mas dado o volume de dados registrados pela versão Teensy, essa não é uma maneira eficiente de fazer a conversão.

Suprimentos

Teensy 3.2 por PJRC

Adafruit MicroSD card breakout board + ou similar.

Cartão MicroSD 16G SDHC classe 10 de boa qualidade, por ex. SanDisk.

Fonte USB 5V

A liderou com um resistor 470R em série.

2 x resistores 100R (fornece proteção contra danos devido a erros de fiação Tx / Rx)

Bluetooth Mate Silver OU um dos módulos descritos no Arduino UNO / Mega Starter, controlado por Android / pfodApp

Etapa 1: construção

Construção
Construção

Baixe e instale o Arduino IDE V1.8.9 + em https://arduino.cc/en/Main/Software. Essa página da web contém links para vários sistemas operacionais e um link para GettingStarted (https://arduino.cc/en/Guide/HomePage).

Baixe e instale o Teensyduino (Suporte Teensy para o IDE Arduino). OBSERVE atentamente as instruções de uso inicial.

Selecione Teensy 3.2 como quadro e verifique se o programa de exemplo BLINK carrega e executa.

Baixe e instale as seguintes bibliotecas: - millisDelay e SdFat (um instantâneo local da biblioteca SdFat usada para esses testes está aqui.) E o pfodParser.zip (para as classes pfodBufferedStream e pfodNonBlockingInput)

Baixe os arquivos zip da biblioteca e use o menu Arduino IDE → Sketch → Incluir biblioteca → Adicionar biblioteca. ZIP para instalar as bibliotecas dos arquivos zip.

Descompacte o arquivo Teensy32AnalogLogger.zip para o diretório de esboços do Arduino e programe a placa Teensy 3.2 com Teensy32AnalogLogger.ino (versão 0.01)

Conecte o Teensy 3.2, módulo Bluetooth e o módulo de cartão SD conforme mostrado acima (versão pdf)

Etapa 2: Executando o Programa - Teste

Primeiro formate seu cartão SD usando

O cartão SD deve estar vazio para iniciar o registro.

Para o teste inicial, você não precisa conectar o módulo de comunicações, apenas conecte o módulo Teensy 3.2 + SD (com uma placa vazia instalada) ao IDE do Arduino através do cabo serial USB. Conforme fornecido, o esboço Teensy32AnalogLogger.ino usa a conexão USB para controle e monitoramento. Consulte a etapa Registro de dados reais abaixo para usar um dispositivo de comunicação para controle e monitoramento.

Edite a parte superior do esboço Teensy32AnalogLogger.ino para definir o COM_SERIAL como Serial, para a saída para a conexão USB Teensy.

#define COM_SERIAL Serial

Em seguida, faça o upload do esboço para o Teensy 3.2

Abra o Arduino IDE Serial Monitor em 115200 baud (com ambos NL e CR definidos). Depois de alguns segundos, o Teensy 3.2 exibirá um menu de comandos

Ver: 0,01 digite um dos seguintes comandos:? - status atual e metadados - inicializar arquivos l - listar arquivos>

O ? cmd exibe detalhes das configurações atuais. (Consulte a parte superior do Teensy32AnalogLogger.ino para alterar essas configurações) Os cmds devem ser encerrados com um NL ou CR ou ambos.

0: 00: 00.000 de 720: 00: 00.000

Pinos de amostra: 16 17 Ordem de bytes: Little-Endian bits ADC: 10 médias de amostra ADC acima de: 4 Taxa de amostra: 1000,00 Intervalo de amostra: 1000uS Amostras por bloco: 127 Tempo para preencher o bloco: 127000uS Tempo para preencher um arquivo: 9:01: 52.000 Tempo para preencher TODOS os arquivos: 894: 04: 48.000 Latência máxima de SD (inclui fechamento / abertura de arquivo): 0uS Latência máxima de fechamento / abertura de arquivo: 0uS Número de blocos de buffer: 28 Tempo para preencher TODOS os buffers de bloco: 3556000uS Número máximo de buffers salvo na chamada para storeSampleBuffers (): 0 Total de temporizadores perdidos: 0 Total de amostras perdidas até agora: 0 Total de blocos gravados: 0 Total de amostras gravadas: 0 cobrindo: 0: 00: 00.000 Arquivo atual:

Neste caso, o tempo de execução de registro atual é 0 dos 720 horas solicitados (30 dias), amostrando D16 / A2 e D17 / A3 (veja abaixo as Restrições na Escolha de Entradas ADC) 1000 vezes por segundo. O tempo de execução máximo pode ser de até 894 horas (37,25 dias). O loop principal () pode ser ocupado por até 3,5 segundos (tempo para preencher TODOS os buffers de bloco) antes que todos os buffers disponíveis sejam preenchidos e as amostras comecem a ser perdidas. Buffers salvos etc. são atualizados conforme o andamento da execução.

Insira um cartão SD vazio, use o cmd 'i' para inicializar os 99 arquivos usados para armazenar os dados. Pré-inicializá-los aqui reduz o atraso de tempo ao alternar de um arquivo para o próximo e permite uma amostragem mais rápida.

Inicializando 99 arquivos

Criando novo arquivo: log00.bin Tempo decorrido: 368mS Criando novo arquivo: log01.bin Tempo decorrido: 520mS… Criando novo arquivo: log98.bin Tempo decorrido: 15660mS Criando novo arquivo: log99.bin Tempo decorrido: 15812mS

Você pode então usar o cmd r para iniciar uma execução de registro. A execução durará o tempo solicitado ou até que o s cmd seja usado para interrompê-la. Você também pode usar o? cmd durante o registro para obter tempos e contagens atualizados. Aqui está uma pequena execução interrompida no início usando o cmd s.

REGISTRO DE DADOS…..

Ver: 0,01 digite um dos seguintes comandos:? - status atual e metadados s - interromper o registro de dados

REGISTRANDO DADOS… Verificar com? comando

Tempo de execução decorrido: 0: 00: 10.000 de 720: 00: 00.000 Tempo de execução decorrido: 0: 00: 20.000 de 720: 00: 00.000…

Parando o registro e removendo arquivos não utilizados.

… Removendo arquivo não usado: log98.bin Removendo arquivo não usado: log99.bin

0: 01: 04.976 de 720: 00: 00.000

Pinos de amostra: 16 17 Ordem de bytes: Little-Endian bits ADC: 10 médias de amostra ADC acima de: 4 Taxa de amostra: 1000,00 Intervalo de amostra: 1000uS Amostras por bloco: 127 Tempo para preencher o bloco: 127000uS Tempo para preencher um arquivo: 9:01: 52.000 Tempo para preencher TODOS os arquivos: 894: 04: 48.000 Latência máxima SD (inclui fechar / abrir arquivo): 204uS Latência máxima para fechar / abrir arquivo: 0uS Número de blocos de buffer: 28 Tempo para preencher TODOS os buffers de bloco: 3556000uS Número máximo de buffers salvo na chamada para storeSampleBuffers (): 1 Total de temporizadores perdidos: 0 Total de amostras perdidas até agora: 0 Total de blocos gravados: 511 Total de amostras gravadas: 64832 cobrindo: 0: 01: 04.832 Arquivo atual: log00.bin

ls:

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

REGISTRO DE DADOS CONCLUÍDO!

Ver: 0,01 digite um dos seguintes comandos:? - status atual e metadados ** r - dados ADC de registro ** não disponíveis. Os dados já existem ** i - inicializar arquivos ** não disponível. Os dados já existem l - listar arquivos

OS DADOS JÁ FORAM REGISTRADOS, verifique com?

Display LED

O LED conectado ao D3 (com o D2 fornecendo a conexão GND) acenderá continuamente se qualquer amostra for perdida e piscará se houver um erro. O esboço tenta continuar após os erros, mas pode não ser bem-sucedido.

Etapa 3: registro de dados reais

Ao registrar dados reais por longos períodos, é mais conveniente conectar um módulo de comunicação aos pinos D0 / D1 e controlar e monitorar o registro remotamente. Aqui, um módulo Bluetooth Mate Silver foi usado com suas configurações padrão, 115200 baud, sem handshaking de hardware (RTC, CTS), código pin 1234.

Nota: Quando o módulo Mate Silver é energizado, ele entra em modo de configuração, led vermelho piscando rapidamente, por 60seg. Durante esse tempo, você pode enviar $$$ através da conexão serial para o módulo para configurá-lo, mas você não pode conectar o módulo. Assim que o led vermelho piscar lentamente, o módulo bluetooth aceitará as conexões.

Altere a definição COM_SERIAL no Teensy32AnalogLogger.ino para a conexão serial do hardware (D0 / D1), Serial1

#define COM_SERIAL Serial1

Após o emparelhamento com o computador, uma nova porta COM foi criada no computador e o CoolTerm pode ser usado para conectar, controlar e monitorar o registro. Outros módulos de comunicação conectados em série também podem ser usados, como WiFi ou BLE, consulte Arduino UNO / Mega Starter, controlado por Android / pfodApp para obter detalhes.

Você também pode controlar e monitorar o registro de seu celular Android usando um aplicativo de terminal bluetooth, como o aplicativo Terminal Bluetooth, ou usando o aplicativo de terminal WiFi e TCP, como TCP Telnet Terminal Pro, ou um Uart para BLE mdoule e um aplicativo de terminal BLE, como nRF UART V2

Etapa 4: Restrições na escolha de entradas ADC

Restrições na escolha de entradas ADC
Restrições na escolha de entradas ADC

O Teensy 3.2 tem dois módulos de hardware ADC separados, ADC_0 e ADC_1, em seu microprocessador para que ele possa amostrar duas entradas ao mesmo tempo. Ele também tem uma média de hardware embutida que pega várias amostras de ADC e calcula a média delas antes de girar o resultado.

Existem restrições sobre quais entradas podem ser conectadas a ADC_0, ADC_1. A imagem Teensy3_1_AnalogCard-p.webp

Em resumo: - Para leituras de extremidade única, isto é, + Volts referenciados a GND ADC_0 pode ler A0 a A9, A10, A11, A12, A14 ADC_1 pode ler A2, A3, A10, A13, A15 a A20 Se você selecionar um pino que o ADC não pode ler, retornará 0 (sempre)

Este projeto usa A2, A3, que podem ser acessados por ADC_0 ou ADC_1.

Etapa 5: convertendo os arquivos.bin em arquivos.csv

O Teensy32AnalogLogger.ino salva as amostras como binárias nos arquivos logxx.bin, ou seja, log00.bin para log99.bin. Teensy32AnalogLogger.ino também salva um arquivo log.met de metadados sobre a execução.

Você pode usar SDtoCSV.jar (código-fonte SDtoCSV_src.zip) para converter os arquivos.bin em.csv para processamento posterior. Copie os arquivos do cartão SD para o disco rígido do seu computador com pelo menos 70Gig de espaço livre e copie o SDtoCSV.jar para o mesmo diretório. Abra uma janela de comando nesse diretório e execute

log java -jar SDtoCSV.jar

Se o seu computador não tiver o Java instalado, instale-o em www.java.com

SDtoCSV processará o arquivo log.met e, em seguida, cada um dos arquivos logxx.bin disponíveis no diretório e produzirá um arquivo.csv para cada.bin. O arquivo.csv tem o número de sequência da amostra seguido pelas duas leituras.

Um exemplo de saída do console para uma leitura de 2 adc amostrada 30.303 vezes / s é mostrado aqui, output.txt. Ilustra como as amostras perdidas são relatadas. (Dobrar o número de buffers no esboço final corrigiu essas amostras perdidas)

SD_Logging para conversão CSV. Verifique SDtoCSV.log para mensagens de progresso e erros. Log de processamento00 256.000 blocos processados Log de processamento01 256.000 blocos processados… Log de processamento25 256.000 blocos processados Log de processamento26 256.000 blocos processados Log de processamento27 256.000 blocos processados Amostras perdidas: 2715 Log de processamento28 256.000 blocos processados… Processando log29 Processados 256000 blocos… Processando log47 Processados 256000 blocos Processando log48 Processados 35935 blocos --- Processamento concluído

Um arquivo de log mais completo, SDtoCSV.log, é anexado a cada execução de SDtoCSV. Inclui a saída de metadados e quaisquer mensagens de erro. Aqui, a contagem: 254 é a contagem dos dados armazenados naquele bloco, ou seja, 127 amostras x 2 leituras adc por bloco. As amostras perdidas é o número de pares de leituras perdidas, ou seja, linhas na saída.csv.

=== Arquivo de registro para conversão de SD_Logging em CSV Sábado 13 de julho 13:19:51 AEST 2019 Para ver as mensagens de progresso no console, use java -jar SDtoCSV.jar Nome do arquivo base 'log' Versão dos metadados: 0 (Little Endian) sampleInterval uS: 33 adcBits: 10 adcAvgs: 4 pinCount: 2 Pins: 16, 17 samplesPerBlock: 127 noBufferBlocks: 28 duração mS: 51649820 runTime solicitado mS: 106216704 maxBuffersUsed: 32 Aviso: Excede o número de buffers disponíveis (28). Algumas amostras podem estar faltando. maxLatency uS: 221476 Aviso: Excede o tempo fornecido pelos blocos de buffer (117348uS). Algumas amostras estarão faltando. maxFileOpenTime uS: 20998 lostTimers: 0 lostSamplesTotal: 2715 totalBlocksWritten: 12323935 totalSamplesWritten: 1565139665 Processando log00.bin Processado 256000 blocos Processando log01.bin Processou 256000 blocos… Processando log26.bin Processados 256000 blocos Processando log27.bin !!! Bloco: 57696 contagem: 254 perdidos Amostras: 2339 !!! Bloco: 57697 contagem: 254 amostras perdidas: 376 256000 blocos processados --- Total de amostras perdidas: 2715

Processando log28.bin Processou 256.000 blocos

… Processando log47.bin Processando 256000 blocos Processando log48.bin Processando 35935 blocos --- Processamento concluído

Uma amostra do arquivo de saída log00.csv é

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

O contador de amostra aumenta de arquivo para arquivo para que possa ser usado como um registro de data e hora. Se houver amostras ausentes, o contador de amostras é incrementado pela contagem perdida antes de enviar a próxima linha para que o contador / carimbo de hora permaneça preciso para as amostras registradas.

Etapa 6: comentários sobre o código e extensões

O Teensy32AnalogLogger é uma versão fortemente modificada do exemplo AnalogBinLogger de Bill Greiman em sua biblioteca SdFat Arduino. Aqui, a biblioteca foi reescrita para funcionar no Teensy 3.2.

Teensy32AnalogLogger usa timer0 para definir o intervalo de amostra. O manipulador de interrupção para timer0 inicia as duas conversões ADC. Um manipulador de interrupção para o segundo módulo ADC é continuamente chamado até que ambos tenham terminado, normalmente o primeiro módulo ADC iniciado ADC_0 terminará antes do segundo, então o manipulador de interrupção é chamado apenas uma vez. O manipulador de interrupção ADC_1 salva as amostras em um buffer de dados.

No loop principal (), storeSampleBuffer () salva todos os buffers completos no cartão SD e recicla os buffers para a fila de buffer vazia. A grande quantidade de RAM disponível no Teensy 3.2 significa que um grande número de buffers pode ser alocado e, portanto, storeSampleBuffer () não precisa ser chamado com freqüência. Isso deixa tempo para o loop principal () fazer outro trabalho, como processar comandos e enviar saída.

Extensões

Embora este projeto funcione como um registrador de dados de alta velocidade, para um wearable completo ele ainda precisa ser embalado e um sistema de bateria e sensores de ECG fornecidos. Além disso, existem algumas extensões que devem ser consideradas.

  1. Adicione controle e monitoramento em tempo real da forma de onda amostrada via pfodApp usando a função de plotagem de pfodApp para mostrar instantâneos da forma de onda
  2. Estenda os números do arquivo além de 99 para execuções de amostragem mais longas
  3. Experimente mais de 2 entradas. Como o Teensy 3.2 tem módulos ADC duplos, você pode modificar o código para adicionar entradas extras em pares para maximizar a taxa de amostragem.
  4. Adicione monitoramento de bateria para rastrear a carga da bateria. O Teensy 3.2 usa cerca de 1100 mAhrs ao longo de 24 horas, incluindo o módulo bluetooth e SD, mas excluindo o módulo sensor
  5. Adicione um circuito de alimentação de bateria dupla para permitir trocas de bateria sem interromper o registro.

Recomendado: