ArduinoではじめるXBee M2Mネットワーキング
1.さぁ準備を始めよう

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

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

Arduino + Wireless SD Shield (XBee Shield)
Arduino + Wireless SD Shield (XBee Shield)

はじめに

 XBeeの登場によってワイヤレスでのデジタル通信が手軽に出来るようになりました。しかし、複数の機器同士が相互に通信を行うようなネットワーキングとなると、XBeeのZigBeeとしての機能を活用しなければならず、ZigBeeの基礎知識とXBeeで動かすためのコマンドの習得には時間を要してしまいます。
 そこで本ページでは、はじめから複雑なネットワーキングへの展開を考慮しつつ、最低限の知識で手っ取り早くシステムを構築してゆきます。
 ArduinoとXBeeのどちらも、少ない基礎知識で手軽にはじめられ、かつ複雑なシステムへの応用に繋げれる点で優れていますので、XBeeを使うためだけに必要なArduinoの一部の知識と、Arduinoで使うためだけに必要なXBeeの一部の知識を習得すれば、複雑なM2Mネットワーキングも比較的簡単に応用して構築することができるのです。

まずは買っちゃおう

 ボクの他のページでは見慣れない言葉かもしれませんが、まずは必要なものを買ってしまいましょう。以下に最初に買っておくといいかなと思うものをリストにしました。なるべく安くすませたい方は、それぞれ代用品もあります。

Arduino + XBee で最小限、買っておくもの
品名 参考価格 備考

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

XBee Wall Router 8,400円 実験用の照度センサと温度センサ、XBeeが内蔵されています。
次ページ「ブレッドボードで作るセンサー」はWall Routerの代わりの子機としても使用可能です。

 このリストは一例です。たとえば、Arduino本体は互換品も多く、また、それぞれの互換品には様々な特徴があります。Arduino 純正品にもLANに対応したArduino Ethernetという製品があります。クラウドサービスやスマートフォンからセンサネットワークにアクセスするにはArduino EthernetによるXBee ZigBee/Ethernet IP変換の役割を担う機器(M2Mゲートウェイ)が必要です。ただし、Arduino Ethernetにはパソコンと接続するためのUSB端子がありませんので、FTDI USBシリアル変換アダプタが別途必要です。
 また XBeeソケット付き Arduino LEONARDO互換品が DF ROBOT から発売されています。現在のところ国内では取り扱われていませんので同社のサイトから個人輸入しました(下図)。


DF ROBOT XBeeソケット付き Arduino LEONARD 互換機

 Arduino Wireless SD SHIELD は、micro SDスロットがついていますが、micro SDなしのArduino Wireless SHIELDであれば、1870円程度と安価です。また、SparkFanなどのサードパーティ製もあります。
 キーパッド付の液晶は adafruit LCD Shieldがお奨めです。I2C接続なのでピン数を節約できるからです。詳しい説明は「Arduino用液晶シールド」に記載しています。そちらに記載の DF-ROBOT LCD Keypad Shield For Arduinoはハンダ付けが苦手な人にはお奨めです。しかし、Wireless SD SHIELDのSDカードが併用できない欠点があります。
 XBeeモジュールはZigBeeもしくはZB、Series 2、S2、S2Bといった表示のあるZigBee対応品を使用します。古い製品に Series 1と呼ばれるZigBee規格に準拠していない製品があるからご注意ください。(詳しくは「XBee ZigBee Wi-Fi モジュールの種類」にシリーズや、アンテナ、無線性能などの特長や違いについて記載しています。)
 親機用のXBee-PROモジュールはPROではないXBeeでも実験はできます。しかし、XBee-PROの方が通信距離が長いので、なるべくならXBee-PROと専用アンテナの組み合わせをお奨めします。


親機にお奨めのXBee-PRO(RPSMA)と専用アンテナ

 XBee Wall Routerはセンサー子機として使います。Strawberry Linuxで「ZigBee レンジエクステンダー」の名称で売られています。ちょっと値段が高い上、センサーとしての性能も悪いので、次ページの「ブレッドボードで作るセンサー」の方が安上がりです。あるいは「XBee ZigBee ワイヤレス温度・湿度・照度センサーの製作方法」で紹介しているセンサーを製作しても良いでしょう。
 他にもセンサー子機として「XBee ZB スマートプラグ」が売られています。Wall Routerと同様の照度センサと温度センサに加え、電流センサとコンセントに接続した電気スタンドなどの家電機器をXBeeでON/OFFするリレー回路が含まれています。これだけでM2Mっぽく感じられますので機能的にはお奨めです。ただし、電気安全法に基づくPSEが未取得につき実験用としてしか使えない欠点があります。


照度センサと温度センサ内蔵の Digi純正 XBee Wall Router (参考 8,400円)


Wall Routerに電流センサとリレースイッチを内蔵した XBee Smart Plug (参考 12,369円)


XBee ピッチ変換基板(参考400円)と XBee ZB(参考1700円)

 これらの他に「XBeeエクスプローラUSB」と呼ばれるXBeeをパソコンのUSBに接続するアダプタもあった方がいいでしょう。各社から独自のものが売られています。Arduino Wireless Shield経由でパソコンとXBeeを接続することが出来ますので必須ではありません。

簡単製作の概要

   ここでは各種の開発ツールのインストールや親機用のXBee-PROモジュールの設定の流れについて説明しますが、あまり分からなくても具体的な作業手順を後ほど説明しますので大丈夫です。
 パソコンには「Arduino IDE(開発環境)」とDigi社の「X-CTU」というソフトをインストールしておきます。そして、シリアルドライバのインストールを行います。さらに、親機用のXBee-PROモジュールをWireless Shieldを使って「ZIGBEE COORDINATOR API」に設定します。
 最後に当方サイトからxbee_arduino.zipをダウンロードして、Arduino IDEへインストールします。メニューからサンプルのスケッチを読み込んで、必要な部分を修正すれば、XBeeの実験が出来るようになっています。
 以上の作業について、これから詳しく説明してゆきます。

Arduino IDE (開発環境)のインストール

 Arduino IDE Ver 1.0.5からWindowsインストーラが配布されるようになりました。Windows インストーラを使った場合のインストール方法は「Arduino IDE インストール方法(PDF)」を参照してください。
 インストーラを使用しない場合は、Arduinoのホームページ(http://arduino.cc/)から「Download」を選択し、ご使用になられているパソコンのOS(Windows、Mac、Linux)を選択してダウンロードします。ダウンロードした圧縮ファイルを展開して「arduino-X.X.X」フォルダをPCにインストールします。

Digi X-CTU (XBee 設定ツール)のインストール

 Digiのホームページ(http://www.digi.com/)から「Support」メニュー内の「Diagnostics, Utilities & MIBs」を選択すると、Digi社の製品リストが表示されます。この中から「X-CTU」を選択します。スクロールバーを最後の方まで下げると「XCTU 32-bit ver. X.X.X.X installer」のようにインストーラが表示されますのでダウンロードして、ダブルクリックするとインストーラーが起動してインストールできます。

シリアルドライバのインストール

 ArduinoとパソコンがUSB通信を行うためのシリアルドライバのインストールを行います。この段階ではArduino本体にシールドは取り付けない方がいいでしょう。
 Arduino本体をパソコンに接続するとドライバのインストールが開始されます。ここで「コンピューターを参照してドライバソフトウェアを検索します」を選択し、続いて「次の場所でドライバーソフトウェアを検索します」を選択し、先ほどコピーした「arduino-X.X.X」フォルダを選択します。「サブフォルダーも検索する」にチェックを入れて検索を行うとドライバーのインストールが開始されます。

親機用のXBee-PROモジュールの設定

 ここでは親機用のXBee-PROモジュールを「ZIGBEE COORDINATOR API」に設定します。「Coordinator」とはZigBeeデバイスの種類の名称で、ZigBeeネットワークを管理する役割を担ったデバイスを示しています。一つのZigBeeネットワークに一つのCoordinatorが存在する必要があります。ここでは分かりやすくCoordinatorのことを親機と表現することにします。

 X-CTUを使ってXBee-PROモジュールにファームウェアを書き込むために、Wireless ShieldをArduinoに接続し、XBee-PROモジュールをWireless Shieldに接続し、Wireless Shield上のSelial Selectスイッチを「USB」に切り替えます。XBee-PROモジュールは必ず定められた方向で差し込みます。また差し込みピン位置がズレてピンが余らないようにも注意します。


 設定には先ほどインストールした「X-CTU」を使用します。起動すると下図のようなシリアルポートの選択画面になりますので、XBeeの接続されているシリアルポート(COM番号)を選択します。どれか分からない場合は、選択して「Test / Query」を押せば確認できます。
 なお、シリアル通信がうまく動作しない場合は、一度、X-CTUを終了してUSBを外し、XBeeをリセットしてみます。それでもシリアルが通信出来ない場合は、X-CTUからXBeeへのシリアル通信にArduinoのシリアルが干渉している可能性があります。Arduinoが応答しないように、Arduinoのリセットボタンを押したまま状態を保持してX-CTUとXBeeとの接続を確認してみます。しかし、これだと手が疲れるので、ジャンパーワイヤーでArduinoの「RESET」と「GND」をショートするか、Arduinoに空のスケッチ「void setup(){ } void loop() { }」を書き込んで干渉を防ぐ方法もあります。


 次に上方にあるタブの中から「Modem Configuration」を選択し、「Read」をクリックします。うまくシリアル通信が出来れば、XBeeモジュールの設定値が表示されます。シリアル通信が動作しない場合は、前述のXBeeリセットや空スケッチを試します。


 ファームウェアの種類「Function Set」をプルダウンして「ZIGBEE COORDINATOR API」を選択します。語尾に「API」のついたものと「AT」のついたものがありますが、ここでは必ず「API」を選択してください。


 最後に「Write」で書き込みます。ここでもシリアル通信に失敗することがありますので、失敗した場合は同様の対策を行います。購入したばかりのXBee-PROモジュールではめったに失敗しないと思いますが、XBeeを省電力モードに設定するとほぼ必ず失敗するようになります。また、ファームウェアの書き込みに失敗すると、場合によってはブートローダーを書き込まなければならない事態になりますが、Arduino Wireless Shieldではブートローダーを書き込むことはできません。別途、ブートローダーの書き込みに対応したXBeeエクスプローラUSBが必要です。(市販のすべてのXBeeエクスプローラUSBが対応しているということではありません)

adafruit LCD Shieldの接続

 adafruit LCD Shield の製作方法は同社のサイト内(http://learn.adafruit.com/rgb-lcd-shield/assembly)にとても細かく写真で示されているので、そちらをご覧ください。本製品はハンダ付け作業が必要です。他の製品の一例として、DF ROBOTのLCD Keypad Shieldを使った場合は互換ライブラリ「LiquidCrystal.zip」をArduino IDEにインポートしたうえで、サンプルスケッチの「#define ADAFRUIT」を消してください。
 次に、adafruit LCD Shieldもしくは、DF ROBOTのLCD Keypad ShieldをArduino Wireless Shieldの上に装着します。Arduino Wireless Shield上のXBeeがXBee-PRO(RPSMA)と専用アンテナの組み合わせであれば何の問題もなく装着できます。しかし、ワイヤーアンテナの場合は、adafruit LCD ShieldがXBee-PROモジュールのアンテナに当たるので、アンテナは水平に近くなるように曲げておきます。なお、チップアンテナやパターンアンテナだと液晶に埋もれてしまうので感度が大きく低下してしまいます。

 下図はワイヤーアンテナのXBee-PROが載ったArduino Wireless Shieldの上にadafruit LCD Shieldを装着した状態の完成図です。左からアンテナが飛び出ているのが分かります。


Arduino IDEへXBeeライブラリを追加する

 Arduinoへ書き込むソフトウェアのインストールを行います。まず、当方サイトのダウンロードページからXBee用ライブラリ(xbee_arduino.zip)をダウンロードします。ダブルクリックするとZIP圧縮されたファイルが見えます(下図@)ので、「XBee_Coord」フォルダを、Arduino IDEの「libraries」フォルダにコピーします(下図A)。


 Adafruitの液晶を購入された方はLCDドライバを同社のサイト(http://www.adafruit.com/)からリンクされているダウンロードサイト(https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library)から雲のマークのある「ZIP」ボタンを押してダウンロードします。念のため、アップロード者がAdafuruitの創立者であるladyada(ニックネーム)を確認しておいたほうが安全です。
 ダウンロードしたZIP内のフォルダ名「Adafruit-RGB-LCD-Shield-Library-master」を前述のXBeeライブラリと同じようにArduino IDEの「libraries」フォルダにコピーします。その後、フォルダ名を「Adafruit_RGBLCDShield」に変更する必要があります。但し、「Arduino」を「Program files」フォルダに入れている場合はZIP内のREADMEに書かれている手順に従って先にフォルダ名を変更してください。

スケッチをArduinoに書き込む

 アプリケーションを作成するためにArduinoを接続した状態でArduino IDEを起動します。起動すると下図のような画面が出てきます。


 Arduino IDEの必須の設定は2つだけです。「ツール」メニューにある「マイコンボード」と「シリアルポート」です。「マイコンボード」は購入したArduinoの種類を選びます。Arduino Unoであれば「Arduino Uno」です。「シリアルポート」はArduinoと通信を行うためのCOM番号を選びます。分からない場合は、適当に選んでおいて、動かなければ変更します。


 Arduino IDEの「ファイル」メニューから「スケッチの例」「XBee_Coord」を選ぶと、サンプルアプリケーションが表示されます。ここでは「sample4_sens」を選んでみてください。


 すると、サンプルアプリを開くとスケッチと呼ばれるソースコードが表示されます。下図ではスケッチの冒頭のタイトルだけしか表示されいませんが、スクロールすると先が読めます。サンプルアプリの詳しい使い方も書いてあります。


 この状態で上方の右矢印ボタンを押すとArduinoにスケッチを描き込むことが出来ます。下図の白い丸いボタンです。「シリアルポート」が間違っていた場合は再設定します。


 使用するArduino本体やXBeeモジュール、XBee用シールドなどの各部品の種類やバラつきによってシリアル線のインピーダンスが低下してスケッチの書込みに失敗することがあります。Arduino Wireless Shieldの Selial Selectスイッチを「USB」に切り替えるか、それでも失敗する場合はWireless ShieldやXBeeモジュールを取り外してスケッチを書き込みます。なお、XBeeモジュールを取り付けたままスケッチを描き込んだ場合は、その信号をXBeeモジュールが誤解釈して動作状態が異常になる可能性が僅かながらあります。その場合は、XBeeモジュールをリセットするために、Arduinoに接続しているACアダプタやUSBを、一度、抜き挿ししてXBeeモジュールを再起動します。

動かしてみる

 スケッチの書き込みが終わるとArduinoのアプリが自動で起動します。この時、Wireless Shieldの Selial Selectスイッチを「MICRO」側にします。10秒以上待っても、タイトル画面のまま進まない場合は、タイムアウトしてしまっていますので、Arduinoのリセットボタンで再起動します。
 正しく、XBeeとの通信が行えると、画面が進み、XBeeセンサーデバイス(子機)を探し始めます。この状態で30秒以内に、XBee Wall RouterやXBee Smart Plugをコンセントに差して、子機側のコミッションボタンを1回だけ押すとペアリングが実行されます。子機のボタンは一つしかないので迷うことはないと思います。
 子機のLEDが点灯から点滅に変わったらペアリング完了です。もう一度、子機のコミッションボタンを押すと、Arduino親機にネットワークへの参加を通知します。次回からは、一度、押すだけでArduino親機が子機を発見できるようになります。


 もし、ペアリングがうまくいかない場合は、子機のコミッションボタンを4回連続で押してネットワーク設定を初期化します。Arduino親機をリセットして、もう一度、試してみてください。子機のコンセントを、一度、抜くと正しく動作する場合もあります。
 ペアリングの部分は、XBeeの特性上、少し不安定に感じることもあります。しかし、一度、動き始めれば途中で止まることなく何カ月も動き続けてくれますので安心してください。

今回の内容について

 ここでは親機が子機のセンサーを読み取って表示するアプリケーションを紹介いたしました。他の方法、例えば、Arduino同士をXBeeのUART通信を使用してデータを受け渡すような方法でも同じことはできるでしょうし、XBeeライブラリを使わずにAPIコマンドを直接、コーディングする方法もあります。しかし、ArduinoとXBeeを応用してネットワーキングに発展可能な方法としては、最も手短で、今後の応用の利く方法だと思っています。
 次節では、センサー子機をブレッドボードで製作してみます。また、その子機からセンサー値を読み取れるようにサンプルアプリを改造してみます。


1.さぁ準備を始めよう  2.ブレッドボードで作るセンサー →


XBeeメインメニューへ戻る

地デジトップへ戻る