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

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

こんなこと、やります。

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

つかうもの

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

心拍センサモジュール(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で電子工作をはじめる方へ をご覧ください。

その他の電子部品

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

▼ 「つくるのめんどー」な方は素直に製品を買いましょう(笑)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」をインストールしてください。

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

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

心拍数と血中酸素濃度測定プログラムです。ライブラリページのサンプルプログラムを使用しました。 GitHub - oxullo/Arduino-MAX30100: Arduino library for MAX30100, integrated oximeter and heart rate sensor

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

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

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

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

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

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

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