複数台のM5Stackと心拍センサーを使ったパルスオキシメーターを集中的にモニタリングする仕組みを自作する

水曜日 , 25, 8月 2021 Leave a comment

2021/08/23に公開した『M5Stackと心拍センサーを使って血中酸素飽和度と心拍数を見える化するプログラム』(いわゆるパルスオキシメーター)を改良し、計測したデータをネットワーク上のMQTTサーバを介してモニタリングできるようにしました。

このプログラムを使うと、複数台のM5Stackパルスオキシメーターを1台以上のPCでモニタリングすることができます。

モニタリングできるデータは、各M5Stackで計測した酸素飽和度(SpO2)、心拍数、心拍パルスです。
データの配信にMQTTを使用しており若干のタイムラグ(通常数十~数百ミリ秒)が生じます。

※2021/08/25 LINE通知に対応しました。

心拍モニタ_動作イメージ

注意事項

このプログラムを使うとパルスオキシメーターのような機能を使うことができますが、医療機器認証を受けた医療機器ではないので精度や信頼性・安定性が保証されません。
センサーに対して指の置き方や圧のかけ方などで計測される値がかなり変化することを確認しています。指の置き方や圧のかけ方で計測値が変わる例

詳細は『M5Stackと心拍センサーを使って血中酸素飽和度と心拍数を見える化するプログラム』の注意事項をご覧ください。

このプログラムは長時間の連続稼働テストやエラー発生時の検出と復旧について十分な検証・テストが未実施です。
シビアな環境での使用にあたっては十分に考慮した上ご判断ください。


このプログラムでできること

複数台のM5Stackで計測した酸素飽和度や心拍数などのデータを1台または複数台のパソコンでモニタリングすることができます。
M5Stackに搭載したセンサープログラムが計測したデータをApache ActiveMQ(MQTT)に向けて送信し、ActiveMQが稼働中のモニタープログラムに対して計測データを配信、モニタープログラムは受信したデータをグラフィカルに表示します。

管理可能な台数は、Apache ActiveMQサーバを実行するコンピュータの処理性能とネットワーク帯域に依存します。

※2021/08/25

LINE通知に対応しました。
MQTTサーバとの接続断、通信異常、心拍未検出状態などを通知できます。
LINE通知の使用にあたってはLINEアカウントよりトークンの発行と取得したトークンをC#ソースへの反映が必要です。

LINE通知の例

必要なもの(機材)

データを送受信するためのWi-Fi環境も必要です。

必要なもの(ソフトウェア)

  • Visual Studio Code
    Microsoftが開発し無償提供しているテキストエディタ ( https://code.visualstudio.com/ )。
    センサープログラムをビルドするために使用。
  • PlatformIO IDE
    Visual Studio Codeなどのプラグインとして提供される組み込み開発用の統合開発環境。。
    センサープログラムをビルドするために使用。
  • Visual Studio 2019
    Microsoftが開発している開発環境( https://visualstudio.microsoft.com/ja/downloads/ )
    モニタープログラムのビルドに使用。

プログラムのセットアップ

このプログラムは、『M5Stackと心拍センサーを使って血中酸素飽和度と心拍数を見える化するプログラム』をネットワーク対応版にしたセンサープログラム(以下センサープログラム)と、計測したデータを表示するモニタープログラム、データ配信のApache ActiveMQで構成されます。

  • Apache ActiveMQ環境の構築
    データの配信で使用するActiveMQ環境を構築してください。
    構築したActiveMQに本プログラムが使用するトピックを生成してください。
        • センサー側
          ダウンロードしたソースコードをVisual Studio Codeで読み込んでください。
          main.cppを開きソース中の「ここから 稼働環境にあわせて調整してください」「ここまで 稼働環境にあわせて調整してください」の間に定義されている文字列を稼働環境にあわせて修正してください。スクリーンショット 2021-08-24 233053
          PlatformIO IDE上でビルド、M5Stack本体にアップロードしてください。
        • モニター側
          ダウンロードしたソースコードをVisual Studio 2019で読み込んでください。
          MainWindow.xaml.csを開き「環境にあわせて設定する」リージョンで定義された文字列を稼働環境にあわせて修正してください。
          スクリーンショット 2021-08-24 233433
          修正後ビルドを行ってください。

プログラムの起動

  1. ActiveMQを起動しセンサーからのデータを受け付けられる状態にしてください。
  2. M5Stackの電源を投入し計測を開始してください。
  3. モニタープログラムを起動しデータが配信されていることを確認してください。

正しく接続できていると、モニタープログラムが起動した時点でActiveMQに送信されたデータが配信され画面上に表示されます。

起動時に引数として表示対象のデバイスIDを与えると、受信したデータのうちデバイスIDが一致するデータだけを絞り込んで表示します。(未指定の場合は受信したデータをすべて表示します)

SpO2_Monitor.exe 《表示対象のデバイスID》

モニタープログラムでは血中酸素飽和度により表示の色分けを行います。

SpO2(%)

背景色

文字色

96以上

90~95

黄色

75~89

ピンク

74以下

モニタープログラムの実行例

モニタープログラムが最後にデータを受信してから30秒以上受信が途絶えた場合は、画面上に「通信異常」と表示されます。

また、最後に心拍を検出してから30秒以上経過すると画面上に「心拍検出できず(n秒経過)」と表示されます。

通信異常、心拍未検出状態の表示例

ソースコード

  • 開発環境
    Visual Studio Code Ver. 1.59.0
    Visual Studio 2019 Ver. 16.11.1
  • 動作確認した環境(M5Stack)
    M5Stack Basic
    M5Stack Fire
  • 動作確認した環境(MQTT)
    Apache ActiveMQ Artemis Ver. 2.17.0
  • ライセンス
    センサープログラム GPL3 ( https://www.gnu.org/licenses/gpl-3.0.html )
    モニタープログラム NYSL ( http://www.kmonos.net/nysl/ )
  • ダウンロード (2021/08/25更新)
    センサープログラム: http://www.ria-lab.com/omiyage/SPO2NW_SRC_1.1.0.zip
    モニタープログラム(LINE通知未対応): http://www.ria-lab.com/omiyage/SPO2NW_MONITOR_SRC_1.1.0.zip
    モニタープログラム(LINE通知対応): http://www.ria-lab.com/omiyage/SPO2NW_MONITOR_SRC_1.1.1.zip
  • その他、積み残しの課題など

    ActiveMQの使用を前提としていますがMQTTであればもっと軽量のものでも代用可能だと思います。
    モニタープログラムで監視しなくともPythonなどでMQTTの配信を受け取り、異常を検知したらLINEで送信するなどしてもよいのではないかと考えています。

    心拍パルスを表示するために15~20ミリ秒程度に一度の間隔でセンサーから値を取得しMQTTサーバに配信しています。この間隔をあけるか止めることでネットワークへの負荷をさげることができます。
    送信頻度を少なくすることでより多くのM5Stackを接続できるようになるはずです。

    コロナ禍で感染拡大が続き、十分に健康状態がモニタリングされていない環境下で宿泊療養、自宅療養が増えてきたことに対してなにかできないかと作ったプログラムです。

    長時間の連続稼働時にどうなるのか、エラー発生は正しく検出され正しく復旧できるのか、そもそも装置の信頼性はどの程度なのか、作っていていろいろな疑問や懸念は湧きましたが、そこにとらわれてしまうよりまず世の中に公開して、あとはよりよい改良を施してくれる方の登場に委ねようと思い公開しました。

    ※2021/08/25

    ActiveMQがダウンしてしまうとモニタープログラムの更新が止まってしまう現象を確認しました。

    Please give us your valuable comment

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください