北東北 LabVIEWユーザー会

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

MicroPython&LabVIEW: Max30102で心拍と動脈血酸素飽和度を測ってみる

安価なセンサーを使ってMicroPythonとLabVIEWを連携したデータ収録のサンプルをつくってみようと思います。Max30102は赤色LEDと赤外LEDを皮膚から照射して散乱して戻ってくる光強度で心拍と動脈血酸素飽和度を測定するセンサーです。実験をするときも指先を流れる血潮を実感できて楽しい教材となるに違いありません。

 

P8170032.JPGP8170034.JPG

 

配線

マイコン ------------- max30102基板

3.3V ------------------- VIN

1pin ------------------- SDA

0pin ------------------- SCL

GND ------------------ GND

 

Max30102から赤色LEDの散乱強度と赤外LEDの散乱強度のデータがI2C通信で送られてきます。心拍数は1分間に60-100回ぐらいらしいので、波形を取得するために0.02秒間隔で送られてくる設定になっています。

MicroPythonライブラリはMaxim MAX30102 MicroPython driverを使用しました。

 

libdl.png

マイコンWaveshare RP2040-Zeroのファイル領域にmax30102というフォルダーを作り、_init_.pyとcircular_buffer.pyを保存します。こうすることで、以下の文でライブラリを活用できるようになるとのことです。

from max30102 import MAX30102

 

libmicropython.png

 

MicroPythonで受け取って、USBシリアルでPCに送ります。0.02秒間隔で連続的に観察したいので、MicroPythonのREPLモードにLabVIEWからコマンドを送ってデータを受けとるコールアンドレスポンスでは間に合わなくなる可能性が高いので、AIと相談して新たな連携方法を考えました。

 

収録開始と収録停止の指示をREPLで行って、収録が開始されると連続して、指定サイズのデータ単位でカンマ区切りの数値文字列で送ってきます。エラー処理などは文字列で送られると受け側の処理が面倒なので、マイコン基板のフルカラーLEDで動作状態を示すようにしました。

このMicroPythonプログラムでは_threadライブラリを使用して、バックグラウンドで収集・送信を行っています。そのバックグラウンドの動作をREPLで制御しているのです。慣れていないと書けないプログラムだと思いますが、汎用性のある方式ではないかと思います。

 

 

sendC.pngstopF.png

 

LabVIEWでの受信プログラムはREPLで”continuous_send(64)”を送って測定を開始して、whileループで受信と解析を連続して行い、停止するときにREPLで"stop()"を送りマイコンの測定動作を止めます。

 

fp.pngbd1.png

 

 

IRの散乱データがch0、REDの散乱データがch1になっていて、Heart Rate、SPO2(動脈血酸素飽和度)を表示しています。

データの解析方法はMAX30102のデータシートとともに提供されている「Recommended Configurations and Operating Profiles for MAX30101/MAX30102 EV Kits」を参考にしました。重複したダイアグラムになっていますが、サブVIの数を少なくしたかったのでご容赦ください。

 

bd2.png

 

REPLの関数はこれまで通りです。

bd3.png

 

 

 

MicroPythonのmax30102ライブラリは紹介したURLからダウンロードください。

添付した"max30102_main.py"はマイコンに"main.py"として保存してください。

Max30102_LabVIEW2023.zipはMax30102_LabVIEW.vi、HR&SPO2.vi、REPL_CommandToArray.viはLV2023で保存して圧縮しました。

 

お気づきの点があれば投稿でお知らせください。

 

 

 

すべてをダウンロード
0 件の賞賛
メッセージ1/1
157件の閲覧回数