So-net無料ブログ作成
検索選択

心拍センサーを Arduino Pro Mini で動かしてみた [Arduino]

少し前に Arduino UNO で動かしてみた心拍センサーを Arduino Pro Mini で動かしてみました。


DSC03920.JPG


Arduino UNO と Arduino Pro Mini は、電圧が 5V と 3.3 V、クロックが 16MHz と 8MHz と異なるので、同じように動くのか試してみようと思ったわけです。Arduino Pro Mini と心拍センサーとの接続を示します。


PulseSensorWithArduinoProMini.png


スケッチは、PulseSensor.com のスケッチをベースに簡略化しました。最新のスケッチは、私のGitHubを参考にしてください。

https://github.com/YoshinoTaro/PulseSensorForArduinoProMini8M
#define N 10

volatile int BPM;
volatile int Signal;
volatile int IBI = 600;
volatile boolean Pulse = false;
volatile boolean QS = false;

volatile int Rate[N];
volatile unsigned long Counter = 0;
volatile unsigned long LastBeatTime = 0;
volatile int P = 512;
volatile int T = 512;
volatile int Threshold = 525;
volatile int Amplifier = 100;

int PulseSensorPin = 0;
int FadePin = 5;
int FadeRate = 0;

void setup() {
  pinMode(FadePin, OUTPUT);
  Serial.begin(115200); 
  noInterrupts();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2  = 0;
  TCCR2A = bit(WGM21);
  TCCR2B = bit(CS22) | bit(CS21) | bit(CS20); // 8M/1024
  OCR2A = 78; // 10ms
  // TCCR2B = bit(CS22) | bit(CS20); //8M/128
  // OCR2A = 124; // 2ms
  TIMSK2 = bit(OCIE2A);
  interrupts();
}

ISR (TIMER2_COMPA_vect) {
  noInterrupts();
  Signal = analogRead(PulseSensorPin);
  
  Counter += 10; // 10msec
  // Counter += 2; // 2msec
  
  int interval = Counter - LastBeatTime;
  
  // hold bottom
  if (Signal < Threshold && interval > (IBI/5)*3) {
    if (Signal < T) T = Signal;
  }
  
 
  // hold peak
  if (Signal > Threshold && Signal > P) {
    P = Signal;
  }
  
  if (interval > 250 /* ms */) {
    
    // check if Signal is over Threshold
    if ((Signal > Threshold) && !Pulse && (interval > (IBI/5)*3)) {
      Pulse = true;
      IBI = Counter - LastBeatTime;
      LastBeatTime = Counter;
      
      if (Rate[0] < 0) {
        Rate[0] = 0;
        interrupts();
        return;
      } else if (Rate[0] == 0) {
        for (int i = 0; i < N; ++i) {
          Rate[i] = IBI;
        }
      }
            
      word running_total = 0;     
      for (int i = 0; i < N-1; ++i) {
        Rate[i] = Rate[i+1];
        running_total += Rate[i];
      }

      Rate[N-1] = IBI;
      running_total += IBI;
      running_total /= N;
      BPM = 60000 / running_total;
      QS = true;
    }
  }
  
  // check if Signal is under Threshold
  if (Signal < Threshold && Pulse) {
    Pulse = false;
    Amplifier = P - T;
    Threshold = Amplifier / 2 + T; // revise Threshold
    P = Threshold;
    T = Threshold;
  }
  
  // check if no Signal is over 2.5 sec
  if (interval > 2500 /* ms */) {
    Threshold = 512;
    P = 512;
    T = 512;
    LastBeatTime = Counter;
    for (int i = 0; i < N; ++i) {
      Rate[i] = -1;
    }
  }
 
  interrupts();
}

void loop() {
  
  if (QS) {
    FadeRate = 255; 
    Serial.print("BPM: ");
    Serial.println(BPM);
    QS = false;
  }
  
  FadeRate -= 15;
  FadeRate = constrain(FadeRate, 0, 255);
  analogWrite(FadePin, FadeRate);
  delay(20);
}



さて、実際の動きをみてみましょう。



きちんと心拍を測定できました!

測定間隔を 2msec から 10msec に変更したので、少し心配だったのですが、測定結果に変わりはありませんでした。ただ、測定直後から安定値になるまでは時間がかかるようです。

こんな小さなマイコンでも動くというのはいいですね。アプリケーションの幅が広がりそうです。
(^_^)/~


関連記事
Arduino で心拍センサーを試してみた!
http://makers-with-myson.blog.so-net.ne.jp/2016-03-18





Arduino パルスセンサー 脈拍センサー 心拍センサー

Arduino パルスセンサー 脈拍センサー 心拍センサー

  • 出版社/メーカー: asshop
  • メディア: その他



Arduino Pro Mini 328 3.3V 8MHz

Arduino Pro Mini 328 3.3V 8MHz

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス



FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス




nice!(35)  コメント(0)  トラックバック(0) 

nice! 35

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※ブログオーナーが承認したトラックバックのみ表示されます。