ProcessingでLEGO MINDSTORMSを操作する(1)
相変わらずなかなか週末に時間が取れないのですが、今回はProcessingからBluetoothシリアル通信を使って、LEGO MINDSTORMSを直接操作してみたいと思います。そこそこのボリュームになりそうなので、何回かに分けて説明する予定です。
尚、最新のLEGO MINDSOTRMS EV3はお高くてなかなか手がでないので、今回は昔購入したLEGO MINDSTORMS NXT 2.0を対象にしたいと思います。
LEGO MINDSTORMSの操作方法
LEGO MINDSTORMSのコントロールは、通常、専用のビジュアルプログラミングソフトで作成したプログラムを、Brickと呼ばれる本体プロセッサーに転送することで行います。
加えて、BrickをPCやMacとBluetooth接続して、専用の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からセンサー情報を取得してみたいと思います。