Construire un Moniteur de Fréquence Cardiaque Précis avec une Photorésistance et Arduino
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Digilent OpenScope MZ | 1 | Pour visualiser le signal (oscilloscope) |
| Arduino UNO | 1 | |
| Amplificateur opérationnel quadruple TI (ex: LM324) | 1 | Usage général |
| Comparateur rapide TI (ex: TLV3501) | 1 | Simple, haute vitesse |
| Potentiomètre multi-tours 10 kΩ (25 tours) | 2 | Pour réglages précis |
| Potentiomètre simple tour 100 kΩ | 1 | Multi-tours recommandé pour réglage fin |
| Potentiomètre simple tour 10 kΩ | 1 | |
| Condensateur 100 µF | 1 | |
| Condensateur 100 nF | 1 | |
| Résistance 10 kΩ | 2 | Ou une seule 20 kΩ |
| Résistance 4,75 kΩ | 1 | |
| Résistance 82 kΩ | 1 | Ou deux potentiomètres 100 kΩ réglés à 82 kΩ |
Applications et services en ligne
- Arduino IDE – Programmation
- Digilent WaveForms Live – Visualisation du signal en temps réel
À propos du projet
Introduction
Ce projet s'inspire d'une vidéo YouTube de CapitanoRed où l'auteur réalise un moniteur cardiaque à photorésistance affiché sur oscilloscope. J'ai voulu reproduire le montage et y ajouter un Arduino pour calculer et afficher la fréquence cardiaque, tout en gardant la visualisation du signal sur oscilloscope.
Quand le cœur se contracte, les fluctuations de pression artérielle sont détectables – c'est ce qu'on sent comme pouls. Dans les zones où la peau est fine, ces pulsations créent de légères variations de lumière traversant le tissu. Nos yeux ne les perçoivent pas, mais les photorésistances, elles, y sont sensibles.
Une photorésistance varie sa résistance selon l'intensité lumineuse. Bien que la variation soit faible pour des changements subtils, elle peut être amplifiée par quelques amplificateurs opérationnels.
Principes de fonctionnement
La photorésistance forme un diviseur de tension avec une résistance de 20 kΩ. Plus la lumière augmente, plus la tension au point milieu augmente.
- Amp1 (premier AOP) : Filtre passe-bas, élimine le bruit haute fréquence.
- Amp2 (deuxième AOP) : Amplificateur inverseur, maximise le signal filtré.
- Amp3 (troisième AOP) : Crée une masse virtuelle à 2,5 V, centre le signal pour un swing maximal 0–5 V.
Le signal passe ensuite par un comparateur (Cmp) qui sort un niveau haut (5 V) ou bas (0 V) – idéal pour les entrées numériques de l'Arduino. Mais le signal brut présente un « notch dicrotique » (pic secondaire) et du bruit, ce qui ferait déclencher le comparateur plusieurs fois par battement.
La solution : hystérésis (comparateur asymétrique). Une boucle de rétroaction modifie la tension d'entrée positive, créant deux seuils distincts : un pour la montée (Vh), un pour la descente (Vl). Le comparateur ne déclenche qu'une fois par battement, après le notch dicrotique.
Voir le document Texas Instruments sur le conditionnement de signal avec hystérésis (pages 5 et 7).
Préparation de la photorésistance
Utilisez un revêtement transparent (gaine thermorétractable claire) pour protéger la photorésistance. Au minimum, isolez complètement les pattes pour éviter tout contact avec la peau – les tensions corporelles sont dans la même gamme que le signal détecté.
Réglage du moniteur cardiaque
Pour le potentiomètre R7 (gain de l'ampli), commencez avec ~375 Ω côté filtre. Ajustez pour maximiser l'amplitude sans saturation (écrêtage). Observez sur WaveForms Live.
Utilisez des potentiomètres multi-tours pour R3 et R4 (seuils comparateur). R5 : résistance 10–100 kΩ mesurée précisément. Un tableau Excel (fourni) calcule R3 et R4 selon R5, Vl et Vh.
R8 et R9 (masse virtuelle) peuvent être remplacés par un potentiomètre, curseur sur l'entrée positive de l'AOP, ajusté pour 2,5 V sortie (voltmètre ou OpenScope).
Visualisation dans WaveForms Live
Connectez la canal 2 (fil bleu) de l'OpenScope à la sortie de l'Amp2, masse sur breadboard. Dans WaveForms Live :
- Time : 1 s
- Trigger : OFF
- Osc Ch 1 & 2 – Offset : 2,5 V
- Samples : verrouiller et entrer 1000 (mise à jour ~4 s) ou 2000 (un battement par capture)
Appuyez sur RUN, placez votre doigt sur la photorésistance (premier joint de l'index recommandé), restez immobile. Ajustez le gain si nécessaire.
Réglage des seuils du comparateur
Arrêtez la capture sur une forme d'onde représentative. Activez CURSORS → Type « Voltage », les deux canaux sur « Osc 2 ». Placez un curseur près du pic, l'autre sous le notch dicrotique. Relevez les deux tensions (Vl = plus petite, Vh = plus grande). Entrez-les dans le tableau Excel avec la valeur de R5 pour obtenir R3 et R4.
Code Arduino
Le code compte les impulsions du comparateur (largeur 200–800 ms) et calcule la fréquence cardiaque (bpm) sur une moyenne glissante de 15 secondes pour filtrer les ratés dus aux mouvements.
#define INT0 3
float frequency, freqAvg, total;
long timeCount, pulseStart;
int counter, inputPin = 3;
boolean low;
void setup() {
attachInterrupt(digitalPinToInterrupt(INT0), intrruption, CHANGE);
counter = 0; timeCount = 0; frequency = 0; low = false;
Serial.begin(9600);
total = 15;
}
void loop() {
timeCount = millis();
while (millis() - timeCount < 5000) {
frequency = counter;
}
if (frequency > 3) {
total += frequency;
total -= freqAvg;
freqAvg = total / 3;
}
showHR();
counter = 0;
}
void intrruption() {
if (digitalRead(3) == 0) { fallDetect(); low = true; }
else if (digitalRead(3) == 1) { widthCheck(); }
}
void fallDetect() { pulseStart = millis(); }
void widthCheck() {
long pulseEnd = millis();
if ((pulseEnd - pulseStart > 200) && (pulseEnd - pulseStart < 800) && low) {
counter++; low = false;
}
}
void showHR() {
Serial.print("Heart rate = ");
Serial.println(freqAvg * 12); // 5s fenêtre → ×12 pour bpm
}
Améliorations futures
- LED intégrée : Fournir une source lumineuse constante (comme les oxymètres de pouls ou capteurs de téléphone). Tests prometteurs avec une LED rouge.
- Algorithme auto-ranging : L'Arduino détecterait les pics/creux, calculerait les seuils optimaux, les appliquerait via potentiomètres numériques, puis utiliserait l'interruption sur pin numérique pour le comptage précis.
Code source
comparator calcs.xlsx– Tableur pour calculer R3/R4 (seuils Vl/Vh, résistance R5)Arduino Heart Rate Counter– Sketch complet (ci-dessus)
Schémas
Fichier Fritzing : hr_monitor_tnffXlVQQV.fzz
Processus de fabrication
- Défibrillateur externe : histoire, conception et fabrication
- Cœur artificiel : technologie, histoire et perspectives futures
- Valves cardiaques artificielles : types, histoire et innovations futures
- Détection d'éclairs avec Raspberry Pi et AS3935 : Guide pratique
- Lire les pulsations cardiaques avec Windows 10 IoT Core sur Raspberry Pi – Guide étape par étape
- Système de surveillance cardiaque à distance avec alertes AWS IoT
- Mesure de la signature magnétique du noyau d'un atome unique
- Capteurs de fréquence cardiaque intégrés dans les vêtements intelligents : surveillance portable fiable
- Protégez votre cœur : habitudes de vie essentielles pour le mois de la santé cardiaque en février