【脈拍計測】Arduinoでセンシングした値をテキスト(.txt)で取得する方法
この記事はこんな人にオススメです
  • センシングした値を保存する方法を知りたい人
  • Processing とArduinoを使っている人
  • 脈拍の計測プログラムが知りたい人

こんにちは.けんゆー(@kenyu0501_)です.
今回は,色々とデータ処理を始めるためにもセンシングした値をまずはテキスト形式で取得する方法について考えて行きます.

以前投稿した「Arduinoと心拍センサーを使って生体信号である脈拍を計測してみる」では,guthubで公開されているプログラムを転用したので,今回は自分で作りながらデータログを残していきたいと思います.

Arduinoで心拍センサーを回す

まずは,普通に脈拍のセンシングを行って,シリアルモニタおよびシリアルプロッタに出力し確認できるソースを見てみます.
(配線に関しては,心拍センサのみを以前の記事と同様につなぎます.)

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のソースです.

const int sensorPin = 0;

void setup() {
  Serial.begin(9600); 
}

void loop() {
  int value = analogRead(sensorPin);
  Serial.write(value/4);
  delay(50);                //50ミリ秒毎
}

そして以下がProcessingのソースです.

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のソースコードです.

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のソースコードです.

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側に送られるので計測できます!