ArduinoとProcessingの通信

組み込み
スポンサーリンク

Processingの使い方がなんとなく分かったので、ArduinoからProcessingにデータを送信する部分を実装していきます。

通信方式

ArduinoからProcessingにデータを送信する場合はシリアル通信で行います。
ProcessingはPC上で動作しているので
「Arduinoからシリアル通信でPCにデータ送信」→「Processingがシリアル通信のデータを読み取る」という形で実装します。

色々なサンプルを見ると、いきなり描画処理までやっているので今回はシリアル通信部分に着目します。
プログラムは以下を参考にしています。
Arduino 101 CurieIMU Orientation Visualiser

Arduino側のプログラム

なじみのあるArduino側から作っていきます。
プログラムとしては単純で、「x」「y」「z」の値をカンマ区切りで送信します。
1行が1つのデータセットとなりますので最後に改行を入れるため「println」を使用します。
シリアル通信の速度は「9600」とし、500msごとにデータをインクリメントしながら送信します。
Processingと通信を行う場合は「通信速度」と「データフォーマット」を合わせることが重要となります。

int x,y,z;
 void setup() {
   Serial.begin(9600);
   x=0;
   y=0;
   z=0;
 }
 void loop() {
   Serial.print(x);
   Serial.print(",");
   Serial.print(y);
   Serial.print(",");
   Serial.println(z);

   x=x+1;
   y=y+2;
   z=z+3;

   delay(500);
 }

Processing側のプログラム(setup)

Arduinoの場合はIDE上でポート番号(COMXX)が分かりますが、Processing側でポート番号を指定する場合はプログラム上で指定する必要があります。
まずは、OS上で使用されているポート番号を確認します。

Serial.listを実行すると、OS上のポート番号とProcesingで使用する配列要素番号が表示できます。
Processingがシリアル通信を行う場合は使用するポート番号を「配列要素」で指定する必要があります。
今回はCOM5にArduinoが接続されているので[0]を指定することになります。

void setup()
 {
   printArray(Serial.list());
 }
-----------------------------------
[0] "COM5"
[1] "COM6"
[2] "COM7"

Arduinoとシリアル通信を行うsetup関数は以下のようになります。
通信ポートと転送速度を指定しオブジェクトを作成します。

import processing.serial.*;
 Serial myPort;
 void setup()
 {
   printArray(Serial.list());
   String portName = Serial.list()[0];
   myPort = new Serial(this, portName, 9600);
 }

Processing側のプログラム(draw)

Processing側はdraw関数のループでデータを取得します。
処理を直接書いても良いのですが、シリアル通信部分を関数として外出しします。

今回のデータは1行単位で送信されてくるので改行文字までを1つのデータとして読み込みます。
データを読み込むことができたらカンマ区切りでデータを分割し表示させるようにしています。

void serialEvent(Serial myPort) {
   int newLine = 13; // 改行文字のASCIIコード(CR)
   String message;
 do {
     message = myPort.readStringUntil(newLine); // 1行分のデータを読み取る
     if (message != null) {
       String[] list = split(trim(message), ",");
       print(list[0]);
       print("  ");
       print(list[1]);
       print("  ");
       println(list[2]);
     }
  }  while (message != null);
}

この関数をdrawでループさせます。
Arduinoと合わせて500msでループさせるようにしました。

void draw()
 {
   serialEvent(myPort);
   delay(500);
 }

実行結果

通信が成功すると、Processing側にデータが表示されます。
このデータを使用して3Dオブジェクトを動かしていきます。

1  2  3
2  4  6
3  6  9
4  8  12
5  10  15
6  12  18
7  14  21
8  16  24
9  18  27
10  20  30
11  22  33

コメント

タイトルとURLをコピーしました