Arduino2.0使用の際は、バイト送信する場合は、
Serial.print(value,BYTE);
のかわりに、
Serial.write(value);
を使用してください。
今回はシリアル通信を用いて、Arduino基盤に接続した入力装置(可変抵抗器)で、Processingで描かれた図形を動かしてみます。
Arduino側のシリアル通信は、前回のモニタリングで使用したときのような感じです。Processingにおいても、シリアル通信の設定が必要になります。
通信の流れとして:
Arduino基盤に接続した入力装置からの値をanalogRead()で読み取る。
その値をSerial.print()でProcessing側に送る。
Processing側で、その値をSerial.read()で読み取る。
Processing上の図形の座標値に入れる。
という感じです。
まずは、Arduino側からプログラムしていきます。今回入力装置となる可変抵抗器を基盤に接続します。
Arduino側のプログラム:
int val; //読み取り値の変数を用意 void setup(){ Serial.begin(9600); } void loop(){ //アナログ入力0番ピンの値を読み取り(0~1023) //4で割った値を変数valに入れる(0~255) val=analogRead(0)/4; //シリアルでvalを送信 Serial.write(val); //1秒間に20回ループ(0.05sec)とする delay(50); }
上記プログラムの説明:
Processingと通信する場合、Serial.write()で一度に送ることができる値は、0〜255までの数値になるので、analogRead()で読み取った値(0〜1023)を4で割って、最大値が255になるようにスケーリングした値をvalに代入し送信します。delay(50)程度にし、一秒間に20回送信することにします。Arduino側から一方的にデータを送り続けるので、あまりにも多くのデータを送りすぎると、Processing側での受取処理が追いつかなくなり、反応に時差がでることがあります。
Processingのプログラムについて:
Processing側のプログラムでは、シリアル通信(Serial)はライブラリに含まれており、必要に応じてその機能を取り込む(import)必要があります。
Processingのsketchを開いたら、メニューバーのSketch>Import Library>serialを選択します。そうすると、プログラムを書く欄に自動的に「import processing.serial.*;」という一文が追加されます。これによって、シリアル機能が導入されます。そして以下のようにmyPort(名前は任意)というシリアルのためのインスタンスを用意し、シリアルポート、通信速度を設定します。Processingのシリアル通信についての説明は、Processing画面のメニューバーでHelp>Referenceへ行き、そのページ内の上部のLibrariesをクリックし、さらにページ内のCore Librariesの欄にSerialという項目があるので、そこをクリックします(Processingのサイトにも同じSerialのページがあります)。
Processing側のプログラム:
//シリアルライブラリを取り入れる import processing.serial.*; //myPort(任意名)というインスタンスを用意 Serial myPort; int x; //図形のX座標の変数を用意 void setup(){ //画面サイズ size(256,256); //シリアルポートの設定 myPort=new Serial(this,"/dev/tty.usbserial-A4001Kjl",9600); } void draw(){ //背景色を白に設定 background(255); //XY座標を(x,100)に設定し、 //幅50、高さ50の円を描画 ellipse(x,100,50,50); } void serialEvent(Serial p){ //変数xにシリアル通信で読み込んだ値を代入 x=myPort.read(); }
上記プログラムの説明:
初期設定のsetup()内の「myPort=new Serial(this,"/dev/tty.usbserial-A4001Kjl",9600);」の設定において、MacOSXの場合は「/dev/tty.usbserial-********」の箇所の********の部分は使用しているArduino基盤によって異なります。Arduino画面のメニューバーのTools>Serial Portのなかから使用している基盤のシリアルポートと同じものを書いて、両端を「"」マークで括ってください。Windowsの場合は、「COM*」(*は番号)のようにポートが表示されるので、同様に「COM*」を「"」マークで括ってください。
通信速度の「9600」は、通常この設定で構いません。
シリアル通信が行われるたびに、serialEvent()内のx=myPort.read()によってArduino基盤から送られて来た値を読み込み、変数xに代入され、最終的にellipse()のX座標に代入されます。Arduinoから送られてくる値は0〜255であるため、Processing上のellipse()のX座標の移動範囲も0〜255(256段階)となります。それに合わせて、Processingの画面幅を256に設定しました。つまり、ellipse()を1ピクセルずつ左右に動かすことができます。
関連:
「Arduino-Processing シリアル通信2」(複数の値をバイトで送る/同期通信)
「Arduino-Processing シリアル通信3」(大きな値を複数送る)
「Processing-Arduino シリアル通信4」(ProcessingからArduinoを制御する)
「Arduino-Processing シリアル通信5」(複数の値を文字列で送信する)
「Arduino-Processing シリアル通信6」(2台のArduinoとProcessingを通信させる)
0 件のコメント:
コメントを投稿