Xbee Pro S2B 解析自己総集編

01 Xbeeの種類
02 デバイスの種類と役割
03 ATコマンドモードとAPIパケットモード
04 ピンアサインと設定ポートの役割
05 X-CTUで初期設定
06 ファームウエアのバージョンアップ
07 ファームウエアの書き換えに失敗した場合の対処
08 ATコマンドモード(透過) (実際に検証はしていないので思惑で)
09 APIモード 1と2
10 パケットの受信
11 APIモード2のエスケープ処理
12 APIフレームから情報を取得する(通信モード、64ビットアドレス 16ビットアドレス オプション値 サンプル値 デジタルマスク アナログマスク 各種データ SUM )
13 リモートコマンド (APIフレームの組み立て、リモートコマンド表)
14  

 

 

 

メニューへ  工作室へ

Xbeeの種類

アンテナ形式から分類すると以下の4種類
 

基板アンテナ式            外部アンテナ式             U FLアンテナ式           ワイヤアンテナ式


他にシリーズ1、とかシリーズ2Proシリーズ1Proシリーズ2Programmable とか種類が多いので注意が必要で
機種によって電波強度や機能が大きく変わるようだ、またプリグラマブルシリーズではXBee本体内にCPUが内臓
されておりちょっとしたプログラムを書いて自身で制御可能なようだ、プログラミング言語はパイソンらしいが詳細は
不明、最近 XBee Wi-Fi が登場した、これは通常パソコンで使われている無線ルーター経由とか、アドホックで通信するらしい

コンピューターに接続する場合、XBee は3.3V仕様なのでUARTのレベル変換が必要、自作は面倒なので”XBeeエクスプローラUSBドングル”と言う
便利なものが有る、FTDIのドライバーが必要DLは→ここ
 

 

メニューへ  工作室へ

デバイスの種類と役割

XBeeはファームウエアの設定によって以下のように

・”Coordinator(コーディネーター [親機]:必ずネット内に1個は必要)
    ネットワーク内を一括コーディネートする

・”Router(ルーター [中継機]:無くても良いが、有れば通信を中継してくれるので到達距離を伸ばせる、子機よりも早くネットに加わる事)
    通信ルートを決めたり、電波を中継する、エンドデバイスの機能も有るが、ルーターを1個通過するごとにホップ数は1個減る

・”End device(エンドデバイス:各種センサー値を収集し送信する、スリープモードを使用して省電力化できる)
    各ポートを、アナログ値をデジタル変換する”ADC”に設定したり、デジタル値(主には H L、数個のポートを使ってパラレル値の収集も可)
    収集したデーターは、APIモードではコーディネーターに垂れ流し送信する、クエリも可能

   各1対1でも、1対複数でもOK、網の目状に個々に通信可能。

 

メニューへ  工作室へ

ATコマンドモードとAPIパケットモード

         1・ATコマンドモード

               モデムと同様なATコマンドで互いに通信する

                1対1で相手のアドレスを指定して要求(リクエスト)送信後、帰ってくる応答(レスポンス)で確認する、シリアル通信のケーブルを
                無線化したようなもので”透過”モードとも呼ばれている。

※ 実証実験を行っていないので詳細はこれから実証する
 

         2・APIパケットモード

               ルーターやエンドデバイスで収集したデーターは”APIフレーム”というプロトコルでパケット化されて垂れ流し式で送信される
               特定のデバイスにリモートコマンドを送出してポートの値を変更することが可能だが、この変更は一時的なものでデバイスを
               再起動したりリセットすると元の設定値に戻る。

APIモードの詳細へ
 

 

メニューへ  工作室へ

ピンアサインと設定ポートの役割

          ピン番号と各ビット毎の設定(下表) → マニュアル13ページ画像

                                                              ピン番号                                          設定可能種類                                                リモート名

01  VCC (2.7 〜 3.6V)  
02  UARTデーター出力  
03  UARTデーター入力  
04  CD/DIO12                 ( 0=Default [ moniter無Digital入力 ] 3 4 5=デジタルI/O ) P2
05  リセット                      ( スイッチでLowレベルにする事でリセットされる )  
06  PWM0/RSSIM/DIO10 ( 1=Default [ 電波強度 ] 3 4 5=デジタルI/O ) P0
07  DIO11              ( 0=Default [ 未使用 ]  3 4 5=デジタルI/O ) P1
08  NC 未使用  
09  DTR/SLEEPリクエスト/DIO8   ( 0=Default [ 未使用 ]  3 4 5=デジタルI/O )  
10  VDD(GND)  
11  DIO4             ( 0=Default [ 未使用 ]  3 4 5=デジタルI/O ) D4
12  CTS/DIO7     ( 1=Default [ CTS Flow Control ] 2 3 4=Digital I/O ) D7
13  ON/SLEPP    ( Default High=ON [ 電源ランフ゜]  Low=SLEEP )  
14  VREF(ADC基準電圧入力)  
15  ASSOC/DIO5 (1=Default [ 接続ランプ ]  3 4 5=デジタルI/O ) D5
16  RTS/DIO6      ( 0=Default [ 未使用 ] 1=RTS flow cont  3 4 5=デジタルI/O ) D6
17  ADC3/DIO3    ( 0=Default [ 未使用 ]   2=ADC 3 4 5=デジタルI/O ) D3
17  ADC2/DIO2    ( 0=Default [ 未使用 ]   2=ADC 3 4 5=デジタルI/O ) D2
19  ADC1/DIO1    ( 0=Default [ 未使用 ]   2=ADC 3 4 5=デジタルI/O ) D1
20  ADC0/DIO0    ( 1=Default [ 接続ボタン ]   2=ADC 3 4 5=デジタルI/O ) D0
 

 

 

メニューへ  工作室へ

X-CTUで初期設定(API エンドデバイス設定例)

         ファームウエアの書き換えや、各種初期設定は”X-CTU”で行う → 最新のX-CTUやドライバ、ファームウエアはここから
 

X-CTUを起動する

XBeeをUSBで接続していればシリアルポートが自動的に選択される、通信速度などはデフォのままでOK

[ Test / Query ]ボタンをクリックすると下図のように
XBeeタイプ、ファームバージョン、上位シリアル番号が表示される



もしも情報が表示されない場合は”リトライ”してみる、XBeeによっては素直でないものもあるようなので一度通信速度をでたらめに設定してわざとエラーを起こさせてから、元の9600に変更してやる上手くいく場合もある、

メッセージBOXが現れるてリセットしろみたいな表示の場合は、
ファームウエア書き換え失敗の対処法を参考に。

 

 
Modem Configuration タブをクリックして

[ Read ]ボタンをクリックすると、デバイスに書き込まれているファームウエアの内容が次の画像のように、読み込まれます。


 
PAN IDの設定

右の画像では、XBeeの種類は ”XBP24Z7”でファンクションセットは”エンドデバイス”に設定されていて、ファームウエアバージョンは”29A0”に設定されている、

PAN IDは”LAN”で言えばネットワーク番号と同じで、PAN IDが異なると通信できません、IDは何でも良いのですがネットワークに参加させるデバイスのPAN IDは一緒でないといけない、

右ではPAN IDは隠しています、セットする値は下部の解説欄に書いてありますが”0x00”〜”0xFFFF FFFF FFFF FFFF”

この解説欄は各項目ごとに細かく説明してあります、英語ですが翻訳ソフトにコピペして翻訳すれば大体のことは理解できると思うし非常に役に立ちます。

設定項目としては

1・Networking
2・Addressing
3・RF Interfacing
4・Security
5・Serial Interfacing
6・Sleep Modes
7・I/O Setings
           I/O Sampling
8・Dignostic Commands

と大きく分けて8項目ですがI/Oセッティングの中にサンプリングに関するサブ項目があります。

又、デバイスの種類によって設定可能な箇所が変わります、

※ 以下重要!

一番最初に設定する場合は”XBeeの種類”と”Function Set”を決めたら一度”Show Defaults”ボタンでデフォルト値を表示させてから
Always Update Fimware”にチェックを入れてから”Write”ボタンで書き込みます、
エラーなく書き込めたら”必ず”読み込みボタンで読み込んでみます、正常に書き込めていたらデバイス固有の64ビットアドレスが、上位”SH”下位”SL”に表示されます、このアドレスが表示されなければ正常に書き込めていません。


 
メニューへ  工作室へ

SC-Scan Channels

チャンネルスキャンの設定は”0x7FFF”がデフォルトでオールチャンネルのようなので変更の必要はないようです、

以下、Networking の設定はすべてデフォルトOKです

 


 
メニューへ  工作室へ

Addressing

この項目は”SH SL”はすでに書き込まれているデバイスの64ビットアドレス、
16ビットアドレスはこのデバイス専用のネットワークアドレスの事で、5 6行目の”DH DL”が、”0”に設定してあると、コーディネーターに任せる設定ですから、”MY MP”は設定できない、ネットワークに参加すればコーディネーターがその都度割り当てます
(一旦ネットから外れるとまた違うアドレスにかわります)

その他の項目も細かく設定可能ですが、必要が無い場合デフォルト設定をお勧めします(変に変えると解らなくなります)


 
メニューへ  工作室へ

RF Interfacing

この項目は、RFモジュールの設定

PL-Power Level 1の最小から4の最大出力まで選べる

PM -Power Mode 0=ブーストなし 1=ブーストモード

PP-Power at PL4 読取り専用(よく解らないし触れない)


 
メニューへ  工作室へ

Serial Interfacing

その名の通りシリアルポートに関する設定

BD = 通信速度
NB =  パリティ
SB = ストップビット

D7とD6 はCTS RTSの設定からデジタルI/Oに変更が可能必要なければ触らない、

★ AP-API  Enable で 1=APIモード1、2=APIモード2が選べる

AO-API Output Mode で 0=native(そのまま)  1=Explicit(詳しく) 3= ZDO (ZigBee Device Objects) 切り替えられる。


 
7・I/O Setings

各種ポートの入出力の設定をする

アナログ値(ADC)を扱えるのは”D0〜D3”の4ポートそのうち”D0”はデフォルトでは”接続用のスイッチ”を付ける設定になっている

設定値は(D0 - D3

0 = デフォルト(未使用)
1 = D0のみのデフォルト(commissoning Button)
2 = ADC
3 = デジタル入力
4 = デジタル出力 Low
5 = デジタル出力 High

D4

0 = 使用しない
1 = NA
2 = NA
3 = デジタル入力
4 = デジタル出力 Low
5 = デジタル出力 High

D5

0 = 使用しない
1 = 接続ランプ
2 = NA
3 = デジタル入力
4 = デジタル出力 Low
5 = デジタル出力 High

P0

0 = 使用しない
1 = 電波強度
2 = NA
3 = デジタル入力
4 = デジタル出力 Low
5 = デジタル出力 High


 
メニューへ  工作室へ

P2

0 = 使用しない
1 = NA
2 = NA
3 = デジタル入力
4 = デジタル出力 Low
5 = デジタル出力 High

PR(プルアップ設定)

ポートをプルアップするしないかの設定、2進のマスクで”1”を立てると”プルアップ”、”0x1FFF”の場合”1 1111 1111 1111”で全ポートプルアップ(デジタルチャンネルマスクと同じ)

LT = 接続ランプの点滅間隔(デフォルト=0 250ms)

RP = 電波強度アナログ出力のタイマ制御

DD = デバイスオプション 0x01

 

 


 
メニューへ  工作室へ

I/O Sampling

IR = サンプリング時間、16進でミリ秒単位で設定、右画像では
      0x3E8 = 1000ms(1秒間隔)

IC = DigitalI/O Change Detection(デジタルI/O変化検出)
       値が変化したらDH DLのアドレスに報告する、設定は
       16進による2進ビットマスク形式

V+ = Suply Voltage High Threshold
       (ADCサンプリング値に上乗せする電圧、0から2.304V)
                                                             0x00 〜 0x900

 


 
メニューへ  工作室へ

8・Dignostic Commands

デバイスの各種情報みたい



 
メニューへ  工作室へ

★ ファームウエア書き換えに失敗して書き換え
   不能になった場合

1・XBeeを刺さないでエクスプローラだけUSB接続する

2・Modem Configralion ページを開き、該当するファームウエアを
   選択する
3・Always Update Firmware にチェックを入れて Write

4・エラーのウインドが表示されたら XBee を刺す(あら不思議、
    書き込みが始まる)
5・念のため、Always Update Firmware にチェックを外し、
    Show Dfalts をクリックして書き込んでみる
6・Read をクリックし自身のシリアル番号が書き込まれているのを
   確認する(シリアルが書き込まれていれば成功)

 

この後必ず、上の「5」「6」を実行する →
 

 

メニューへ  工作室へ

ファームウエアのバージョンアップ

手順は
1・ファアームウエアのバージョンアップは”digi.com”のサポートから
    該当するデバイスのアーカイブをダウンロードします

2・ダウンロードファイルを、アーカイブのまま、X-CTUをインストール
    している場所の”update”ホルダにコピーします、
             (例・C:\Program Files\Digi\XCTU\update)

3・X-CTUを起動して”Modem Configuration”のひときわ大きい
   ボタンの”Download New Versions”をクリックする

4・右画像の小さい表示ウインド内の”Update sours”から「File」
    ボタンを クリックし保存した上記ホルダ内の zipファイルを
    指定します

5・Update Summary ウインドが起動してデバイスタイプとバージョン
   が表示されるので、現在のものより新しければ「OK」ボタンを
   クリックして終了です

 


メニューへ  工作室へ

ATコマンドモード(透過モード)
      (実検証していないのでちょっとした実験と思惑で書いています)

ATコマンドデバイスに設定するにはX-CTUでファームウエアを”ZIGBEE ** AT”を選択して書き換える、

メッシュ通信ネットワーク内では、XBeeのADCDigitalI/Oを使用する場合は本質的にAPIモードと同じなようだ、データーはAPIフレームで送られる
      (コーディネーターやルーターはAPIモードだから)


XBeeのシリアル入出力を利用して他のデーターをそのまま(透過)送信することができる、単に無線のシリアルポートのように通信
この場合はXBeeのADCやDI/Oは使用できなかったと思う

XBeeのI/O設定等を変更する時に”ATコマンド”を発行して変更する(リモートコマンドも使用できるようだ)但し1対1のATモード通信では当然のことながら”ATコマンド”を発行して制御するしかない。
設定値の確認等はリクエストを送信後レスポンスで確認する。

右図のような、リモコン的な使用法でATコマンドモードを使うのが一般的な気がする
 


★ ATコマンドモードは1対1の通信に利用するのが基本のようだ ★

   

メニューへ  工作室へ

APIモード 1 と 2

APIモードにするにはX-CTUの”Modem Configuration”の”Fanction Set”から”ZIGBEE ** API”を選択すればよい、デフォルトでは”モード1”なので”モード2”にするには上記を参照

APIモードとは(Application Programming Interface)の略です、色々な情報をデバイスが決められたプロトコルに従ってフレームを組み立ててパケットにして通信します、そのプロトコルは右図のように
パケットの内容が決められている、

APIモード1とAPIモード2共にパケット内容は同じです右図のように

1バイト目=フレームの始まりを示す 0x7E
2,3バイト=データーフレーム部の長さ
4バイト目から最後の1バイト前までがデータ部になる
最後の1バイトが、チェックサム

★ チェックサムの計算法

sum = FF - フレームデータ長

(計算結果の下位1バイトが チェックサム)

APIモード1ではアナログ入力値やアドレス情報などの値はそのままの値としてパケットされて送信されます。

もしかしてフレームの途中に”フレームスタート ”を示す”0x7E”が現れるかも知れない、そんなことになると受信データはむちゃくちゃになってしまします、そこで

APIモード2
では以下のように特定のキャラクターがフレーム中に現れたら処理されます、

     •0x7E – Frame Delimiter
     •0x7D – Escape
     •0x11 – XON
     •0x13 – XOFF

上のデータが現れると”0x20”と”Xor”された値に置き換えられる
置き換え方は↓

例1 0x7E → 0x7D5E
例2 0x7D → 0x7D5D
例3 0x11 → 0x7D31
例2 0x13 → 0x7D33

各2バイトに置き換えられる、見かけ上全体の長さは変わるが
レングス値は変わらない、又チェックサムの値も変わりません

元の値に直すには 0x7D の次の値と 0x02 でXor してフレームから
0x7D を取り除き変換処理された値を Xor した値に置き換える。

このように、APIモード2では受信データをチェックしてエスケープコードの監視をするようにプログラムを書かないといけない
                  私の処理法(HSP) ← がここにある。

 

 


APIモード1

 

 



APIモード2

 

実際の処理結果

   
   

メニューへ  工作室へ

パケットの受信

XBeeの送信データには始まり(0x7E)は存在しても終わりを示す ものは無いようだ、最後のチェックサムのデータを受信後にすぐ 0x7E が現れる、受信の区切りは 0x7E に頼るしかないようだ、

0x7E”は始まりであり、終わりでもあると言う事で受信スクリプトを
書く必要があるようだ(受信バッファが空になったらも併用する)

最初はキャラクタで受信していたが、最終的にバイナリで受信する事にした、どちらでも良いが、バイナリ受信でバイトごとに配列変数に格納した方が、あとのプログラムが解りやすいように思う。

右欄のスクリプトでは2次元配列 APIF(0,0)が先頭ビットで順次に
APIフレームの順にチェックサムまできれいに収まるので添字をそのままAPIフレーム番号に利用できる。

 

 



========== 以下受信例スクリプト(HSP3.0) ===============================

*rs232c ;COMポートから受信

    repeat 255,1 ; とりあえず最大バッファ数で繰り返す
         comgetc APIF(cnt,0) ;数値で受信 配列変数の1番から順に受信値を格納する

         ;受信バッファが空か 0x7e が現れたらAPIF(cnt,0)合計フレーム長を保存して
         ; ループから抜ける                         合計フレーム長↓
         if stat = 0 or APIF(cnt,0)=126 : APIF(0,0)=126 : TFLeng=cnt: break

    loop
return

===================================================================
 

メニューへ  工作室へ

APIフレームから情報を取得する

右の画像がAPIフレームを実際に取り出したもの

2バイト目と3バイト目がレングス、0x0018(10進で24) 24バイトで通信モードからチェックサムの前までのバイト数である

4バイト目の通信モードは右図では 0x92 マニュアルの100ページに詳しく掲載されているが、0x92は”ZigBee IO Data Sample Rx Indicator”となっているので「デバイスからのI/Oデーター値を受信中」という勝手な解釈してます、訳は違っているかも、

5〜12バイト目までが64ビットアドレスでXBeeの本体に刻印されている上位と下位のアドレス

13、14バイトは16ビットアドレスで、ネットワークに参加すると自動でデバイス毎に振られるネットワークアドレス、これは一度ネットワークから抜けるとまた異なるアドレスを割り付けられる、

15バイト目はオプション値 とかで意味不明だったが色々と触っている内に判明した、以下の通りみたい(違うかも?実験結果判明)

 0x01 = ルーターから受信
 0x40 = ENDデバイスがブロードキャストしている
 0x41 = ENDデバイスがネットアドレスを、コーディネータに任せる
           (0000 0000)に設定している
 0x42 = ENDデバイスが (0000 FFFF) に設定している

16バイト目 サンプル番号、いつも 0x01 らしい、マニュアルにもそう書いてある

17、18バイト目 デジタルマスク値、デジタル設定をしているポートを2進数でマスク表現している、”1”が立っているビットが使用中
右図の場合16真値は 0x0001 2進値は  0 0000 0000 0001 なので 20番」ピンAD0 のみ デジタルI/O設定になっている。

19バイト目 アナログマスク値、アナログ入力”ADC”に設定しているポートを知らせるマスク、右図の場合16進で 0x0e 2進で 1110 なので、AD1、AD2、AD3 の3ポートがADCに設定されている、という事になる

20バイト目以降チェックサムビットの前までは各、デジタルポート値とADCのアナログ値がポート番号の若い順に現れるので、ポートの設定によって大きく変わる、

             最終的に、ここの情報がメインになる

コーディネーター(親機)以外は、上記の情報を絶えず送信している

 


取り出したフレーム


マスクの状態
アナログマスク値(例)
0x0E1 1 1 0 (AD1 AD2 AD3 を使用)

0x0F1 1 1 1 (AD0 AD1 AD2 AD3 の
                          4ポート全部使用)
デジタルマスク値(例)
0x00010 0 0 0 0 0 0 0 0 0 0 0 1
                (DIO1だけデジタル設定)
0x00110 0 0 0 0 0 0 0 1 0 0 0 1
              (DIO1とDIO4をデジタル設定)

16進 ADC値を実際に入力されたアナログ値に変換するには

入電圧mV = (10進変換した16進値×1200)/1023
                                  ADC基準電圧↑← デバイス毎に多誤差が有るみたい

デジタル値は”H”か”L”の情報だけ
(全てのDIOをデジタル入力に使えば8ビットのデジタルデータぐらいは何とか送れそう)

 
メニューへ  工作室へ

リモートコマンド

APIモードで各デバイスの設定を変更したり値を変えることが可能
設定項目はマニュアルの129ページ以降に詳しく掲載されている

送出するには、リモートコマンドのフレームを組み立ててから送信することになるし、送信相手の64ビットアドレスか16ビットアドレスが必要になるので、予め受信データーから送信相手のアドレスを取得しておく。

フレーム組み立ての実際
 
位置

セット内容と値

0   7E (デミリタ)
1   レングス上位(最後に計算する)決め打ちでもOK
2   レングス下位(最後に計算する)決め打ちでもOK
3   通信モード(リモートコマンドリクエストの場合 0x17
4   フレムID(常に 0x01
5   64ビットアドレス上位( 受信データから抜く )決め打ちでもOK
6   64ビットアドレス上位( 受信データから抜く )決め打ちでもOK
7   64ビットアドレス上位( 受信データから抜く )決め打ちでもOK
8   64ビットアドレス上位( 受信データから抜く )決め打ちでもOK
9   64ビットアドレス下位( 受信データから抜く )決め打ちでもOK
10   64ビットアドレス下位( 受信データから抜く )決め打ちでもOK
11   64ビットアドレス下位( 受信データから抜く )決め打ちでもOK
12   64ビットアドレス下位( 受信データから抜く )決め打ちでもOK
13   64ビットアドレス下位( 受信データから抜く )決め打ちでもOK
14   16ビットアドレス上位( 受信データから抜く )ここは毎回変わる
15   16ビットアドレス下位( 受信データから抜く )ここは毎回変わる
16   変更コマンド( 0x02 )
17   変更するポート名( 該当する文字の ASCIIコード )
18   変更するポート番号( 該当する番号の ASCIIコード)
19   セットする値1バイト(セット可能な値はマニュアル
                                                      129Page以降に
20   チェックサム(0xFF - 上の水色部分合計 )の
                                          計算結果の下位1バイト

※ エスケープ処理は考慮しなくて良い

チェックサムや他の値が違うとパケットは送信しても破棄される


 

 

マニュアル100ページにあるAPI通信モード表
        

※ 監視プログラムから自動送信する場合、フレームの骨組を作成しておきコマンドと
    値だけ変えればうまくいく。

   
   
   
   
   

工作室へ