Abstract—L’article suivant fournit un aperçu de la construction d’un prototype conçu pour représenter le rythme cardiaque sur une diode électroluminescente (LED). L‘objet a été conçu dans les locaux de Télécom Bretagne, en collaboration avec les étudiants de L’ESAB. L’objectif est de déterminer les événements cardiaques via un récepteur de pulsations, et le signal recueilli doit être analysé et traité par un microcontrôleur Arduino MINI. Dans les lignes suivantes, nous détaillerons les mesures prises pour atteindre l’objectif du projet. En commençant par une introduction dans laquelle les bases sont discutées pour analyser les battements, suivis par la mise en œuvre technique ainsi que les matériaux utilisés pour fabriquer le dispositif. Enfin, la conclusion des travaux ainsi que des recommandations pour de futures améliorations apportées au prototype inclus sont abordées
I. INTRODUCTION
Le signal d’impulsion cardiaque qui sort d’un est une fluctuation de la tension analogique, et il a une forme d’onde prévisible . La représentation de l’onde de pouls est appelé photopléthysmogramme ou PPG. Le Capteur de Pouls Amped, amplifie le signal cardiaque brut, et normalise l’onde de pouls autour de V / 2 (point médian de la tension). . Le Capteur de Pouls Amped répond aux changements relatifs à l’intensité lumineuse. Si la quantité de lumière incidente sur le capteur reste constante, la valeur du signal restera à (ou à proximité) 512 (milieu de gamme ADC). Plus de lumière, plus le signal monte. Moins de lumière, le contraire. La lumière de la LED verte qui represente les changements de capteurs pendant chaque impulsion.
L’objectif est de trouver des moments successifs et instantanés du rythme cardiaque et mesurer le temps entre eux. En suivant la forme prévisible et modèle de la vague PPG, il est possible de faire exactement cela.
Lorsque le cœur pompe le sang dans le corps, à chaque battement il y a une vague d’impulsion (un peu comme une onde de choc) qui se déplace le long de toutes les artères jusqu’aux extrémités de tissu capillaire où le capteur d’impulsion est fixé. Le sang circule réellement dans le corps beaucoup plus lent que l’onde de pouls se déplace. Une augmentation rapide à la hausse de la valeur du signal se produit que l’onde de pouls passe sous le capteur, le signal retombe vers le point normal. Parfois, l’encoche dichroïque (pic vers le bas) est plus prononcé que d’autres, mais en général, le signal s’installe au bruit de fond avant la prochaine vague d’impulsion lave travers. Depuis la vague se répète et prévisible, nous pourrions choisir ne importe quel élément reconnaissable comme un point de référence, dire le pic, et de mesurer la fréquence cardiaque par faire des mathématiques sur le temps entre chaque pic. Voir l’image ci-dessous
II. IMPLENTATION TECHNIQUE
Pour faire le pouls cardiaque détecteur prototype, ont été utilisés les composants suivants :
-
Une LED verte (Sortie 13).
-
Une LED blanche (Sortie 5).
-
Un circuit intégré Arduino MINI.
-
2 Piles de 3Volts connectées en série pour l’alimentation du circuit.
-
Un capteur de pouls Amped(TTL-232r-5V)
Le capteur de pulses est connecté au microcontrôleur Arduino, qui a été programmé avec le code comme indiqué ci-dessous :
Tout d’abord, il est important d’avoir un taux d’échantillon disponible avec résolution suffisamment élevée pour obtenir une mesure fiable de la synchronisation entre chaque battement. Pour ce faire, nous avons mis en place Timer2, une minuterie de 8 bits, de sorte qu’il effectue une interruption toutes les deux millisecondes. Ce qui nous donne un taux de 500 Hz de l’échantillon, et beat-pour-beat résolution temporelle de 2 ms.
void interruptSetup(){ TCCR2A = 0x02; TCCR2B = 0x06; OCR2A = 0x7C; TIMSK2 = 0x02; sei(); }
Les paramètres de registre ci-dessus indiquent Timer2 pour passer en mode CTC, et comptent jusqu’à 124 (0x7C) encore et encore et encore. Un diviseur de 256 est utilisé pour obtenir le bon moment pour qu’il prenne deux millisecondes à compter jusqu’à 124. Un indicateur d’interruption est réglé chaque fois Timer2 atteint 124, et une fonction spéciale appelée un programme d’interruption (ISR) que nous avons écrit est exécuté au moment suivant possible, peu importe ce que le reste du programme est en train de faire. sei () assure que les interruptions mondiaux sont activés.
Ainsi, lorsque l’Arduino est sous tension et en cours d’exécution avec capteur tactile Amped branché sur la broche analogique 0, il lit la valeur de capteur toutes les 2 ms et cherche l’instant du battement de cœur. Voici comment ça fonctionne:
ISR(TIMER2_COMPA_vect){
Signal = analogRead(pulsePin);
sampleCounter += 2;
int N = sampleCounter – lastBeatTime;
Cette fonction est appelée toutes les 2 millisecondes. La première chose à faire est de prendre une lecture analogique du capteur d’impulsions. Ensuite, on incrémente la variable sampleCounter. La variable sampleCounter est ce que nous utilisons pour garder une trace du temps. La variable N permettra d’éviter le bruit après.
Ensuite, nous suivons les valeurs les plus élevées et exclusive de la vague PPG, pour obtenir une mesure précise de l’amplitude.
if(Signal < thresh && N > (IBI/5)*3){
if (Signal < T){
T = Signal;
}
}
if(Signal > thresh && Signal > P){
P = Signal;
}
Les variables P et T designent les valeurs maximales et minimales, respectivement. La variable thresh est initialisée à 512 (milieu de gamme analogique) et des changements lors de l’exécution de suivre un point à 50% d’amplitude comme nous le verrons plus tard. Il ya une période de temps de 3/5 IBI qui doit se écouler avant T est mis à jour comme un moyen d’éviter le bruit et les fausses lectures de l’encoche dichroïque.
Maintenant, permet de vérifier et voir si nous avons une impulsion.
if (N > 250){ if ( (Signal > thresh) && (Pulse == false) && (N > ((IBI/5)*3) ){ Pulse = true; digitalWrite(pulsePin,HIGH); IBI = sampleCounter - lastBeatTime; lastBeatTime = sampleCounter;
Avant nous considérons même à la recherche d’un battement de cœur, un certain minimum de temps doit passer. Cela permet d’éviter le bruit haute fréquence. 250 millisecondes minimum N impose une limite supérieure de 240 BPM. Lorsque la forme d’onde depasse la valeur de battement, et 3/5 de la dernière IBI a passé, nous avons une impulsion! C’est alors le moment pour définir le drapeau d’impulsion et allumer le voyant pulsePin. Ensuite, nous calculons le temps écoulé depuis le dernier temps pour obtenir IBI, et d’actualiser les lastBeatTime.
Le bit suivant est utilisé pour se assurer que nous commençons avec une valeur de BPM réaliste au démarrage.
if(secondBeat){
secondBeat = false;
for(int i=0; i<=9; i++){
rate[i] = IBI;
}
}
if(firstBeat){
firstBeat = false;
secondBeat = true;
sei():
return;
}
Le booléen Firstbeat est initialisée comme vrai et secondBeat est initialisée comme faux au démarrage, donc la première fois que nous trouvons un battement et obtenons aussi loin dans l’ISR au conditionnel Firstbeat. Cela va finir par ne pas prendre en compte la première lecture IBI. La seconde fois, nous pouvons faire confiance (plus ou moins) l’IBI, et l’utiliser pour ensemencer le rate[] tableau afin de commencer avec un BPM plus précis. Le BPM est dérivée d’une moyenne des 10 dernières valeurs d’IBI, la nécessité de graines.
word runningTotal = 0;
for(int i=0; i<=8; i++){
rate[i] = rate[i+1];
runningTotal += rate[i];
}
rate[9] = IBI;
runningTotal += rate[9];
runningTotal /= 10;
BPM = 60000/runningTotal;
QS = true;
}
}
Tout d’abord, on récupère une grande variable runningTotal, pour recueillir les IBIs, alors le contenu de rate[] sont décalés plus et ajoutés à runningTotal. La plus ancienne IBI (il ya 11 battements) tombe sur la position 0, et l’IBI frais se met en position 9. Ensuite, c’est un processus simple pour la moyenne de la gamme et de calculer le BPM. La dernière chose à faire est de mettre le drapeau de QS (abréviation de Quantified Self). De sorte que le reste du programme sait que nous avons trouvé le rythme. C’est tout pour la chose à faire lorsque nous trouvons le rythme.
Il y a une couple d’autres bouts qui doivent attacher avant que nous aurons terminé, comme trouver le pas-beat.
if (Signal < thresh && Pulse == true){
digitalWrite(13,LOW);
Pulse = false;
amp = P – T;
thresh = amp/2 + T;
P = thresh;
T = thresh;
}
Pulse a été déclaré vrai lors de la montée vers le haut dans le signal de capteur d’impulsion quand nous avons trouvé le rythme, ci-dessus, de sorte que lorsque le signal passe thresh descendant, nous pouvons comprendre que l’impulsion est terminée. Un peu de ménage dans l’élimination pulsePin et le booléen d’impulsion. Puis l’amplitude de l’onde qui vient de passer est mesurée, et foule est mis à jour avec la nouvelle marque de 50%. P et T sont remis à la nouvelle thresh. L’algorithme est maintenant amorcée et prêt à trouver le temps suivant.
if (N > 2500){
thresh = 512;
P = 512;
T = 512;
firstBeat = true;
secondBeat = false;
lastBeatTime = sampleCounter;
}
S’il n’y a aucun événement de battement pour 2,5 secondes, variables utilisées pour trouver le rythme cardiaque sont réinitialisés aux valeurs de démarrage. Une sorte de soft-reset doux. C’est la fin de l’ISR.
En utilisant Timer2 interrompre, nos algorithme de recherche fonctionnent « en arrière-plan » et met à jour automatiquement les valeurs des variables.
Une fois le programme compilé, nous telechargeons l’executable sur l’arduino. Pour ce faire, nous devons passer par un convertisseur entre le cable lié au port serie du PC d’une part et l’arduino d’autre part. Le montage à effectuer coorespond au schema ci-dessous:
Figure2: Montage du circuit pour le telechargement de l’executable
Quand l’executable est mis sur l’arduino, nous pouvons enfin tester notre disposible en mesurant notre rythme cardiaque avant et apres avoir couru. Le resulat est coherent avec la prevision:
Figure3: Montage du dispositif avec une alimentation sur 2 piles montées en serie
Figure4: Test de simulation en mettant le capteur au doigt
III. MONTAGE ESTHETIQUE
Le tout doit loger dans un bracelet de poignet de telle sorte que les leds soient visibles et le capteur en contact avec la peau. Un schema a été defini d’abord à la main avant d’etre schematiqué avec un editeur d’image:
Figure5: Schema prevu pour le bracelet
Figure6: Schéma conceptuel du bracelet et liaison des fils