公開日:2025/03/22
title.png

34th Season


#34-2 脈拍計再び

 以下の記事では、個々のディスクリート部品を組み合わせて、ブレッドボード上に脈拍センサを作成しました(以下リンクを参照)。

  「#10-4 ハートビート

a104_heartrt.jpg

 今回、この機能が詰まったセンサモジュールを入手したので、Cmod A7ボード(FPGA)を使って開発している、オリジナル16ビットCPUコアMoscoviumシリーズで応用してみたいと思います。

MAX30100モジュール

 以下図に、購入した脈拍センサMAX30100モジュールの外観を示します。

a342_max30100.jpg


 まずは、データシートを入手しておきましょう。

  MAX30100のデータシートを検索(別ウインドウが開きます)

 データシートによると、MAX30100と言うチップは1.8V定格です。通信方式はI2C通信でした。エミッタは赤外線IR(波長約880nm)と可視光赤色RED(波長約660nm)、2種類のLEDを搭載しています。
 エミッタが2種類搭載されている理由は、以下図から判ります。

a342_spo2.png
※MAX30100データシートより引用。

 上図の通り、血液中のヘモグロビンHbと、酸化ヘモグロビンHbO2では、光の波長によって反射率が異なります。
 2種類の光線源(IR,RED)を使う事で、HbとHbO2の比率を知ることができると、血中の酸素飽和度(%SpO2)を推定できる、という仕組みです。

 ちなみに、こちら「#10-4 ハートビート」のページで使った反射型赤外線センサTCRT5000Lは、赤外線リモコンでも使用可能な、波長約940nmの赤外線LEDでした。MAX30100の波長約880nmは、IrDA等の通信仕様で使用される波長です。

回路構成の推定

 データシートから判ったのは、MAX30100は1.8V定格のチップでした。ただし、LEDの駆動電源として別途、3.3V給電が必要です。

※LEDのVfは比較的大きい(>>1V)ので、1.8Vでは高輝度で光らせることができない為です。

 MAX30100モジュールには、入力電源VINから1.8Vと3.3Vへの降圧レギュレータが2種類搭載されている様です。
 さて、通信インターフェイスはI2C通信なのですが、I2Cの信号線(SCL,SDA)は1.8Vなのでしょうか?手元に1.8V定格のマイコンボードはありませんので、1.8Vインターフェイスだとすると使用できません……。

 Arduino UNO+Logiscopeで、I2C通信端子の電位を計測したところ、I2Cの信号線はVINでプルアップされていると判明しました。よって、


 裏面の写真で確認できる3つのチップに関しては、以下の様に推定しています。

 MAX30100チップの電気的特性としては、I2C等のデジタル入力端子に対して6V(ABS.MAX)の規定があるので、5VのUNOでも、使えない事は無いみたいです。ただし、絶対最大定格(ABS.MAX)に対して余裕が足りないため、設計余裕度を考えると、3.3Vインターフェイスで使用すべきチップなのだと思われます。
 推定ですが、手持ちのMAX30100モジュールは5Vインターフェイスでも余裕をもって使用できる様にL/Sを搭載しているのでしょう。ただし、購入したサイトなどから回路図が入手できていないため、「推定」です。各自、良く調査の上、ご使用ください。

 今回使用するCmod A7ボード(FPGA)は、3.3V I/Oなので、問題なく使用可能と判断しました。

今回のお買い物

 今回のお買い物は以下の通りです。

 amazonで購入したのですが、「amazon発送の商品3,500円以上で送料無料」ではなく、送料無料の中華ショップを利用しました。もし、amazon発送のショップを利用した場合だと、3,500円未満なので送料410円取られます。300円の商品に送料410円って……。「送料」買ってるんかい!
 中華ショップなので届くまでに3〜4週間かかりますが、そこを許容できる場合は断然お得です。ただし、中華ショップはトラブルも多く報告されているため、信頼のおけるショップを選ぶことは重要な課題です。「安い」だけに飛びつかない様、ご忠告申し上げます。

※ショップ側も、赤字で販売するはずは無いので、販売価格の中に送料分の経費も含まれているはずです。よって、送料がどうのこうのではなく、送料込みの総額が納得できるかどうか?で判断する様にしています。

応用:脈拍センサ

 Cmod A7ボード(FPGA)にオリジナル32ビットCPUコアNihoniumを書き込んで使います。測定した脈拍をSPI-TFTに表示しようと思いますので、こちらのSPI-TFTアダプタボードで接続します。
 MAX30100モジュールへ給電する3.3V電源が必要なのですが、Cmod A7ボードではPMODコネクタからしか3.3V電源が引き出せません。PMODコネクタはアダプタボードで埋まってしまうため、アダプタボードを改造して3.3V電源とGND端子を引き出せるよう、ピンソケットを追加しました。

デザイン

 32ビット整数演算が必要なため、Nihoniumコアを搭載したNHOC113DB9808を使います。このマイコンには、I2C通信やSPI-TFT制御に必要なI/Oユニットも搭載されており、今回の応用に適合します。

 Cmod A7ボード等、XilinxのFPGAに書き込むのに必要な、Moscoviumマイコンの設計データ(Vivadoのプロジェクトファイル一式を含む)はGitHubで提供しています。以下バナーよりアクセスしてください。

btn_moscovium.png

 デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

予備実験

 必要な機器を以下の様に接続して、予備実験してみました。

MAX30100
モジュール
接続 Cmod A7ボード 接続 SPI-TFT
アダプタボード
  PMODコネクタ PMODピンヘッダ
VIN 3V3
GND GND
SCL stws_scl  
SDA stws_sda
INT  

※割り込み出力信号INTは使わないので、放置しておきます。

 下図に実験中の様子を示します。

a342_expr.jpg

 実は、予備実験の結果は散々な物でした。全然ダメです。次節で考察します。

考察

 まず、MAX30100に指を近づけたり離したりすると、確かに出力が変化するので、使い方は間違っていない様でした。

  これじゃ、ただの近接センサじゃないか!

と、沸騰しかけた頭😡を、一旦冷静になって冷やしてみました……。

 自分で工作した、こちらの記事「#10-4 ハートビート」を読み返してみたところ、

と言う記憶が蘇ってきました。その上で、改めてMAX30100のデータシートを参照し、ブロック図を眺めて見たところ、「信号増幅」している回路が見当たりません。LPF通過信号との比較(減算)している回路も無い様です。
 つまり、フォトトランジスタからの検出信号(アナログ信号)を、そのままAD変換しているだけ、のチップだと判りました。

  をいをい、そんな調子で脈拍なんて言う、微小な信号を検出(※)できるのかい?

 AD変換後のデジタル信号になってしまっては、もはや信号増幅する事は叶わないので、後はLPF通過信号との差分値を取って見て、果たして脈拍を検出できるかどうか?って事ですね……。

※原理は、こちらを参照

MAX30100の設定

 予備実験の結果を受けて、MAX30100の動作設定に関しては、以下の通りに決定しました。

  MAX30100の動作設定:

 脈拍による、反射光強度の微小な変化をAD変換後のデジタル値で判定する必要があるため、MAX30100が持つAD変換器の最大解像度である、16ビットモードを使用可能な動作設定を選択しました。

ソフトウェア設計

 「#10-4 ハートビート」の記事では、LPFはFIRフィルタを設計して適応したのだけど、今回はもっとお手軽に「移動平均」を使います。
 開発環境は、Blockly for Moscoviumです。
 移動平均を取るのにリングバッファが必要だったので、バッファ領域を確保するカスタムブロックを追加しておきました。こちらの記事に従って、環境の立ち上げ、または更新してお使いください。

プログラム

 完成したプログラムを以下にリンクしておきます。

  完成プログラム:blky_heart_rate.xml

※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。

 Blockly for MoscoviumのXMLタブに貼り付けて、ご利用ください。アセンブルに必要なINCLファイルは、こちらからダウンロード可能です。

 なお、デバッグ用にシリアルモニタは活きていますが、【who】と【help】コマンドしか実装していません。基本的には、SPI-TFT画面表示で閉じる設計です。

本番の実験

 必要な機器の接続などは、予備実験と同じです。

 電源を投入したら、MAX30100モジュールに指の腹の部分等を当てて、SPI-TFT表示画面を確認してください(下図)。

a342_display.jpg

 予備実験でも指摘した通り、指の当て方、強さなどで測定値は簡単にばらつきます。微小な脈拍信号の検知どころではなくなってしまうため、指を当てたら安静にして、SPI-TFT画面をご確認ください。うまく脈拍を検出できない場合は、指の当て方や強さなどを少し変えながら試してみてください。結構シビアです(1−_−;)。


 計測した脈拍数[bpm]はSPI-TFTに表示される様になっているので、以下動画で確かめていただきたいと思います。



 SPI-TFTが手軽に使える様になったので、予備実験の段階から、計測したデータをリアルタイムで確認できる様になりました。デバッグが捗ります。今までは、計測したデータをシリアルモニタでダウンロードして、Excelに貼り付けて、グラフ化して、と、手間がかかっていましたから。

総括

 こちら「#10-4 ハートビート」の記事ではアナログ信号の間にハードウェア側も手を尽くしているのに対して、MAX30100はAD変換器でデジタル信号に変換しただけで、後はソフトウェア側の処理に丸投げです。これって、どうなのでしょうか??ごく微小な信号なのですから、アナログ信号の間に、もう少しハードウェア側が歩み寄るべきだったのではないでしょうか?ハードウェア/ソフトウェアが協調すべきシステム設計が、ずさん過ぎると思いました。

  システム設計の悪いお手本、なのでは?

 皆様は、ハードウェアもソフトウェアも良く理解した上で、システムとして、どうするのが一番の解法なのか?を考えて設計するようにしてください。そうした方が、より良いモノ作りができます。


 ディスクリート部品を使ってブレッドボード上に結構ゴチャっとした回路を作っていたのに対して、お気軽に使えるかな?と、購入して見たものの、こんなにシビアなモジュールでは、お気軽に使うとは言い難いです。この先の応用(ウェアラブル)も考えていたのですが、ちょっと無理そう……。


btn_arduino.png

btn_prev.png btn_next.png

home