小林です
先日遠藤さんから提案のあったI2Cを扱うための仕組みに関してですが、r507まででFunnel
Server側およびArduino側の対応(Arduino側はREAD CONTINUOUSが未実装ですが)を行いました。
それに対応するライブラリ側の実装検討として、RubyにI2CDeviceクラス、およびそのサブクラスであるHMC6352クラスを追加してみました。
http://code.google.com/p/funnel/source/detail?r=508
HMC6352はSparkFunで扱っているコンパスモジュールで、日本でもスイッチサイエンスやストロベリーリナックスで購入できます。
http://www.sparkfun.com/commerce/product_info.php?products_id=7915
http://www.switch-science.com/products/detail.php?product_id=55
2つのクラスの実装はこちらです。
http://code.google.com/p/funnel/source/browse/trunk/libraries/ruby/funnel/i2c.rb?spec=svn508&r=508
実際に使う時には、次のようにして使います。
config = Arduino.FIRMATA
@aio = Arduino.new :config => config
compass = HMC6352.new @aio
10.times do
# compassのheadingプロパティを参照して現在の方位角を表示する
puts "heading: #{compass.heading}"
sleep 0.5
end
ここで、HMC6352のコンストラクタにIOModuleクラスのインスタンスを渡しているのですが、これはこのインスタンスを介してSysEx関連のやり取りを行うためです。実際にも、I2CデバイスはI/Oモジュールにぶら下がるものですので、この形式は一つの方法かなと思います。
他の方法としては、
config = Arduino.FIRMATA
@aio = Arduino.new :config => config
compass = HMC6352.new
aio.add compass
のように、add()のようなメソッドをIOModuleに用意して、I2Cデバイスのインスタンスを追加する、というものです。どちらも、実装上の問題や手間などはほとんど変わらないと思いますので、どちらが自然に見えて使いやすいか、で決めてしまっていいのだと思います。また、他にもっと良い案があればそれも含めて、意見やコメントなどをお願いします。;)
小林です
AvagoのADJD-S371-QR999とBlinkMでもテストしてみました。Arduino
Nanoでテストしましたが、いずれも想定したような動作をしてくれているようです。Rubyライブラリにはこの2つを追加しました。
http://code.google.com/p/funnel/source/browse/trunk/libraries/ruby/funnel/i2c.rb?spec=svn510&r=510
BlinkMはいいのですが、ADJD-S371-QR999のクラス名は悩みどころです。とりあえずADJD_S371_QR999としてありますが、これはクラス名としては(言語仕様として許してくれますが)不自然ですよね…。かといって、メーカ名のAvagoだけだとセンサ以外にもたくさん製品がありますので…。
以上、取り急ぎのご報告でした。
2008/11/2 Shigeru Kobayashi <koto...@gmail.com>:
arduinoにはSimpleI2CFirmataを書き込み
サーバーはr505を使っています。
require 'funnel'
include Funnel
config = Arduino.FIRMATA
@aio = Arduino.new :config => config
compass = HMC6352.new @aio
10.times do
# compassのheadingプロパティを参照して現在の方位角を表示する
puts "heading: #{compass.heading}"
sleep 0.5
end
sleep 1
というコードを実行すると
command port: localhost, 1761
Rebooted successfully
Configured successfully
OK: /polling
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
heading: 0
となり、出力がとれません。
センサーの接続は別のプログラムで取得できましたので、正しいのではないかと思います。
なにかチェック項目はありますか?
遠藤孝則
2008/11/04 23:18 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori
小林です
すみません、サンプルとして示したコードが1行抜けておりまして、正しくは
10.times do
# compassのheadingプロパティを参照して現在の方位角を表示する
compass.update # 手動でアップデートする
puts "heading: #{compass.heading}"
sleep 0.5
end
です。
ファーム側できちんと実装されればupdateの呼び出しは必要なくなるのですが、現状では実装されていないため、明示的な呼び出しが必要になります。
2008/11/5 takanori endo <sweeta...@gmail.com>:
#define I2C 0x76 // I2C read/write message
/* IC2 read/write
* -------------------------------
* 0 START_SYSEX (0xF0) (MIDI System Exclusive)
* 1 I2C (0x76)
* 2 read/write
0 => write
1 => read once
2 => read continuously
3 => stop reading
* 3 slave address (7bit)
* 4 data 0 (LSB)
* 5 data 0 (MSB)
* 6 data 1 (LSB)
* 7 data 1 (MSB)
* ...
* n END_SYSEX (0xF7) (MIDI End of SysEx - EOX)
*/
example: read a value of a slave device
1. Host => Arduino
* 0 START_SYSEX (0xF0) (MIDI System Exclusive)
* 1 I2C (0x76)
* 2 1 (read)
* 3 slave address
* 4 register to read (LSB)
* 5 register to read (MSB)
* 6 bytes to read (LSB)
* 7 bytes to read (MSB)
* 8 END_SYSEX (0xF7) (MIDI End of SysEx - EOX)
2. Ardino => Host
* 0 START_SYSEX (0xF0) (MIDI System Exclusive)
* 1 I2C (0x76)
* 2 slave address (LSB)
* 3 slave address (MSB)
* 4 register (LSB)
* 5 register (MSB)
* 6 data 0 LSB
* 7 data 0 MSB
* ...
* n END_SYSEX (0xF7) (MIDI End of SysEx - EOX)
これって今まで通りですよね?
サーバーにsysexで、パケット作っておくっても出力が帰ってこないのですが、
サーバーでなにか変更はありましたか?
writeで送った時も、サーバー側からsysexが戻ってくるようですが
こんな感じでしたか?すいません。忘れてしましました。
2008/11/05 15:55 takanori endo <sweeta...@gmail.com>:
--
endo takanori
小林です
※すみません、送信ミスで送信できていませんでした。
変更個所について確認してみますね。SysExの送り方に関しては違いがないはずなのですが…。
送っているのは以下のソースをみていただくと一番わかりやすいかと思います。
libraries/ruby/funnel/i2c.rb
考えられるとすると、サーバが担当うすべきLSB/MSBの分割をクライアント側でしてしまっている、とかでしょうか。
一点確認なのですが、レジスタから読み出すときは
readを呼ぶだけでOKなのですね?
1. I2Cで読み出したいアドレスを指定(write)
2. I2Cで読み出しを実行(read)
3. 1で指定したアドレスのデータが読み出される
で、writeとreadをそれぞれ送るという方法でやっていました。
SimpleI2CFirmataでは
readのなかに、このような処理が入っていますよね?
とりあえず、確認できたのでつづきをやります
遠藤孝則
2008/11/06 0:12 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori
小林です
> 一点確認なのですが、レジスタから読み出すときは
> readを呼ぶだけでOKなのですね?
すみません、その通りです。
> とりあえず、確認できたのでつづきをやります
はい、また何かありましたらお願いいたします。
2008/11/6 takanori endo <sweeta...@gmail.com>: