パルスセンサーSEN-11574の出力を、Arduino(ArduinoIDE)とProcessingで視覚化するテストしてみました。
Processingはビジュアルデザイン用のプログラミング言語で、ビジュアル表現に特化したツールです。
また、Arduinoとは相性が良く、ArduinoIDEとペアで利用することが可能で、Arduinoで計測したデータをProcessingで視覚化することが可能です。
Processingのインストール
Processingの公式ページ http://processing.org/に行き、上部メニューからDownloadを選びます。
No Donation(寄付なし)チェックを入れ再度Downloadをクリックする。
自分のPCにあったバージョンを選びダウンロードを実行します。
ダウンロードしたファイルを解凍すればインストールが完了です。
最初にオライリージャパン発行の「Processingをはじめよう」を参考に、光センサのCDS出力をArduinoで計測しProcessingで視覚化してみました。
回路図
Arduino用スケッチ
//Arduino用
int sensorPin = 0; //入力ピン
int val = 0;
void setup() {
Serial.begin(9600); //シリアルポートを開く
}
void loop() {
val = analogRead(sensorPin) / 4; //センサを読む
Serial.write((byte)val); //値を送信
delay(100); //100ミリ秒待つ
}
主な内容
センサはArduinoボードのアナログ入力ピン(A0)に接続
センサからの情報はanalogRead()でよみとる。
値は0~1023の範囲なので、4で割って0~255の範囲に変換しvalに代入
0~255の範囲であれば単一のbyteデータで送信ができる
Serial.writeで送信
Processing用スケッチ
import processing.serial.*;
Serial port; //Serialクラスのオブジェクト
float val; //シリアルポートから受信したデータ
void setup() {
size(440,220);
//重要
//Serial.list()で取得したリストの、最初のシリアルポートがArduinoボードの
//はずですが、実行環境によってはそうならないことがあります。
//動作しない場合は println(Serial.list());を実行して、シリアルポートの
//状態を確認し、次の行の[0]を、Arduinoボードが接続されているポートの
//番号へ変更します。
println(Serial.list()); //この行を有効にするとリストが表示される。
String arduinoPort = Serial.list()[0];
port = new Serial(this,arduinoPort, 9600);
}
void draw() {
if(port.available() > 0) { //データが届いているなら
val = port.read(); //読み込んで、変数valに格納
val = map(val, 0, 255,0, height); //値を変換
}
rect(40, val-10, 360, 20);
}
主な内容
Serialライブラリの読み込みは1行で行っている。
setup)()ないでシリアルポートが開かれ、シリアル通信が有効となる。
draw()ブロックの中で、Serialオブジェクトのread()メソッドを使って値を読み込む
新しいデータが届いたときだけ、読み込みが行われる。
map()関数を使って画面に納まるようにする
使い方
最初にArduino用コードをArduinoボードにアップロードしておきます。
次にProcessingにコードを記入し RUN すると、Arduinoボードからシリアル通信で送られてきたデータを読み取り、画面表示に適した値に変換した後描画ウインドウに表示されます。
processinngの表示画面
光センサCDSの上で手をかざし、光の加減を変化させると表示画面に変化が現れる。
受信した値の大小により横線が上下に移動する。
Arduinoからのデータ受信とprocessingによるそのデータの表示が確認できましたので、別のフォーマットで視覚化します。
光センサの出力データとそれを平均化したデータを上下に配置して表示します。
光センサからの信号は上半分に、それを平均化して滑らかになった線を下半分に表示する。
Processing用スケッチ
import processing.serial.*;
Serial port; //Serialクラスのオブジェクト
float val; //シリアルポートからの受信したデータ
int x;
float easing = 0.05;
float easedVal;
void setup() {
size(440,440);
frameRate(30);
String arduinoPort = Serial.list()[0];
port = new Serial(this, arduinoPort, 9600);
background(0);
}
void draw() {
if(port.available() > 0) { //もしデータが届いていたら
val = port.read(); //読み込んでvalへ代入
val = map(val, 0, 255, 0, height/2); //値を変換
}
float targetVal = val;
easedVal += (targetVal - easedVal) * easing;
stroke(0);
line(x, 0, x, height); //黒い線
stroke(255);
line(x+1, 0, x+1, height); //白い線
line(x, 220, x, val); //生データ
line(x, 440, x, easedVal + 220 ); //平均値
x++;
if(x > width) {
x = 0;
}
}
processinngの表示画面
Arduinoは前回と同じくボードにスケッチを書き込み動作状態にしておき、processingをRUNします。
引き続き心拍センサー(パルスセンサー)のテスト(4-2)で、SEN-11574の視覚化を掲載します。