ArduinoではじめるXBee M2Mネットワーキング
4.家中どこでも情報表示(M2M子機-中継器の製作)

by ボクにもわかる地上デジタル

XBeeメインメニューへ戻る
地デジトップへ戻る

M2M子機の製作例
M2M子機の製作例

はじめに

 家中どこでも情報表示が出来るM2M子機(中継器)の製作を通し、XBeeのネットワークに関する知識を習得します。製作したM2M子機は各部屋毎に1台づつ設置するような表示&操作端末となり、設置した部屋の複数のセンサー孫機の管理と制御を担います。

M2Mシステムの全体イメージ図

 親機を含めたM2Mネットワークのイメージをつかむためのイメージ図を下図に示します。中央に位置するのがM2M子機(中継器)です。左側のM2M親機は本ページには出てきませんが、Arduino Ethernetを使ったXBee ZigBee/Ethernet IPゲートウェイを経由して親機が収集した情報をクラウドサーバにアップロードしたり、スマートフォンからセンサー状態を確認したりするようなことを想定しています。

M2M機器イメージ
M2Mシステムのイメージ図

M2M子機(中継器)の主要機能

 ここで製作する(サンプルスケッチ)の主要な機能は以下の通りです。親機からのデータ表示機能に加えて、親機や子機とのネットワーク参加(ジョイン)に関する管理機能や簡単なデータ収集、親機へのデータ送信機能を有します。

M2M子機の製作例
M2M子機の製作例

M2M子機(中継器)の製作に必要なもの

 ここではM2M子機(中継器)と孫機を各1台(計2台)でのサンプルを示します。実際には部屋ごとにM2M子機1台、同じ部屋にあるセンサーは全て孫機という発展例を想定しており、そういった展開を行う場合はシステムに合わせてサンプルスケッチを修正してください。

M2M子機の製作に必要なもの
品名 参考価格 備考

Arduino Ethernet 5,030円 PCで代用可能。また本ページではEthernetは使いません。
USB-シリアルアダプタ 5V 1,690円 Arduino Ethernetをパソコンに接続するための変換器
Arduino Wireless SHIELD 1,870円 XBeeモジュールをArduinoに接続するためのシールド
XBee-PRO ZB(S2) Module 2,900円 Arduinoに搭載する親機用。RPSMAコネクタ型がお奨めです。
XBee 専用アンテナ 550円 上記の親機XBeeのRPSMAコネクタに取り付けるアンテナです。




Arduino Uno SMD R3 2,390円 安価な互換品や秋月キット、LAN付のArduino Ethernetも
Arduino Wireless SHIELD 1,870円 子機なのでmicroSDの無い廉価版を使用します。
adafruit LCD Shield Kit 1,995円 液晶と5個のボタンのついたUIキットです。(要ハンダ付け)
XBee-PRO ZB(S2) Module 2,900円 Arduinoに搭載するM2M子機用。RPSMAコネクタ型がお奨めです。
XBee 専用アンテナ 550円 上記のM2M子機XBeeのRPSMAコネクタに取り付けるアンテナです。

XBee Sensor $125 実験用の照度センサと温度センサ、XBeeが内蔵されています。
ブレッドボードで作るセンサー」もXBee Sensorの代わりの孫機として使用可能です。

親機Coordinatorの製作

 まずは実験のための仮の親機を製作します。本ページでは Arduino版、パソコン版ともにXBee ZB/Ethernet IPゲートウェイ機能をもった親機のサンプルはありません。(Arduino版は、M2M子機2台とセンサーを接続するようなシステム構成です。)
 仮の親機として、親機となるArduinoにもM2M子機と同じプログラム(後述のサンプルスケッチ「sample11_lcd」)を書き込みます。また、親機に搭載するXBeeモジュールには「COORDINATOR API」を書き込みます。
 親機XBeeをパソコンで製作することも可能です。XBee USBエクスプローラを経由してパソコンと接続したXBeeモジュールへ「COORDINATOR API」を書き込み、Cygwin上でアプリケーションソフトウェアを動かします。仮の親機なので、ATコマンド解析ツール「xbee_test.c」を使っても構いません。もしくは「COORDINATOR AT」を書き込んでX-CTUのTerminalから動かしても良いでしょう。

M2M子機Router(中継器)の製作

 M2M子機(中継器)に搭載するXBeeモジュールには「ROUTER API」のファームウェアを書き込みます。またM2M子機のArduinoにはサンプルスケッチ「sample11_lcd」を書き込みます。

仮の親機/M2M子機(中継器)用のサンプルスケッチ

 親機とM2M子機(中継器)の両方のArduinoに書き込んだサンプルスケッチ「sample11 LCD」について簡単に説明します。このサンプルはM2M子機用ですが、親機でも問題なく動きます。実際の運用時は、親機にはSample 7 UARTのようなデータ蓄積機能を分担するのが良いでしょう。また、ゲートウェイ機能も必要になるでしょう。

サンプルスケッチ

 Arduino に書き込むサンプルスケッチ「sample11_lcd」は下記からダウンロードしてください。また、下記のXBee 管理ライブラリのダウンロードページから「xbee_arduino_XXX.zip」をダウンロードし、Arduino IDEへ組み込んでください。
 最新版のサンプルスケッチはXBee用ライブラリ(Ver 1.87以降)に含む予定です。Ver 1.87公開以降はライブラリをインストール後にArduino IDEの「ファイル」メニューから「スケッチの例」→「XBee_Coord」→「sample11_lcd」を選択して読み込んでください。

M2M子機用(中継器)のサンプルスケッチ
コンテンツ 説明
sample11_lcd.zip サンプル11 M2M子機用のサンプルスケッチ 初回リリース版
xbee-download.html XBee 管理ライブラリ ダウンロードページ

M2M子機(中継器)の動作確認

 まずは親機CoordinatorとM2M子機Router(中継器)とのペアリングを行います。Adafruit LCD上の[UP]ボタンは上位の機器に接続するためのコミッションボタンです。また、[DOWN]ボタンは下位の機器にペアリングを許可するためのボタンです。また、M2M子機にはASSOSIATEランプがありません。そこで、ASSOSIATEランプ代わりに、画面の右上にXBeeモジュールの状態を2桁の16進数で表示しています。正常時は「----」表示になります。
 初回起動時は、親機は正常の表示になっていると思いますが、子機の方は「FF」などペアリングされていない状態表示となっています。
 ペアリングを行うには、親機で[DOWN]ボタンを押下してペアリングを許可してから、10秒以内に子機の[UP]ボタンを押下します。ペアリングが完了するとM2M子機Routerの右上の液晶表示が正常な値に変わります。この状態で、もう一度、M2M子機の[UP]ボタンを押すと、親機にM2M子機のアドレスが表示されます。また、子機にはPAN IDとよばれるネットワーク固有のIDが表示されます。
 孫機となるXBeeセンサーをM2M子機に追加するときは、M2M子機の[DOWN]ボタンを押してから、XBeeセンサーのコミッショニングボタンを押下します。
 さて、これで、親機、M2M子機、孫機が同じネットワークに接続されました。ここで、M2M子機の電源を切ってみてから、孫機のコミッションボタンを押下してみてください。M2M子機が居なくても親機との通信が出来ることが分かります。また、M2M子機の電源を入れ直し、親機の電源を切ってから、孫機のコミッションボタンを押下してみると、親機が居なくてもM2M子機との通信が出来ます。ただし、低省電力で動作する「End Device」の孫機については、ペアリングしたM2M子機が居ないと通信が出来なくなります。

M2M子機(中継器)の使い方

 左右ボタンで実行するコマンドを選択してから[Setect]ボタンを押すと実行されます。例えば、孫機をペアリングするには左右ボタンで「Pairing」を探し、[Select]を押します。
 時計表示を行いたい場合は「Clock ON」を選択します。時計が表示された状態で、同じメニューを探すと「Clock OFF」に変わっています。(メニュー項目名は状態を示すのではなく、コマンド内容を示します。)

親機から受信可能なUARTコマンド一覧

    レベルメータ表示

        [ESC] [L] [0〜9,A]          レベルメータ1の表示レベル(0〜10段)
        [ESC] [L] [0〜9,A][0〜9,A]  レベルメータ1と2の表示レベル(0〜10段)
        [ESC] [L] [0x00〜0x0A]      レベルメータ1の表示レベル(0〜10段)
        [ESC] [L] [0x10〜0x1A]      レベルメータ2の表示レベル(0〜10段)

    ブザー出力

        [ESC] [A] [0〜9,A]          アラート音を鳴らす(0〜9回),0=OFF
        [ESC] [B] [0〜9,A]          ベル音を鳴らす(0〜10回),0=OFF
        [ESC] [C] [1]               チャイム音(1回)

    UART送信データのユーザ定義

        [ESC] [M] [1〜2] [TEXT]     メニュー名称(10文字まで)
        [ESC] [U] [1〜2] [UART]     送信データ(8バイトまで)

    時刻合わせデータ

        [ESC] [T] [h][h][:][m][m]   時刻合わせ用のデータ

XBee ZBモジュールのZigBeeファームウェア

 XBee ZBモジュール用のZigBeeファームウェアは大きく6種類あり、「ZIGBEE」に続く「COORDINATOR」または「ROUTER」、「END DEVICE」のZigBeeデバイスタイプによる種別と、それぞれに「API」または「AT」のつくシリアルインタフェース別による種別があります。

     ZIGBEE COORDINATOR API ACアダプタ Arduino/PC/ARM等 XBeeライブラリ使用時
     ZIGBEE COORDINATOR AT  ACアダプタ マイコンなし(PAN ID配布のみの親機)
     ZIGBEE ROUTER    API ACアダプタ Arduino/PC/ARM等 XBeeライブラリ使用時
     ZIGBEE ROUTER    AT  ACアダプタ 中継器、センサー
     ZIGBEE END DEVICE  API 乾電池   Arduino/PC/ARM等 XBeeライブラリ使用時
     ZIGBEE END DEVICE  AT  乾電池   センサー

 まず、シリアルインタフェース種別の「API」と「AT」の違いですが、XBeeライブラリを使用する機器では必ず「API」のつくものを使用します。その他の場合、「API」でも「AT」でもどちらでも良いですが、XBeeモジュールのシリアルUART通信をXBeeライブラリ以外で使用する場合は「AT」にします。
 また、ZigBeeデバイスタイプについては、通常、親機には「COORDINATOR」、ここで紹介したM2M子機のような中継器には「ROUTER」を使用します。子機や孫機のうちACアダプタのような十分な電力源がある場合は子機に「ROUTER」を用います。一方、乾電池を使用せざる得ない場合は「END DEVICE」を使用します。
 XBee ZBを使っている人の中でも「END DEVICE」を使いこなせている人は多くないようですが、ZigBee方式を使う最も大きな恩恵が受けられる部分です。当サイトの「
XBee ZigBee スリープ方法 CYCLIC SLEEP」には基本的な動作に関する情報を、書籍「ZigBee/Wi-Fi/Bluetooth無線用Arduinoプログラム全集」には、ライブラリを使用したより簡単な設定方法を紹介しているので、ぜひとも使いこなしていただきたいと思います。

中継機能を持つZigBee Router

 ZigBeeデバイスタイプのうち「COORDINATOR」と「ROUTER」はZigBeeプロトコル上で中継機能を持っています。このため極端な言い方をすると「中継のための設定」はとくに無く、ネットワークに参加していれば、ZigBeeプロトコルで勝手に中継してくれます。だからこそ、ZigBeeではネットワークの参加/不参名kを制御したりペアリングを行うことが重要なのです。
 さて、設定不要と書きましたが、同じネットワークに参加する親機、中継器、子機のすべての「SP値」と「SN値」を同じ値に設定しておく必要があります。これらの設定値に関する説明は「
XBee ZigBee スリープ方法 CYCLIC SLEEP」に記載しています。なお、End Deviceの都合で様々な「SP値」と「SN値」が混在する場合、それぞれの最大の値を全ての「COORDINATOR」と「ROUTER」とに設定します。(End Deviceは、それより小さな値であれば問題ありません)

 省電力で動作するEnd Device(ファームウェア=ZIGBEE END DEVICE)は、ある一つの親機または中継器と親子関係が固定されています。End Deviceにとっての親機(中継器)が居なくなると他の親機か中継器を探すのですが、中継器のNJ値が0x00になっている(ジョインを許可していない)と、再接続できない場合があります。
 そこで例えば子機を見失ったら親機から中継器のNJ値をリモート指示で0xFF(ジョイン許可)に変更し、子機からデータが来るようになったら、NJ値を0x1E(電源を入れてから30秒だけジョイン許可)に設定といったようにプログラムで解決する方法もあります。親機から子機のNJ値を変更するための関数として「xbee_ratnj」も用意してあります。
 開発途中の段階ではNJ値を0xFFにしたまま使って、不具合が発生した時に対策した方が手っ取り早いかもしれません。(NJ値を0xFFにしていると、システムを運用中に新しいシステムを試作しようとした場合に、試作システムの子機が運用中システムにつながってしまい、試作側の親機と通信ができなくなります。また他の近隣のZigBeeシステムでペアリングが出来ないといった不具合も出る場合があります。)
 あるいは、暗号化を設定することで他のシステムや製品のジョインを阻止することもできます。ただ、NJのように途中でXBeeのリモート指示で暗号化のON/OFFを変更できないので、一長一短があります。このあたりはNJ値を初期値の0xFFの状態で開発を進め、中継しての通信が出来ることを確認してからNJ値や暗号化などで調整すればよいと思います。

複雑なネットワーキングへの発展

 XBeeの登場によってワイヤレスでのデジタル通信が手軽に出来るようになりました。しかし、複数の機器同士が相互に通信を行うような複雑なネットワーキングとなると、XBeeのZigBeeとしての機能を活用しなければならず、ZigBeeの基礎知識とXBeeで動かすためのコマンドの習得には時間を要してしまいます。
 本ページのM2M子機による部屋毎の分散処理を用いれば、はじめから複雑なネットワーキングへの展開を考慮しつつ最低限の知識で、1部屋分の立ち上げから順に家全体のシステムへと発展させてゆくことができます。
 ArduinoとXBeeのどちらも、少ない基礎知識で手軽にはじめられ、かつ複雑なシステムへの応用にも長けているので、M2M子機を使った複雑なネットワーキングへの展開も手軽だと思います。

 なお、集中処理型のネットワーキングとなると、その中心にはPCを導入した方が手軽です。とくにArduinoのような組み込み環境ではソフトの規模が大きくなるほどデバッグに手間取ります。十分なデバッグ環境が準備されていないArduinoを使った集中処理による大規模ネットワーキングの構築は難しいでしょう。


3.絵っ!スケッチを描こう  4.家中どこでも情報表示  5.開けゴマ!無線リモート赤外線リモコン →


XBeeメインメニューへ戻る

地デジトップへ戻る