Arduinoでパルスオキシメーター、MAX30100の使い方〜心拍数と血中酸素濃度の測定

こんなこと、やります。

  • Arduinoで心拍センサーモジュール「MAX30100」の使い方
  • MAX30100の基板改造
  • シリアルモニタに心拍数と血中酸素濃度を表示

Arduinoでパルスオキシメーター、MAX30100の使い方〜心拍数と血中酸素濃度の測定
Arduinoでパルスオキシメーター、MAX30100の使い方〜心拍数と血中酸素濃度の測定

▼ Arduinoで作らずとも今なら製品を安く購入できます。今すぐパルスオキシメーターが欲しい方は、検討してみてはいかがでしょうか。

つかうもの

はじめに、この記事で使うものをご紹介します。

心拍センサーモジュール(MAX30100)

基板上のセンサー部に指をかざすと、心拍数と血中酸素濃度を検出します。分解能16bitのデジタル値として、I2C通信で取得します。専用のライブラリがありますので、Arduinoでの測定はカンタンです。

心拍センサーモジュール(MAX30100)
心拍センサーモジュール(MAX30100)

入力電圧は1.8V〜5.5Vまで対応しています。ただし、SDA・SCL端子が4.7kΩの抵抗で1.8Vにプルアップされているため、1.8V以外のI2C機器と接続する場合はそのままでは使えません。このことについては後ほど解説します。

Arduino

Arduino Uno Rev3を使用しました。

この記事の内容は、ほかのArduinoでも動作します。

まだArduinoをお持ちでないようでしたらオススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。

その他の電子部品

また、ブレッドボードやジャンプワイヤもあると便利です。

MAX30100基板の改造

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

Initializing pulse oximeter..FAILED
Initializing pulse oximeter..FAILED

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

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

改造前
改造前

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

改造後
改造後

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

配線

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

ArduinoMAX30100モジュール
3V3VIN
SCLSCL
SDASDA
GNDGND

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

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();
    }
}

指をセンサーにかざせば、次のようにシリアルモニターで心拍数と血中酸素濃度が測定されるはずです。

心拍数と血中酸素濃度
心拍数と血中酸素濃度

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

記事に関するご質問などがあれば、
@tosisico または お問い合わせ までご連絡ください。
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事