少し前に 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切り替え機能付き)
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス