サイトロゴ

【Arduino】MAX30100で心拍数と血中酸素濃度の測定【パルスオキシメーター】

著者画像
Toshihiko Arai

はじめに

こんなこと、やります。 - Arduinoで心拍センサモジュール「MAX30100」の使い方 - MAX30100の基板改造 - シリアルモニタに心拍数と血中酸素濃度を表示

MAX30100基板の改造

私が購入したMAX30100モジュールの場合、残念ながらそのままではI2C通信できませんでした。下記のように「Initializing pulse oximeter..」で「FAILED」となってしまいました。

原因を探っていたところ、こちらの動画で詳しく解説されていました。

MAX30100モジュールに内蔵されているプルアップ抵抗が、1.8Vにつながっていました。これではArduinoの入力しきい値をこえないため、I2C通信ができるはずありません。

そこで、動画内で紹介されていた改造方法をやってみました。1.8Vへつながる配線をカットし、プルアップ抵抗を3.3Vへ繋ぐように改造しました。細かい作業ではんだ付けしにくいですが、下の写真のようになんとか改造できました。

これで、後ほど紹介するプログラムでも動作するようになります。

配線

配線は次のとおりです。ArduinoのA4をSDA、A5をSCLとして使ってもらっても構いません。

Arduino MAX30100モジュール
3V3 VIN
SCL SCL
SDA SDA
GND GND

ライブラリのインストール

Library Managerを開き「max30100」で検索して「MAX30100lib」をインストールしてください。

心拍数と血中酸素濃度測定プログラム

心拍数と血中酸素濃度測定プログラムです。ライブラリページのサンプルプログラムを使用しました。 https://github.com/oxullo/Arduino-MAX30100

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"

#define REPORTING_PERIOD_MS     1000

PulseOximeter pox;

uint32_t tsLastReport = 0;

void onBeatDetected()
{
    Serial.println("Beat!");
}

void setup()
{
    Serial.begin(115200);

    Serial.print("Initializing pulse oximeter..");

    // 失敗する場合は基板のプルアップ抵抗が1.8Vにつながっている可能性あり!
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }

    pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop()
{
    pox.update();

    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        Serial.print("Heart rate: ");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2: ");
        Serial.print(pox.getSpO2());
        Serial.println("%");

        tsLastReport = millis();
    }
}

指をセンサにかざせば、次のようにシリアルモニターで心拍数と血中酸素濃度が測定されるはずです。 ただし、あまり精度が良いとは言えません。本格的に使う場合は、プログラムを改良する必要がありそうです。

関連記事