M5StickC で BLE対応のスティックタイプな心拍計(概要)
ジョギングの合間などに手軽に心拍数を確認できるデバイスが欲しいなと思っていたところ、M5StickC をお安くゲットできる機会があったので自作してみました(本来ならスマートウォッチ的なものの出番ですが、作ってみたくなってしまったのもは仕方ないということで :-)。
※ 昨今の情勢的に念のために書いておきますが、上記の機器は健康状態を厳密に判断するような用途では使えません。趣味の範囲で使うためのものです。
動作
指をセンサーに乗せると計測を開始し、BLE接続されていれば通知を行います(スタンドアローンで使うこともできます)。
上の画像は動作を見やすくするためにケースから取り出していますが、普段はケースに入れた状態で使っています。(体調にもよりますが)センサー部分をラフな感じで握りこむだけでもそれなりに計測できます。
BLE の(初回)ペアリングは PIN による認証が必要となっています。PIN の確認や設定については README を参照してください。
ハードウェア
センサーモジュール
「電子工作 心拍」「Arduino 心拍」等で検索すると RPR-220 を使ったものがいくつかヒットしたので、その中でも一番シンプルな「Arduinoでパーツやセンサを使ってみよう~フォトリフレクタ編 | Device Plus - デバプラ」を参考にしてみました。
回路図は Fritzing で作成してみましたが使い方をあまり理解できていないので、こういった感じで良いのかどうか。。。(右下の LED1 と Q1 が RPR-220 だと思ってください)。
センサー出力の増幅についてはハードルが高そうだったのでソフトの方で頑張ることにしました。
ケース
最初は 100 均で購入したピルケース(おそらく「山田化学 セブンデイズピルケース」)をホットナイフで切り出したものを使ってみたのですが、持ち歩くには接続部分の強度や防水性等に不安があったので利用は見送りました。
少し試行錯誤した結果「やはり本体ごとケースに入れてしまう方が安心できる」ということになり、いまは無印良品の「ポリプロピレン印鑑ケース クリア・朱肉付」にまるごと入れています。センサー部分は加工しないとダメかと思っていたのですが、意外とそのままでも大丈夫でした。
内部はレイアウト的に少し余白がありますが、M5StickC がピッタリとはまっているので、ポケットに入れてジョギングしてもほとんどズレません。
と、大丈夫そうなところだけ書きましたが、以下のような難点もあります。
- 日中の屋外ではディスプレイがほぼ見えない。
- 各ボタンと USB ポートにアクセスしにくい。
ソフトウェア
センサー出力の読み取り
基本的には analogRead
で値を読み取っているだけですが、ハードウェアで増幅しない方法を選択したので、心拍数を計測する前に少し加工しています。
- 波形のピーク部分を取りこぼさないように短い間隔で読み取る。
- 細かく振れやすくなるので移動平均で滑らかにする。
- ただし、運動中には心拍数(波形のピーク)は増えるので過度に滑らかにはさせない。
波形のピーク
上記の前処理をしても細かい振れが残ったり階段状になったりするので、下図のような感じで波形のピークをハンドリングするようにしてみました(実際にはもう少し判定処理等が入っています)。
心拍の算出
有効な心拍が一定間隔以上計測できている間は算出するようにしています。 また、測定中に身体を動かすと波形が変動することから、 「ありえないような間隔での心拍」が出た場合は「無視する」「直近の有効な計測値から補正する」等の処理も入れてあります。 ただし、補正の処理は「なんとなく」で組んだので、市販の血圧計等の値と大きくズレるときがあります(脈が飛んだ時にも補正してしまうのが良くないようです)。
プロッター
元々はデバッグ用として Arduino IDE のプロッターのようなものを表示させていたのですが、計測できているかの目安になるので残しました(動きがある方が面白いというのもあります :-)。
表示全般
TFT_eSPI
でスクロールできないか調べているときに M5Stack 用の UI を構築するライブラリーを見かけた気がするのですが、いざ使おうと思って探してみると見つからなかったので、とりあえず各種表示を部品化するようなものを作ってみました。
が、後付けで TFT_eSprite
経由でスクリーンショットを取得できるようにしてみたら、ちょっとごちゃごちゃしてしまいました。
BLE
健康状態の情報を送信することになるので、とりあえずは 「esp32-snippets/StaticPIN.ino at master · nkolban/esp32-snippets · GitHub」 等を参考に PIN による認証はするようにしました。が、セキュリティ的に問題がないかはいまいち自信はありません。
また、 Heart Rate Sensor Demo からは利用できていますが、他のアプリからどの程度使えるかは不明です(Runtastic は真っ先に試したのですが、いまのところうまくいっていません。。。)。
リポジトリ
ソースコードのリポジトリです。
実際に使ってみる
何度かジョギングで使ってみましたがパラメーター等の調整が必要そうなので、その辺がまとまったら別途アップする予定です。