yana_lab

心拍

最終更新:

yutanit

- view
だれでも歓迎! 編集

心拍

心拍とは心臓の拍動のことです。
心臓の拍動と拍動の間隔(心拍間隔)を測定し、それを一定時間(60秒など)で割ると心拍数を求めることができます。
心拍数は通常、1分間に心臓が拍動した回数のことをいい、BPM(Beats Per Minute)で表します。

RRI(心拍間隔)とは


この図のような心電図の波形に表れるピーク部分、R波とR'波の間隔のことをRRI(R-R interval)と呼びます。
正常に計測されている心電図であれば、このような波形が周期的に現れます。
また、RRIは常に一定ではなく、変動しています。
この変動は自律神経系の活動によって起こされています。
私たちは、この変動を解析することで、ストレス状態を計測しました。



POLAR H10(心拍センサ)

心拍数を高い精度で測定し、Bluetooth(BLE通信)でPCなどの機器にデータ送信でき、ボタン電池一つで400時間ほど使うことができます。
この計測機器は主にサイクリングやランニングなどのスポーツで使われています。
今回はこれを使用し心拍からストレス状態を求めようとしました。
また、私たちはストレス状態を光として表現し、フィードバックを行いました。
ラズベリーパイ関連のRPi.GPIO ⑤カラーLEDにて、その方法を説明していますので、そちらもご確認ください。

装着方法

※ペースメーカーを利用している方には使用しないでください。

①装着ベルトに心拍センサを取り付けます。
 「パチン」と音がするまで押し込んでください。

②装着ベルトのフックをもう一方のベルト先端に引っ掛けて装着します。
 装着ベルトを体に巻き付け、胸回り(アンダーバスト)に合わせて装着ベルトの長さを調整します。
 きつく締めすぎると測定中に苦痛を感じることがあるので適度に締めます。
 心拍センサがお腹側の中心に来るように位置を調節してください。

 ※心拍センサはロゴが周りから見て反対にならないように注意し、装着してください。
 ※必ず電極パッドが身体に密着するようにしてください。
 ※皮膚が乾燥していたり、服の上から装着した場合、計測ミスが起こることがあります。
  測定ミスが起こる場合、電極パッドを水で濡らしてみてください。


接続テスト

ラズベリーパイを使って接続しました。
以下の通りに進めていくとコマンドラインに心拍センサのデータが表示されます

①コマンドライン(コマンドプロンプトのようなもの)に「sudo hcitool lescan」で心拍センサのアドレスを確認する
 ※ほかのBluetooth機器のアドレスも出てきてしまうため、できるだけOFFにすると対象のアドレスが見つけやすいです。
②「gattool -b XX:XX:XX:XX:XX:XX -t random -l」を実行
 (XX:XX:XX:XX:XX:XXには先ほど確認した心拍センサのアドレスが入ります)
③実行した後に出てくる「[XX:XX:XX:XX:XX:XX][LE]>」の後ろに「char-write-req 0x0011 0100」と打ち実行する。
 約1秒おきにデータがコマンドラインに送られてきます。

(例)
Notification handle = 0x0010 value: 10 57 7e 02
このようなデータが送られてきます。

この時の2バイト目(57)は心拍数で16進数になっているので10進数に直すと87となり、
心拍数が87と分かります。

3バイト目(7e)と4バイト目(02)はRRI(心拍間隔)についての情報です。
このRRIの求め方は心拍数とは異なるので詳しいやり方を説明します。(進数変換ツールをおすすめします。)

RRIの求め方(上の例を用います)

Notification handle = 0x0010 value: 10 57 7e 02

① 4バイト目(02)を2進数に変換します。
 16進数「02」→2進数「10」

② ①の値を8ビット左へシフトします。
 2進数「10」→2進数「1000000000」(0を8つ追加)

③ ③の値を10進数に変換します。
 2進数「1000000000」→10進数「512

④ 3バイト目(7e)を10進数に変換します。
 16進数「7e」→10進数「126

⑤ ③と④を足し合わせます。
 「512」+「126」=638ms

この答え「638ms」がRRI (心拍間隔)を表しています。

RRIは一定ではないため1秒間にRRIが2回分計測されることがあります。
その際、データも次のように変わってきます。

Notification handle = 0x0010 value: 10 57 7e 02 11 03

このように5バイト目「11」と6バイト目「03」が追加されて送信されます。
このときも同様に①~⑤の流れ(5バイト目が3バイト目、6バイト目が4バイト目に対応)からRRIが求まります。

次に紹介するプログラムでは、RRIが2データ分送信されても対応できるようになっています。

POLAR H10からBLE通信でRRI(心拍間隔)を受け取る

以下のプログラムではbluepy、matplotlib、numpyのライブラリを使います。
ラズベリーパイにインストールしていない場合は行ってからプログラムを実行してください。
+ プログラム
##作成者:栁澤
##更新日:2020/10/17
##内容: PolarのウェアラブルデバイスからBLE通信でRRIを受け取る

from bluepy.btle import Peripheral
import bluepy.btle as btle
import binascii
import matplotlib.pyplot as plt
import numpy as np
 
RRI_data = []
 
#ウェアラブルデバイスのアドレス(BLE)
ROHM_RAW = "XX:XX:XX:XX:XX:XX" #確認した心拍センサのアドレスを記入してください

# データを受信した時に呼ばれるclass
class MyDelegate(btle.DefaultDelegate):
    def __init__(self, params):
        btle.DefaultDelegate.__init__(self)
 
    def handleNotification(self, cHandle, data):
        global RRI_data
        c_data = binascii.b2a_hex(data)
        ##「c_data」が受信したデータ,デフォルトは16進数標記なので、10進数に戻す必要がある
        hr = int(c_data[2:4],16)
        v1 = int(c_data[4:6],16)
        v2 = int(c_data[6:8],16)
        rri1 = (v2<<8) + v1
        RRI_data = np.hstack([RRI_data, rri1])
        print(rri1)
        if len(c_data) > 8:
            v3 = int(c_data[8:10],16)
            v4 = int(c_data[10:12],16)
            rri2 = (v4<<8) + v3
            RRI_data = np.hstack([RRI_data, rri2])
            print(rri2)
            print(RRI_data)
 
# センサークラス
class SensorBLE(Peripheral):
    def __init__(self, addr):
        Peripheral.__init__(self, addr, addrType="random")
 
 
def main():
    # 初期設定
    medal = SensorBLE(ROHM_RAW)
    medal.setDelegate(MyDelegate(btle.DefaultDelegate))
 
    # ノーティフィケーションを有効にする
    # Polar H10デバイスの場合は,0x0011に 0100を送れば有効になる
    medal.writeCharacteristic(0x0011, b"\x01\x00", True)
 
    # データを受信し続ける
    while True:
        if medal.waitForNotifications(1.0):##1秒間隔でデータを受け取る
            continue##continueにしておかないと、一定時間で接続が切れる?(要検証)
        #print("wait...")

if __name__ == "__main__":
    print("start")
    main()
 
 

BLE通信とは

BLEとは「Bluetooth Low Energy」の略で、最大の特徴は消費電力の低さです。
接続の確立やデータの通信などの大きな電力を必要とする動作にかかる時間を極力少なくしています。
その結果、ボタン電池1個で約1年間の稼動が可能なほど、従来のBluetooth機器よりも大幅に消費電力を削減することが出来ています。
しかし、通信速度は低くなっているため、画像データや動画データなど、大規模データの通信には不向きです。
また、規格上の最大通信速度はのBluetooth4.0で1Mbps、Bluetooth5.0で2Mbpsとされていますが、省電力などの要因からおよそ10kbpsで運用されています。
電波到達距離はBluetooth4.0で数十メートル、Bluetooth5.0において通信速度を125kbpsに設定した場合で最大400メートルまで電波を到達させることができますが、こちらも省電力などの要因からおよそ5メートルまでの非常に短い距離に設定し、運用されることが多いです。

タグ:

+ タグ編集
  • タグ:
ウィキ募集バナー