Arduinoと戯れてみる!

Arduino 入門 Lesson 49 【脈拍・心拍センサ その3】

arduino-lesson49-01Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 49
【脈拍・心拍センサ その3】

こにんちは、管理人のomoroyaです。

センサーの使い方の基本を学習する入門編。

 

世の中には、まだまだ色々なセンサーがあります。

これからも、色々なセンサーで遊んでいきます。

 

本記事はLesson 49 【脈拍・心拍センサ その3】です。

Lesson 48で使用したセンサ。

精度よく簡単なスケッチで心拍波形を表示することができました。

また、Processing入門編で紹介したサンプルスケッチを使用するれば心拍波形を数値かしてパソコンに表示することもできます。

Processing 入門 Lesson 22 【脈拍・心拍センサ】
Lesson 22で使用する電子部品は【脈拍・心拍センサ】です。本LessonではArduino入門編で遊んだ「脈拍・心拍センサ」を使って心拍をProcessingで表現して遊びます。Arduinoで取得したデータをProcessingで処…

 

本Lessonでは、Lesson 48で取得した心拍波形からBPMを取得するスケッチを考えて見たいと思います。

BPM:Beats Per Minute(1分間の拍数)

 

サンプルコードを使用すれば、すぐにできますが・・・

あえて考えてみるということです。

管理人プログラマーでも何でもないため、挫折するかもしれません・・・

面白そうなので理解を深めるために、ちょっと学習です。

 

本Lessonで使用する脈拍・心拍センサは以下が同等品となります。

最近センサ関係の電子部品が手に入りずらい。

Amazonに在庫がない。

出荷元がAmazonではない。

そんな場合は中国からの輸入品になると考えられるため気長に待ってください。

 

Amaozn以外の国内で探してもあります。

しかし、高いです・・・。

Aliexpressなどでの購入に抵抗感がなければ、そちらもあり。

管理人はトラブルが面倒なので、多少高くでも返金が容易なAmazonで購入です。

Amazonであれば、最悪「Amazonマーケットプレイス保証」がありますので・・・。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

本Lessonで使用する「脈拍・心拍センサ」はLesson 48と同じものを使います。

原理は「脈拍センサ」で調べればででくるので興味のある方は調べてみてください。

オペアンプ、ノイズキャンセル回路が実装されているため、Lesson 47のセンサに比べて安定した測定ができると考えられます。

 

Lesson 49 目標

本Lessonの目標は以下です。

1.心拍波形からBPMの取得方法を理解する
2.BPMを取得するスケッチを描く
3.BPMを取得して遊ぶ

いつものように、遊ぶことが重要です。

 

センサの動作は単純。

ただし動作の理屈を理解するためには電子回路の知識が少し必要・・・。

回路がわからなくても遊べる、使える、作れるのがArduino の良いところ。

 

準備

ではLessonの準備に取り掛かりましょう。

部品は「反射型 脈拍・心拍センサ」のモジュールと表示をわかりやすくるためのLチカ。

Lチカ不要の場合は要りません。

 

必要なもの

Lesson 48と同じです。

※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

使用部品説明

脈拍・心拍センサ」のモジュールについて説明していきます。

Lesson 48と同じため省略。

下記を確認ください。

 

本Lessonは遊び、学習を想定しています。

Arduinoの仕様範囲内で使用していれば問題になることもありません。

遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

Lesson 48と同じです。

 

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、「反射型 脈拍・心拍センサ」を動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

反射型 脈拍・心拍センサが実装されたモジュール端子を接続していきます。

Arduinoはアナログ入力としてA0を使用。

あとは、5VGNDのみ。

 

回路図がこちら。

pulse-sensor-schematic

 

こちらがブレッドボード図。

pulse-sensor-breadboard

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は「反射型 脈拍・心拍センサ」とLチカのみです。
※センサが実装されたモジュール

Lチカが不要であれば、部品は1個、接続は簡単です。

脈拍・心拍センサと接続するジャンパーワイヤーはF-Mを使用してます。

そのため、ブレッドボードもいりません。

 

毎回ブレッドボードにLEDをセットするのも面倒なので「Lチカ」自作しました。

おすすめです。

 

使用するポートは、アナログ入力A0、5V、GND。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

arduino-lesson48-04

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

コマンド説明

本Lessonでは、「MsTimer2」のライブラリを使用します。

MsTimer2」がライブラリにない方はライブラリをインストールしてください。

 

以下のいずれかでインストトール可能です。

  • 「ライブラリをインクルード」⇒「.zip形式のライブラリをインストール…」
  • 「ツール」⇒「ライブラリを管理」

ライブラリについては下記を参照ください。

 

zipファイルは下記からダウンロード可能です。
https://www.arduino.cc/reference/en/libraries/mstimer2/

コマンド内容
MsTimer2::set(unsigned long ms, void (*f)())ms:オーバーフローする時間をmsで指定
関数f:オーバーフローするたびに呼び出される
f:引数なしのvoid型として宣言
MsTimer2::start()割り込みを有効
MsTimer2::stop()割り込みを無効

 


MsTimer2::set(200, xxx); // 200msごとにxxxの関数を繰り返す
MsTimer2::start();           //割り込みを有効化

 

公式ページの解説は以下となります。
https://playground.arduino.cc/Main/MsTimer2/

 

サンプルコード

サンプルスケッチは3つ考えます。

  1. Lesson48の復習となる、脈拍・心拍をシリアルプロッタに表示するスケッチ
  2. 20秒間の脈拍・心拍の回数を測定し60秒間に換算するスケッチ
  3. 基準点と基準点の周期をもとめてBPMを求めるスケッチ
1番はLesson48の復習のスケッチ。
2番は単純に20秒間の脈拍・心拍をカウントし60秒に換算するスケッチ。
※60秒カウントしても良いが長いので・・・
簡単なスケッチでBPMを計算できないかなと考えました。
3番は、電子部品を販売している公式ページに計算の概念が記載されています。https://pulsesensor.com/pages/pulse-sensor-amped-arduino-v1dot1

公式ページを読み解くと3番の流れとしては以下。

  • タイマー割り込みを発生させる(2msごと)てセンサーの値をサンプリング
  • 波形の立ち上がり部分の底(T)と頂点(P)を見つけ、その半分の点を心拍の基準点とする
  • 基準点と次の基準点の間の時間(周期)を求め、1分間の心拍数(BPM)に換算
  • 10拍分の移動平均で最終的なBPM値を計算する

arduino-lesson49-01

 

ちょっと、管理人に上記のスケッチがかけるのか・・・

とりあえず、2番のスケッチに取り組み、次に3番です。

 

サンプルスケッチ1

まずは、復習もかねて脈拍・心拍をシリアルプロッタに表示するスケッチです。

とても単純なスケッチで、analogReadでセンサの出力をAD変換してシリアルプロッタに表示しているだけです。

//Lesson49 PulseSensor 脈拍・心拍のシリアルプロッタ表示
//https://omoroya.com/

//  変数の設定
int SensorOutPin = 0; // パルスセンサー出力をアナログピンの0番指定
int LED = 13;         // Lチカ用のデジタルピンを13番指定
int Signal;           // analogReadで読み取る値の格納変数
int Threshold = 550;  // 心拍のスレッショルド指定(LED点灯判定用)

void setup() {
  pinMode(LED,OUTPUT); // 13番ピンを出力指定
  Serial.begin(9600);  // シリアルポートを9600bpsで指定

}

void loop() {
  Signal = analogRead(SensorOutPin); // パルスセンサの値を読み込み
  Serial.println(Signal);                    // シリアルプロッタに表示
  
  //LED使用したなければ下記は不要
  if(Signal > Threshold){
      digitalWrite(LED,HIGH); // 設定閾値をこえたらLED ON
    } else {
      digitalWrite(LED,LOW);  // 設定閾値未満ならLED OFF
    }
    delay(10);                // 10ms遅延設定
}

 

サンプルスケッチ1 結果

こちらはLesson48の復習です。

  • センサー上に何もなし → シリアルプロッタで脈拍・心拍が確認されない
  • センサー上に指を置く → シリアルプロッタで脈拍・心拍を確認できる
補足
測定の邪魔になる他の光は遮断しましょう。
マジックテープなどで指にまくと良いでしょう。

 

■センサーに指を置いていない状態

serial-monitor-0

 

■センサーに指を置いた状態

arduino-lesson49-02

 

 

サンプルスケッチ2

サンプルスケッチ2は、サンプルスケッチ1を改造します。

MsTimer2」のライブラリを使うことで、20秒間の脈拍・心拍を単純にカウントします。

20秒のカウント値を取得後、60秒換算することでBPMを算出。

カウントした値をシリアルモニタに表示させます。

 

簡単なスケッチでBPMを表示できないかなと考え・・・

カウントするだけでBPMが計算できるようにしてみました。

欠点はBPM測定に時間がかかるということ。

//Lesson49 サンプルスケッチ2 PulseSensor 心拍をカウントする
//https://omoroya.com/

#include 

// 変数の設定
int SensorOutPin = 0; // パルスセンサー出力をアナログピンの0番指定
int LED = 13;         // Lチカ用のデジタルピンを13番指定
int Signal;           // analogReadで読み取る値の格納変数
int Threshold = 550;  // 心拍のスレッショルド指定(LED点灯判定用)
int timercnt;         // タイマーの判定用変数

void timerHandler() {
  //タイマ満了時呼び出される
  timercnt++;
}

void setup() {
  pinMode(LED,OUTPUT); // 13番ピンを出力指定
  Serial.begin(9600);  // シリアルポートを9600bpsで指定

}

void loop() {
  // ローカル変数設定
  int cnt = 0;
  int state = 0;
  float buf;

  MsTimer2::set(20000, timerHandler);
  timercnt = 0;
  MsTimer2::start();
  
  while(timercnt == 0){ 
    Signal = analogRead(SensorOutPin); // パルスセンサの値を読み込み
    //Serial.println(Signal);          // AD変換した値を表示
    
    //LEDのON,OFF及び脈拍・心拍のカウント
    if(Signal > Threshold){
      digitalWrite(LED,HIGH);  // 設定閾値をこえたらLED ON
      if(state == 0){
        cnt++;                 //閾値を超えて状態0ならカウントアップ
        Serial.println(cnt);   //20秒間のカウント値を表示
      }
        state = 1;             //状態を1にする
      } else {
        digitalWrite(LED,LOW); // 設定閾値未満ならLED OFF
        state = 0;             // 状態を0にする
      }
    delay(10);                 // 10ms遅延設定
  }


   buf = float(cnt)/20.0*60.0; // 20秒のカウント値を60秒換算
   Serial.print("BPM = ");     // 表示設定
   Serial.println(buf);        // BPMの値を表示
}

 

サンプルスケッチ2 結果

20秒間、脈拍・心拍をカウントします。

その後、60秒換算したBPMを表示しています。

シリアルモニタで確認ください。

 

■シリアルモニタの表示結果

  • 20秒間、脈拍・心拍をカウント
  • 20秒後、60秒換算したBPMを表示

arduino-lesson49-03

 

■シリアルプロッタの表示表示

20秒間、カウントし、リセットして0に戻る動作を繰り返しているのがわかります。
※途中でやめたのでプロットが切れています。

arduino-lesson49-04

 

サンプルスケッチ3

現在、スケッチ試行中!

しばらく、お待ちください。

 

サンプルスケッチ3 結果

現在、スケッチ試行中!

しばらく、お待ちください。

 

まとめ

本Lessonは、以下を目標としました。

1.心拍波形からBPMの取得方法を理解する
2.BPMを取得するスケッチを描く
3.BPMを取得して遊ぶ

 

本Lessonはリリースされているサンプルスケッチを使わずに「BPM」を計算することを目標にしています。

遊ぶだけであれば、ここまでしなくてもリリースされているサンプルスケッチをダウンロードすればOK。

ただ、今回はどうしてもBPMを自分で計算させて取得したいと考えました。

色々試行して遊びたいんですよね。。。

また、「MsTimer2」の使い方を学習したいというのも一つです。

MsTimer2」を使いこなすことができれば、色々と他のスケッチでも遊べそうです。

 

Lesson 49 【脈拍・心拍センサ その3】 は記事をアップデート中。

サンプルスケッチ3は試行中です!

しばらくお待ちください。

疑問点、質問などありましたら気軽にコメントください。

 

脈拍・心拍センサとProcessingを使って、面白そうなことができそう!

サンプルスケッチが秀逸なのでProcessingで遊んでみました。

こちらも、あわせて遊んでみてください。

Processing 入門 Lesson 22 【脈拍・心拍センサ】
Lesson 22で使用する電子部品は【脈拍・心拍センサ】です。本LessonではArduino入門編で遊んだ「脈拍・心拍センサ」を使って心拍をProcessingで表現して遊びます。Arduinoで取得したデータをProcessingで処…

 

次回、Lesson 50 【Real Time Clock モジュール】を使って遊びます。

時刻を刻むための「DS1302」を使ったクロックモジュールです。

Arduino 入門 Lesson 50 【Real Time Clock モジュール】
本記事はLesson 50 【Real Time Clock モジュール】です。Real Time Clock(リアルタイムクロック)とは、時刻を告げることを目的とした電子デバイスが搭載された時計。その機能を実装したIC(集積回路)のことを…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで2000ポイントもらえるキャンペーンも実施中!
※いつもは1000ポイント、今なら2000ポイントです!

\Amazonギフト券 2000ポイントキャンペーン/
Amazonチャージ 初回購入で2000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

タイトルとURLをコピーしました