SSブログ

心拍センサーを 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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。