小林です
思いのほか時間がかかってしまったのですが、Firmata開発チームに提案していたI2Cおよびサンプリング間隔に関するプロポーザルが取り入れられ、近日中にリリースされるArduino
0017としてリリースされることになりました。SimpleI2CFirmataとほぼ同じ内容のものがI2CFirmataという名前でサンプルに追加されますので、StandardFirmata同様に標準的なものとして利用できるようになります。
これに関連して、いくつか簡単な変更をお願いできればと思います。
<I2Cの電源関係の設定について>
以前は、SimpleI2CFirmataのdefineを変更して電源ピンの有効/無効を切り替えていました。しかし、これですと毎回ファームウェアをアップロードしなければなりませんし、うっかりミスが起きる場合があるかもしれません。そこで、デフォルトではオフにしつつ、新規に追加したI2C_CONFIGというメッセージでオンに設定できるようにしました。
この部分を行うAS3でのコード(i2c.I2CDevice.as)の関連部分以下のようになっています。
public static const I2C_CONFIG:uint = 0x78;
var powerPinSetting:uint = _io.configuration.powerPinsEnabled ? 1 : 0;
var delayInMicrosecondsLSB:uint = _delay & 0xFF;
var delayInMicrosecondsMSB:uint = (_delay >> 8) & 0xFF;
_io.sendSysex(I2C_CONFIG, [powerPinSetting, delayInMicrosecondsLSB,
delayInMicrosecondsMSB]);
ここで、最後のdelayInMicrosecondsLSBとdelayInMicrosecondsMSBはREAD_CONTINUOUS時において、リクエストからI2Cデバイス側の準備ができるまでの待ち時間を設定するものです。通常は必要ないはずなのですが、Wii
Nunchuckなどの一部のデバイスにおいて必要になるため追加しました。
この設定はConfigurationにenablePowerPins()というメソッドを追加し、以下のように設定するようにしました。
var config:Configuration = Arduino.FIRMATA;
config.enablePowerPins();
aio = new Arduino(config);
なお、これに伴ってなのですが、仕様時にコマンドによって電源の供給が開始するため、デバイスによってある程度の時間(例:500ms)待ってからデバイスに対してのコマンドを送信しないと正しく処理されない場合があります。AS3では基本的に全て非同期処理のため、新規にI2C_POWER_PINS_READYというイベントを追加し、そのリスナの中でI2Cデバイスのインスタンスの生成などを行うようにしています。
しかし、Processingでは同期処理が可能だと思いますので、このような方法は必要なく、単に内部的に500ms程度待っていただければ大丈夫だと思います。
<新規のI2Cデバイスの追加について>
現在コミットされているもので、以下のデバイスが追加されています。
・HMC6343(傾き補正付きコンパス)
・LIS302DL
・LIS3LV02DQ
・WiiNunchuck
これらに関しては、必ずしもProcessing側でも同じように用意しなければならないというものではありませんが、もしサポートできそうということでしたらデバイスをお渡しします。
以上、長くなってしまいましたがI2Cデバイスの変更に関するご連絡でした。さまざまなデバイスでの検証や仕様策定に時間がかかってしまったためにまとめてのご連絡となってしまいましたが、もし何か不明な点などあればリプライをいただけたらと思います。
返信が遅くなりました。
Arduinoがリリースされてからと思ってましたが、なかなかされませんね。
ファームをもしおもちでしたら、送ってもらえるとたすかります。
あと、べつのプロジェクトの展示がもうすぐなので、ちょっと今は手がつけられない
かもしれません。
遠藤孝則
2009/07/17 4:16 に Shigeru Kobayashi<koto...@gmail.com> さんは書きました:
--
endo takanori