Arduino NanoとMAX30102で心拍数モニターを自作:16x2 LCD表示対応
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | 小型マイコンボード |
| MAX30102 心拍数センサーモジュール | 1 | 光学式心拍・酸素飽和度センサー |
| Adafruit RGBバックライト LCD 16x2 | 1 | I2Cまたはパラレル接続対応 |
| ロータリーポテンショメーター | 1 | LCDコントラスト調整用 |
必要な工具
- はんだごて(ピンヘッダー実装用)
使用ソフトウェア
- Arduino IDE
プロジェクト概要
MAX30102センサーを用いたシンプルな心拍数モニターです。指先をセンサーに当てると、赤外線LEDとフォトダイオードによる反射光量の変化から脈拍を検出し、BPM(拍動/分)を計算して16x2 LCDに表示します。1行目に平均BPM、2行目に赤外線反射値(IR値)を表示し、IR値が安定しているかで装着状態を確認できます。
配線図
- MAX30102: VCC→3.3V/5V, GND→GND, SDA→A4, SCL→A5, INT→未接続
- LCD (パラレル): RS→12, EN→11, D4→5, D5→4, D6→3, D7→2, VSS→GND, VDD→5V, V0→ポテンショメーター中間, RW→GND, A→5V(抵抗経由), K→GND
ライブラリの準備
以下のライブラリをArduino IDEのライブラリマネージャーからインストールしてください。
MAX30105(SparkFun製、MAX30102互換)heartRate(同梱のアルゴリズム)LiquidCrystal(標準搭載)
スケッチ解説
PBA(Penpheral Beat Amplitude)アルゴリズムを用いてピークを検出し、直近4回のピーク間隔から平均BPMを算出します。測定間隔はloop()の高速実行に任せており、指の押し付け圧力が一定でないとノイズが乗りやすいため、「一定の圧力で指を固定すること」が精度向上の鍵です。
#include <Wire.h>
#include "MAX30105.h"
#include <LiquidCrystal.h>
#include "heartRate.h"
MAX30105 particleSensor;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30105 not found");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
}
void loop() {
long irValue = particleSensor.getIR();
if (checkForBeat(irValue)) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
lcd.setCursor(0, 0);
lcd.print("BPM: "); lcd.print(beatAvg);
lcd.setCursor(0, 1);
lcd.print(" IR: "); lcd.print(irValue);
if (irValue < 50000) Serial.println(" No finger?");
delay(20);
}
精度向上のポイント
- 指をゴムバンドなどで固定し、圧力を一定に保つ
- IR値が50,000以上になるようセンサー位置を調整
- 周囲光の影響を避ける(指でセンサーを覆う)
- RATE_SIZEを増やして平滑化(メモリー許容範囲内で)
応用アイデア
- SpO2(酸素飽和度)測定機能の追加(赤色LEDも使用)
- Bluetoothモジュール追加でスマホアプリにデータ転送
- バッテリー駆動化してウェアラブルデバイス化
製造プロセス
- リモート心拍数監視システム:AWS IoTアラート付き
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- フォトレジスタとArduinoで作る高精度心拍数モニター
- 給湯器パイロットライト監視システム - サーモカップル電圧をArduinoとRaspberry Piで監視し異常通知
- Arduino Mega と IoT センサによる高機能ホームモニタリングシステム
- DHT センサで作る信頼性の高い Arduino 気象ステーション
- Arduino UNOで作る信頼性の高いスマートエネルギーモニター – ステップバイステップガイド
- Arduino UNOで作るクラシックLCDアーケードゲーム(ブザー・ジョイスティック付き)
- スマート衣類に統合された心拍センサーで信頼性の高いウェアラブル監視を実現