バージョン情報
Arduino Uno , Arduino IDE 1.0.5 , processing 1.5.1 , windows 8.1
Arduinoを使ってシリアル通信を試してみた。
今回の実験内容
アナログセンサ : フォトリフレクタ
↓
Arduino
↓
PC : processingでグラフ化
【Arduinoのスケッチ】
今回のコードは、センサからの入力を40msec毎に1byteのバイナリデータとして送信するのみ。(受信はせずに強制的に送信し続ける。)
int analog_in = 0; //アナログピン A0 byte val = 0; unsigned long sTime = 0; void setup() { Serial.begin(9600); } void loop() { sTime = millis(); val = analogRead(analog_in)/4; //1バイトに収める為 Serial.write(val); while(millis() - sTime < 40){ //40msecおきに送信しているつもり(未検証) delay(1); } }
analogRead(analog_in)でアナログピンA0に入力している電圧に応じて0~1023の値が得られる。今回は1Byte分をSerial.write()で送信する為に、4で割って0~255の値に変換している。
【processingのコード】
シリアル通信で受信したデータをグラフ化する。グラフは古いデータが左に流れていく感じにする。
import processing.serial.*; Serial myPort; int val; int [] x = new int[500]; //グラフ用データ x:時間 int [] y = new int[500]; //グラフ用データ y:電圧 void setup() { frameRate(50); //20msec毎にグラフを更新 size(600, 350); myPort = new Serial(this, "COM5", 9600); textSize(20); //グラフ用データの初期化 for (int i = 0; i < x.length; i++){ x[i] = i; y[i] = 128; } } void draw() { background(0); //グラフ用データの更新 for (int i = 0; i < y.length - 1; i++){ y[i] = y[i+1]; } y[y.length - 1] = val; //グラフエリアの描画 fill(255); text("0V",10,310); text("5V",10,54); text("0sec",530,340); text("-10sec",30,340); fill(0,255,0); text(val/255.0*5,560,100); //グラフのプロット pushMatrix(); translate(50,300); scale(1,-1); fill(0); stroke(255); rect(0,0,500,256); stroke(0,255,0); for (int i = 0; i < x.length - 1; i++){ line(x[i],y[i],x[i+1],y[i+1]); } popMatrix(); } void serialEvent(Serial myPort){ delay(10); val = myPort.read(); }
【メモ】
processingは描画周りが非常にシンプルでわかり易い。シリアル通信もライブラリが充実しているので特に苦も無く実装可能だった。
今回は1Byte分のみ送信するコードを試してみたが、次はもう少し実用的に複数データの送信にチャレンジしよう。