心拍センサを Seeeduino で使ってみる

 自社でヘルスケア関連サービスをやっているということもあり、スイッチサイエンスさんで販売されていた心拍センサが面白そうだったので Seeeduino で使ってみました。

www.switch-science.com

 使い方は Seeed の製品サイトの方にも記載されています。

wiki.seeedstudio.com

回路構成

 今回使う心拍センサは Grove コネクタが使われています。Grove システムについては下記資料でも紹介されています。

Introduction to Grove
http://www.seeedstudio.com/document/pdf/Introduction%20to%20Grove.pdf

 心拍センサの使い方のページの例でも使われている Grove の Basic Shield が上記の資料でも使われていますので、これを参考に下記のように配線しました。

f:id:akanuma-hiroaki:20180710084200j:plain

 Seeeduino にも Grove コネクタが搭載されているのですが、今回は心拍センサが心拍を検知したタイミングでの出力を割り込みで受け取るために D2 ピンを使いたかったので、心拍センサの Grove コネクタに直接ジャンパコードを挿して接続しました。

f:id:akanuma-hiroaki:20180710084253j:plain

 Seeeduino 側は 3.3V、GND、D2ピンにそれぞれ接続します。 Seeeduino の動作電圧も 3.3V に設定してあります。

f:id:akanuma-hiroaki:20180710084227j:plain

ファームウェア

 ファームウェアは先ほどの 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

電圧出力の確認

 ここまでで動作確認はできてるのですが、試しにオシロスコープでセンサからの電圧出力を確認してみます。

f:id:akanuma-hiroaki:20180712085629j:plain

 オシロスコープのプローブは心拍センサの Grove コネクタ部分に取り付け、 1系を VCC と GND、 2系は D2 への出力ピンに取り付けます。

f:id:akanuma-hiroaki:20180712085508j:plain

 結果は下記の写真のようになりました。赤いラインは 1系で、こちらは常に一定の電力が供給されているので 3.3V のまっすぐなラインになります。黄色いラインが 2系で、心拍を検知した際にセンサからのデジタル出力により 3.3V の電圧を検知しています。

f:id:akanuma-hiroaki:20180712085545j:plain

まとめ

 市販のセンサーで簡単にバイタルデータを計測できてしまうのは面白いですね。また、オシロスコープで実際の電圧検知までできて、病院の心拍計のようなイメージまで可視化されたのでより面白かったです。今回は測定結果はシリアルモニタに出力するだけだったので、これをネットワーク経由で送信したり、 LED などを使って可視化することもできると楽しそうかなと思っています。