2011年5月26日木曜日

XBee を使ったWireless MIDI 送信

以前、XBee のAT コマンドによる設定で、通信速度を任意の値に設定できることを紹介しました。
MIDI の速度(31.25kbps) にセットすれば、原理的にはMIDI も飛ばせるはずです。
タイミングがずれたり、データの取りこぼしがあると演奏が台無しなので、実用にはならないかも知れませんが、実験してみます。
(MIDI は NOTE OFF が取れなくて音が鳴りっぱなし、ということが良く有ります。)

まずは XBee (series 1) のATコマンドの要点を復習します。

・+++ を送り、1秒経過後に AT コマンドモードに入る
・ATCN を送るか、最後のコマンドから 10秒たつとATコマンドモードを抜ける
・ATBD で通信速度を変更した場合、AT コマンドモード終了時から、新しい通信速度になる
・ATWR で設定保存をしない場合、電源OFF で元の値に戻る

ここで重要なのは、「31.25kbps」という値が一般的なものではない、という事です。
Arduino IDE や CoolTerm では31.25kbps の通信ができないため、一度設定すると接続できません。※Arduino を使って戻す方法を後述します。
XBee の設定値は ATBD に続けて16進数で入力します。(31.25kは 31250、16進数では 0x7A12です。)

今回のコマンド入力の流れ

+++ :1秒まつ
ATBD7A12:通信速度の設定コマンド(7A12 は 31250 bps)
ATWR:設定保存コマンド
ATCN:コマンド終了


これを、送信側・受信側、2台のXBee に行います。


構成はこのようになります。




Fio は電源として使っているだけなので、プログラムは不要です。
(受信側は純粋なXBee モジュールだけで OK です。)

Arduino Uno のプログラムはこの回と全く同じです。
実際に音を鳴らしているのは、iOS App のbs-16i です。詳細はこの回を参照して下さい。





追記:Arduino によるXBee の通信速度設定です。31.25kbps を選択できるシリアルターミナルはないと思うので、元の設定に戻すときにこれを使いました。(Serial.begin の値が現在の値、ATBD が変更後の値です。)

//
// XBee baud rate settings using AT Command by Arduino.
// This sample set baud rate from 31.25kbps to 57.6kbps.
//

void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); // LED on

// Set MIDI baud rate:
Serial.begin(31250); // XBee's current baud rate.

delay(1000);
Serial.write("+++"); // Enter AT command mode.
delay(2000);


Serial.write("ATBD6"); // Select baud rate for XBee.
Serial.write(0x0D); // Send Carriage Return code.

// ATBD3 :9600
// ATBD4 :19200
// ATBD5 :38400
// ATBD6 :57600 ... for Firmata, for Fio wireless programming
// ATBD7 :115200
// ATBD7A12 :31250 ... for MIDI


delay(2000);
Serial.write("ATWR"); // Save settings.
Serial.write(0x0D);
delay(2000);
Serial.write("ATCN"); // Exit AT Command mode.
Serial.write(0x0D);
delay(100);

}

void loop() {
digitalWrite(13, HIGH); // LED on
delay(1000);
digitalWrite(13, LOW); // LED off
delay(1000);
}


0 件のコメント:

コメントを投稿