Table des matières:

Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois : 6 étapes
Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois : 6 étapes

Vidéo: Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois : 6 étapes

Vidéo: Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois : 6 étapes
Vidéo: 231 - Electrocadiogramme (ECG) - Partie 2 - ECG normal 2024, Juillet
Anonim
Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois
Enregistrez l'ECG à haute vitesse ou d'autres données, en continu pendant plus d'un mois

Ce projet a été développé pour soutenir une équipe de recherche médicale universitaire, qui avait besoin d'un appareil portable capable d'enregistrer 2 x signaux ECG à 1 000 échantillons/s chacun (2 000 échantillons/s au total) en continu pendant 30 jours, afin de détecter les arythmies. Le projet présenté ici comprend le contrôle et la surveillance à distance de l'exploitation forestière. Le contrôle à distance se fait via des menus présentés sur un terminal série, soit sur un ordinateur, soit sur un téléphone mobile. Ce projet ne couvre pas la mesure ECG ou l'emballage ou la batterie requis pour le portable final.

Cette version haute vitesse/longue durée utilise Teensy 3.2, le module de dérivation Micro-SD Adafruit, une carte SD 16G SDHC classe 10 de qualité pour enregistrer les données et un module de communication Bluetooth pour le contrôle et la surveillance. Une version UNO/Mega2560 moins développée et plus lente de ce projet est également disponible. Bien que ce projet utilise un module de communication Bluetooth pour le contrôle et la surveillance de la journalisation, vous pouvez également utiliser des modules WiFi ou BLE.

Cette version, basée sur le Teensy 3.2, est capable de taux d'échantillonnage beaucoup plus élevés que la version UNO/Mega2560. En utilisant ce code, le Teensy 3.2 peut échantillonner et enregistrer deux échantillons ADC à> 30Khz avec une moyenne matérielle de plus de 4 échantillons et satisfait ainsi facilement l'exigence de 1000 échantillons/s ci-dessus. Le code prend en charge l'enregistrement de 100 fichiers.bin de 128 Ko chacun. A 30Khz qui couvre 29h 30min. A 1000 échantillons/sec, il couvre 37 jours. Le code peut facilement être étendu pour gérer plus de 100 fichiers, prolongeant ainsi la durée de l'exécution. À la fin de la course, vous aurez > 10 Go de données, des fichiers.bin et un fichier.met de métadonnées décrivant la course et les résultats. Le SDtoCSV.jar fourni (code source SDtoCSV_src.zip) peut être utilisé pour convertir les fichiers.bin en fichiers.csv sur votre ordinateur pour un traitement ultérieur. Les données résultantes sont > 60Gig. La version UNO/Mega2560 a une conversion.bin en.csv incluse dans le sketch Arduino, mais étant donné le volume de données enregistrées par la version Teensy, ce n'est pas un moyen efficace de faire la conversion.

Fournitures

Teensy 3.2 par PJRC

Carte de dérivation de carte MicroSD Adafruit+ ou similaire.

Carte MicroSD 16G SDHC classe 10 de bonne qualité, par ex. SanDisk.

Alimentation USB 5V

Une led avec une résistance 470R en série.

2 résistances 100R (offre une protection contre les dommages dus aux erreurs de câblage Tx/Rx)

Bluetooth Mate Silver OU l'un des modules décrits sur Arduino UNO/Mega Starter, contrôlé par Android/pfodApp

Étape 1: Construction

Construction
Construction

Téléchargez et installez Arduino IDE V1.8.9+ à partir de https://arduino.cc/en/Main/Software. Cette page Web contient des liens vers divers systèmes d'exploitation et un lien vers GettingStarted (https://arduino.cc/en/Guide/HomePage).

Téléchargez et installez Teensyduino (Support Teensy pour l'IDE Arduino). NOTEZ attentivement les instructions de première utilisation.

Sélectionnez Teensy 3.2 comme tableau et vérifiez que l'exemple de programme BLINK se charge et s'exécute.

Téléchargez et installez les bibliothèques suivantes:- millisDelay et SdFat (Un instantané local de la bibliothèque SdFat utilisée pour ces tests est ici.) et le pfodParser.zip (pour la classe pfodBufferedStream et pfodNonBlockingInput)

Téléchargez les fichiers zip de la bibliothèque, puis utilisez le menu IDE Arduino → Sketch → Inclure la bibliothèque → Ajouter une bibliothèque. ZIP pour installer les bibliothèques à partir des fichiers zip.

Décompressez le fichier Teensy32AnalogLogger.zip dans votre répertoire de croquis Arduino et programmez la carte Teensy 3.2 avec Teensy32AnalogLogger.ino (Version 0.01)

Câblez le Teensy 3.2, le module Bluetooth et le module de carte SD comme indiqué ci-dessus (version pdf)

Étape 2: Exécution du programme -- Test

Formatez d'abord votre carte SD en utilisant

La carte SD doit être vide pour démarrer l'enregistrement.

Pour les tests initiaux, vous n'avez pas besoin de connecter le module de communication, connectez simplement le module Teensy 3.2 + SD (avec une carte vide installée) à l'IDE Arduino via le câble série USB. Comme prévu, le sketch Teensy32AnalogLogger.ino utilise la connexion USB pour le contrôle et la surveillance. Voir l'étape d'enregistrement des données réelles ci-dessous pour l'utilisation d'un périphérique de communication pour le contrôle et la surveillance.

Modifiez le haut de l'esquisse Teensy32AnalogLogger.ino pour définir COM_SERIAL sur Serial, pour la sortie sur la connexion USB Teensy.

#define COM_SERIAL Série

Ensuite, téléchargez le croquis sur le Teensy 3.2

Ouvrez le moniteur série Arduino IDE à 115200 bauds (avec les deux ensembles NL et CR). Après quelques secondes le Teensy 3.2 affichera un menu de commandes

Ver:0.01 entrez l'une des commandes suivantes: ? - état actuel et métadonnéesi - initialiser les fichiersl - lister les fichiers>

Les ? cmd affiche les détails des paramètres actuels. (Voir le haut de Teensy32AnalogLogger.ino pour modifier ces paramètres) Les commandes doivent être terminées par un NL ou un CR ou les deux.

0:00:00.000 de 720:00:00.000

Broches d'échantillonnage: 16 17 Ordre des octets: Bits ADC Little-Endian: 10 Moyennes d'échantillonnage ADC sur: 4 Fréquence d'échantillonnage: 1000.00 Intervalle d'échantillonnage: 1000uS Échantillons par bloc: 127 Temps de remplissage du bloc: 127000uS Temps de remplissage d'un fichier: 9:01: 52.000 Temps de remplissage de TOUS les fichiers: 894:04:48.000 Latence SD max (inclut la fermeture/ouverture de fichiers): 0uS Latence max de fermeture/ouverture de fichiers: 0uS Nombre de blocs tampons: 28 Temps de remplissage de TOUS les tampons de blocs: 3556000uS Nombre max de tampons enregistré dans l'appel à storeSampleBuffers(): 0 Total des timers manqués: 0 Total des échantillons manqués jusqu'à présent: 0 Total des blocs écrits: 0 Total des échantillons écrits: 0 couvrant: 0:00:00.000 Fichier actuel:

Dans ce cas, la durée d'enregistrement actuelle est de 0 sur 720 heures (30 jours) demandées, échantillonnant D16/A2 et D17/A3 (voir ci-dessous pour les restrictions sur le choix des entrées ADC ci-dessous) 1000 fois par seconde. La durée d'exécution maximale peut aller jusqu'à 894 heures (37,25 jours). La boucle principale () peut être occupée jusqu'à 3,5 secondes (temps pour remplir TOUS les tampons de blocs) avant que tous les tampons disponibles ne soient remplis et que les échantillons ne commencent à être perdus. Les tampons enregistrés, etc. sont mis à jour au fur et à mesure que l'exécution progresse.

Insérez une carte SD vide, utilisez la cmd 'i' pour initialiser les 99 fichiers utilisés pour stocker les données. Les pré-initialiser ici réduit le délai de passage d'un fichier à l'autre et permet un échantillonnage plus rapide.

Initialisation de 99 fichiers

Création d'un nouveau fichier: log00.bin Temps écoulé: 368mS Création d'un nouveau fichier: log01.bin Temps écoulé: 520mS… Création d'un nouveau fichier: log98.bin Temps écoulé: 15660mS Création d'un nouveau fichier: log99.bin Temps écoulé: 15812mS

Vous pouvez ensuite utiliser la commande r pour démarrer une exécution de journalisation. L'exécution durera le temps demandé ou jusqu'à ce que la commande s soit utilisée pour l'arrêter. Vous pouvez également utiliser le ? cmd lors de la connexion pour obtenir des horaires et des nombres mis à jour. Voici une courte exécution arrêtée tôt à l'aide de la commande s.

ENREGISTREMENT DES DONNÉES …..

Ver:0.01 entrez l'une des commandes suivantes: ? - état actuel et métadonnées s - arrêter l'enregistrement des données

ENREGISTREMENT DES DONNÉES… Vérifiez avec ? commander

Durée d'exécution écoulée: 0:00:10.000 de 720:00:00.000 Durée d'exécution écoulée: 0:00:20.000 de 720:00:00.000…

Arrêt de la journalisation et suppression des fichiers inutilisés.

… Suppression du fichier inutilisé: log98.bin Suppression du fichier inutilisé: log99.bin

0:01:04.976 de 720:00:00.000

Broches d'échantillonnage: 16 17 Ordre des octets: Bits ADC Little-Endian: 10 Moyennes d'échantillonnage ADC sur: 4 Taux d'échantillonnage: 1000.00 Intervalle d'échantillonnage: 1000uS Échantillons par bloc: 127 Temps de remplissage du bloc: 127000uS Temps de remplissage d'un fichier: 9:01: 52.000 Temps de remplissage de TOUS les fichiers: 894:04:48.000 Latence SD max (inclut la fermeture/ouverture de fichier): 204uS Latence max de fermeture/ouverture de fichier: 0uS Nombre de blocs tampons: 28 Temps de remplissage de TOUS les tampons de blocs: 3556000uS Nombre max de tampons enregistré dans l'appel à storeSampleBuffers(): 1 Total des timers manqués: 0 Total des échantillons manqués jusqu'à présent: 0 Total des blocs écrits: 511 Total des échantillons écrits: 64832 couvrant: 0:01:04.832 Fichier actuel: log00.bin

ls:

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

ENREGISTREMENT DES DONNÉES TERMINÉ !

Ver:0.01 entrez l'une des commandes suivantes: ? - état actuel et métadonnées ** r - données d'enregistrement ADC ** non disponibles. Les données existent déjà ** i - initialiser les fichiers ** non disponible. Les données existent déjà l - liste les fichiers

LES DONNÉES ONT DÉJÀ ÉTÉ ENREGISTRÉES, vérifiez auprès de ?

Affichage LED

La LED connectée à D3 (avec D2 fournissant la connexion GND) s'allumera en continu si un échantillon est manqué et clignotera s'il y a une erreur. L'esquisse tente de continuer après des erreurs, mais peut ne pas le faire avec succès.

Étape 3: enregistrement de données réelles

Lors de l'enregistrement de données réelles sur de longues durées, il est plus pratique de connecter un module de communication aux broches D0/D1 et de contrôler et surveiller l'enregistrement à distance. Ici, un module Bluetooth Mate Silver a été utilisé avec ses paramètres par défaut, 115 200 bauds, pas de prise de contact matérielle (RTC, CTS), code PIN 1234.

Remarque: lorsque l'alimentation est appliquée au module Mate Silver, il passe en mode de configuration, le voyant rouge clignote rapidement pendant 60 secondes. Pendant ce temps, vous pouvez envoyer des $$$ via la connexion série au module pour le configurer mais vous ne pouvez pas connecter le module. Une fois que la led rouge clignote lentement, le module bluetooth acceptera les connexions.

Remplacez la définition COM_SERIAL dans Teensy32AnalogLogger.ino par la connexion série matérielle (D0/D1), Serial1

#define COM_SERIAL Série1

Après l'appairage avec l'ordinateur, un nouveau port COM a été créé sur l'ordinateur et CoolTerm peut être utilisé pour se connecter, contrôler et surveiller la journalisation. D'autres modules de communication connectés en série peuvent également être utilisés, tels que le WiFi ou le BLE, voir Arduino UNO/Mega Starter, contrôlé par Android/pfodApp pour plus de détails.

Vous pouvez également contrôler et surveiller la journalisation à partir de votre mobile Android à l'aide d'une application de terminal Bluetooth telle que l'application de terminal Bluetooth, ou à l'aide d'une application de terminal WiFi et TCP telle que TCP Telnet Terminal Pro, ou une mdoule Uart vers BLE et une application de terminal BLE telle que nRF UART V2

Étape 4: Restrictions sur le choix des entrées ADC

Restrictions sur le choix des entrées ADC
Restrictions sur le choix des entrées ADC

Le Teensy 3.2 possède deux modules matériels ADC distincts, ADC_0 et ADC_1, dans son microprocesseur afin qu'il puisse échantillonner deux entrées en même temps. Il dispose également d'un moyennage matériel intégré qui prend plusieurs échantillons ADC et les moyenne avant de transformer le résultat.

Il existe des restrictions sur les entrées pouvant être connectées à ADC_0, ADC_1. L'image Teensy3_1_AnalogCard-p.webp

En résumé:-Pour les lectures asymétriques, c'est-à-dire + Volts référencés à GND ADC_0 peut lire A0 à A9, A10, A11, A12, A14 ADC_1 peut lire A2, A3, A10, A13, A15 à A20 Si vous sélectionnez une broche que l'ADC ne peut pas lire, il renverra 0 (toujours)

Ce projet utilise A2, A3 qui sont chacun accessibles par ADC_0 ou ADC_1.

Étape 5: Conversion des fichiers.bin en fichiers.csv

Le Teensy32AnalogLogger.ino enregistre les échantillons en binaire dans les fichiers logxx.bin, c'est-à-dire log00.bin à log99.bin. Teensy32AnalogLogger.ino enregistre également un fichier log.met de métadonnées sur l'exécution.

Vous pouvez utiliser SDtoCSV.jar (code source SDtoCSV_src.zip) pour convertir les fichiers.bin en.csv pour un traitement ultérieur. Copiez les fichiers de la carte SD sur le disque dur de votre ordinateur avec au moins 70 Go d'espace libre et copiez le fichier SDtoCSV.jar dans le même répertoire. Ouvrez une fenêtre de commande dans ce répertoire et exécutez

journal java -jar SDtoCSV.jar

Si Java n'est pas installé sur votre ordinateur, installez-le à partir de www.java.com

SDtoCSV traitera le fichier log.met, puis chacun des fichiers logxx.bin disponibles dans le répertoire et produira un fichier.csv pour chaque.bin. Le fichier.csv a le numéro de séquence de l'échantillon suivi des deux lectures.

Un exemple de sortie de console pour une lecture de 2 adc échantillonnée 30303 fois/s est affiché ici, output.txt. Il illustre comment les échantillons manqués sont signalés. (Le doublement du nombre de tampons dans l'esquisse finale a corrigé ces échantillons manqués)

Conversion SD_Logging en CSV. Vérifiez SDtoCSV.log pour la progression et les messages d'erreur. Processing log00 Traités 256000 blocs Processing log01 Traités 256000 blocs… Journal de traitement25 Traités 256 000 blocs Journal de traitement26 Traités 256 000 blocs Journal de traitement27 Traités 256 000 blocs Échantillons manqués: 2715 Journal de traitement28 Traités 256 000 blocs… Log de traitement29 256000 blocs traités… Journal de traitement47 Traités 256 000 blocs Journal de traitement48 Traités 35935 blocs --- Traitement terminé

Un fichier journal plus complet, SDtoCSV.log, est ajouté à chaque exécution de SDtoCSV. Il inclut la sortie des métadonnées et tous les messages d'erreur. Ici, le nombre: 254 est le nombre de données stockées dans ce bloc, c'est-à-dire 127 échantillons x 2 lectures adc par bloc. MissedSamples est le nombre de paires de lectures manquées, c'est-à-dire de lignes dans la sortie.csv.

=== Fichier journal pour la conversion SD_Logging en CSV Samedi 13 juillet 13:19:51 AEST 2019 Pour voir les messages de progression sur la console, utilisez java -jar SDtoCSV.jar Nom du fichier de base 'log' Version des métadonnées: 0 (Little Endian) sampleInterval uS: 33 adcBits:10 adcAvgs:4 pinCount:2 Pins: 16, 17 samplesPerBlock:127 noBufferBlocks:28 duration mS:51649820 runTime demandé mS:106216704 maxBuffersUsed:32 Avertissement: dépasse le nombre de tampons disponibles (28). Certains échantillons peuvent être manquants. maxLatency uS:221476 Avertissement: dépasse le temps fourni par les blocs de tampon (117348uS). Certains échantillons seront manquants. maxFileOpenTime uS:20998 missingTimers:0 missingSamplesTotal:2715 totalBlocksWritten:12323935 totalSamplesWritten:1565139665 Traitement log00.bin Traitement 256000 blocs Traitement log01.bin Traitement 256000 blocs… Traitement de log26.bin Traitement de 256000 blocs Traitement de log27.bin !!! Bloc:57696 compte:254 manquéÉchantillons:2339 !!! Bloc: 57697 compte: 254 échantillons manqués: 376 traités 256 000 blocs --- Total des échantillons manqués: 2 715

Traitement de log28.bin Traitement de 256000 blocs

… Traitement log47.bin Traitement 256000 blocs Traitement log48.bin Traitement 35935 blocs --- Traitement terminé

Un exemple de fichier de sortie log00.csv est

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

Le compteur d'échantillons augmente d'un fichier à l'autre afin qu'il puisse être utilisé comme horodatage. S'il manque des échantillons, le compteur d'échantillons est incrémenté du compte manqué avant de sortir la ligne suivante de sorte que le compteur/horodatage reste précis pour les échantillons enregistrés.

Étape 6: Commentaires sur le code et les extensions

Le Teensy32AnalogLogger est une version fortement modifiée de l'exemple AnalogBinLogger de Bill Greiman dans sa bibliothèque SdFat Arduino. Ici, la bibliothèque a été réécrite pour fonctionner sur Teensy 3.2.

Teensy32AnalogLogger utilise timer0 pour définir l'intervalle d'échantillonnage. Le gestionnaire d'interruption pour timer0 démarre les deux conversions ADC. Un gestionnaire d'interruption pour le deuxième module ADC est appelé en permanence jusqu'à ce qu'ils soient tous les deux terminés, généralement le premier module ADC démarré ADC_0 se terminera avant le second, de sorte que le gestionnaire d'interruption n'est appelé qu'une seule fois. Le gestionnaire d'interruption ADC_1 enregistre les échantillons dans un tampon de données.

Dans la boucle principale (), le storeSampleBuffer () enregistre tous les tampons pleins sur la carte SD et recycle les tampons dans la file d'attente de tampon vide. La grande quantité de RAM disponible sur le Teensy 3.2 signifie qu'un grand nombre de tampons peuvent être alloués et donc storeSampleBuffer() n'a pas besoin d'être appelé souvent. Cela laisse le temps à la boucle principale() de faire d'autres tâches, comme traiter les commandes et envoyer la sortie.

Rallonges

Bien que ce projet fonctionne comme un enregistreur de données à grande vitesse, pour un portable complet, il doit encore être emballé et un système de batterie et des capteurs ECG fournis. En plus de cela, certaines extensions devraient être envisagées.

  1. Ajoutez un contrôle et une surveillance en temps réel de la forme d'onde échantillonnée via pfodApp en utilisant la fonction de traçage de pfodApp pour afficher des instantanés de la forme d'onde
  2. Étendre les numéros de fichier au-delà de 99 pour des échantillonnages plus longs
  3. Échantillonnez plus de 2 entrées. Étant donné que le Teensy 3.2 possède deux modules ADC, vous pouvez modifier le code pour ajouter des entrées supplémentaires par paires afin de maximiser la fréquence d'échantillonnage.
  4. Ajoutez une surveillance de la batterie pour suivre la charge de la batterie. Le Teensy 3.2 utilise environ 1100mAhrs sur 24h, y compris le module Bluetooth et SD, mais à l'exclusion du module capteur
  5. Ajoutez un double circuit d'alimentation de batterie pour permettre les changements de batterie sans interrompre l'enregistrement.

Conseillé: