つくったブログ

ぼくがつくったもの。

シリアル通信でArduinoからProcessingに情報を渡す

Processingを使おう

 今回はProcessingとArduinoを連携させてシリアル通信を行う。ボタンを押すとLEDが点灯し「1」をシリアル通信でProcessing側に送り、ボタンを離すと「0」を送るコードを書く。

 Processingはビジュアルデザインに特化したプログラミング言語で、初心者でも簡単に画像処理や図形描画が行える。


ダウンロード


 まずはProcessingをダウンロードしよう。下記のリンクへ。


Download \ Processing.org



 
f:id:kyokucho1989:20130627183839p:plain:h300
 寄付を呼びかけているが、No donationでも別にかまわない。「Donate & download」をクリックしてインストールしよう。

 


コード

 Arduino側のコードを以下に示す。回路は前回のままでかまわないが、使用するのは赤LEDとプッシュボタンのみだ。

// Original 04:シリアル通信でProcessingと連携(Arduino)

const int red_LED = 13;        // 赤LEDが接続されているピン
const int BUTTON = 12;
int val = 0;                   // BUTTONの状態を格納(LOW/HIGH)
int state = 0;                 // LEDの状態(0ならオフ、1ならオン)

void setup() {
  pinMode(red_LED, OUTPUT);    // ArduinoにLEDが出力であると伝える
  pinMode(BUTTON, INPUT);      // BUTTON は入力
  Serial.begin(9600);          // シリアル通信の転送レートを指定
}

void loop() {
  val = digitalRead(BUTTON);   //ボタンのON,OFFを判別
  if(val == LOW){
    state=0;  
  }else{
    state=1;
  }
  Serial.write(state);         // シリアルポートにデータを出力 
  digitalWrite(red_LED, val);
  delay(100);
}

Serial.write()でシリアルポートにデータを出力する。注意して欲しいのは一度に1バイト分しかデータをおくれないことだ。1023とかを送ろうとすると受け取る側が変な値になる。


 Processingのコードを以下に示すがコードを実行する前にいくつかやっておくことがある。まずArduinoとPCをUSB端子で接続すること。次にProcessingに以下のコマンドを入力することだ。

println(Serial.list());

 これを実行すると下のような文字が出てくる。このなかでArduinoで設定したシリアルポートと同じものを探し番号を覚えておく。

f:id:kyokucho1989:20130627182721p:plain:h300

 いよいよコードを書く。それほど多くない。

//Original :04 シリアル通信でProcessingと連携(Processing)

import processing.serial.*;

Serial port; 
int inByte;

void setup(){
  println(Serial.list());
  String arduinoPort = Serial.list()[4];              // printlnで表示された番号を4の代わりに入れる
  port = new Serial(this, arduinoPort, 9600);  // Arduino
}

void draw(){
  delay(100);
  background(0);  // 背景を黒に。
  text(inByte,50,50); //テキスト(変数inByteの値)を50,50の位置に表示
  
}

void serialEvent(Serial p){
  delay(10);
  inByte=port.read();
}

Processingはdraw()の中で連続して実行したい命令を書く。serialEventはシリアル通信で何か値を受け取った時に実行される関数である。


実行

 実行の手順はArduinoのスケッチを実行してからProcessingを動かすのが肝心かなめ。無事に動いたらめでたし。Processingのdraw関数の中を自分なりにアレンジするのも楽しい。ボタンを押すと図形が変わったり色がかわったり。いろいろできる。




「Arduinoをはじめよう」第六章で詰まったこと

 

Arduinoをはじめよう 第2版 (Make:PROJECTS)
Massimo Banzi
オライリージャパン
売り上げランキング: 4,552

 今回と前回のシリアル通信ではずいぶんこの本にお世話になったが、六章のプログラムで大分つまってしまった。まずは間違えやすいコードの部分を書き出してみる

 new StringTokenizer(data,"\"<>,.()[] "); //スラッシュではなく、"バックスラッシュ"

 if (chunk.indexOf("love") >= 0 ) // indexゼロfではなく、index"オー(大文字)"f

 また、コードを正確に書き写したのに

"Cannot fined a class or type named "URL"

とエラーが出た。調べてみると以下のページを見つけ解決方法も載っていた。どうやら新しいスケッチのバージョンではこのようなエラーがでてくるらしい。

Arduino Networked Lamp Processing sketch error.

コードの最初の部分に以下を書き加えるといい。

import processing.serial.*;


//ここから
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// ココマデ

おわりに


 次はいよいよモータの制御でもやってみようかな。これができればロボットが作れる!

Processingをはじめよう (Make: PROJECTS)

Processingをはじめよう (Make: PROJECTS)