XBee是Digi公司生產,支援802.15.4或者ZigBee通訊協定的微控制器模組。
筆者借用的是XBee S1,它和S2的主要差異:
- S1支援Digi公司自訂的802.15.4,點對點網路通訊協定。
- S2支援ZigBee Mesh Network(網狀網路)協定。
註:多數的S1都可以寫入DigiMesh韌體來支援網狀網路,詳請參閱Digi公司的線上文件;S1和S2的詳細比較,請參閱Digi公司的這份線上文件。
XBee的通訊頻道、PAN和位址
就像每個電視台都有一個頻道編號,收視戶必須轉到對應的頻道才能收看節目,同一網路中的每個XBee裝置,都必須調到相同的頻道,才能接收到彼此的訊息。實際上,每個XBee都要設置三個網路相關參數:
- 頻道:設定XBee模組之間的無線通訊操作頻道。頻道的數值範圍(註:0x代表該數字為16進位格式):
- 0x0B~0x1A(XBee,如:S1和S2)
- 0x0C~0x17(XBee Pro)
- PAN識別碼:代表Personal Area Network(個人區域網路),相當於在同一個通訊頻道中分組交談。PAN值範圍:0~0xFFFF。
- 位址:有64位元(MAC位址)和16位元(自訂位址)兩種格式。MAC位址相當於XBee的出廠序號,標示在裝置後面,每個都不一樣:
XBee的MAC位址分成高(High)、低(Low)兩部份,凡是Digi公司生產的XBee裝置,其高位址一定是0013A200;低位址則是Digi公司設定的唯一值,如上圖的40CA509A。
頻道、PAN識別碼和位址的關係如下圖:
註:「頻道」也代表無線電的運作頻率,802.15.4協定的中心頻率計算式為:
2.405GHz + (頻道值 – 11) x 5 MHz
使用序列轉換板連接XBee
XBee模組本身具有TTL形式的序列輸出入腳,可以直接和Arduino或USB轉序列埠板相連。不過,XBee模組的接腳間距是2.0mm,而Arduino板和麵包板的腳位間距是2.54mm,所以實驗XBee時,通常會將它接上一個轉接板。
像下圖這個轉接板上面包含與XBee相容的排插,以及一個USB轉序列埠的IC(FT232RL),可連接個人電腦:
這個轉換板通常只用在透過電腦設置XBee參數,跟Arduino板相連時,不一定要用轉換板。
使用X-CTU軟體設置XBee裝置的參數
XBee裝置可透過「序列埠通訊軟體」連線,並以AT命令設置參數。或者,採用Digi公司提供的X-CTU軟體設置。新版的X-CTU軟體支援Windows, Mac OS X及Linux系統,請在Digi公司的X-CTU網頁下載並安裝。X-CTU軟體的操作示範:
先把XBee插入USB序列埠轉換板,再接到電腦的USB埠,然後開啟X-CTU軟體。
按下「新增XBee」或「搜尋XBee」鈕,加入XBee裝置。這是按下「搜尋XBee」鈕的畫面,筆者在電腦上連接兩個XBee裝置,因此點選兩個序列埠:
接下來的設定畫面用於選擇XBee模組的序列通訊參數,通常使用預設值即可:
按下Finish(完成)鈕,X-CTU工具將依據上圖的序列通訊參數,嘗試連結XBee模組。下圖顯示找到兩個XBee模組(註:XBee模組預設是「終端」裝置):
點選要加入的模組,並按下「加入選取的裝置」按鈕,即可開始在X-CTU中讀取與設置XBee模組的參數:
底下列舉即將使用的幾項「網路與安全(Networking & Security)」參數:
- CH(通訊頻道):連線設備的頻道必須一致,預設為C。
- ID(PAN識別碼):連線設備的PAN識別碼必須一致,預設為3332。
- DH(目標高位址):連線對象的高位址,預設為0。
- DL(目標低位址):連線對象的低位址,預設為0。
- MY(16位元位址):用戶自訂的位址,可能值為0~0xFFFF。
- SH(裝置序號-高):裝置的出廠高位序號,不可修改。
- SH(裝置序號-低):裝置的出廠低位序號,不可修改。
未完待續…
老師你好
想請問可以在linkit one 上使用 Xbee嗎?
我將Xbee S2插在Xbee shield v2.0上,再插到lilnkit one上,用digi 的X-CTU無法連線
hi sun:
XBee採用序列通訊介面,一定可以和linkit one相連,但遺憾的是,我沒用過linkit one,拍謝~
thanks,
jeffrey
我的可以喔~baud 不要設定錯誤
還有linkit one 的 板子上的 TX RX 是 Serial1 而不是Serial
感謝告知!
thanks,
jeffrey
老師你好
我裝了兩隻xbee API mode分別各自連在arduino mega2560 上 ,但是 有時候 他們之間的溝通會失敗 ,也就是沒有封包傳過去 。想請問可能造成這樣的code原因。 我在void loop() 裡面 兩邊都是 分割好(uint8_t的大小)以後 就 xbee.send(zbTx); 然後在下一行 xbee.readPacket();
謝謝
本文的XBee模組是朋友借我測試的,已經歸還,很抱歉我不清楚這方面的問題。
thanks,
jeffrey
老師你好 這可以設路由器嗎?
不好意思~XBee模組是我跟朋友借來測試的,已經歸還,煩請閱讀模組的規格書。
thanks,
jeffrey