vendredi 9 janvier 2015

Mesurez votre rythme cardiaque avec Arduino

Aujourd'hui, je vous livre un compte-rendu de mes récentes expériences de photopléthysmographie, une méthode qui consiste à détecter les battements du coeur en mesurant le volume de sang dans les tissus au moyen d'une source de lumière et d'un détecteur.

Comme matériel, j'ai utilisé une LED infrarouge (TSAL7400) et un phototransistor sensible à l'infrarouge (TOPS-050), un double amplificateur opérationnel (LM358), un transistor 2N3904, mon fidèle Arduino Uno, et quelques condensateurs et résistances que j'énumérerai de façon plus détaillée plus loin dans cet article.

Mon point de départ a été ce tutoriel publié par MAKE magazine.  J'ai commencé par reproduire le plus exactement possible le circuit qui y était proposé, pour en arriver à une absence totale de résultats:  pas la moindre pulsation cardiaque en vue.  Conclusion:  ou bien ce circuit correspondait mal au matériel que j'utilisais, ou bien j'étais récemment décédé, sans que qui que ce soit n'ait pris la peine de m'en avertir!


L'article de du magazine MAKE propose de la photopléthysmographie par réflexion:  la source de lumière (la LED infrarouge) et le détecteur (le phototransistor) sont placés côte à côte.  Lorsqu'on appuie cette paire émetteur-récepteur sur la surface de la peau, au bout d'un doigt, la quantité de rayonnement infrarouge réfléchi vers le récepteur est supposé changer en fonction du volume de sang qui circule sous la peau.

Bon...je ne sais pas si c'est parce que ma peau est plus réfléchissante qu'elle le devrait, mais je n'ai rien obtenu de probant en procédant de cette façon.

Par contre, j'ai obtenu des résultats beaucoup plus intéressants en plaçant la source de lumière (la LED infrarouge) et le détecteur de lumière (le phototransistor) de part et d'autre de mon doigt.  De cette façon, le détecteur mesure maintenant le rayonnement qui a traversé le doigt.  Plus le volume de sang est élevé dans les vaisseaux, plus le doigt est opaque et absorbe une grande quantité de la lumière transmise par la LED:  c'est de la photopléthysmographie par transmission.



La lumière ambiante et les mouvements du doigt par rapport à la paire émetteur-détecteur peuvent facilement fausser les résultats, j'ai donc construit une petite boîte de forme étroite et allongée dans laquelle j'insère un doigt.  La LED infrarouge et le phototransistor se situent au fond de la boîte, de part et d'autre de l'extrémité de mon doigt.

J'ai aussi constaté que mon phototransistor avait une meilleure sensibilité si je le couplait à une résistance de 10K plutôt qu'à une résistance de 39K.  C'est probablement dû au fait que mon modèle de phototransistor n'est pas identique à celui qui était proposé dans le tutoriel de MAKE.


(Plusieurs personnes affirment avoir eu du succès en utilisant une photorésistances plutôt qu'un phototransistor: je n'ai pas essayé.)

À cette étape, j'obtenais un signal tout à fait satisfaisant:  mes pulsations cardiaques provoquaient un changement de tension très net à la sortie du circuit (le graphique ci-dessous représente 5 secondes de pulsations cardiaques):


 Je me suis malgré tout interrogé sur deux aspects du circuit:

1)  Le tutoriel de MAKE magazine proposait l'utilisation d'un LM324, qui comporte 4 amplificateurs opérationnels.   Traitez-moi de pingre si vous voulez, mais je ne vois pas tellement l'intérêt d'installer un circuit intégré comportant deux fois plus d'amplificateurs que nécessaire, et de laisser la moitié de ses pins inutilisées.  J'ai donc essayé avec un LM358, et ça a parfaitement fonctionné.

2)  Le tutoriel spécifiait que les deux condensateurs de 1 µF devaient être au tantale, mais était-ce bien nécessaire?  Je les ai remplacé par des condensateurs électrolytiques, pour constater que la qualité des résultats en souffrait:  fréquemment, de façon aléatoire, la tension chutait pendant une pulsation, ce qui pouvait donner l'illusion qu'il y avait eu deux pulsations distinctes plutôt qu'une seule.  Alors j'ai gardé les condensateurs au tantale.



Voici donc le schéma du circuit que j'ai finalement utilisé (cliquez-le pour l'agrandir):


Attention, plusieurs des composants ne sont pas réversibles:
  • LED infrarouge: la tige la plus courte à GND
  • Phototransistor:  la tige la plus longue à GND
  • Condensateurs au tantale:  le signe + indique l'armature +
  • Transistor 2N3904:

Voici un premier sketch qui enregistre les données brutes dans le moniteur série pendant une durée de 5 secondes.




Ces données sont utiles pour, d'une part, vérifier le bon fonctionnement du circuit et, d'autre part, définir un seuil qui servira de critère pour détecter le début d'une pulsation. 



J'ai copié ces données à partir du moniteur série de l'IDE Arduino, et je les ai copiées dans un tableur pour les mettre en graphique.  J'ai ainsi pu constater que la valeur alternait entre un peu moins de 600, puis un peu plus de 700.  J'ai donc décidé qu'une pulsation commence au moment où la valeur monte en traversant un seuil de 650.



À partir de cette information, j'ai mis au point un deuxième sketch qui, chaque fois qu'une pulsation est détectée, affiche dans le moniteur série le rythme cardiaque en pulsations par minute.



Voici le résultat:



Conclusion:  mon rythme cardiaque est un peu rapide.  Il faut que je songe sérieusement à diminuer ma consommation de café...

Yves Pelletier (Twitter: @ElectroAmateur)

21 commentaires:

  1. Bonjour.

    Pourriez vous mesurer le pouls en mesurant le champs éléctrique du poignet/doigs

    Merci de réaliser cet exercice si possible

    RépondreSupprimer
  2. Bonjour,

    Pourriez vous schématiser le montage svp ?
    J'aimerais beaucoup reproduire ce projet en étude.

    RépondreSupprimer
    Réponses
    1. Le schéma du circuit figure déjà dans l'article.

      Supprimer
    2. mon prof m'a dit que le schéma était nul et qu'un électronicien n'aurait jamais fais ce genre de schéma

      Supprimer
    3. Cher Unknown, veuillez demander à votre prof de préciser ce qu'il ne comprend pas dans ce schéma, et je m'efforcerai de le vulgariser à son intention.

      Supprimer
    4. Normal, c'était un prof de latin.

      Supprimer
    5. Ah oui je me suis malencontreusement trompé...

      Supprimer
  3. Ce code est-il valable en utilisant sauf le capteur ECG (les électrodes)??

    RépondreSupprimer
  4. Salut et merci pour le retour d'expérience.
    Le tuto de Makezine utilise une photodiode et non un phototransitor (en tout cas d'après le schéma électronique). C'est sans doute pour ça que ça ne marchait pas pour toi.
    Pour le bruit du signal, je pense qu'il est possible de le filtrer à l'aide d'un filtre passe-base. A voir à quelle fréquence ce trouve le bruit.
    Ciao

    RépondreSupprimer
  5. BONJOUR on a utiliser les memes composants mais on n'a pas obtenue une courbe bien filtrer comme vous

    RépondreSupprimer
  6. salut.je travail sur un projet qui consiste a réaliser un bracelet Electronique.sur ceux j utilise un pulse sensor mais depuis deux jours j'ai du ma a ecrire l'algorithme qui me permettre de prendre le battement entre les pics.
    email.ahouansou.xavier19@gmail.com

    RépondreSupprimer
  7. salut Yves .moi je travail sur un projet ni porte sur la conception d'un bracelet de mesure de fréquence cardiaque .... J'aimerais bien je tu m'aides un peu pour la conception du capteur

    RépondreSupprimer
    Réponses
    1. Slt unknown moi aussi je travail sur ce projet je sais pas si tu peux m'aider

      Supprimer
    2. Salut j'ai le même signale carré avec le mémé montage que lui mais sans mettre un doigt entre la diode et le phototransistor ...

      Supprimer
  8. Quelqu'un pourrait-il m'expliquer à quoi servent chacun des blocs ? J'ai bien repéré 2 passe-haut passifs et un passe pas actif mais je ne comprend pas ce que fait l'autre ampli op.

    RépondreSupprimer
  9. quel est le système d'affichage utilisé?

    RépondreSupprimer
    Réponses
    1. "J'ai copié ces données à partir du moniteur série de l'IDE Arduino, et je les ai copiées dans un tableur pour les mettre en graphique. "

      Supprimer
  10. Bonsoir,
    Serait-il possible de savoir à quoi correspond le +200 et pourquoi l'avoir mis dans cette ligne de code s'il vous plaît :
    if (tempsDetection > (tempsPrecedent + 200)){

    RépondreSupprimer
  11. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer