XBeeを紹介しているサイトを見てみると私にもすぐできそう・・・
でしたが、これがなかなかできない。
悩んで丸1日程度かかりました。
というわけで覚え書きとして残しておきます。
この記事はXBeeでLEDを遠隔操作することだけを目的とします。
普通はトランスペアレントモードなどでシリアル通信をするのがいいかもしれません。
スポンサーリンク
用意するもの
- XBeeモジュール ×2
- XBee用2.54mmピッチ変換基板 ×2
- XBeeエクスプローラUSB
- XBeeシールド
- Arduinoとその開発環境
- その他(ブレッドボード、電源、LEDなど)
無線通信するためにはXBeeモジュールは最低2つ必要となります。
今回のXBeeはシリーズ2です、それ以外ではできないと思います。
変換基板は自分ではんだづけしてください。
今回選んだ変換基板はレギュレータがついていますが、ついていない場合は3.3Vのレギュレータを外付けしてください。
エクスプローラUSBはXBeeの設定を変えるために必要なものです。
もっと安価なのもありますが、今回はこれを使いました。
XBeeシールドはArduinoと接続するためだけのものなので別に接続しなくていいという人はいらないでしょう。
全部揃えるとなると結構高いです・・・
ドライバのインストール
FTDIのサイトに飛んで最新のドライバをダウンロードします。
その後は、丁寧に説明されてるサイト様を参考にしてください。
X-CTUのインストール
Digiのサイトに飛んで「Diagnostics,Utilities and MIBs」をクリック。
最新版のX-CTUをダウンロードしてインストールしてください。
これは説明いらないでしょう・・・
XBeeの設定
共通の動作
XBeeを接続したエクスプローラUSBをPCにつなげます。
そしてX-CTUを起動します。
こんな感じの画面になっているはずなので、XBeeがささっているCOMポートを選択します。
(この場合はCOM5だけなのでわかりやすいですが・・・)
次にTest / Queryを押してみましょう。
そして、こんな感じの表示になればちゃんとXBeeがささっています。
そうならなかったらUSBを一旦抜いてみるなり、X-CTUを再起動するなりしてみましょう。
その次に、「Modem Configuration」のタブに移動します。
そして画像の赤丸で囲っている「Read」をクリックします。
そしたらいろんな項目が出ると思います。
読み込みに失敗しても連打してれば大抵はいけますよ。
受信機の設定
受信側は
- Modem: XBEE ・・・「XB24-ZB」
- Function Set ・・「ZIGBEE COODINATOR API」
を選択します。
「Networking」の項でいじるのは最初の「PAN ID」というところです。
これは受信側と送信側とで一致させてください。
別にどんな数字でもいいです。
0xFFFFFFFFFFFFFFFFまでの値ならいくらでも・・・w
今回は「PAN ID」を「1000」にします。
次に、「Addressing」のところをいじります。
「DH -Destination Address High」と「DL -Destination Address Low」を相手側のアドレスに設定してください。
アドレスはXBeeの裏面に載っています。(おそらく「004 revG」の下2行)
その次に、一旦「PC Settings」のタブに戻って「Enable API」にチェックを入れます。
そしてまた戻り、「AP - API Enable」を「2」にします。
ここまでの設定でこんな感じになりました。
黄色くなっているところが変更点です。
これで「Write」を押せば完了です。
送信機の設定
送信側は
- Modem: XBEE ・・・「XB24-ZB」
- Function Set ・・「ZIGBEE ROUTER AT」
を選択します
PAN IDは受信側と同じにします。(今回の場合は「1000」)
また、同様にDHとDLは相手側のアドレスにします。
そして「JV - Channel Verification」を「1 - Enable」にします。
その次に、今回はD0にスイッチをつけてそのスイッチが押されたら受信側のLEDをつけるようにするので、「I/O Settings」のD0を「3 - DIGITAL INPUT」にします。
ここまでの設定はこんな感じです。
できたら「Write」を押してください。
送信側はこれで終わりではなく、次に 「Terminal」のタブに移動します。
画像ではいっぱいコマンドを打っていますが、確認のためだけなのでほとんど飛ばしても構いません
重要なのはatir032(atir32でもいけるっぽい)とatwrです。
atir032,wrと入力してもいけるそうですが、私は無理でした。
ここに相当苦労して、PCからはずしたら送受信しなくなる現象になっていました。
atwrも暗中模索で適当に打ってたら保存されたのでかなり嬉しかったです(オイ
ちなみにここで半日ほど悩んでましたorz
コマンド一覧ほしい・・・
回路
どちらも簡単な回路なので、すぐ組めると思います。
XBeeの動作電圧は3.3Vで、Arduinoの動作電圧は5Vです。
受信側
送信側
データの読み取り
何も思わずとりあえずコピペしてアップロードしてください。
/* Read Digital Input Receiver= ZigBee Coordinator API mode ver 218C Sender= ZigBee Router AT mode ver 228C */ /* http://www.geocities.jp/todayorozu/XBee/XBeeSketch.html */ int DI = 0; void setup(){ pinMode(12, OUTPUT); pinMode(13, OUTPUT); // 受信チェック用 Serial.begin(9600); // Serial通信の設定 } void loop(){ if(Serial.available() == 0) DI = 0; // Serialに情報が来ていなければ DI = 0とする if(Serial.available() > 20){ // 0-21バイトを受信 if(Serial.read() == 0x7E){ // スタートバイトを見つけたら digitalWrite(13, HIGH); delay(10); digitalWrite(13,LOW); // 確認用のLED点灯 for (int i = 1; i < 21; i++) byte discard = Serial.read(); //1-20バイトまでを読み飛ばす(0 byteはすでに読み取り済み) DI = Serial.read(); // 21バイト目をDIに読み取る Serial.print(DI); // 確認用にSerialにデータを送る。 } } if(DI == 1) digitalWrite(12, HIGH); // DI = 1であれば12番ピンをHIGHとする。 if(DI == 0) digitalWrite(12, LOW); // DI = 0であれば12番ピンをLOWとする。 }
スポンサーリンク
回路通りに組んだなら13番ピンにつながっているLEDは点滅していて、送信側のボタンを押すと12番ピンのLEDがつくはずです。
参考にさせていただいたプログラムのままでは動かず、ここでも挫折しそうになりました。
私の場合だけかもしれませんが、なぜか21バイト目がないんですよね。
XBeeシールドがある人は次のプログラムを動かせば、どんな信号を受信してるかが分かります。
void setup(){ Serial.begin(9600); } void loop(){ if(Serial.available() > 20){ if(Serial.read() == 0x7E){ for (int i = 1; i < 22; i++){ Serial.print(Serial.read(), HEX); Serial.print(" "); } Serial.print("\n"); } } }
シリアルモニターを確認してみてください。
ボタンを押した時
7E 0 12 92 0 7D 33 A2 0 40 6F F4 E5 B7 15 1 1 0 1 0 0 0
ボタンを押していない時
7E 0 12 92 0 7D 33 A2 0 40 6F F4 E5 B7 15 1 1 0 1 0 0 1
こういう違いで私は2つ上のプログラムにしています。
("7E"はシリアルモニターには表示されません。)
もし違うところが変わったのであれば、少しだけですがプログラムを変える必要があります。
また、X-CTUの方でも受信信号を読み取れるそうですが、わかりませんorz
参考サイト
この記事の参考にはしてないですが、役に立ちそうなサイト様も掲載しています。
スポンサーリンク
Pingback: 【arduino】お盆休みでArduinoいじる<ANTはまったついでに> | 信州MAKERS日記
Pingback: 【arduino】お盆休みでArduinoいじる<ANTはまったついでに> – 信州MAKERS<新サイト>