自社でヘルスケア関連サービスをやっているということもあり、スイッチサイエンスさんで販売されていた心拍センサが面白そうだったので Seeeduino で使ってみました。
使い方は Seeed の製品サイトの方にも記載されています。
回路構成
今回使う心拍センサは Grove コネクタが使われています。Grove システムについては下記資料でも紹介されています。
Introduction to Grove
http://www.seeedstudio.com/document/pdf/Introduction%20to%20Grove.pdf
心拍センサの使い方のページの例でも使われている Grove の Basic Shield が上記の資料でも使われていますので、これを参考に下記のように配線しました。
Seeeduino にも Grove コネクタが搭載されているのですが、今回は心拍センサが心拍を検知したタイミングでの出力を割り込みで受け取るために D2 ピンを使いたかったので、心拍センサの Grove コネクタに直接ジャンパコードを挿して接続しました。
Seeeduino 側は 3.3V、GND、D2ピンにそれぞれ接続します。 Seeeduino の動作電圧も 3.3V に設定してあります。
ファームウェア
ファームウェアは先ほどの Seeed の製品ページにサンプルが掲載されていますので、それをベースにして、今回は LED は使っていないので LED 関連部分を削除して下記のようにしました。
大まかな内容としては、 attachInterrupt()
で D2 ピンからの割り込みを受け付けるようにして、心拍センサが心拍を検知した時は interrupt
メソッドが実行され、20回検知するとそこまでの検知間隔から心拍数を計算してシリアルモニタに出力します。
unsigned char counter; unsigned long temp[21]; unsigned long sub; bool data_effect=true; unsigned int heart_rate; const int max_heartpluse_duty = 2000; void setup() { Serial.begin(9600); Serial.println("Please ready your chest belt."); delay(5000); arrayInit(); Serial.println("Heart rate test begin."); attachInterrupt(0, interrupt, RISING); } void loop() { } void sum() { if(data_effect) { heart_rate=1200000/(temp[20]-temp[0]); Serial.print("Heart_rate_is:\t"); Serial.println(heart_rate); } data_effect=1; } void interrupt() { temp[counter]=millis(); Serial.println(counter,DEC); Serial.println(temp[counter]); switch(counter) { case 0: sub=temp[counter]-temp[20]; Serial.println(sub); break; default: sub=temp[counter]-temp[counter-1]; Serial.println(sub); break; } if(sub>max_heartpluse_duty) { data_effect=0; counter=0; Serial.println("Heart rate measure error,test will restart!" ); arrayInit(); } if (counter==20&&data_effect) { counter=0; sum(); } else if(counter!=20&&data_effect) counter++; else { counter=0; data_effect=1; } } void arrayInit() { for(unsigned char i=0;i < 20;i ++) { temp[i]=0; } temp[20]=millis(); }
これを Seeeduino にアップロードして、心拍センサのクリップを耳などにつけると、下記のようにシリアルモニタに心拍検知時と20回測定後の心拍数計算結果が出力されます。
Please ready your chest belt. Heart rate test begin. 0 32432 0 1 33133 701 2 33133 0 3 34014 881 4 34934 920 5 35849 915 6 36736 887 7 37653 917 8 38588 935 9 39524 936 10 40410 886 11 41291 881 12 42212 921 13 43163 951 14 44107 944 15 44998 891 16 45929 931 17 46887 958 18 47837 950 19 48720 883 20 49581 861 Heart_rate_is: 69
電圧出力の確認
ここまでで動作確認はできてるのですが、試しにオシロスコープでセンサからの電圧出力を確認してみます。
オシロスコープのプローブは心拍センサの Grove コネクタ部分に取り付け、 1系を VCC と GND、 2系は D2 への出力ピンに取り付けます。
結果は下記の写真のようになりました。赤いラインは 1系で、こちらは常に一定の電力が供給されているので 3.3V のまっすぐなラインになります。黄色いラインが 2系で、心拍を検知した際にセンサからのデジタル出力により 3.3V の電圧を検知しています。
まとめ
市販のセンサーで簡単にバイタルデータを計測できてしまうのは面白いですね。また、オシロスコープで実際の電圧検知までできて、病院の心拍計のようなイメージまで可視化されたのでより面白かったです。今回は測定結果はシリアルモニタに出力するだけだったので、これをネットワーク経由で送信したり、 LED などを使って可視化することもできると楽しそうかなと思っています。