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





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





スケッチは、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 パルスセンサー 脈拍センサー 心拍センサー

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



Arduino Pro Mini 328 3.3V 8MHz

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



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

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