長距離通信を行う場合、Bluetoothは電波が届かないので、WiFiやZigBeeを使用します。XBeeモジュールを使用すると、手軽に環境を構築できます。Arduino2台を1対1でZigBee通信する方法について紹介します。
XBeeとZigBeeについて
XBeeは米Digi社の商標で、各種無線通信規格に対応したモジュールが販売されています。よく使用される通信規格は、WiFiとZigBeeです。ZigBeeは聞いたことがないかもしれませんが、電気的な基礎仕様はIEEE802.15.4で規格化されており、それより上位の層はZigBeeアライアンスが使用策定を行っています。
WiFiはアクセスポイントを経由して、インターネットに接続することを主な目的としていることに対して、ZigBeeやBluetoothは機器間を接続して情報を相互通信することを目的としています。そのため、 ZigBeeやBluetoothは 通信速度でWiFiに劣るものの、低消費電力という点で優れています。ZigBeeはBluetoothと同じ2.4GHz帯を使用しており、通信速度はBluetoothに劣りますが、通信距離はBluetoothが10m程度なのに対して、ZigBeeは1km程度まで届きます。
XBeeの種類
今回使用するのは「XBee S2C/ワイヤアンテナ型」ですが、XBee S2Cはアンテナの種類が3つあります。
- PCBアンテナ型
- ワイヤアンテナ型
- U.FLアンテナ型
ワイヤアンテナ型は、基板にアンテナが埋め込まれているため、アンテナに指向性があります。ワイヤアンテナ型は、基板から短いアンテナが伸びており、指向性が無く、遠くまで電波を飛ばすことができます。U.FLアンテナ型は、別売りの太くて大きなアンテナ「 XBee用外部アンテナU.FLコネクタ型 」を取り付けて使用します。
ここで注意が必要なのが技適です。XBee S2Cは技適認証取得済みなので、日本国内で使用可能です。ただし、U.FLアンテナ型は先述のアンテナとセットで認証を得ているため、セットで使用する必要があります。もし、自作のアンテナを取り付けたり、他製品のアンテナを取り付けて使用すると、違法になる恐れがありますのでご注意ください。
使用する部品
Arduinoを2台使用して、1対1でZigBee通信します。今回は、1台目のプッシュスイッチを押すと、2台目のLEDが点灯するものを作成します。
- Arduino UNO R3 … 2個
- ブレッドボード … 2個
- XBee S2C/ワイヤアンテナ型 … 2個
- XBeeシールド(Seeed Studio社製) …2個
- XBeeエクスプローラUSB … 1個
- プッシュスイッチ … 1個
- LED … 1個
- 抵抗(220Ω) … 1個
回路構成
LEDとプッシュスイッチの使用方法については、「ArduinoでSTEM教育 基礎編:プッシュスイッチ」に記載していますので、ここでの説明は割愛させていただきます。
XBeeの設定
1. XCTUのインストール
XBee製品の設定を変更するために、XCTUをインストールします。このソフトは、米Digi社で公開されています。ダウンロードリンクがわかりにくいのですが、下記リンク先の「Diagnostics…」をクリックで展開して、DOWNLOAD XCTUから対象OSのソフトをインストールしてください。
XCTUのリンク先:https://www.digi.com/support/productdetail?pid=3352
2.XBeeの設定
①XCTUを起動すると下記の画面が出ます。 まずは、XBeeエクスプローラUSB にXBeeを挿して、パソコンのUSBポートに接続して下さい。そして、左上のプラスマークのアイコン「Add devices」をクリックして下さい。
②パソコンに接続されたXBeeデバイスを検索するため、接続したポートを選択して、「Finish」をクリックします。すると、検索が始まりますので数秒待って下さい。 デバイスが見つかると、ウィンドウ左側に表示されます。これをクリックすると、デバイスの詳細情報を表示することができます。
③ここで下記の設定を書き換える必要があります。
- ID PAN ID
- DH Destination Address High
- DL Destination Address Low
- CE Coordinator Enable
「ID PAN ID」は、2台のXBeeで共通の値を使用します。ここでは初期設定の3332をそのまま使います。
「DH Destination Address High」は、接続相手のXBeeの「SH Serial Number High」の値を入力します。同様に、「DL Destination Address Low」も接続相手の「SL Serial Number Low」を入力します。
「CE Coordinator Enable」は、コーディネータの許可設定です。 コーディネータとは、ネットワーク内に必ず1台だけ存在し、ネットワークの立ち上げ機能を持っています。今回の場合は、どちらのXBeeをコーディネータ「Coordinator[1]」に設定しても構いません。もう1台はエンドポイント「Disable[0]」に設定して下さい。
以上を入力したら、最後に鉛筆マークの「Write」をクリックしてXBeeに書き込みます。完了すると、ウィンドウ左側のアイコンに「C」や「E」が表示されていると思います。これは、CoordinatorとEndpointを意味します。
XBeeシールドの設定
XBeeの設定が完了したら、シールドに差し込んでArduinoと接続します。ここで、注意が必要なのがジャンパーの位置です。今回の部品の組み合わせの場合は、下記の写真で示すとおり、「0」はXB_TXとDIGITALをジャンパーで接続、「1」はXB_RXとDIGITALをジャンパーで接続します。
プログラム
プログラムは以下の通りですが、Arduinoに書き込むときに注意が必要です。書き込む前に、XBeeシールドのジャンパーを取り外してください。もしくは、XBeeをArduinoから取り外してください。ジャンパを外さないまま書き込もうとすると、書き込みエラーが発生します。
書き込みが完了したら、ジャンパーをもとに戻します。コーディネータ側のArduinoの電源を入れ、続けてエンドポイント側のArduinoの電源を入れると1対1接続が完了します。
①スイッチ側のプログラム
スイッチは、2番ピンでプルアップ入力に設定します。スイッチを押すとLOWが入力され、シリアル通信で’A’を出力します。この記述は、XBeeを使用せずにシリアルモニタに出力する場合と同じです。
//www.stemship.com //2019.12.28 const int buttonPin = 2; void setup() { pinMode(2, INPUT_PULLUP); Serial.begin(9600); } void loop() { if(digitalRead(buttonPin) == LOW) { Serial.print('A'); } delay(100); }
②LED側のプログラム
LEDは、3番ピンで出力に設定します。スイッチ側からデータが送られてきたかどうかは、Serial.available関数で判断します。Serial.available関数は、シリアルバッファにあるデータのバイト数が戻り値です。したがって、この戻り値が0より大きければ、データが送られてきたことを意味します。そして、なんのデータが送られてきたかは、Serial.read関数で読み込みます。読み込んだ値が’A’の場合は、LEDの3番ピンをHIGH出力にして点灯させます。
//www.stemship.com //2019.12.28 const int ledPin = 3; int serialData = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available() > 0) { serialData = Serial.read(); Serial.println(serialData); if(serialData == 'A') { digitalWrite(ledPin, HIGH); Serial.println("LED-ON"); delay(1000); serialData = 0; } else { digitalWrite(ledPin, LOW); } } else { digitalWrite(ledPin, LOW); Serial.println("No Serial Data"); } delay(100); }
まとめ
Arduinoを2台使用して、1対1でXBee(ZigBee通信)で無線通信する方法を紹介しました。通信相手のアドレスをXCTUで書き込み設定しさえすれば、あとはシリアルモニタに出力する要領で、プログラムを書くだけで通信ができました。海外サイトを見ていると、もっと安価なモジュールを使って無線通信をしていますが、 日本では 技適認証取得 が必要なことを覚えておいて下さい。
コメントを残す