08-17-2025 07:40 PM
安価なセンサーを使ってMicroPythonとLabVIEWを連携したデータ収録のサンプルをつくってみようと思います。Max30102は赤色LEDと赤外LEDを皮膚から照射して散乱して戻ってくる光強度で心拍と動脈血酸素飽和度を測定するセンサーです。実験をするときも指先を流れる血潮を実感できて楽しい教材となるに違いありません。
配線
マイコン ------------- max30102基板
3.3V ------------------- VIN
1pin ------------------- SDA
0pin ------------------- SCL
GND ------------------ GND
Max30102から赤色LEDの散乱強度と赤外LEDの散乱強度のデータがI2C通信で送られてきます。心拍数は1分間に60-100回ぐらいらしいので、波形を取得するために0.02秒間隔で送られてくる設定になっています。
MicroPythonライブラリはMaxim MAX30102 MicroPython driverを使用しました。
マイコンWaveshare RP2040-Zeroのファイル領域にmax30102というフォルダーを作り、_init_.pyとcircular_buffer.pyを保存します。こうすることで、以下の文でライブラリを活用できるようになるとのことです。
from max30102 import MAX30102
MicroPythonで受け取って、USBシリアルでPCに送ります。0.02秒間隔で連続的に観察したいので、MicroPythonのREPLモードにLabVIEWからコマンドを送ってデータを受けとるコールアンドレスポンスでは間に合わなくなる可能性が高いので、AIと相談して新たな連携方法を考えました。
収録開始と収録停止の指示をREPLで行って、収録が開始されると連続して、指定サイズのデータ単位でカンマ区切りの数値文字列で送ってきます。エラー処理などは文字列で送られると受け側の処理が面倒なので、マイコン基板のフルカラーLEDで動作状態を示すようにしました。
このMicroPythonプログラムでは_threadライブラリを使用して、バックグラウンドで収集・送信を行っています。そのバックグラウンドの動作をREPLで制御しているのです。慣れていないと書けないプログラムだと思いますが、汎用性のある方式ではないかと思います。
LabVIEWでの受信プログラムはREPLで”continuous_send(64)”を送って測定を開始して、whileループで受信と解析を連続して行い、停止するときにREPLで"stop()"を送りマイコンの測定動作を止めます。
IRの散乱データがch0、REDの散乱データがch1になっていて、Heart Rate、SPO2(動脈血酸素飽和度)を表示しています。
データの解析方法はMAX30102のデータシートとともに提供されている「Recommended Configurations and Operating Profiles for MAX30101/MAX30102 EV Kits」を参考にしました。重複したダイアグラムになっていますが、サブVIの数を少なくしたかったのでご容赦ください。
REPLの関数はこれまで通りです。
MicroPythonのmax30102ライブラリは紹介したURLからダウンロードください。
添付した"max30102_main.py"はマイコンに"main.py"として保存してください。
Max30102_LabVIEW2023.zipはMax30102_LabVIEW.vi、HR&SPO2.vi、REPL_CommandToArray.viはLV2023で保存して圧縮しました。
お気づきの点があれば投稿でお知らせください。