参考にすべき物
XBee Starter Kit の CD-ROM 中のドキュメントを頼りに進めていきます。
product-manual_XBee_OEM_RF-Modules_802.15.4.pdf : 使い方が一通り載っています。
以下も参考になります。
http://ftp1.digi.com/support/documentation/productmanual_xbeecodedevelopment.pdf : P16に、開発キットの回路図が載っています。これをもとに回路図を考えました。
受信するデータ
X-CUT や TeraTerm などでCOMポートを見ると、以下のようなデータを受信します。(ASCIIや16進数で表示されますが、ここでは2進数にしてあります。)
01111110 00000000 00001010 10000011 00000000 00000000 00111110 00000000 00000001 00000000 00000001 00000000 00000000 00111100
スイッチを切り替えると、以下のようなデータになります。
01111110 00000000 00001010 10000011 00000000 00000000 00111100 00000000 00000001 00000000 00000001 00000000 00000001 00111101
このデータの説明は、付属の product-manual_XBee_OEM_RF-Modules_802.15.4.pdf に書いてあるのですが、どうも書いてある内容とデータが違います。
データの意味はよく分かりませんでしたが、このデータの13バイト目(後ろから二つ目)が、DIO0〜DIO7 までのデータです。
これをRubyで必要な部分だけ書き出すようにします。
以下のスクリプトを参考にしました。
http://ruby.g.hatena.ne.jp/garyo/20061130/1164845977
class Com @comno @speed @parity @data @stop @com attr_accessor :comno, :speed, :parity , :data , :stop, :com def initialize @comno="1" @speed="9600" @parity="N" @data="8" @stop="1" end def open(n) @comno=n.to_s modestr = "MODE COM#{@comno} BAUD=#{@speed} PARITY=#{@parity} DATA=#{@data} STOP=#{@stop}" system modestr @com = open("com#{@comno}", "r+b")#.binmode end def close @com.close end def recv @com.readpartial(1024 * 1024) # RS232C IN end end com1=Com.new com1.speed="9600" com1.open(1) # USBの開発ボードを使っている場合は、この数字が変ります。環境に応じて変えてください。 loop { unless com1.com.eof? then a = com1.recv while a.size < 14 a += com1.recv unless com1.com.eof? end abort a.size.to_s + "is too large." if a.size > 14 0.upto(13) {|i| print "%08b"%(a[i].to_i) + " " } puts "" print "%08b"%(a[12].to_i) + " " puts "" end sleep(0.2) } com1.close
XBeeを超シンプルに使ってみた
requirement
- 1つのスイッチの状態を通知するのみ
- 即応性は不要(あってもかまわない)
- スイッチの状態が一瞬だけ切り替わった時は、通知しなくて良い
- 伝送に時間が掛かってもかまわない
- 省電力は無視(後々考える