NXTプログラミング(3)


NxtCommunicator.cs*1を用いて開発していくことにする。


まずは、Helloを再生から。


NxtCommunicator nc = = new NxtCommunicator("COM3");
// portは自分の環境に合わせて変更すべし。

nc.Connect();
nc.PlaySoundFile("hello.rso");

っと、これで再生されれば良いのだが、NxtCommunicatorにはPlaySoundFileというメソッドが用意されていない。何とも使えないwarpperである。


仕方ないので、BDK*2のp.5を見ながらサウンドファイルを再生させるメソッドをNxtCommunicatorに追加するのである。


/// <summary>
/// サウンドを再生する。
/// </summary>
/// <param name="filename"></param>
public void PlaySoundFile(string filename)
{
byte[] message = new byte[3 + filename.Length + 1/* \0 */];

message[0] = 0x80;
// いまから送信するコマンドに返信がいるかなどの設定
// 0x00 : ダイレクトコマンド送信。レスポンス必要。
// 0x01 : システムコマンド送信。レスポンス必要。
// 0x02 : 返信の送信。
// 0x80 : ダイレクトコマンド送信。レスポンス不要。
// 0x81 : システムコマンド送信。レスポンス必要。

message[1] = (byte)NxtCommand.PlaySoundFile;
// 送信するコマンド
// PlaySoundFile == 0x02 : サウンドファイルの再生
// SetOutputState == 0x04 : 出力用コマンド
// などなど。

message[2] = 0;
// endless loopで再生するのかのフラグ
// 0 == false
// 1 == true

// そのあとにファイル名がASCIIZ(最後に\0が付与されるアスキー文字列)で入る。
for(int i=0;i<filename.Length;++i)
message[i+3] = (byte)filename[i];

message[message.Length - 1] = (byte)'\0'; // null terminator

sendMessage(message);
// ちなみにsendMessageでは実際には、ここで指定したbyte[]の前に
// このメッセージの長さを意味する数値が付与されてCOMポートに
// 送信される。
// なお、この数値はUShort(2バイト)で、リトルエンディアンである。
}

これで、サウンドが再生できるようになった。*3


サウンドはNXT本体から再生されるので、面倒な組み立てをしなくともNXT本体に単三電池を6本入れればすぐにこのテストが出来る。

*1:NXT#プロジェクトの一部であるLego Bluetooth Protocolのwrapper : http://nxtsharp.fokke.net/

*2:Bluetooth Developer Kit (BDK) : http://mindstorms.lego.com/Overview/NXTreme.aspx

*3:なお、事前に、サウンドファイルを本体に転送しておく必要がある。「NXTソフトウェア」を使ってNXT本体で一度でも再生させたファイルは自動的にNXT本体に残っているようなので、私はこの機能で転送した。Windowsのプログラム→アクセサリ→通信→Bluetoothファイル転送ウィザード から直接ファイルを転送できるようではある。(未確認)