MAX30102-Arduinoテスト1

 MAX30102

心拍数モニタバイオセンサーモジュール

データシート

https://www.analog.com/media/en/technical-documentation/data-sheets/MAX30102.pdf



まずネットでの情報が多いのでArduinoではじめてみる。久々にNanoをひっぱり出してきた・・・。サンプルを走らせると何やら数字はかえってくる。




すぐさまスマートウォッチGalaxy Watch5 Pro(4万円はする)で測定した値と比べると10程違う。

ArduinoのExampleが動いた所でつかえるようになるものでもないという事で一つ一つデータシートを読んで動作を確認していくことにする。

まずはI2Cでデータのやり取りを確認する。レジスタFFにPARTIDがあってIDを返してくれるはずなのでそれを読み取ってみる。
0x15を返してくれるはず。
まず #include <Wire.h> Wireをインクルードする。結果をシリアルに出力するためにSerial.beginも。
あとはI2Cのコマンドを並べて・・・
#include <Wire.h>

void setup() {
  // put your setup code here, to run once:
   Serial.begin(115200);
   Wire.begin();

}

void loop() {
  // put your main code here, to run repeatedly:
 Wire.beginTransmission(0x57);
 Wire.write(0xFF);
 Wire.endTransmission(false);
 Wire.requestFrom(0x57, 1,true);
 Serial.println(Wire.read(),HEX);

  delay(1000);
}

0x15を返してくれる。

I2Cの通信が確認できたのでやり取りする関数から用意する。
File-New sketchで新しいスケッチをつくる。 I2Cを使うので、

続いて、レジスタへの書き込み、読み込みの関数を用意してやる。

void MAX30105writeRegister(uint8_t address, uint8_t reg, uint8_t value) {
 Wire.beginTransmission(address);
 Wire.write(reg);
 Wire.write(value);
 Wire.endTransmission();
}  

uint8_t  MAX30105readRegister(uint8_t address, uint8_t reg) {
 Wire.beginTransmission(address);
 Wire.write(reg);
 Wire.endTransmission(false);
 Wire.requestFrom(address, 1,true);
 return Wire.read();
}  

setupの中には、Wireの開始の関数を置く
Wire.begin();

レジスタ0x09は、シャットダウンや、リセット、モードの選択をする。
MAX30105writeRegister(0x57,0x09,0x07);
ここでは、MultiLEDモードを指定する。

x0Cのレジスタは、LEDに流す電流の大きさを決める。
MAX30105writeRegister(0x57,0x0C,0x1F);


まずは、中間に見えている1F(6.2mA)を指定してみた。
0x11と0x12のレジスタで2つのLEDをアクティブにするタイミングを指定してやる。
MAX30105writeRegister(0x57,0x11,0x21);

最低限として上に記載の設定をしてやる。
void setup() {
  // put your setup code here, to run once:

 Wire.begin();


MAX30105writeRegister(0x57,0x09,0x07);
//LED current
MAX30105writeRegister(0x57,0x0C,0x1F);
/
MAX30105writeRegister(0x57,0x11,0x21);

}




すると上のような記述になる。
loopの中を以下のように記述する。これはいわゆるLチカをやってみる。
void loop() {
  // put your main code here, to run repeatedly:

MAX30105writeRegister(0x57,0x0C,0x00);
MAX30105writeRegister(0x57,0x0D,0x00);
 delay(500);

//MAX30105writeRegister(0x57,0x0C,0x1F);
MAX30105writeRegister(0x57,0x0D,0x1F);
 delay(500);
}


電流をゼロと1Fと交互に500msecで1秒間隔で点滅させる。コメントアウトを0x0Cと0x0Dで変えて動作を確認してみある。

LED1(0x0C)を点灯させた場合
肉眼では見えないが、カメラ越しだと、青色く見える点が点滅する。

LED2(0x0D)を点灯させた場合、これは目視でも見えるRedの点滅

まずは、I2Cを介してマイコンから命令を送ってLEDを点灯させる所まではできた。



コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法