[Arduino+Processing]:応用編

今回、難しくなるので取り上げないようにしようと思っていましたが、進みが早そうなので、こんなこともできますよという意味で、少しだけ紹介します。
下の例では、マウスの座標によってLEDの色が変わるようになります。
Processingから、Arduinoをコントロールする例です。





//パソコンからフルカラーLEDの色を変える


int led1Pin = 11; //LED1のピンを11番にする
int led2Pin = 5;  //LED2のピンを5番にする
int led3Pin = 3;  //LED3のピンを3番にする

//受け取ったデータをカウントする変数
int receiveCount = 0;
//受信データ用変数
int receiveData=0;
//色データ用の3つの配列
//赤、緑、青の3つ
int ledColorData[3] = {
  0,0,0};

//受信データのカウント変数
int dataPos =0;


void setup(){
  //アナログ出力モード(PWM)で使うのでpinModeは設定しない
  //シリアル通信を開始(通信速度9600baudで)
  Serial.begin(9600);  
  for(int i=0; i<=255; i++){
    analogWrite(led1Pin, i);
    analogWrite(led2Pin, i);
    analogWrite(led3Pin, i);
    delay(1);
  }
  for(int i=255; i>=0; i--){
    analogWrite(led1Pin, i);
    analogWrite(led2Pin, i);
    analogWrite(led3Pin, i);
    delay(1);
  }  
}

void loop(){
  //もしシリアルポートにデータが入ってきたら、
  if(Serial.available() > 0){
    receiveData = Serial.read();

    //255がきたら、色データ変えるヘッダとして認識
    if(receiveCount==0 && receiveData == 255){ 
      //ヘッダを受け取ったらカウント1
      receiveCount = 1;
    }
    else if( receiveCount == 1 && receiveData>=0 && receiveData<=2){
      //ledColorDataに格納する位置を受信したデータ「0~2」に
      dataPos = receiveData;
      //赤緑青のデータを受け取ったらカウント2
      receiveCount = 2;
    }
    //カウント2のときは色のデータとして
    else if(receiveCount ==2){
      ledColorData[dataPos] = receiveData;
      //カウントをクリア
      receiveCount = 0;
    }
    //受信データを格納する変数をクリア
    receiveData = 0;

    //LEDに色データを反映
    analogWrite(led1Pin, ledColorData[0]);
    analogWrite(led2Pin, ledColorData[1]);
    analogWrite(led3Pin, ledColorData[2]);
  }
}






//パソコンからフルカラーLEDの色を変える
//マウスのX座標,Y座標でLEDの色を変えます

//シリアル通信を行うためのライブラリをインポート
//メニューの[Sketch]>[Import Library]>[Serial I/O]
import processing.serial.*;
//シリアルポートを格納するための変数
//「myPort」を好きな名前にできる
Serial myPort;

void setup(){
  //画面サイズを255*255pixelに
  size(255,255);
  //つないでいるポートのリストを表示して、何番目なのか確認
  println(Serial.list());
  //Arduinoをつないでるポートを設定する
  String portName = Serial.list()[1];
  //設定したポートとシリアル通信を開始する
  myPort = new Serial(this, portName, 9600);
}

void draw(){
  background(mouseX, 254-mouseX, mouseY);
  
  //RED
  myPort.write(255);
  myPort.write(0);
  myPort.write(mouseX);
  
  //GREEN
  myPort.write(255);
  myPort.write(1);
  myPort.write(254-mouseX);
  
  //BLUE
  myPort.write(255);
  myPort.write(2);
  myPort.write(mouseY);
  
  delay(10);
}