ランニング中の心拍数を測る方法として、スマートウォッチの光学式センサーとチェストストラップ型の心電図(ECG)センサーの2種類がある。光学式は手軽だが、動きが激しいときに精度が落ちやすい。一方ECG式は電極を胸に直接当てて心臓の電気信号を測定するため、原理的にはより正確なデータが得られる。
Milos Rasic氏は、このECG式チェストストラップを自作できないかと考えた。市販品を買えば済む話だが、エンジニアとしては中身を理解したい。そこで生まれたのが「OpenHRStrap」だ。ESP32マイコンとECGモジュールを組み合わせ、Stravaなどのフィットネスアプリが市販の心拍計として認識するBLEデバイスを、オープンソースで作り上げた。
回路は入手しやすいモジュールの組み合わせで構成されている。マイコンにはBLE通信機能を内蔵したSeeed StudioのXIAO ESP32-C3を採用。ECG信号の取得には、ホビー向けとして広く流通しているAD8232モジュールを使用した。電源は1セルのリチウムイオン電池に小型の昇圧コンバーターを組み合わせ、3.7Vから5Vに変換している。ケースはPLAとTPUで3Dプリントし、市販のチェストストラップに装着できる形状とした。
AD8232は通常3電極で動作するため、市販のチェストストラップ(2電極)に参照電極を1つ追加する必要があった。Rasic氏はストラップの背面にボタン型電極を縫い付けて対応している。
心拍数の計算には、1985年に発表された「Pan-Tompkinsアルゴリズム」を実装した。ECG信号から心拍を示すRピーク(QRS波の頂点)をリアルタイムで検出する手法で、今も広く使われている。処理の流れは、バンドパスフィルターでノイズを除去し、微分処理で信号の変化を強調、二乗処理と移動窓積分で波形を整えた後、閾値判定でピークを検出する。Rasic氏はまずPythonで実装・検証した後、ESP32に移植してリアルタイム処理を実現した。
5kmのランニングで実地テストを実施し、スマートウォッチ(PPGセンサー)と比較した。走り始めの心拍数が120〜130bpm程度で安定している区間では両者のデータがよく一致したが、心拍数が上がるにつれて差が開き、自作デバイスの値が低めに出る傾向が見られた。急激なペース変化にも追従しきれない場面があった。
原因としてはアルゴリズムのパラメーター調整やノイズの影響が考えられるが、現バージョンにはデータロギング機能がないため詳細な原因特定が難しい。そこでRasic氏はV2の開発を進めており、異なるアナログフロントエンドICを採用した専用PCBの設計と、microSDカードによるデータロギング機能の追加を予定している。
プロジェクトはMITライセンスで公開されており、回路図、3Dプリント用データ、ESP32のファームウェア、Pythonの解析コードがすべてGitHubで入手できる。完成度としてはまだ発展途上だが、ECGセンシングからBLEプロファイルの実装、信号処理アルゴリズムまで一通り学べる教材として参考になる。なお、このプロジェクトは教育・実験・ホビー目的であり、医療機器ではない点に注意が必要だ。
Build Your own ESP32 Fitness Heart Rate Monitor / Tracker(element14)