Arduino シリアル通信 その1:processing

バージョン情報
Arduino Uno , Arduino IDE 1.0.5 , processing 1.5.1 , windows 8.1

Arduinoを使ってシリアル通信を試してみた。

今回の実験内容
 アナログセンサ : フォトリフレクタ
  ↓
 Arduino
  ↓
 PC : processingでグラフ化

写真
IMG_201405271084

回路図
回路図

【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分のみ送信するコードを試してみたが、次はもう少し実用的に複数データの送信にチャレンジしよう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です