2014年7月27日日曜日

Xbee+ArduinoとXbee+Macを繋ぐ方法(つまづきメモ)

2014年7月27日

XBee+ArduinoとXBee+Macを繋ぐ方法
http://airshipnewsjapan.blogspot.jp/2014/07/xbeearduinoxbeemac.html
をまとめるに至った過程で、苦労したことをメモとして記録しておく。

XBee+Arduino+バッテリーで、センサノードをばらまいて、PCでデータ収集をするシステムを作るのが目的だ。

XBee WIFIで作ろうかと思ったが、インターネットへの接続はPCで集約した方が便利なのと、センサノードの省電力化をはかりたいと思ったため、ZigBeeを扱えるXbee ZBで作ってみることにした。

最初はキーワードが全然わからず苦労した。
XBeeとZigBeeとArduino、さらに懐かしいATコマンドのそれぞれの用語がある。

XBeeをArduinoに搭載するには、XBeeとArduinoを接続する必要がある。簡単なのはシールドを用いることだ。ところが3つ購入したシールドの内の一つが不良であった。4個のXBeeを相互接続したところ、どうしても4つ目が認識せず、Arduinoのせいなのか、XBeeのせいなのか、シールドのせいなのか分からず切り分け試験に苦労した。

ArduinoやXBeeを交換してもなおらないので、シールドが妖しいとにらんだが、プログラムの方も自信がなかったので、確信が持てなかった。シールドの代わりに、XBeeをピッチ変換基板(細かなハンダつけが必要)に載せ変えたところ、問題なく動いた。

3カ所以上のハンダづけは久しぶりだったが、昔取った杵柄なんだね、身体が覚えていた。

なお、ここまでの試験では、ATモードで接続していた。
XBeeに関するATモードでの設定は、スイッチサイエンスのホームページが詳しい。
丁寧に記述されていて、この通りにすれば設定できる。

さてここでATモードというのが出てきたが、XBeeには、ATモードとAPIモードという2種類がある。ATモードは別名「透過モード」とも言う。ZigBeeは本来、規格にあったパケットをやりとりすることで通信する。それがAPIモードである。しかしAPIモードは数字列で普通のプログラマが直接やりとりするには低レベルすぎる。

そこでXBeeでは、APIモードのパケットを独自に変換して、直接シリアルモデムで接続されているかのように見せてくれるモードが用意されている。つまり、ATモードだと、
 PC--シリアル--モデム----モデム--シリアル--Arduino
というイメージで使える。

ただし簡易モードなので、1対1通信程度なら問題ないが、センサノードを複数台扱おうとすると無理がある。ただ、無理がある、といろんなホームページに書かれているが、どの程度無理があるのかと思って、1対3で接続してテストしてみた。PC1台に、センサノード3台をつなげてみた。

PCに繋いだXBeeはCoordinator ATで設定し、ブロードキャスト設定(送信先をDH=0, DL=FFFFにする)で、センサノードは全て、Router ATで設定して、送付先をPCに繋いだCoordinatorにした。


なお、ここでまた新しい用語が出てきた。Coordinatorと Routerである。あとEnd Nodeというのがある。ZigBeeにはこの3種類がある。Coordinatorというのは、一つのネットワークの監視役である。Routerは中継に使われる。End Nodeというのは末端のセンサノードである。End Nodeにはスリープする機能がある。

設定方法は、「Xbee+ArduinoとXbee+Macを繋ぐ方法」に書いた通りで、xctuというソフトを使う。xctuにはWindows版しかない、と多くのホームページで書かれているが、今はちゃんとMac版がある。けっこう使い勝手の良いソフトである。

Coordinatorとか、Routerとか、またはATモードとかAPIモードとかの変更は、ファームを変えることで行う。単に設定変更ではできない。

さて、元に戻って、ATモードの限界についてだが。テストしたのは、Coordinatorから1, 2, 3,...と番号を1秒おきにブロードキャストして、センサノードにそれぞれ番号を割り当てて、自分の番号が送られてきたら、値を返す、という単純なテストである。

最初はうまく行っていた。順調に値が返ってきていた。ところが何十回かやっていると、通信が一時停止することがわかった。細かく追っていないが、ブロードキャストが滞っているものと推察される。その理由はブロードキャストタイミングを早めて、1/10秒ごとに番号を送るようにすると、あっという間に滞るためだ。

滞るのも、1、2秒なら良いが酷い場合には、10秒も20秒も滞る。これでは使い物にならない。ブロードキャストの範囲などを細かく制限すれば、大丈夫になるのかもしれないが、あまり深入りしても時間の無駄なので、ここでATモードとはおさらばすることにした。

さてAPIモードを使おうと思ったが、直接APIパケットを作るのはいくらなんでもやりたくないので、便利なものが無いか探した。最初は小林さん@IAMASたちが作ったfunnelを使おうかと思ったが、Processing 2.0に対応していないというのと、カプセル化が強く、高レベルすぎるのが気になり、もう少し低レベルで扱えるライブラリを探した。

ただ、だいぶ自分の頭が整理できたので、funnelを使うことを再検討してみても良い。

funnelは、小林さんの「Prototyping Lab--「作りながら考える」ためのArduino実践レシピ」の前提とされているライブラリで、未踏で作られたかなりできの良いものだ。2009年に完成しているので、その後のアップデートが滞っているのだろうか?

funnelだと、Arduino側の設定も、PC側からできてしまう。ProcessingでArduinoの入出力まで制御できるというすごいライブラリだ。ただ、このアクロバットをこなすために、ちょっと凝ったことがしてある。私としては、Arduinoは、Arduinoでコーディングして、PCは受信したデータを扱ったり、Arduinoに指令を出すなどの役割分担をする方が、気持ち的に良い。オブジェクト指向的というか。

調べてみると、Arduinoには、XBee-Arduinoというライブラリが、ProcessingというかJavaには、xbee-apiというライブラリがあることがわかった。いずれも

 APIモード
 エスケープモード
を扱えるライブラリである。
今回、「XBee+ArduinoとXBee+Macを繋ぐ方法」で解説しているのは、この方法である。

さて、ここでまた新しい用語「エスケープモード」が出てきた。APIモードでは、すべてのパケットは0x7Eで始まる。よってパケットの中に0x7Eを含むデータがあると、パケットの先頭と間違える可能性がある。そこで、パケット内の0x7Eを別の値に退避(エスケープ)させることで、0x7Eを扱えるようにするモードである。

実はXBeeをこのモードに設定する方法がわからず、けっこう苦労した。結論としてはxctuで、AP-API Enableという設定項目を「2」に変更することで行う。

エスケーブモードにしていないとライブラリは全然動いてくれない。

また二つのライブラリを使うので、どっちのライブラリの使用方法にエラーがあるのか、の切り分け試験ができずに苦労した。

これは結論としては、PC側はシリアルモニタで監視できるので、最初にXBee-Arduino側から確認する、のが良いことに気づいた。

まずXBee-Arduinoをインストールして、データをZigBeeに送り出す簡単なサンプルプログラムをArduinoに転送することとした。XBeeを繋いだPCでシリアルモニタにより、シリアルを監視すると、値が一定時間毎に送られているのを確認できる。

ここでシリアルモニタとしては、Cool Termが良い。HEX表示もあり、使い勝手が良い。

ちゃんと値が送られてこない場合は、XBee-Arduino側に問題がある。私の場合は、エスケープモードになっていなかったためだった。

次に、Processing側のxbee-apiの設定をした。ちなみにxbee-apiに関しては、あまり日本語の情報が多くない。javaでxbeeを使おうという人がまだ多くないということだろうか?

ちなみにProcessingとは、MITで開発された簡易言語である。ここまで読むような人で知らない人はいないよね。javaベースで、javaネイティブで書くより簡単に可視化などのプログラミングができる。ProcessingのIDEは、ArduinoのIDEと見た目や使い勝手がそっくりなのも、Arduinoと一緒に使うときの敷居を下げている。

xbee-apiで苦労したのは、ドキュメントが少なく、未だに更新され続けているためだった。
例えばProcessing 2.0.3までは、私がアップしたコードで動く。しかし、2014年3月の最新のProcessingでは、RXTXというシリアルを扱うライブラリが使われなくなっており、xbee-apiが前提としているため、RXTXを別にインストールしないと使えない。

なおlog4jは使わなくても動く。log4jを使わないようにコメントアウトすると警告(Warning)が出るが、通信自体には影響がない。

Arduinoにモバイルバッテリーを繋いで、PCから離して、寝室に置いてみた。3DKの鉄筋コンクリートで、リビング-寝室間は-92dBとかなり電波状況が悪い。1秒一回の通信で5000回のテストの間に15回エラーが生じている。まぁ、そんなものか。

以上










0 件のコメント: