Arduinoとやり取りするシリアルデータをProcessingで制御すると、例えばマウスやタッチパネル式ディスプレイを使ってArduinoを操作したり、逆にArduino側のセンサーで取得したデータの可視化をリッチにしたりすることができる。

ここではシンプルに、Processingでマウスクリックの状態を取得してArduinoの内蔵LEDを点灯/消灯させる簡単なプログラムを書いてみる。

尚、この例ではArduinoボードはUNOを使い、シリアルポートは/dev/ttyACM0、通信速度は9600bpsとする。

流れとしてはまずArduinoでシリアルポートから受け取ったデータによってLEDに加える電圧を高くしたり(点灯)、低くしたり(消灯)するプログラムを書きArduinoに書き込んでおく。

#define led LED_BUILTIN        // 内蔵LED

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);     // LEDを出力用に
}

void loop() {
  // シリアルポートからデータを受け取ったら
  if (Serial.available() > 0) {

    // 受信したデータを読み込む
    char data = Serial.read();

    // データが'1'ならLED点灯
    if (data == '1') {
      digitalWrite(led, HIGH);
    }

    // データが'0'ならLED消灯
    if (data == '0') {
      digitalWrite(led, LOW);
    }
  }
}

次にProcessingでマウスの左と右のクリックに応じてシリアルポートにデータを送信するプログラムを書いて実行する。

import processing.serial.*;

Serial Port;

void setup() {
  size(300, 300);
  Port = new Serial(this, "/dev/ttyACM0", 9600);
}

void draw() {
  // マウスの左クリックボタンが押されたらシリアルポートに'1'を送信
  if (mousePressed && (mouseButton == LEFT)) {
    Port.write('1');
  }

  // マウスの右クリックボタンが押されたらシリアルポートに'0'を送信
  if (mousePressed && (mouseButton == RIGHT)) {
    Port.write('0');
  }
}

これでマウスを左クリックするとArduinoの内蔵LEDが点灯し、右クリックすると消灯する。
CLIで実行したい場合は以下のようにする。

$ tree .
.
├── arduino
│   └── arduino.ino
└── processing
    └── processing.pde

$ arduino --board arduino:avr:uno --port /dev/ttyACM0 --upload arduino/arduino.ino

$ processing-java --sketch=$(pwd)/processing --run

参考サイト

元記事はこちら

ArduinoとProcessingを連携させてシリアルデータをやり取りする