先日、表題の件に関して原田くんから指摘があり、確認してみました。確認したのは以下の組合せです。
・FIO(StandardFirmataFIO)+KXM52-1050+Processing
・workshop/Fio/RGBCubeFIO
このサンプルは加速度センサの出力で画面の中のキューブをコントロールするサンプルなのですが、明らかにレイテンシが大きく、0.5秒くらい反応が遅れる感じになります。
この原因ですが、StandardFirmataFIOをデフォルトの状態で動かした場合、8ch分のアナログ情報が33msごとに送信される(データ量としては3byteが8ch分で720byte+デジタル側の変化分)ため、デフォルトである19200bpsでは帯域幅ぎりぎりになってしまうようです。この解消方法としては、以下のような方法があります。
Configuration config = Fio.FIRMATA;
config.setDigitalPinMode(17, Fio.OUT);// A3(ArduinoではA0はD14としてカウントする)
config.setDigitalPinMode(18, Fio.OUT);// A4
config.setDigitalPinMode(19, Fio.OUT);// A5
config.setDigitalPinMode(20, Fio.OUT);// A6
config.setDigitalPinMode(21, Fio.OUT);// A7
fio = new Fio(this, moduleIDs, config);
これは、使用しないアナログ入力を全てデジタル出力に変更することにより、通信量を約3/8に減らすというものです。
※アナログ入力がデジタルピンの14ピンからになる、というのはFirmataの仕様をきちんと理解していないとちょっと混乱する部分かと思いますが…。
・・・
アナログ入力をフルに使いたい場合のことを考えると、通信速度を19200ではなく57600などに変更するというのは一つの方法です。19200にしている理由は、Arduino
IDEからスケッチを書込む場合のことを考えてのことなのですが、以下のような変更をかけることを検討しています。
・StandardFirmataFIOの動作開始時にエンドデバイス側XBeeの通信速度を57600に変更する(フラッシュへの書込みはしない)
・Funnel Serverの起動時にコーディネータ側XBeeの通信速度を57600に変更する(フラッシュへの書込みはしない)
・Funnel Serverの終了時にコーディネータ側XBeeの通信速度を19200に戻す
ここまでは簡単に実装できるのですが、エンドデバイス側の通信速度を19200に戻すための方法で良い方法をまだ思いついていません。何かこの点に関してのシンプルな解決法の提案などあれば是非お願いします。
※Arduino 0016で追加された328P系のボードは全てブートローダが57600に変更されていますので、FIOの328Pモデルが出ればそちらに関しては単にデフォルトでの通信速度を57600にすることで解決するかもしれません。