Arduino 入門
Lesson 49
【脈拍・心拍センサ その3】
こにんちは、管理人のomoroyaです。
センサーの使い方の基本を学習する入門編。
世の中には、まだまだ色々なセンサーがあります。
これからも、色々なセンサーで遊んでいきます。
本記事はLesson 49 【脈拍・心拍センサ その3】です。
Lesson 48で使用したセンサ。
精度よく簡単なスケッチで心拍波形を表示することができました。
また、Processing入門編で紹介したサンプルスケッチを使用するれば心拍波形を数値かしてパソコンに表示することもできます。
本Lessonでは、Lesson 48で取得した心拍波形からBPMを取得するスケッチを考えて見たいと思います。
サンプルコードを使用すれば、すぐにできますが・・・
あえて考えてみるということです。
管理人プログラマーでも何でもないため、挫折するかもしれません・・・
面白そうなので理解を深めるために、ちょっと学習です。
本Lessonで使用する脈拍・心拍センサは以下が同等品となります。
最近センサ関係の電子部品が手に入りずらい。
Amazonに在庫がない。
出荷元がAmazonではない。
そんな場合は中国からの輸入品になると考えられるため気長に待ってください。
Amaozn以外の国内で探してもあります。
しかし、高いです・・・。
Aliexpressなどでの購入に抵抗感がなければ、そちらもあり。
管理人はトラブルが面倒なので、多少高くでも返金が容易なAmazonで購入です。
Amazonであれば、最悪「Amazonマーケットプレイス保証」がありますので・・・。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
本Lessonで使用する「脈拍・心拍センサ」はLesson 48と同じものを使います。
原理は「脈拍センサ」で調べればででくるので興味のある方は調べてみてください。
オペアンプ、ノイズキャンセル回路が実装されているため、Lesson 47のセンサに比べて安定した測定ができると考えられます。
Lesson 49 目標
本Lessonの目標は以下です。
2.BPMを取得するスケッチを描く
3.BPMを取得して遊ぶ
いつものように、遊ぶことが重要です。
センサの動作は単純。
ただし動作の理屈を理解するためには電子回路の知識が少し必要・・・。
回路がわからなくても遊べる、使える、作れるのがArduino の良いところ。
準備
ではLessonの準備に取り掛かりましょう。
部品は「反射型 脈拍・心拍センサ」のモジュールと表示をわかりやすくるためのLチカ。
Lチカ不要の場合は要りません。
必要なもの
Lesson 48と同じです。
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - M-M Jumper wire(UNOと部品をつなぐための配線)
- M-F Jumper wire(UNOと部品をつなぐための配線)
- M-F M-M F-F セット Jumper wire(UNOと部品をつなぐための配線)
- 反射型 脈拍・心拍センサ
- 330Ω 1本
※330ΩはLEDを使用する場合に必要
※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
「脈拍・心拍センサ」のモジュールについて説明していきます。
Lesson 48と同じため省略。
下記を確認ください。
本Lessonは遊び、学習を想定しています。
Arduinoの仕様範囲内で使用していれば問題になることもありません。
遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。
実践 回路作成とコード作成
最初に回路図を確認してください。
Lesson 48と同じです。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、「反射型 脈拍・心拍センサ」を動かしていきましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
反射型 脈拍・心拍センサが実装されたモジュール端子を接続していきます。
Arduinoはアナログ入力としてA0を使用。
あとは、5VとGNDのみ。
回路図がこちら。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は「反射型 脈拍・心拍センサ」とLチカのみです。
※センサが実装されたモジュール
Lチカが不要であれば、部品は1個、接続は簡単です。
脈拍・心拍センサと接続するジャンパーワイヤーはF-Mを使用してます。
そのため、ブレッドボードもいりません。
毎回ブレッドボードにLEDをセットするのも面倒なので「Lチカ」自作しました。
おすすめです。
使用するポートは、アナログ入力A0、5V、GND。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、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つ考えます。
- Lesson48の復習となる、脈拍・心拍をシリアルプロッタに表示するスケッチ
- 20秒間の脈拍・心拍の回数を測定し60秒間に換算するスケッチ
- 基準点と基準点の周期をもとめてBPMを求めるスケッチ
公式ページを読み解くと3番の流れとしては以下。
- タイマー割り込みを発生させる(2msごと)てセンサーの値をサンプリング
- 波形の立ち上がり部分の底(T)と頂点(P)を見つけ、その半分の点を心拍の基準点とする
- 基準点と次の基準点の間の時間(周期)を求め、1分間の心拍数(BPM)に換算
- 10拍分の移動平均で最終的なBPM値を計算する
ちょっと、管理人には上記のスケッチがかけるのか微妙です・・・
とりあえず、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の復習です。
- センサー上に何もなし → シリアルプロッタで脈拍・心拍が確認されない
- センサー上に指を置く → シリアルプロッタで脈拍・心拍を確認できる
■センサーに指を置いていない状態
■センサーに指を置いた状態
サンプルスケッチ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を表示
■シリアルプロッタの表示表示
20秒間、カウントし、リセットして0に戻る動作を繰り返しているのがわかります。
※途中でやめたのでプロットが切れています。
サンプルスケッチ3
現在、スケッチ試行中!
しばらく、お待ちください。
サンプルスケッチ3 結果
現在、スケッチ試行中!
しばらく、お待ちください。
まとめ
本Lessonは、以下を目標としました。
2.BPMを取得するスケッチを描く
3.BPMを取得して遊ぶ
本Lessonはリリースされているサンプルスケッチを使わずに「BPM」を計算することを目標にしています。
遊ぶだけであれば、ここまでしなくてもリリースされているサンプルスケッチをダウンロードすればOK。
ただ、今回はどうしてもBPMを自分で計算させて取得したいと考えました。
色々試行して遊びたいんですよね。。。
また、「MsTimer2」の使い方を学習したいというのも一つです。
「MsTimer2」を使いこなすことができれば、色々と他のスケッチでも遊べそうです。
Lesson 49 【脈拍・心拍センサ その3】 は記事をアップデート中。
サンプルスケッチ3は試行中です!
しばらくお待ちください。
※しばらくどころかだいぶお待ちください・・・。
疑問点、質問などありましたら気軽にコメントください。
脈拍・心拍センサとProcessingを使って、面白そうなことができそう!
サンプルスケッチが秀逸なのでProcessingで遊んでみました。
こちらも、あわせて遊んでみてください。
次回、Lesson 50 【Real Time Clock モジュール】を使って遊びます。
時刻を刻むための「DS1302」を使ったクロックモジュールです。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント