ProcessingでLEGO MINDSTORMSを操作する(1)

相変わらずなかなか週末に時間が取れないのですが、今回はProcessingからBluetoothシリアル通信を使って、LEGO MINDSTORMSを直接操作してみたいと思います。そこそこのボリュームになりそうなので、何回かに分けて説明する予定です。

尚、最新のLEGO MINDSOTRMS EV3お高くてなかなか手がでないので、今回は昔購入したLEGO MINDSTORMS NXT 2.0を対象にしたいと思います。

LEGO MINDSTORMSの操作方法

LEGO MINDSTORMSのコントロールは、通常、専用のビジュアルプログラミングソフトで作成したプログラムを、Brickと呼ばれる本体プロセッサーに転送することで行います。

f:id:tkitao:20140720155526p:plain

加えて、BrickをPCやMacBluetooth接続して、専用のDirect Commandsプロトコルに従ったシリアル通信を行うことで、Processing等からMINDSTORMSを直接操作することも可能です。

LEGO MINDSTORMSのDirect Commandsのリファレンスは、こちらからダウンロードできます。

ProcessingでのBluetoothシリアル通信の方法

Processingでは、シリアル通信ライブラリを使用することで、Bluetoothシリアル通信を行えます。シリアル通信ライブラリは、ProcessingのSketchメニューから、Import Library...serialを選択することで利用可能になります。

シリアル通信ライブラリのAPIは、公式サイトのリファレンスから確認できます。

Direct Commandsの送信方法

ProcessingからのDirect Commands送信は、次の手順で行います。

1. MINDSTORMSのポートをオープンする

Serialクラスのlistメソッドで列挙されるポート一覧から、MINDSTORMSに接続されたポートをオープンします。今回はMINDSTORMS NXT 2.0を対象にしているので、NXTの送信用のポートである/dev/cu.NXT-DevBを選択します。

2. 送信コマンドを準備する

次に送信用のコマンドを準備します。送信コマンドはbyte型の配列で作成します。Bluetoothシリアル通信の場合、先頭2バイトで続けて送信するコマンドのサイズを指定する必要があります。

3. コマンドを送信する

最後にSerialクラスのwriteコマンドで作成したコマンドを送信します。

サンプルコード

Direct CommandsのPLAYTONEコマンド(0x03)を使って、MINDSTORMSに音を再生させるサンプルがこちらになります。

import processing.serial.*;

Serial serial = null;

void setup() {
  // シリアルポートを開く
  String[] ports = Serial.list();

  for (String port : ports) {
    if (port.contains("cu.NXT")) {
      println("open " + port);
      serial = new Serial(this, port, 9600);
      break;
    }
  }

  if (serial == null) {
    println("can't find ports for NXT");
    exit();
  }

  // コマンドを送信する
  byte[] bytes = new byte[] {
    (byte)0x06, (byte)0x00, // Length (LSB, MSB)
    (byte)0x80, (byte)0x03, // Command type, Command
    (byte)0xb8, (byte)0x01, // Frequency for the tone (LSB, MSB)
    (byte)0x00, (byte)0x02  // Duration of the tone (LSB, MSB)
  };

  serial.write(bytes);
}

void draw() {}

PLAYTONEコマンドは全部で6バイトのため、先頭の2バイトで0x06(下位バイト)、0x00(上位バイト)を指定します。サウンドは今回はの音(440Hz=0x01b8)を512ms(0x0200)で指定しています。

Brickの電源を入れ、スケッチ実行後、Brickからの音が再生されたら動作確認成功です。次回はMINDSTORMSからセンサー情報を取得してみたいと思います。