覚え書きTOP

ZigBee(XBee)       


<現時点での感想など> 2016/11/25更新
 4つの送信出力(1mW、5mW、10mW、
20mW)、3つの無線通信速度(9.6kbps、50kbps、100kbps) NEC製H001-000013 mbed 販売店DAISEN
 最大10mW、低速で長距離モードがある(A/DやらGPIOが最初から付いてる) IM920 mbed

<現時点での感想など> 2014/07/25更新
 これまた良いのが出た。どんどん出るね!フリースケールのモジュール

<現時点での感想など> 2014/06/11更新
 自分の用途にぴったりなモジュールが出た。富士通のMBH7SLZ01 カタログ
 920MHz、1:N通信、グループ通信、3局迄の中継可能、送信出力が変更可能、低速な伝送レート(=長距離通信=多分FHSS)。
 疑問点はスリープからの起動時間とモジュールの消費電流と入手性。
 メールでの返信によれば、資料とサンプルは2014/7月以降、量産は2014/10月、最低ロット数は未定だって。
 この富士通のモジュールが入手出来ないようなら、TOCOSのも良い感じそう。
 これは2.4GHzのDSSS、スリープからの復帰が高速、JTAGデバッグ、情報が豊富、1:N通信、1局迄の中継可能、送信出力が変更可能、高速伝送。
 無線関係でとても分かりやすいページ

<現時点での感想など> 2013/02/18更新


ここはXBeeに関する記述だ。自分用の備忘録なので、あちこちから無断コピーしてます。悪しからず。
ここで使ってるのは”XBee-Pro ZB”と”XBee ZB”だ。
XBee-Pro ZBを親機と子機、XBee ZBを子機の合計3台を使う。
なおXBeeの概要や他のシリーズの話やツールやファームの書き換え方法はこっちを見てちょうだい。

ここに書いてあるのは"XBee-PRO ZB"と"XBee ZB"を有線シリアルと同じように使う方法だ。
有線のシリアル通信の代わりに使いたいんで、変なタイミングでデータが途切れたりは困るわけ。
<結論> 
透過モードで相手先を指定して送信する ブロードキャスト方式は問題あり。
バイナリーでの通信は取り敢えずこれでやってみよう(APIモードは後日)。

以下の機材を使った。
 パソコン × 3
 USBドングル × 3
 XBee-Pro  ZB × 2
 XBee  ZB × 1

  いじくり回してるうちに壊さないようにアンテナごと袋に入れた。
裏面にリセットSWを付けてる。



APIモードはこっち


前準備
 概要を参考にして、FTDIドライバを入れたり、X−CTUを使ってXBeeと通信できることを確認する。


透過モードで相手先を指定して送信する

1,ファームの書き換え

以下のように各モジュールのファームを書き換える(END Deviceは今回は試してない)。
  XBee-Pro ZB : Coodinator(親機)
  XBee-Pro ZB : Router(子機1)
  XBee ZB    : Router(子機2)

   XBee-Pro ZBのCoodinator(親機)設定    XBee-Pro ZBのRouter(子機)設定
   
   
  XBee ZBのRouter(子機)設定   ファーム変更の手順
   
@ModemConfigタブを選択。

AReadボタンで設定情報を確認。

B"XBP24BZ7"を選択(XBee-Proの場合)。

C"ZIGBEE COODINATOR AT"を選択。
 ファームウェアのVersion表示が20xxになる。

DShow Defaultsボタンをクリックし。
 パラメータのデフォルト値をローディングする。

E"Always update firmware"にチェックを入れる。
 なおパラメータだけを変更するときはチェックを外すこと。

FWriteボタンをクリック。
 ファームウェアのアップデートが始まる。
 アラートが表示されたらモジュールのリセットボタンを押す。

 完了したらReadボタンをクリックして書き込まれた値を確認。

 AdressingのSH/SLにはモジュールのシリアル番号が書かれており、送信時はこれを宛先として指定する(本体の裏に印刷有り)。

 書き込みが終了したら、10秒程度待ってから、XBeeの電源を切る(書き込み直後に電源を切るとうまく書き込まれていない場合があるらしい)。




2,パラメータの変更

  子機はスリープモードに入ると面倒(X-CTUが繋がりにくい)なので、寝ないように変更した。
X-CTUのTerminal使用時にCTS表示が黒くちらちらするならスリープモード状態だ。
 
   
  全部のモジュールのPAN IDを同一にすること(0なら親機がIDを自動設定する)。
デフォルトの0のままで構わないようだ。
 
   
  D7コマンドでCTSの有効/無効を設定する(デフォルトで有効)。
受信バッファが満タンになる17バイト前にCTSはDisableになり、34バイトの空きが出来るとEnableになる。
   



3,相手先を指定して送信する

相手先を指定すれば誰にでも送信可能だ。親子間だけではなく子機同士もOK。複数モジュールから同時に送信しても混信しない。
XBee ZBでは宛先は相手のシリアル番号で指定する(MYアドレスではない)。シリアル番号はモジュール本体の裏面に印刷されている(ATNDでの表示も可)。
なお「子 → 親」送信のときだけは「0(ゼロ)」を使っても良い。

宛先はATコマンドで、DHとDLに相手先のシリアル番号を指定する(大文字小文字、ゼロサプレス可)。
なおATND と入力するとコネクト中の相手のシリアル番号等が表示される(表示されない場合はCoordinatorやRouterなど上位のモジュールでやる)。プログラムで送信先を柔軟に変更するような場合に利用可能だ。

 [ ATコマンド例 ]
  +++                     // ATモードに入る
  ATDH 13A200       // 子機1のシリアル番号上位
  ATDL 4070FF9D    //        〃          下位
  ATCN                  // ATモード終了
  yoyoino-yoi...         // ここからは相手へ伝えるデータ列だ

  ATNDによるシリアル番号の表示   子機2へのデータ送信 
     



4,+++をなんとかする

<2011/7/7 更新>
 ATコマンドモードに入るときのシーケンスを発見。

  A : 1秒間(GT))は何も送らず・・・GTは単位は多分1mS
B : 1秒以内(CT)に"+++"(CC)を送り・・・CTは10mSっぽい
C : その後1秒間(GT)は何も送らない
これでATコマンドモードに入る。
と言う事は、普通にデータ送信をしてるなら、ATコマンドモードに入ることは有り得ないじゃん。
 

<2011/7/16 更新>
 このATコマンドモードへ入るシーケンスをちょっと変えてやれば使いやすくなりそうだ。
 例えば適当にGTを1mSにし、CTを10mSにする。
 こうすればATコマンドモードに入るときの時間がかなり早くなるだろ。それに"+++"除けの待ち時間も短くできるし。
 送信相手が複数有り、それを切り替えるときなんかも結構高速にやれそうだ。
 ま、透過モードはこの程度で良いや。あとは
APIモードを調べよう。

<2011/7/6 更新>
 透過モードだと"+++"がATコマンドの入口コードなんで、バイナリーデータの送信時はこいつをなんとかせにゃならん。
 と思ったんだけど、XBeeがATコマンドモードに入るのは、"+++"の後ろに時間が空いたときだけのようだ。
 例えば連続で'+'を4個送り込んでもATコマンドモードにならない。
 ちゅうことは、何も考えずにぶっ続けでデータを送り込んでやればOKって話。
 ただ4個目の'+'の直前でCTSがディセーブルになった場合は空き時間が出来てATコマンドモードになっちまう・・・けど、こんな事は滅多に起きないわな。
  ・XBeeのモジュール間通信速度は256KBpsだから、CTSがディセーブルになる機会は少ない。
  ・XBee内のファームがもしかしたらCTSディセーブル直後の'+'は無視するようにしてるかも?
  ・実際の通信ではプロトコルを組み込むから異常発見は容易だ。
  ・'+++'が無いデータにすれば良い(暗号化するなど)。

以下は必要ならやればって話だな。

1,ちょい待つ方式
 3個目の'+'を送る前に、ちょっと時間を空けてやればATモードに入らない。
 データ内の'+++'の頻度が少ないならこれでも良いかな。

  const int _PDELAY = 500; // 空ける時間mS
int __pm = 0; // '+'の個数(この関数から抜けたときのデータが"++"の対策で外部変数にしてる)
public bool Write(byte[] txd, int offset, int txcnt)
{
    for (int i = offset; i < txcnt; ++i) {
        if (txd[i] == '+') {
            if (++__pm == 3) {
                Thread.Sleep(500);  // 500mS待ち
                __pm = 0;
            }
        } else __pm = 0;
        while (false == _Cts) Thread.Sleep(1); // CTS待ち
        serialPort1.Write(txd, i, 1);  // 1バイトずつ送信
    }
    return true;



2,エスケープコードを使う方式
 この方式では、受信のときに「5バイト受信」と言っても、もしエスケープコードが含まれてたら6バイト受信して捨てる処理が要るんで、1バイトずつ受信する必要がある。
 APIモードでは、0x7Eを「0x7Dと0x7E xor 0x20」の2バイトに置き換え、0x7D自体がデータに出現した場合は「0x7Dと0x7D xor 0x20」に置き換えるらしい
 んじゃ"+"(0x2B)が現れたらこうするか・・・
  ・0x2B → 0x2Aと0x2B xor 0x20
  ・0x2A → 0x2Aと0x2A xor 0x20

  #define ESC  0x2a

void sendByte(BYTE b)
{
    if (b==0x2b || b==ESC) {
        _xbee.putc(ESC);
        _xbee.putc(b ^ 0x20);
    } else _xbee.putc(b);
}

BYTE recvByte()
{
    BYTE b =  _xbee.getc();
    if (b == ESC) b = _xbee.getc() ^ 0x20;
    return b;
}




概要

以下のリンク先にはXBeeモジュールのシリーズ1/2/ZBが混じってるので注意。

ZigBeeと言うのは通信規格の名前の事だ。
ここで使ってる実際のブツ(モジュール)名はXBeeと言う。
で、XBee上に載せたファームによって以下の3種類が存在してる(2011/6/21現在)。
なお、ここではZigBee規格のモジュール XBee ZB を使用するので、シリーズ1・2・DigiMesh等と混同しないように注意。
ここここここここを読めば大体の事は分かる。

 ・XBee シリーズ1   これは今更どうでも良いや。調べるならキーワードは”802.15.4 DigiMesh”。 ここここ
 ・XBee シリーズ2   これも既に保守扱いだ
 ・XBee(-Pro) ZB   これから使うならZBシリーズだ。正式なZigBee規格のファームが載せてある(-Proは電波が強いタイプ)。
 ・Programable XBee  ユーザーがプログラミング可能なCPU内蔵とのこと。ただ言語がPythonなそうだ。

XBeeのファーム及びパラメータ書き換えには、PCとドングルとX-CTUと言うアプリケーションソフトを使用する。
なお購入時点でモジュールがスリープモードになってると、X-CTUでの通信がしくじることが多いが、気にせずに何度か繰り返せば接続する。

1,PCとの接続とドライバのインストール
 PCとの接続にはXSTICKXBeeエクスプローラUSBドングルを使う(これはドングルだけだから、この他にXBeeモジュールを買わないとだよ)。
 こいつにはUSB-シリアル変換のIC(FT232)が載ってるんで、それ用のドライバをPCにインストする。
  ・ドングルにモジュールを挿すときに逆挿し注意。
  ・XP、W7共、PCにドングルを挿すとドライバは自動的にインストールされたが、念のために最新版にアップした(デバイスマネージャーのドライバの更新を使用)。
 ここここ正式マニュアル(ドライバの削除方法有り)ここ(ドライバの削除方法有り)


2,X-CTU
 USBドングルを使ってXBee内のファームを変更をするんだけど、その時に使うアプリケーションがX-CTUだ。
 X-CTUのインストール方法。
 ここここここここ本家の英語マニュアル

X-CTUの起動
 自分の環境ではドングルはCOM5〜、XSTICKはCOM11〜割り付けられた。
 なおXSTICKはデフォルトでAPIモードになってるので、X-CTUの"Enable API"にチェックを入れる(Modem ConfigタブのReadで読み込める事を確認する)。
   


XBeeパラメータの変更
 パラメータだけを変更する時は"Always update firmware"のチェックを外す。
 ここ

XBeeファームの変更
 こっちに図入りの詳細があるよ。
 XBeeはファームを書き換えることで、AT(透過)モードやAPIモードになる。シーケンス図
 またコーディネータ(親機)、ルータ(フル機能の子機)、エンドデバイス(省電力モードの子機)に設定することができる。
 ファームウェアバージョン(Modem firmware version)には以下の種類がある。
 ・20xx Coodinator AT(透過)モード
 ・22xx Router AT(透過)モード
 ・28xx End Device AT)透過)モード
 ・21xx Coodinator APIモード(XSTICKのデフォルト)
 ・23xx Router APIモード
 ・29xx End Device APIモード

 X-CTU内で最新のファームをダウンロードする場合、XPマシンではWEBから可能だがW7マシンではエラーになるので手動で行う
 ファーム変更する場合、DTRが繋がってれば書き込み失敗しても問題無く修復出来るようだ。ここのコメント欄。
 ここここここ失敗談トラブルファームを飛ばしたときここも詳しいここも詳しいここも

 XBeeと通信出来なくなったら1200BPS PN S1 で行けるようだ。


3,リンクとマニュアル
 Digi日本
 岡本無線電機WEBショップ
 データシート
 XBee(シリーズ1/2)マニュアル


4,その他
 入門記事  
 ZigBee規格について 
 親機子機設定  
 スリープモード  
 ネットワーク  
 API  (DigiMesh)、XBeeServer
 製品  NECルネサスA&ITOCOS
 他  ラジコン


特徴やら制限やら


ブロードキャストによる通信

AT(透過)モードで「1:N」通信を行う。
マイコンボードを使う前にPCとUSBドングルで動かしてみよう。
PC、USBドングル、XBee ZB(XBee-Pro ZB)モジュールをそれぞれ3台ずつ用意し、モジュールにファームを入れる。
なお最新のファームを使うかどうかは良く考えような("Download new version"にて最新のファームを取得する場合、XPマシンではWEBから取得可能だが、W7マシンではエラーになるので手動で取得しよう)。
1台にCoodinator(親機)のファームを入れ、残り2台にRooter(子機)のファームを入れる。
なおスリープが面倒くさそうなんで今回はEndDeviceは使わない。

ここが詳細で正確だ
リセットSWの取り付けとATコマンド(ネットワークへの参加SWは不要だ)
ファームを透過モードに変更する(アドレス設定は不要だ)

 親機はブロードキャストを行い、これを受信した子機は自分宛の電文なら親に返事を出す方式を使う。
 宛先指定などは特に必要無し。つまり全部デフォルトのままで使えば「1:N」で通信可能だ(同時送信しても混信しない)。
  ・親機 → 子機への送信は宛先指定無し(DH=0,DL=FFFF)。
  ・子機 → 親機への送信も宛先指定無し(DH=0,DL=0)。

<問題点>
 ・子機 → 親機では高速に伝わる。問題ナシ。
 ・親機 → 子機では最初の数文字だけが早く届き、残りが10秒ほど遅れて届くことがある。
  実験では「80バイト以内のデータを1700mS以上空けて送信する」なら、何度繰り返しても遅れないし落とさない。
  なお送信時はまじめにCTSでフロー制御をしないとダメだよ。


ループバックテスト

 親機を使って簡単にループバックテストが行える。
 親機にATCI12を入力。
 ATCIはクラスタIDと呼ばれるZigBee通信の設定で、12はループバックテストを行うためのクラスタだ。
 この状態で「あて先送信(ATDH と ATDLを使用)」を開始すると、簡単にループバックテストを行うことが出来る。
 ここ(中頃より下のページ)、ここ



パラメータ

 
パラメータを変更する時は"Always update firmware"のチェックを外す。

 Sleep Modes
    [4]SM - Sleep Mode=4 - CYCLIC SLEEP(デフォルト) → [0]-NO SLEEP ROUTER(子機をスリープさせない)に変更。

 AT Command Options
  [64]CT - AT Commando Mode Timeout=64(デフォルト)=ATコマンド入力時のタイムアウト値。デフォルトは0x64=100だから1000mSecだ。






ATコマンド
 C=Coodinator(親機)
 R=Router(フル機能子機)
 E=EndDevice(省電力子機)

 文字列  C/R/E  
 +++    
 AT  C/R/E  接続確認用。
 ATCN  C/R/E  ATコマンド終了。
 ATNJ  C/R  新しい機器の参加を受け入れる時間を設定します(FFで常時受け入れる)。
 設定した秒数を超えると新しい機器の参加が受け入れられなくなります。
 ATND  C/R/E  送信可能な相手のアドレス等の情報が表示される(この後でATDH/Lでそのアドレスにデータを送信すれば良い)。
 ATDH
 ATDL
 C/R/E  送信先アドレスの設定(例:ATDH 00000000、ATDL 00001763)。
 親機を指定するときは DH=DL=0 とすれば良い。
 ATWR  C/R/E  設定した内容をフラッシュに書き込む。
 ATNR  C  ネットワーク設定をリセットします。
 各機器がCoordinatorと同じPAN IDでは無かった場合に、実行することで同じPAN IDに設定されるまで繰り返します。
 ATNR1  C  傘下の全ての機器のネットワーク設定をリセットすることが出来ます。
 ATSH
 ATSL
 C/R/E  シリアル番号の取得。 
 ATCI12  C  ループバックテスト。
 ATID  C/R/E  PAN IDの取得。
     
     
     


メモ
 
PAN ID
 同じPAN IDモジュールとだけ接続可能になる。
 0はCoordinatorが空きIDをスキャンして自動設定する。
 Set the PAN (Personal Area Network) ID the device should join (ZigBee extended PAN ID).
 Alternatively, set ID=0 (default) for the device to join any PAN ID.

ブロードキャスト
 「Destination Addressを DH=0x0000-0000、DL=0000-FFFFにすると、CoodinatorからはPAN ID内のすべてのデバイスを対象にメッセージが送信されます(ブロードキャスト)。
 詳細はこっちに書いておいた。

<出た症状>
XBee-Proの子機特有の症状(XBee子機とXBee-Pro親機は問題ナシ)
 1:無線通信してないと直ぐに寝てしまう。
  恐らくXBee-Proは電波出力が大きいんで、子機では省電力モードに入るんだと思う ← XBee-Proのパラメータを調べる必要有り → スリープさせない設定有り。
   → KeepAliveをする。
    例えば、親機 → 子機と定期的に1文字をブロードキャストし、子機は受信文字をループバックするなど。

 2:Rooter(子機) スリープモード時はATコマンド入力開始時、CTSがDisableで入力を受け付けない状態になる。
   → ”+++++++...”を連続で3秒ほど入力してやるとCTSが連続でEnableになるので、少し待ってから再度"+++"を入力してやれば目覚める(ATが返る)。
   → 先に
モジュールをリセットしてからATコマンドの入力を行う

  シリアルモニタの結果
 



ここはシリーズ1の話(未検証)

  1. まずここを見て、1台をCoodinator AT/透過モード、一台をEnd Device AT/透過モードにする(ファームを入れる)。
  2. ここを見て2台のXBeeモジュールにお互いのアドレスを設定する。
  3. 2台のPCにUSBドングルをセット(XBeeモジュールも当然挿しておく)。
  4. それぞれのPCでターミナルソフトを起動(USBドングルの割り振られたCOMポートを選択)。
  5. お互いのキー入力が見えれば成功じゃ。


 次は「1:N」を試す。
 PC、USBドングル、XBeeモジュールをそれぞれ3台ずつ使う。

  1. まずここを見て、1台をCoodinator AT/透過モード、二台をEnd Device AT/透過モードにする(ファームを入れる)。
  2. ここを見て3台のXBeeモジュールにアドレスを設定する。
    アドレスが分かりやすいように50,51,52とても振るかな。
    で、各モジュールのアドレス(MYとDL)を次のようにセットする。
    モジュール0 : MY=50、DL=51・・・50 → 51へと送信
    モジュール1 : MY=51、DL=52・・・51 → 52へと送信
    モジュール2 : MY=52、DL=50・・・52 → 50へと送信
  3. 3台のPCにUSBドングルをセット(XBeeモジュールも当然挿しておく)。
  4. それぞれのPCでターミナルソフトを起動(USBドングルの割り振られたCOMポートを選択)。
  5. 3台のキー入力が見えれば成功だけど、混信しないかどうかも確認する。

 ここまで確認出来たら、次は親機用の簡単なソフトを作って実験する。
 各モジュールのアドレスを次のように設定する。

  親モジュール  : MY=50、DL=51・・・取り敢えずDLを51にしておこう
  子モジュール1 : MY=51、DL=50・・・相手先DLを親アドレスにする
  子モジュール2 : MY=52、DL=50・・・      〃

 ソフトからのDL(相手先アドレス)の設定方法。
 XBeeモジュールにパラメータをセットする方法を調べる。
 ま、X-CTUがやってることと同じ事をすれば良いんで、COMポートを監視するソフトで通信データを見て真似する手も有るな。
 恐らくATモードで設定するはずだ。



覚え書きTOP