2011年9月28日水曜日

Arduino-Processingシリアル通信

以下はProcessingプログラム上でマウスクリックしてArduinoボード上のLEDを点灯/消灯させるプログラムです。ProcessingとArduinoを連携させるにはシリアル通信という手段を用います。
まずProcessingのプログラムから行います。

import processing.serial.*;
Serial myPort;

void setup(){
myPort=new Serial(this,Serial.list()[0],9600);
}

void draw(){
//描画内容は特になし
}
void mousePressed(){
myPort.write(1);
}

void mouseReleased(){
myPort.write(0);
}

シリアル通信を行うためには、シリアル通信用のライブラリを導入する必要があります。
ProcessingのSketch>Import Library/Serial I/Oを選択すると、
import processing.serial.*;
がプログラムに書き足されます。
今回は画面上をクリックするだけで特に描画しないので、draw(){}内は空白です。
あとはmyPort(名前は任意)を設定し、setup(){}内にシリアルポート設定を上記のように書き足せばシリアル通信を行うことができます。
myPort.write()によって、()内の数値をArduinoに送信するプログラムを書き足します。
マウスを押した時に1を、マウスを放した時に0を送信することにし、Arduino側では1の値を受け取ったらLEDをオンにし、0を受け取ったらオフになるようにします。
マウスクリックする際には、Processingをランさせたときに表示される画面上をクリックしてください(100×100ピクセルのグレーのウィンドウが表示されます)。

以下はArduinoのプログラム:

void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop(){
if(Serial.available()>0){
if(Serial.read()==1){
digitalWrite(13, HIGH);
}else{
digitalWrite(13, LOW);
}
}
}


Arduino側では、Serial.begin()によってシリアル通信開始を設定します。括弧内の9600は通信速度でありこのままの設定で構いませんが、Processing側と設定速度を同じにしておきます。
Serial.available()によって、Processing側から何個のデータが送られて来ているかをチェックします。Serial.available()>0というのは、受信データが0個より大きいとき、つまり1個データを受信したときに以下のプログラム(LED点灯/消灯)を実行するということになります。
受け取ったデータをSerial.read()で読取り、その内容が1であればdigitalWrite(13, HIGH)によってLEDを点灯させ、0であれば消灯させるという条件式になっています。
つまり、Processing側でマウスを押したとき(押し続けているとき)オンになり放したらオフになります。

この通信の場合は、Processing側からデータを送信し、Arduino側が受信する内容になります。
その逆でArduinoからデータを送信して、Processing側が受信してProcessingでプログラムした描画内容を操作するという場合のサンプルはこちらを参考にしてみてください(建築発明工作ゼミ2008:シリアル通信1)。

また、Xbee、Bluetoothなどを使えばワイヤレス送信させることも可能です。
Xbeeのサンプル
Bluetoothのサンプル
あるいは、インターネット越しに操作することも可能です。
ネットワークのサンプル

0 件のコメント:

コメントを投稿