Photopléthysmographe

La -attention- photopléthysmographie est une technique simple et non invasive permettant, entre autre, de pouvoir visualiser l'afflux sanguin des vaisseaux capillaires. Notre détecteur est composé d'une LED infrarouge ainsi que d'une photodiode sensible aux mêmes fréquences lumineuses.
La lumière émise par notre LED est plus ou moins réfléchie en fonction de la circulation du sang (dans un doigt). Ainsi, il est possible non seulement de récupérer l'information sur le rythme cardiaque mais également un cardiogramme relativement précis.

setup

heartbeat

Sommaire

  1. Le Hardware
    1. LED et photoDiode IR
    2. Convertisseur courant à tension
    3. Filtre passe-haut et offset
    4. Suiveur de tension
    5. Amplificateur de tension et filtre passe-bas
  2. Le Software
    1. Arduino
    2. Python
  3. Le mot de la fin
  4. Downloads

Le Hardware

sketch

LED et photoDiode IR

Lorsque notre photoDiode réceptionne la lumière IR émise par notre LED, un courant électrique s'établira. La majeure partie de cette lumière est constante dans le temps dû à la réflexion de celle-ci vers la photoDiode par les différentes matières organiques de notre doigt (peau, os...). Une autre partie de cette lumière réceptionnée est variable dans le temps et elle est due à la réflexion de celle-ci par l'afflux sanguin. C'est ce signal variable (très faible) qu'il s'agira d'amplifier ainsi que de filtrer afin de pouvoir tracer notre cardiogramme.

sketch01

Convertisseur courant à tension

La première étape est de convertir le courant établit par notre photoDiode en une tension interprétable par notre microControlleur. Notez que la tension de sortie est liée aux deux parties de notre signal (constante et variable). Il nous faudra donc filtrer la partie constante avec un filtre passe-haut par la suite.

sketch02

La fonction reliant le courant d'entrée $I_e$ et la tension de sortie $V_s$ est donnée par:

$V_s = -I_e R_2$

En situation, notre photoDiode établi un courant de quelques micro Ampère (1 à 4). Ainsi, le choix d'une résistance d'un Mega Ohm était imposée pour obtenir une tension de sortie dans la plage utilisée par notre microControlleur (0-5v).

Filtre passe-haut et offset

Comme énoncé précédemment, il nous faut filtrer la composante continue du signal qui ne contient pas d'information utile pour notre cardiogramme. L'ajout d'un offset nous permet de fixer la tension de repos. Cette tension a été choisie en fonction de la forme générale d'un cardiogramme. Les amplitudes positives d'un cardiogramme sont bien plus grandes que les amplitudes négatives. Ainsi, en fixant cette tension aux alentour de 1.25V, il nous sera possible d'utiliser le full-scale du microControlleur (0-5v).

sketch03

La fonction reliant la tension d'entrée $V_e$ et la tension de sortie $V_s$ est donnée par:

form02

La fréquence de coupure a été choisie extrêmement basse afin de perdre le moins possible d'informations quand au signal d'origine. En effet, la fréquence moyenne d'un coeur humain se situe à environ 1Hz (60Bpm).

Suiveur de tension

Un montage suiveur de tension est utilisé pour la séparation entre l'étage du filtre passe-haut et offset ainsi que l'étage d'amplification du signal. En effet, l'impédance d'entrée du suiveur (borne 1) est très élevée alors que son impédance de sortie (borne 3) est très faible. Ceci nous permet de créer une source de tension en borne 3 qui suit la tension présente en borne 1.

sketch04

Amplificateur de tension et filtre passe-bas

A ce point de notre circuit, la tension d'entrée du montage est composée de l'offset (1.25v) ainsi que d'une tension variable (très faible) décrite par l'afflux sanguin dans notre doigt. C'est cette tension variable qu'il nous s'agira d'amplifier. C'est pourquoi la tension d'entrée est comparée à une tension fixe de 1.25v. On remarquera que notre tension fixe a été réalisée avec des composant discret et qu'ainsi elle n'est pas forcément égale à exactement 1.25v. Les tolérances des composants utilisés (résistances) sont de 1%. Ainsi, dans le pire des cas, la différence entre la tension d'offset et la tension de référence est de:

form03

Ce qui correspond à une tension de sortie (après amplification) de 4V (-1.5V dans le cas inverse) au repos (sans afflux sanguin). Ceci montre bien les problèmes de design que l'on peut rencontrer en circuit discret. Bien heureusement, nos résistances ne sont pas autant éloignées de leurs valeurs annoncées. Ainsi la tension de repos en sortie varie de seulement quelque mV autour de notre offset (1.25V).

sketch05

La relation entre la tension d'entrée et de sortie est donnée par:

form04

G est le gain de notre amplificateur. On le choisit en fonction de la variation de la tension en sortie du suiveur en situation (quelques dizaines mV) afin d'obtenir le full-scale en entrée du microControlleur (0-5v). Il faut également prêter attention à la valeur du condensateur qui définira la coupure des hautes fréquences parasites. Dans notre configuration, la fréquence de coupure est d'environ 30Hz et a été choisie en fonction de la fréquence maximal contenue dans notre signal (link).

Le Software

Arduino

Le microControlleur est utilisé pour l'interprétation du signal via une entrée analogique puis transmet l'information par USB à une machine plus puissante pour l'affichage de ce signal. Une routine d'interruption réglée à 200Hz s'occupe de prendre la mesure continuelle du signal.

code Arduino

void setup(){ 
    TimerSetup();     
}
void loop(){
}

void TimerSetup(void){
    noInterrupts();
    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1 = 55536;            // preload timer 65536-16MHz/8/200Hz
    TCCR1B |= (1 << CS11);    // prescaler : 8
    TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
    interrupts();             // enable all interrupts
}
ISR(TIMER1_OVF_vect){
    int data = analogRead(0); // int : two bytes
    Serial.write(data >> 8);  // send first byte
    Serial.write(data);       // send second byte
    TCNT1 = 55536;            // reset intterupt
}

Python

Le langage de programmation python est utilisé pour l'affichage de l'User Interface. Python nous permet d'établir la liaison USB avec notre microControlleur en une simple ligne de commande:

arduino = serial.Serial('COM3',250000,timeout=.1)
data = arduino.read(2)

userInterface

Le mot de la fin

Le but principal de ce dispositif était de réaliser le traitement du signal en composants discrets. On remarque que le signal traité par cette méthode n'est pas exempté de bruit. Il nous est possible de filtrer ce bruit résiduel d'une façon numérique, en python par exemple.
Notre détecteur est très sensible au mouvement du corps lors de la mesure. Ainsi, une position immobile de la personne test est mandatoire pour l'obtention d'un ECG viable.
Des améliorations peuvent être apportées à notre design, particulièrement concernant la tension d'offset ainsi que la tension de référence. Une solution serait d'utiliser la tension stable de 3.3v qui est disponible sur le microControlleur.

ecg_comp0 ecg_comp

Downloads

le fichier python