2012年11月12日月曜日

ProcessingからArduinoへ通信

前回、Processingのスケッチでは、画面表示の部分を作成しました。OnボタンとOffボタンを制御し、それぞれの処理を行うことができる条件分岐までを作ったわけです。

ProcessingとArduinoを連携させ、信号の送受信を行う方法として、今回はシリアル通信を使います。



具体的には、PC上で動作するProcessingから、USBケーブルを介して、シリアル通信方式でArduinoへデータを送信します。Arduino側では、USBケーブルを介して、送信されたデータを受信し、処理を行います。


今回は、ProcessingからArduinoへ信号を伝える部分を作成します。


Processingで、シリアル通信を行うためには、手順が決まっています。

さっそく、実際のスケッチを見てみましょう。
太字の部分が今回、シリアル通信を行うために追加したスケッチです。


import processing.serial.*;
Serial myPort;


PImage Onimg;
PImage Offimg;

int StatusFlag;

void setup() {
  size(200, 100);
  Onimg = loadImage("On.png");
  Offimg = loadImage("Off.png");
  image(Onimg,50, 20);
  StatusFlag=0;
  myPort=new Serial(this,Serial.list()[0],9600);
}

void draw() {

}
void mouseClicked(){
  if(mouseX>=50 && mouseX<=130 && mouseY>=20 && mouseY<=60){
    if(StatusFlag==0){
      //Onの処理を実行
      println ("Mouse Click On!!");
      image(Offimg,50, 20);
      StatusFlag=1;
      myPort.write(1);
      }else{
      //Offの処理を実行
      println ("Mouse Click Off!!");
      image(Onimg,50, 20);
      StatusFlag=0;
      myPort.write(0);
      }
  }
}


解説です。


import processing.serial.*;
   Processingでシリアル通信を行うための、ライブラリを読み込んでいます。
  Processingのエディターの[Sketch]-[Import Library]-[serial]を選択すると、
  エディター画面に一行追加されます。

Serial myPort;
  myPortというシリアルで使用する変数(オブジェクト)を宣言しています。

myPort=new Serial(this,Serial.list()[0],9600);
setup()内にある、この命令は、宣言したmyPortをシリアル通信で使用するためのパラメータを指定しています。
Serial.list()[0]は、PCに接続されているArduinoの一つ目をmyPortで使用することをしています。
9600は、ご想像のとおり、シリアル通信の速度を指定います。

ここまでが、シリアル通信をするための準備です。

マウスイベント内では、それぞれ、シリアル通信としてデータ送信の命令を書いています。
myPort.write(1);
  この書き方で、1 をデータ送信します。

myPort.write(0);
  この書き方では、0 をデータ送信します。

上記のようのに、シリアル通信の決まりは、
 
 1.ライブラリーの追加
 2.シリアルポートで使用するオブジェクトの宣言
 3.Arduinoとの通信パラメータの指定


これで、あとは、自由に使用できます。

意外と簡単と感じた方が多いと思います。今回はここまでです。

次回は、Arduino側の処理に進みます。







・Processingをはじめよう
・Processing アニメーション
・楽しく学ぶコンピュテーショナルデザイン




2 件のコメント:

  1. image(Onimg,50, 20);
    のところでエラーが発生します。

    返信削除
    返信
    1. 匿名さん

      こんにちは、投稿ありがとうございます。どんなエラーメッセージですか?

      下記の最小限のスケッチで、試してみるのはいかがでしょう。

      On.png と Off.png ファイルは、スケッチ(sample.pde)と同じ階層にdataフォルダを作成し、そのフォルダ内に保管して下さい。

      ¥sample.pde
      ¥data¥On.png
      ¥data¥Off.png


      ファイル名 : sample.pde

      PImage Onimg;
      PImage Offimg;

      int StatusFlag;

      void setup() {
      size(200, 100);
      Onimg = loadImage("On.png");
      Offimg = loadImage("Off.png");
      image(Onimg,50, 20);
      StatusFlag=0;
      }

      void draw() {

      }

      削除