以下の記事では、個々のディスクリート部品を組み合わせて、ブレッドボード上に脈拍センサを作成しました(以下リンクを参照)。
「#10-4 ハートビート」
今回、この機能が詰まったセンサモジュールを入手したので、Cmod A7ボード(FPGA)を使って開発している、オリジナル16ビットCPUコアMoscoviumシリーズで応用してみたいと思います。
以下図に、購入した脈拍センサMAX30100モジュールの外観を示します。
まずは、データシートを入手しておきましょう。
MAX30100のデータシートを検索(別ウインドウが開きます)
データシートによると、MAX30100と言うチップは1.8V定格です。通信方式はI2C通信でした。エミッタは赤外線IR(波長約880nm)と可視光赤色RED(波長約660nm)、2種類のLEDを搭載しています。
エミッタが2種類搭載されている理由は、以下図から判ります。
※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で提供しています。以下バナーよりアクセスしてください。
デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
必要な機器を以下の様に接続して、予備実験してみました。
MAX30100 モジュール |
接続 | Cmod A7ボード | 接続 |
SPI-TFT アダプタボード |
PMODコネクタ | ⇔ | PMODピンヘッダ | ||
VIN | ← | 3V3 | ||
GND | ⇔ | GND | ||
SCL | ⇔ | stws_scl | ||
SDA | ⇔ | stws_sda | ||
INT | X |
※割り込み出力信号INTは使わないので、放置しておきます。
下図に実験中の様子を示します。
実は、予備実験の結果は散々な物でした。全然ダメです。次節で考察します。
まず、MAX30100に指を近づけたり離したりすると、確かに出力が変化するので、使い方は間違っていない様でした。
これじゃ、ただの近接センサじゃないか!
と、沸騰しかけた頭😡を、一旦冷静になって冷やしてみました……。
自分で工作した、こちらの記事「#10-4 ハートビート」を読み返してみたところ、
と言う記憶が蘇ってきました。その上で、改めてMAX30100のデータシートを参照し、ブロック図を眺めて見たところ、「信号増幅」している回路が見当たりません。LPF通過信号との比較(減算)している回路も無い様です。
つまり、フォトトランジスタからの検出信号(アナログ信号)を、そのままAD変換しているだけ、のチップだと判りました。
をいをい、そんな調子で脈拍なんて言う、微小な信号を検出(※)できるのかい?
AD変換後のデジタル信号になってしまっては、もはや信号増幅する事は叶わないので、後はLPF通過信号との差分値を取って見て、果たして脈拍を検出できるかどうか?って事ですね……。
※原理は、こちらを参照。
予備実験の結果を受けて、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表示画面を確認してください(下図)。
予備実験でも指摘した通り、指の当て方、強さなどで測定値は簡単にばらつきます。微小な脈拍信号の検知どころではなくなってしまうため、指を当てたら安静にして、SPI-TFT画面をご確認ください。うまく脈拍を検出できない場合は、指の当て方や強さなどを少し変えながら試してみてください。結構シビアです(1−_−;)。
計測した脈拍数[bpm]はSPI-TFTに表示される様になっているので、以下動画で確かめていただきたいと思います。
SPI-TFTが手軽に使える様になったので、予備実験の段階から、計測したデータをリアルタイムで確認できる様になりました。デバッグが捗ります。今までは、計測したデータをシリアルモニタでダウンロードして、Excelに貼り付けて、グラフ化して、と、手間がかかっていましたから。
こちら「#10-4 ハートビート」の記事ではアナログ信号の間にハードウェア側も手を尽くしているのに対して、MAX30100はAD変換器でデジタル信号に変換しただけで、後はソフトウェア側の処理に丸投げです。これって、どうなのでしょうか??ごく微小な信号なのですから、アナログ信号の間に、もう少しハードウェア側が歩み寄るべきだったのではないでしょうか?ハードウェア/ソフトウェアが協調すべきシステム設計が、ずさん過ぎると思いました。
システム設計の悪いお手本、なのでは?
皆様は、ハードウェアもソフトウェアも良く理解した上で、システムとして、どうするのが一番の解法なのか?を考えて設計するようにしてください。そうした方が、より良いモノ作りができます。
ディスクリート部品を使ってブレッドボード上に結構ゴチャっとした回路を作っていたのに対して、お気軽に使えるかな?と、購入して見たものの、こんなにシビアなモジュールでは、お気軽に使うとは言い難いです。この先の応用(ウェアラブル)も考えていたのですが、ちょっと無理そう……。