【Arduino】MAX30100で心拍数と血中酸素濃度の測定【パルスオキシメーター】
こんなこと、やります。
- Arduinoで心拍センサモジュール「MAX30100」の使い方
- MAX30100の基板改造
- シリアルモニタに心拍数と血中酸素濃度を表示
つかうもの
はじめに、この記事で使うものをご紹介します。
心拍センサモジュール(MAX30100)
基板上のセンサ部に指をかざすと、心拍数と血中酸素濃度を検出します。分解能16bitのデジタル値として、I2C通信で取得します。専用のライブラリがありますので、Arduinoでの測定は簡単です。
入力電圧は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」となってしまいました。
原因を探っていたところ、こちらの動画で詳しく解説されていました。
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」をインストールしてください。
心拍数と血中酸素濃度測定プログラム
心拍数と血中酸素濃度測定プログラムです。ライブラリページのサンプルプログラムを使用しました。 GitHub - oxullo/Arduino-MAX30100: Arduino library for MAX30100, integrated oximeter and heart rate sensor
#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();
}
}
指をセンサにかざせば、次のようにシリアルモニターで心拍数と血中酸素濃度が測定されるはずです。 ただし、あまり精度が良いとは言えません。本格的に使う場合は、プログラムを改良する必要がありそうです。