【Arduino】MAX30100で心拍数と血中酸素濃度の測定(パルスオキシメーター)
はじめに
こんなこと、やります。
- 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」をインストールしてください。

心拍数と血中酸素濃度測定プログラム
心拍数と血中酸素濃度測定プログラムです。ライブラリページのサンプルプログラムを使用しました。
#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();
}
}
指をセンサにかざせば、次のようにシリアルモニターで心拍数と血中酸素濃度が測定されるはずです。

ただし、あまり精度が良いとは言えません。本格的に使う場合は、プログラムを改良する必要がありそうです。