Arduino + Max + Xbeeでシリアル通信 その1

自分はハードはからっきしなので、まずはArduinoからということで手を出してみてます。しらないことがたくさんあったのでメモ

やりたかったことは「ArduinoからZigbeeでPCまでシリアル通信を飛ばして、それをMaxで拾う」ということ。

 

1.知らなくて困ったこと

・抵抗器の抵抗の大きさはラインのカラーで表現されている(!)
・スイッチの状態を得るためには「プルアップ抵抗(プルダウン抵抗)」というものを使う
・LEDは長いほうがプラス極。あと抵抗付けないでそのままぶっさしてはいけない(焼けます。)

 

 

 

2.Xbeeの基本

Arduinoで無線通信する方法はイーサネットやBluetoothもあるけど、今回はZigbeeを扱えるXbeeモジュールを使うことにした。

 

Xbeeはファームウェアによって挙動が変わる

Xbeeはメッシュネットワークを形成することができ、ネットワーク内での役割によって3つのタイプになれる。

①Coordinator(親機)
一つのネットワークに一つ必要。

②Router(中継機)
終端端末としての機能に加えて中継機能をもち、リープしない。

③End Device(終端装置)
データを収集する。スリープする

 

Xbeeはコマンドモードによって対話方式が変わる

ATモードとAPIモードがある。
ATモードは機能が少ないが、シリアル通信だけならこれでOK(というか有線シリアル通信の無線板のようなもの)。コンソールが使える。
APIモードは
センサーの値をずっと垂れ流しにしたい、みたいなケースで使う。APIモードではデータはパケット(フレーム)として送られる。(もしかして音声とかも送れるのかな? いずれ試してみたい)

 

XCTUなどのソフトを使って、Xbeeのモジュール自体に情報を書き込む必要がある。
いじる必要がある場所は、ネットワークID(同一IDのものでネットワークを形成する)、Xbeeのファームウェアタイプとコマンドモード(例えばCoordinator AT)など。

Xbeeの基本については
こことか
http://www.inetclub.gr.jp/Total_collection_volume.htm

こことか
http://todotani.cocolog-nifty.com/blog/2010/12/xbee-f604.html

が詳しい。

 

3.Xbeeまわりで詰まったこと

X-CTUで、Arduino経由でのXbeeを認識しない事が多い

X-CTUで情報を書き込む際、まずCOMポートを選び、「Test/Query」ボタンを押すことでチェックを行うのだが、これがとにかく成功しないことが多い。

Arduino UNO-ワイヤレスプロトシールド-Xbeeみたいな感じでつないでいるのだけど、(おそらくArduinoのシグナルが邪魔をして)認識できないことが多い。(Action Requiredという表示が出る。)

次のようにやるとうまくいく事が多い。

①ワイヤレスプロトシールドのSERIAL SELECTスイッチを、USB側に倒す。ArduinoのリセットとGNDをつないでショートさせる。

②USBでPCにつなぐ。

③X-CTUでTest/Queryを行う。

これで、Action Requiredとか言われた場合は、USBをはずして、もう一度①からやりなおす。

 

Xbee同士のペアリングがひたすらうまく行かなかった

有線では、ここ http://mag.switch-science.com/2012/07/20/startup_xbee_s1/ を参考にして、とりあえずシリアル通信ができるようになった。ただ、無線でどうしてもうまくいかない。

PAN IDもきちんと設定できているのに、なぜつながらないんだろうか悩んでいたけど、どうやらペアリング自体がうまくいっていなかったことがわかった。

X-CTUのコンソールからATモードでネットワーク設定をリセットするATNRコマンドを双方(CoordinatorとRooter両方で)叩いて、とりあえずはうまくいくけど、
せっかくの無線通信なのにいちいち有線で設定をしないといけないのじゃ意味が無い。

そこでArduino側から内部でATコマンドを叩いてネットワーク設定をリセットする方法もやってみたけれど、イマイチうまくいかない。

一応:内部から叩く場合、
”+++(ATコマンドモードに入る)”→"ATNR(ネットワークリセット)"→”ATCN(でATコマンドモードを抜ける)”
というのをやる必要があって、またGuardTimeというのがあってそれぞれの処理の間で決められた時間待たないとコマンドを受け付けない。
(ここに詳しい http://nora66.com/zigbee/

 

ネットに転がっている資料だと、どれも一発でペアリングがうまく行っていたのにひたすら謎で、かなり時間を食われたけれど、
結果的に電源を入れる順番とタイミングの問題だということがわかった。

①PC側XBeeの電源を入れる(PCにUSBでつなぐ)

②10秒くらい待つ ←超重要

③Arduino側Xbeeの電源を入れる

しばらくすると、ペアリングが成功して、シリアル通信を行えるようになる。
Arduino側のリセットだけじゃダメで、PC側も電源を入れなおさなきゃいけないというのが盲点だった。あとは挿し直した後にしばらく待たないといけないというのも。

 

4.遅延

というわけで、無線でシリアル通信はできるようになり、Maxで中身を拾えたはいいが、

致命的な遅延がある。

音を扱おうとしているので、遅延少なくする方法をいろいろ探してみているけど、とりあえずつかれたので今日はここまで。

1 Comment

apple says:

ありがとうございました。

Leave a Reply

Your email address will not be published.