2013年5月6日月曜日

フォトリフレクタ + オペアンプで心拍計


ライントレーサーなどでよく使われるフォトリフレクタを使い、指先の血流から心拍を測定したいと思います。



フォトリフレクタに指先を軽く重ねると、赤外線LEDから赤外線が照射され、指先の毛細血管を流れる血液の流れの変化に伴って、フォトトランジスタに入力される赤外線の量が変化します。
変化量はわずかなためオペアンプで増幅します。

「arduino 心拍」で検索すると心拍計シールドがヒットしますが、回路図も載ってました。
この回路ほぼそのまま使いますが、フォトリフレクタとオペアンプは手持ちの次のものを使いました。
・フォトリフレクタ LBR-127HLD(参考価格10個450円)
・オペアンプ SHARP IR9358
    単電源 3V~30V、両電源 ±1.5V~±15V、出力 0V~Vcc-1.5V

オペアンプを単電源5V、非反転増幅回路で増幅しています。
フォトトランジスタ周りの抵抗と可変抵抗を手持ちの1KΩ、20KΩに変更。オペアンプの1MΩ抵抗を可変抵抗に。
でブレッドボードに組んだものがこれ。


(右下はKyutech Arduino Scope



◆回路図
省略されていますがオペアンプには5Vを給電


以前紹介したarduinoで作るオシロスコープで波形をみてみるとこのようになりました。
(processingのアップデートに伴い、オシロのスケッチもアップデートされています)
オシロ1chは回路図A点、オシロ2chはB点で計測。下の画像では脈動しているのがわかると思います。

 (波形の全体がわかるように調整)

(計測しやすいように調整)



◆スケッチ
/*
フォトリフレクタ+オペアンプで心拍計
                             by cranberry
http://cranberrytree.blogspot.jp/
                          2013/05/05
*/

byte pin = A0;
unsigned long st;
unsigned long dur;
unsigned long sum_dur;
boolean f_low = false;
byte cnt = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(analogRead(pin) < 100){
    f_low = true;
  }
  if(analogRead(pin) > 500 && f_low == true){
    cnt += 1;
    dur = millis() - st;
    sum_dur += dur;
    if(cnt == 5){
      int ppm = ( (long)60 * 1000 * cnt ) / sum_dur;
      Serial.print("pulse per minute : ");
      Serial.println(ppm);
      cnt = 0;
      sum_dur = 0;
    }
    st = millis();
    f_low = false;
 }
}

パルス計測5回毎に、平均値をシリアル出力しています。

環境:arduinoUnoR3、arduinoIDE1.0.4、win7(32bit)





0 件のコメント:

コメントを投稿