M5Stick CとHeart Rate UNITでSpO2を測ってみる -1-

https://kinneko.booth.pm/items/1963720

 ----------------------------------------------------------------------------------------

 新型コロナでは、酸素飽和度(SpO2)の低下に要注意ということなので、測ってみようかなと思った金曜日。

コロナ「突然重症化した人」の驚くべき共通点
https://toyokeizai.net/articles/-/346423

 『肺炎では患者は通常、胸部の不快感や呼吸時の痛みなどの呼吸障害を発症する。しかし、新型コロナ肺炎の場合、当初患者は酸素量が低下しても、息切れを感じない。しかしその間、驚くほど酸素濃度が低下し、中等度から重度の肺炎(胸部X線写真で見られる)になっていく。正常な酸素飽和度は94%から100%だが、私が見た患者の中には、酸素飽和度が50%にまで低下していた例もある。』

 SpO2を測定する代表的な方法はパルスオキシメーターを使う方法。原理を開発したのは日本の方だそうだけど、その発明者の方がつい先日亡くなっている。

パルスオキシメーターを発明、青柳卓雄さん死去:朝日新聞デジタル
https://www.asahi.com/articles/ASN4R74VJN4RULBJ00D.html

 基本的には、2つの波長の光で酸素と結合したヘモグロビンと、酸素を手放したヘモグロビンの比を確認することで、血中に十分に酸素が供給されているか調べるという方法。

 パルスオキシメーター、売っているのだけど、国内で流通しているものは高価すぎる。

 Amazonでは安いものも並んでいるのだけど、ほとんど国内在庫なしの中華通販業者なのでAliexpressで頼むのと変わらない。そして、のきなみ売り切れ。なんでだ?

 しょうがないので、Aliexpressで3種類ほど見繕ってオーダーしてみた。しかし、このご時世なので、いつ届くかわからない。

 SpO2センサMAX30100も基板実装済みのものが$2くらいで安いのだけど、精度とかよくわかんないな、ということでパス。Arduinoで使えるライブラリはあるそうな。

 調べてゆくと、どうもM5Stackで出しているセンサが安い感じ。ケースに入って扱いやすそう。スイッチサイエンスでさっそくオーダーする。836円+送料200円。でも金曜オーダーなのでいつ届くやら。

M5Stack用心拍センサユニット - スイッチサイエンス
https://www.switch-science.com/catalog/5695/

 たしか、マルツは店頭在庫がチェックできたな、と思って調べる。マルツ金沢には在庫があるようだ。スイッチサイエンスで買う必要なかったか...

 睡眠時無呼吸症候群の検査の時に、このセンサを一晩指にくっつけて寝た記憶があるのだけど、SpO2って透過で測るのじゃなかったか? 反射でもいいのか?という疑問はある。

 翌日の土曜、さっそく買いに行く。在庫は1つでした。コロナのおかげで、電子工作コーナーはお休みになっている。営業時間も短縮中。マスクして入り口でアルコール消毒しないと入店できない。開いててよかった!

 マイコンはNodeMCU-32S、表示は7セグでやろうかなと思っていたのだけど、ちょっとグラフっぽいのも出るといいなということで、M5Stick Cも買う。お天気いいので、日中は庭仕事することにして夜からさわりはじめる。

 しかし、いきなりアウェイな事実が判明。

HIROSHI SASAKI on Twitter: "m5stackにheart rate(max30100)で脈波を測定。5ー6秒で波形が安定してくる。 m5stickCでは動かなかった。
https://twitter.com/hirosh/status/1209057503767453697

 マヂですか... オラの1800円を返せ... (買う前にリサーチしろよw)

 でも、まぁ、自分でやってみる。接続はGROVEコネクタモドキなので、センサに付属のケーブルで接続するだけ。ピン配置は本体にもモジュールにも明記されているので、わかりやすい。M5Stick CがGND-5V-G32-G33、HeartRate UNITがSCL-SDA-5V-GND。

 M5StickVはさわったことあるのだけど、あちらはMiaxPyで使っていた。普通のM5シリーズをさわるのは初めてだ。これ、どうやってプログラム書くの?

 ドキュメントを見ると、普通にArduinoの開発環境でいい感じだ。

M5Stack Docs - The reference docs for M5Stack products.
https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows

 EPS32のライブラリは普段使っているので、インストール済みだ。あとは、M5StickCのライブラリを検索してインストールする。

 出荷時のデモプログラムの出来がいいので、なんかもったいないな。一応、esptoolでバックアップを取っておく。

$ esptool.py -p /dev/tty.usbserial-9552E83892 -b 115200 read_flash 0 0x400000 m5c_default_firmware.bin

 esptool.py v2.5.1

 Serial port /dev/tty.usbserial-9552E83892

 Connecting.......

 Detecting chip type... ESP32

 Chip is ESP32-PICO-D4 (revision 1)

 Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse

 MAC: d8:a0:1d:58:48:d8

 Uploading stub...

 Running stub...

 Stub running...

 4194304 (100 %)

 4194304 (100 %)

 Read 4194304 bytes at 0x0 in 379.8 seconds (88.3 kbit/s)...

 Hard resetting via RTS pin...

$ ls -hl m5c_default_firmware.bin

 -rw-r--r-- 1 kinneko staff 4.0M 4 25 22:02 m5c_default_firmware.bin

 バックアップはできた。書き戻しは、以下のようにするとできる(確認はしていない)。

$ esptool.py -p /dev/tty.usbserial-9552E83892 -b 115200 write_flash --flash_freq 80m 0x000000 m5c_default_firmware.bin

 ArduinoIDEの設定はこのようにした。

 サンプルコードはこのあたりにある。とりあえず、これをそのまま試す。

M5StickC/MAX30100_RawData.ino at master · m5stack/M5StickC
https://github.com/m5stack/M5StickC/blob/master/examples/Unit/HEART/MAX30100_RawData/MAX30100_RawData.ino

 /*

 pls install MAX30100lib by library manager first

 addr: https://github.com/oxullo/Arduino-MAX30100

 */

#include <M5StickC.h>
#include <Wire.h>
#include "MAX30100.h"
// Sampling is tightly related to the dynamic range of the ADC.
// refer to the datasheet for further info
#define SAMPLING_RATE                       MAX30100_SAMPRATE_100HZ
// The LEDs currents must be set to a level that avoids clipping and maximises the
// dynamic range
#define IR_LED_CURRENT                      MAX30100_LED_CURR_50MA
#define RED_LED_CURRENT                     MAX30100_LED_CURR_27_1MA
// The pulse width of the LEDs driving determines the resolution of
// the ADC (which is a Sigma-Delta).
// set HIGHRES_MODE to true only when setting PULSE_WIDTH to MAX30100_SPC_PW_1600US_16BITS
#define PULSE_WIDTH                         MAX30100_SPC_PW_1600US_16BITS
#define HIGHRES_MODE                        true
// Instantiate a MAX30100 sensor class
MAX30100 sensor;
void setup()
{
M5.begin();
M5.Lcd.setRotation(3);

 //M5.Lcd.setTextColor(WHITE);

M5.Lcd.setTextSize(3);
M5.Lcd.print("MAX30100");

 //M5.Lcd.clear(BLACK);

M5.Lcd.setCursor(0, 40);
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
// Initialize the sensor
// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!sensor.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
// Set up the wanted parameters
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(IR_LED_CURRENT, RED_LED_CURRENT);
sensor.setLedsPulseWidth(PULSE_WIDTH);
sensor.setSamplingRate(SAMPLING_RATE);
sensor.setHighresModeEnabled(HIGHRES_MODE);
}
void loop()
{
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print(ir);
Serial.print('\t');
Serial.println(red);
}
}

 コンパイルエラーになつた。"AX30100.h: No such file or directory"。

 ライブラリは別入れか... (アタリマエ)

 ソースにはGithubから落とすように書かれているけど、とりあえずライブラリを検索してみると2つ出てきた。

 最初のは、オリジナルが https://github.com/kontakt/MAX30100 らしいのでダメだわ。

 もう1つの方が、ソースで指定されている https://github.com/oxullo/Arduino-MAX30100 のようだ。インストールする。

 んで、サンプルのソースを書き換える必要がある。ライブラリは、#include "MAX30100_PulseOximeter.h"で読み込む必要がある。

 ビルドできたので書き込む。指をあてるとシリアルにはこんなデータが出ている。

 しばらくすると安定してくる。

 このサンプルは、LCDにはMAX30100としか表示していなくて、値はシリアルを見ないとわからない。かなりイマイチ。

 つつく


オリジナル投稿:
M5Stick CとHeart Rate UNITでSpO2を測ってみる -1-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/991824