- センシングした値を保存する方法を知りたい人
- Processing とArduinoを使っている人
- 脈拍の計測プログラムが知りたい人
こんにちは.けんゆー(@kenyu0501_)です.
今回は,色々とデータ処理を始めるためにもセンシングした値をまずはテキスト形式で取得する方法について考えて行きます.
以前投稿した「Arduinoと心拍センサーを使って生体信号である脈拍を計測してみる」では,guthubで公開されているプログラムを転用したので,今回は自分で作りながらデータログを残していきたいと思います.
Arduinoで心拍センサーを回す
まずは,普通に脈拍のセンシングを行って,シリアルモニタおよびシリアルプロッタに出力し確認できるソースを見てみます.
(配線に関しては,心拍センサのみを以前の記事と同様につなぎます.)
1 2 3 4 5 6 7 8 9 10 11 | const int sensorPin = 0; void setup() { Serial.begin(9600); } void loop() { int value = analogRead(sensorPin); Serial.println(value); delay(20); //20ミリ秒毎 } |
こちらのプログラムを回すと,.txtデータは取れませんが,シリアルプロッタやモニタは確認できます.
心拍センサから計測されたデータの値は,0〜1024の範囲を取ります.
校正式を調べましたが,なかなか出てこなかったので,その範囲の値をそのまま使用します.
Processingに送って,データが送信されているのかを確認する
ちょっと丁寧にやります.0〜1024のデータを4で割って,Processing側に送信します.
なぜ4で割るかというと,Processing側の表示で擬似LEDの点灯を行いたかったからです.
(LEDの色の明るさは0-255の範囲なため)
このような感じです!
左上に0〜1024のデータを4で割った数字と,その値によって明度が変わる赤色のモニター上のLEDを作りました.
ソースコードも若干改良しています.
以下がArduinoのソースです.
1 2 3 4 5 6 7 8 9 10 11 | const int sensorPin = 0; void setup() { Serial.begin(9600); } void loop() { int value = analogRead(sensorPin); Serial.write(value/4); delay(50); //50ミリ秒毎 } |
そして以下がProcessingのソースです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import processing.serial.*; Serial port; void setup() { size(255,255); port = new Serial(this,"/dev/cu.usbmodem14111", 9600); stroke(0); fill(0); textSize(48); } void draw() { if(port.available() > 0){ background(192); int value = port.read(); fill(value, 0, 0); ellipse(127,127,100,100); fill(0); text(value, 10,50); } } |
値がきちんと送信されていて,心拍の大きさに合わせてグラフィックLEDの明るさが変化していることが確認できます.
計測値をテキストデータで保存する!
次に,脈拍をテキストデータで保存できるようにします.
今回は,さらにプッシュボタンを増設して,ボタンが押されているときにだけ,ログが残るように改良しました.
ボタンをつけない場合は,プログラムを起動させるとすぐにテキストデータに保存されて,脈拍が安定していない場合にもデータが収集されてしまうからです.
脈拍が安定してからデータを取得したいのでそういう風に改良しました.
こちらが回路図になります.Digitalの2番に,スイッチを接続しています.
以下がArduinoのソースコードです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | const int sensorPin = 0; const int switchPin = 2; void setup() { Serial.begin(9600); pinMode(switchPin, INPUT); } void loop() { int value = analogRead(sensorPin); if(digitalRead(switchPin) == LOW) Serial.write(value/4); delay(1000); //20ミリ秒毎 } |
次がProcessingのソースコードです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import processing.serial.*; Serial port; //for data log PrintWriter writer; void setup() { size(255,255); port = new Serial(this,"/dev/cu.usbmodem14111", 9600); stroke(0); fill(0); textSize(48); //file name writer = createWriter("pulse2.txt"); } void draw() { if(port.available() > 0){ background(192); int value = port.read(); fill(value, 0, 0); ellipse(127,127,100,100); fill(0); text(value, 10,50); // output writer.println(value); } } void exit(){ writer.flush(); writer.close(); super.exit(); } |
これでデータがきちんとtxt形式で保存できるようになりました.
また,ボタンは一度離しても,再度押すと信号がProcessing側に送られるので計測できます!
数値化の件、
奴吾の表現が足らずに、誤解を与えてしまった模様です。
脈診の場合、(極端な場合ですけど)患者の死期が近いとか、衰弱の程度を第三者に伝えるに相応しく、”定量化”できたらと常日頃、感じているものです。
ex. 腎経が虚しているのを、伝えるに5段階で2だったら、仕事どころではない、安静(休養)を要する . . . 。といった次第です。
素早い、応答(ご返事)に感謝です。m(__)m
デハ、では de 野兎(やっと)
作ってみようと思うのですが、回路図を詳しく教えて欲しいです。
回路図は書かれてると思いますが、、、イラストにて、、。