XBeeのAPIモードで温度を受信する
はじめに
夏場は部屋が寒すぎるので、どうにかならないかな〜と考えていたら、部屋の温度を監視して適温になるようにエアコンを自動調整すればいいのでは。と思い立ち、周辺装置の開発でもしてみようと思ったので、その前段としてXBeeの使い方を覚えてみる(一年経過)
準備
秋月電子で以下の部品を調達する
- XBee ZB (S2C) / ワイヤアンテナ型 × 3
- XBeeピッチ変換基板とソケットのセット × 3
- XBee USB アダプター(リセットスイッチ付き) × 1
- Arduino Uno × 1
- 高精度IC温度センサ LM35DZ × 2
- 電源
- ブレッドボード
- ジャンパワイヤ
X-CTUのセットアップ
XBeeの設定を行うには X-CTU
というソフトウェアを使うと簡単に設定できるので、インストールする
XBeeの設定
X-CTU
をインストールしたら、早速XBeeの設定を行ってみる
今回はコーディネータ1台とルータ2台によるメッシュネットワークを構成したいと思う。
ZigBeeの仕様についてはskyleyのサイトで大変わかりやすくまとめてくれているので、一通り目を通すのをオススメする。
ZigBee入門 - Skyley Support Wiki
XBeeのフレーム構造や種類などに関しては、XBeeの製造元の digi 社のサイトが大変参考になる。
XBeeのピン配列に関しては以下のサイトがわかりやすい
共通
最初は、親機子機共に共通の設定を行う必要があるので以下のように設定する。
XBeeUSBアダプターを使ってXBeeを繋いだら左上の「+」マークからデバイスを探す。
USBで繋いでいるので usbserial
を選択する。
無事デバイスが見つかったら、Firmwareの最新版を一度書き込みたいので update
を選択する。
ZIGBEE TH Reg
を選択して完了するのを少々待つ。
余談だが、従来のXBeeだとコーディネータやルータなどのデバイスタイプ毎に書き込むFirmwareが違っていたらしいが、XBeeS2Cからは設定項目でデバイスタイプなどを変更することが可能となった。
どうやら、メモリやCPUの性能が上がったことで全モードが書き込み可能となったため、ATコマンドで変更することができるようになったのだとかどうとか。
子機(室温を親機に送る)
設定項目は結構あるので、変更部分だけを抜粋。
若干ハマった所としては、アナログピン(Pin19)を入力にするだけではダメで、サンプリングレートを設定しないとセンサー素子から値を読み込んで送信してくれない。
[Networking] - PAN ID = 1192 - Zigbee stack profile = 0 [Serial Interfacing] - API Enable = API Enabled [1] [I/O Settings] - Pin 19 DIO1/AD1/nSPI_ATTN Configuration = ADC [2] [I/O Sampling] - IO Sampling Rate = 3E7
ブレッドボード上の回路としてはこんな感じになる
親機(受信した値をコンソールに出力する)
同じく変更部分だけを抜粋。
重要な部分は Coordinator
を有効にするぐらい。
[Networking] - PAN ID = 1192 - Zigbee stack profile = 0 - Coordinator Enable = Enabled[1] [Addressing] - Destinaton Address Low = FFFF [Serial Interfacing] - API Enable = API Enabled [1]
親機は設定が終わってもPCに繋げっぱなしにしとき、X-CTU
のコンソールを開いて受信するフレームを確認する。
一点混乱してハマったのでメモとして残しておくが、コンソールで確認したり設定変更したりスキャンしてネットワークを確認してまたコンソールみたりと、試行錯誤しながら色々触ると思うが、何かしらのタイミングで IO Data Sample RX Indicator
のフレームが受信されなくなり、代わりに変なフレームを受信するようになる。これは、スキャンなどを行っているとそれに関係するフレームの送受信を行っているために、そのようなフレームがコンソールに表示される(その間はスキャン以外のフレームは送信されないような仕様になってるぽい?)
完成