心拍センサーを Arduino Pro Mini で動かしてみた [Arduino]
少し前に 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
さて、実際の動きをみてみましょう。
きちんと心拍を測定できました!
測定間隔を 2msec から 10msec に変更したので、少し心配だったのですが、測定結果に変わりはありませんでした。ただ、測定直後から安定値になるまでは時間がかかるようです。
こんな小さなマイコンでも動くというのはいいですね。アプリケーションの幅が広がりそうです。
(^_^)/~
関連記事
Arduino で心拍センサーを試してみた!
http://makers-with-myson.blog.so-net.ne.jp/2016-03-18
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 Pro Mini 328 3.3V 8MHz
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
コメント 0