安裝與設定Raspberry Pi的RealVNC伺服器

VNC伺服器可讓使用者從遠端以圖像介面操控Raspberry Pi,我在樹莓派一代安裝的是免費的TightVNC,它雖然可以被設定支援在遠端和本機電腦端進行文字剪貼,但是它僅支援Latin-1編碼,中文字在剪貼之後會變成??問號亂碼。

所以我改用RealVNC,它有分成免費、個人和商業版,最主要的差異在於免費版不支援加密(encryption)、也不具備檔案傳輸功能,但是剪貼中文沒問題。詳細的功能比較,請參閱realvnc.com的VNC產品頁面

取得RealVNC的授權碼

啟動RealVNC伺服器需要輸入授權碼,安裝之前,請先連到Activate VNC頁面,點選“Free license only,…(僅免費授權)”選項、輸入你的大名、e-mail、確認e-mail、選擇國家,最後按下“Continue(繼續)”,即可收到授權碼。

安裝RealVNC

以下操作步驟節錄自RealVNC的Raspberry Pi產品頁面

1. 在樹莓派的終端機執行底下兩行敘述,下載最新版的RealVNC軟體並解壓縮

解壓縮之後可取得Server(伺服器)和Viewer(用戶端)兩個套件。目前的版本是5.2.3。

2. 只需要安裝VNC伺服器

3. 加入授權碼

初次啟動RealVNC伺服器軟體時,它的操作視窗可能會要求我們輸入連線密碼,請在Users & Permissions(使用者和權限)畫面輸入密碼和確認密碼(按下右上角的Add鈕新增密碼):

Users & Permissions(使用者和權限)畫面

啟動VNC伺服器:Service Mode

VNC伺服器有兩種啟動模式,我們可選用任一種:

  • Service Mode(服務模式):VNC連線用戶的操作以及所見畫面,都和主機同步,相當於直接操作Pi。
  • Virtual Mode(虛擬模式):VNC伺服器將為連線用戶建立「虛擬桌面」,因此VNC用戶的操作不影響同樣在操作Pi的用戶。

使用免費版初次啟動「服務模式」時,需要設定連線密碼。請執行底下的指令,然後跟著指示輸入兩次密碼:

接著輸入底下的指令啟動VNC伺服器:

如果需要在開機時啟動VNC伺服器,請輸入:

日後若想要取消開機啟動VNC伺服器,請輸入:

使用VNC Viewer(用戶端)連線Pi

預設的RealVNC伺服器埠號是5900,假設樹莓派的IP位址是192.168.1.11,從個人電腦或手機、平板的VNC Viewer軟體(如:Chrome線上應用商店的VNC Viewer)連線時,要輸入5900埠號,Picture quality(影像品質)選擇"Automatic"(自動)即可:

輸入連線IP位址和埠號

連線時,VNC會顯示底下的訊息,提示這是「未加密連線」(點選左下角的核取方塊,就不會再出現這個訊息了):

「未加密連線」提示

輸入密碼即可連線:

樹莓派本機的IP位址可透過ifconfig指令,或者按一下系統右上角的VNC選單圖示,即可從底下的畫面看到IP位址(註:在VNC選單按滑鼠右鍵,選擇Options指令,可設定VNC伺服器的參數)。

顯示伺服器的IP位址

設定樹莓派的初始螢幕解析度(方法一):透過例行性工作排程(crontab)

如果沒有接上螢幕開機,樹莓派預設的螢幕解析度將是640×480,VNC用戶端的連線畫面也是不堪使用的640×480。在終端機執行xrandr(原意為X Rotate and Reflect Extension,改變大小與旋轉擴充),將能顯示當前的螢幕解析度:

根據Raspberry Pi官方論壇的“X11VNC headless resolution”這一篇討論,透過底下的指令建立一個例行性工作排程(crontab)設定螢幕解析度:

然後在此排程最後加入這一行敘述:

按下Ctrl+O鍵寫入、Ctrl+X退出之後,重新啟動,就能獲得1366×768像素、16位元色彩深度的VNC畫面了。

註:fbset用於設定顯示卡的frame buffer(圖框緩衝區)參數-g代表geometry(尺寸),後面的數字分別代表“水平可見解析度(像素)”、“垂直可見解析度”、“虛擬水平解析度”、“虛擬垂直解析度”以及“色彩深度(亦即,每個像素的色彩位元數,16位元是數千色,24位元是全彩)”。

設定樹莓派的初始螢幕解析度(方法二):使用HDMI轉VGA接頭

有些電腦必須連接顯示器,顯示卡的GPU才會啟動,像Apple的Mac Mini就是一例。若需要在不連接螢幕的情況下,開啟GPU運算功能,可以購買一個像Headless Ghost的HDMI模擬器,將它插在電腦的HDMI座。

或者,依照macminicolo的方法(Build a Dummy Dongle for a headless Mac mini),準備一條HDMI轉VGA線,在VGA端子那一端的第16腳,插入一個電阻(原作者用的是85Ω,我用的是120Ω),也能騙過電腦。將此HDMI轉換線插在樹莓派上:

用HDMI轉VGA線改成HDMI模擬器

Pi的系統不需要任何設定,也不需要加上例行性工作排程,VNC連線的解析度就是1920×1080的Full HD解析度了。 當然,測試成功之後,我實際並沒有採用這種方式,用上一節的方法就行了。

啟動VNC伺服器:Virtual Mode

多數人都是使用Virtual Mode(虛擬模式)連接VNC。在終端機視窗輸入底下的指令,便能以「虛擬模式」啟動VNC伺服器:

我們可以在指令後面加上解析度的參數,以1366×768解析度為例:

免費版的RealVNC伺服器最多可接受5個用戶端同時連線(亦即,虛擬5個螢幕)。虛擬模式的VNC埠號從5901~5905。假設樹莓派的IP位址是192.168.1.11,請在VNC用戶端使用5901埠號連線:

若要關閉此虛擬模式的VNC伺服器,請輸入(1代表虛擬的螢幕編號):

開機啟動虛擬模式的VNC伺服器

開機啟動虛擬模式的VNC伺服器的設定步驟,和其他VNC伺服器軟體大同小異,除了在 /etc/init.d/ 路徑下建立控制腳本(script)之外,比較簡單的方法是在家目錄底下的“.config(設置)”隱藏目錄裡面,存入開機設置程序,底下的步驟修改自Adafriut的TightVNC開機啟動設定

切換到家目錄.config目錄

在此目錄底下新增一個autostart(自動啟動)資料夾:

使用nano文字編輯器,在autostart路徑底下新增一個“realvnc.desktop”檔:

在此文字檔中輸入底下的內容:

按下Ctrl+O寫入、Ctrl+X關閉檔案。

日後每次開機時,Pi都會啟動虛擬模式的VNC伺服器。

Raspberry PI 2 + 自製Arduino + Motorola Lapdock 小改造

最近購入Raspberry Pi 2,不知為何英國製造的版本比中國製造的便宜,還附贈一個透明外殼。原本沒有打算買第2代,作為一台「電腦」,第一代樹莓派有點力不從心,但是當作「硬體控制板」、網路控制器, 第一代足敷使用。可惜第2代的乙太網路速度沒有提昇,USB介面也仍舊是2.0。

如果只打算把樹莓派當作電玩遊戲機或者媒體播放器,那麼,Android電視棒或機上盒也許更合適;若要當成一般的電腦,做一些文書處理、瀏覽網頁、編寫程式…考量到顯示器、輸入設備及儲存媒介的費用,對未曾接觸Linux系統的使用者,它的CP值可能不如中國製造的Windows/Android雙系統平板、電視棒或迷你PC。

因為家裡有台Lapdock基座,終究還是經不住誘惑……我把原本焊接在Raspberry Pi一代的micro USB電源線和micro HDMI轉接頭焊下來。

Raspberry Pi Model B + LEGO

先Raspberry Pi 2的外殼鑽一個圓孔,以便連接micro USB電源+數據線。micro USB的電源(紅線)焊接在樹莓派板子背面電源輸入的一個焊點、接地線(黑)焊接在HDMI的金屬殼其中一個接腳、data +(綠)data -(白)焊接在其中一個USB插座背面的焊接點(註:自行在板子上焊接額外的接線,將失去保固):

在樹莓派2焊接電源和USB線

Raspberry Pi 的GPIO 5V和3.3V電源輸出功率有限,以Raspberry Pi一代(Model B)來說,板子上有三個保險絲:兩個USB插座各有一個140mA限流保險絲、micro USB電源輸入附近有一個750mA限流保險絲。在未插接USB裝置的情況下,Raspberry Pi一代本身約消耗700mA電流,二代約650mA。因此,在採用5V, 1A電源供電的情況下,最後僅剩下200mA~300mA可提供GPIO介面使用;GPIO上的3.3V腳位,最大輸出電流為50mA(參閱elinux.org的GPIO以及Power條目)。

為了驅動自製的Arduino控制板,我另外從micro USB電源輸入端焊接一條電源線,直接供電給Arduino:

焊接Arduino控制板用的電源

這一款外殼會包覆整個Raspberry Pi,為了方便日後的GPIO控制實驗以及插接自製的Arduino板,我在外殼上標注記號,準備裁切一個約莫和GPIO介面等寬的開口:

樹莓派外殼上蓋

採萬用PCB板(洞洞板)製作一塊Arduino控制板,由於空間有限,我將兩個電容和一個電阻塞在IC座的中間:

自製的Arduino控制板

焊接好的自製Arduino控制板,插入預先燒錄Arduino韌體的ATmega328P處理器,先用HC-05藍牙序列模組上傳程式碼測試:

用HC-05藍牙序列模組上傳程式碼測試自製的Arduino控制板

測試無誤,把自製的Arduino控制板插入Raspberry Pi 2的GPIO介面:

自製的Arduino控制板插入Raspberry Pi 2的GPIO

裁切好Raspberry Pi 2外殼上蓋並且鎖上螺絲的模樣:

裁切好Raspberry Pi 2外殼上蓋

用印表機列印Raspberry Pi的GPIO以及Arduino的腳位名稱,貼在Raspberry Pi 2的外殼以及自製Arduino控制板排插外側,再用透明膠帶包覆:

標示Arduino和Raspberry Pi GPIO腳位名稱

外殼背面貼上Raspberry Pi和Arduino的貼紙,就改造完成一個基本的Raspberry Pi 2 + Arduino微電腦了~

外殼背面貼上Raspberry Pi和Arduino的貼紙

Raspberry Pi 2微電腦和Motorola Atrix Lapdock合體的模樣:

Raspberry Pi 2微電腦結合Motorola Atrix Lapdock基座

延伸閱讀

XBee模組通訊實驗(五):API通訊模式與API訊息框資料分析

XBee裝置有兩種通訊模式:

  • AT:預設,序列埠收發的資料都直接轉發到RF天線。
  • API:把模組採集到的資料包裝成「訊息框(frame)」再發送。

之前的XBee文章都是用AT模式通訊,本文將採API模式。

XBee的API訊息框

XBee模組具備多個I/O腳位(參閱「XBee模組通訊實驗(一):認識ZigBee」)並內建一個微處理器,和感測器結合(如:溫濕度感測器),便能構成獨立的無線感測節點,傳回感測器的資料。

然而,XBee模組不支援條件判斷敘述,例如,它沒辦法執行「當溫度大於30度時,啟動風扇」這樣的敘述。因此,要構成「智慧型無線感測器」,還是得搭配其他微處理器(如:Arduino)運作。

本文將使用兩個XBee S1模組,一個設置成協調器、一個設置成終端;終端將每隔一秒鐘,傳送數位0腳(Xbee模組的第20腳)的輸入狀態給協調器。

設定讓XBee模組傳送腳位狀態時,它每次都會傳出它自身的位址和全部腳位狀態,並且包裝成如下的API訊息框格式

訊息框能夠傳送多種不同類型的資料,例如,代表模組腳位狀態的資料,或者控制遠端裝置的AT命令。為了分辨訊息框的資料類型,XBee模組規定了一系列不同的API識別碼。

筆者只測試過傳送模組腳位狀態的訊息框,其API識別碼為0x820x83

啟用XBee模組的API模式

將其中一個XBee模組設定成「協調器」,並且將“AP API Enable”參數,設定成“API enabled [1]”:

“AP API Enable”參數設定畫面

協調器參數設置:

參數 說明
CH (Channel) C 兩端的頻道一致
ID (PAN ID) 3332 兩端的網路ID要一致
DH 0
DL 12 設定成終端的MY位址。
MY (Source Address) 13 協調器的位址
CE (Coordinator Enable) 1 啟用協調器
AP (API Enable) 1 設置成API 1模式

設定完畢後,按下「鉛筆」圖示鈕寫入參數。

另一個XBee模組設置成「終端」,除了設置“AP API Enable”參數之外,還要將D0腳位設定成DI(Digital Input,數位輸入)IR(取樣速率)設定成1000(代表1000微秒):

終端參數設置:

參數 說明
CH (Channel) C 兩端的頻道一致
ID (PAN ID) 3332 兩端的網路ID要一致
DH 0
DL 13 協調器的位址
MY (Source Address) 12 終端的唯一位址值
CE (Coordinator Enable) 0
D0 DI 設置成Digital Input
IR (Sample Rate) 1000 每隔1000ms取樣一次
AP (API Enable) 1 設置成API 1模式

設定完畢後,按下「鉛筆」圖示鈕寫入參數。

API 1模式的訊息框格式

切換到「協調器」的「終端機」視窗,再按下「連線」鈕。您將注意到「終端機」視窗的畫面配置和之前的AT模式不同。協調器的「終端機」將每隔一秒收到終端傳入的API訊息:

協調器的終端機接收到終端的API訊息

上圖的每一行紅字,代表一則API訊息。點選其中一條訊息,將能在右邊的窗格顯示解析後的訊息內容。

底下是16位元位址的訊息框範例:

16位元位址的訊息框範例

訊息當中的各項元素重點說明:

  • 類別:代表API的模式,像此例的83(16進位值)代表此訊息框裡的XBee裝置位址是16位元的短位址。若「類別」值為82,則代表採用64位元的長位址。
  • 選項:預設為0,代表不使用特別功能。若「選項」值為20(16進位值),代表啟用AES加密。
  • 取樣數:代表每次探尋(採集)幾次接腳狀態,預設是1次(註:XBee S1模組的韌體似乎只支援每次採集一次)。
  • 通道遮罩:代表模組的哪些接腳有傳回資料,此例的0001,代表數位0腳。
  • 通道資料:各個接腳實際傳回的資料,此例的0001,代表數位0腳傳回1。

訊息框長度代表從「類別」到「通道資料」為止的位元組數,此例為10個位元組,因此其值是0A。驗證碼(checksum)的計算方式則是用0xFF減去訊息框資料的加總

訊息框的長度與驗證碼計算式

底下是採用64位元位址(XBee序號)的訊息框格式範例:

64位元位址(XBee序號)的訊息框格式範例

使用Arduino接收並解析API訊息框

假設我們把XBee模組(協調器)的序列埠接在Arduino的數位8和9腳。傳送API訊息框的終端,接上電源和一個開關。

XBee與Arduino的接線電路圖

底下的Arduino程式將能在「序列埠監控視窗」顯示接收到的訊息內容:

在此範例中,XBee模組傳入的實際資料位於第13個位元組,其餘的資料可以丟棄:

XBee模組傳入的訊息框內容

取出第13個位元組的程式碼可以寫成:

比較嚴謹的資料接收程式應該要核對檢驗碼,Andrew寫了一個Arduino適用的XBee程式庫,相關說明與程式範例請參閱xbee-arduino使用xbee-arduino程式庫時,XBee模組需要設定成API 2模式。

AP模式的設置選單

認識XBee模組的API 2模式

API 1和API 2的差別在於API 2的訊息框可包含跳脫字元(escape,也譯作逸出、脫逸)

若訊息框中出現具有特殊意義的字元值,該字元的前面會被加上0x7D跳脫,而且原有的字元要跟0x20做XOR運算(註:「驗證碼」是未跳脫字元的計算值)。需要跳脫的字元包括:

  • 0x7E:起始字元
  • 0x7D:跳脫字元
  • 0x11:XON控制字元,相當於Ctrl-Q,代表「請序列埠裝置開始傳送資料」。
  • 0x13:XOFF控制字元,相當於Ctrl-S,代表「請序列埠裝置停止傳送資料」。

以底下的“7E00022311CB”資料為例,在API 2的模式下,實際傳出的資料為“E0002237D31CB”。

API 2模式的跳脫字元訊息示範

XBee模組通訊實驗(四):廣播通信、AES 加密及AT命令模式

廣播通信

讓一個通訊節點對其餘所有節點發送訊息,稱為「一點對多點廣播」。

XBee模組廣播

假設ZigBee網路上包含5個XBee模組,協調器的DL參數(目標低位址)設定成FFFF(代表「廣播」),其餘4個模組的DL參數則設定成協調器的位址(此例為12)。

協調器的參數設置

參數 說明
CH (Channel) C 頻道要一致
ID (PAN ID) 3332 網路ID要一致
DH 0
DL FFFF FFFF代表「廣播」
MY (Source Address) 12 協調器的唯一位址值,可任意設置。
CE (Coordinator Enable) 1 設置成協調器

如此,每當協調器發送訊息時,所有連線的終端都會接收到。

啟用AES 加密

ZigBee支援128位元的AES加密(註:32個字元長度),可以保障通訊網路的安全。啟用方式很簡單,只要將所有通訊端點的EE參數(代表「啟用AES加密」)設定成1,並且輸入相同的32個字元長度的AES密鑰即可,例如:

123456789ABCDEF123456789ABCDEF12

啟用AES的參數設置:

參數 說明
EE (AES Encryption Enable) 1 全部連線模組都要開啟
KY (AES Encryption Key) 123456789ABCDEF123456789ABCDEF12 所有連線模組都要一致

在X-CTU軟體中設定完畢後,按下「鉛筆」圖示鈕寫入參數。日後連線,XBee模組將自動加密與解密通訊內容,Arduino程式不需要任何修改。

自行輸入AT命令

XBee模組的參數都是透過AT命令設定,只不過,X-CTU軟體把設定AT命令的動作以圖形化介面呈現;每當我們按下X-CTU介面上的「鉛筆」圖示,它就在背地裡執行一連串AT命令。

我們也可以用序列通訊軟體連結XBee模組,自行輸入AT命令來調整參數。以採用X-CTU內建的序列通訊程式為例,進入AT命令的方法:

  1. 切換到「終端機」視窗,再按下「連線」鈕。
  2. 在終端機中輸入+++ (三個連續加號),並且不要按Enter鍵!(註:輸入+++前後一秒鐘,不要輸入任何字元),XBee將回應OK,代表模組已進入AT命令模式。
  3. 輸入任何AT命令看看,例如:ATID,它將回應模組的頻道ID。

底下畫面中的藍色字體是我們輸入的命令,紅色字體則是XBee模組的回應。

進入XBee的AT命令模式

進入AT命令模式之後,若經過一段時間沒有輸入AT命令,XBee將自動跳出AT命令模式,變成「透傳模式」,也就是自動轉發序列埠的訊息。只要再次輸入+++即可進入AT命令模式。

XBee模組的AT命令都已經列舉在X-CTU軟體的參數設定介面上…只要在參數名稱(粗體字部份)加上AT前綴,就是完整的AT命令。例如,讀取與設定「目標低位址」的參數是DL,其AT命令是ATDL。

XBee模組的AT命令名稱

補充說明,進入AT命令模式的‘+’字元,由CC參數(Command Sequence Character)定義;進入AT命令前後的一秒鐘等待時間可透過GT參數(Guard Times)調整,預設為0x3E8(亦即,10進位的1000ms)。詳細的AT命令說明,請參閱XBee模組的技術文件(PDF格式)

未完待續…

XBee模組通訊實驗(三):點對點連接XBee模組

「點對點(一對一)」是連接兩個XBee模組最簡單的方式。

點對點(一對一)連接兩個XBee模組

在ZigBee協定中,兩個終端不能直接相連,點對點連線的其中一端可以是終端(Endpoint),另一端則須是協調器(Coordinator)路由(Router),但Digi公司的XBee S1模組,允許兩個終端互聯。

協調器與終端點對點通訊通訊

採用一個XBee S1裝置當作協調器;另一個當作終端。先在X-CTU軟體中,替一個XBee S1模組設置底下的參數,讓它變成協調器:

參數 說明
CH (Channel) C 兩端的頻道一致
ID (PAN ID) 3332 兩端的網路ID要一致
DH 0  
DL 12 設定成終端的MY位址。
MY (Source Address) 13 16位元的自訂位址。
CE (Coordinator Enable) 1 啟用協調器
NI (Node Identification) Land of Joy 選擇性的節點名稱

CE(Coordinator Enable,協調器致能)若設置成1,此模組將擔任「協調器」;設置成0,則擔任「終端」。節點名稱(NI)可以留白,XBee的連線是以「位址」來識別彼此,而非節點名稱。

設定完畢後,按下「鉛筆」圖示鈕,將參數寫入S1模組:

將參數寫入XBee S1模組

設置終端模組參數

依照底下的參數設置另一個S1模組,重點在於,這兩個模組的頻道和網路ID要一致,DL參數設置成對方的MY位址。

參數 說明
CH (Channel) C 兩端的頻道一致
ID (PAN ID) 3332 兩端的網路ID要一致
DH 0  
DL 13 連接到協調器的位址
MY (Source Address) 12 16位元的自訂位址。
CE (Coordinator Enable) 0 設置成終端
NI (Node Identification) Zion 選擇性的節點名稱

設定完畢後,按下「鉛筆」圖示鈕寫入參數。

測試連線

S1模組參數設置完成後,它們將在通電時自動建立連線。X-CTU軟體內建終端機軟體,可直接透過序列埠與XBee連線,並且接收和傳遞序列資料。

請分別在兩個模組上,執行下圖的三道步驟,建立終端機連線:

採用X-CTU軟體內建終端機次測試序列連線

連線之後,便能直接在Console log窗格輸入與接收訊息(輸入的字元會立即被傳送出去):

在Console log窗格輸入與接收訊息

連接XBee模組與Arduino控制板

若XBee已經設定好點對點連線,那麼,對Arduino來說,XBee模組就像是一條序列線,接上就能使用。所以和連接藍牙序列模組一樣,Arduino不需要使用特別的程式庫。

假設我們使用SoftwareSerial程式庫,將Arduino控制板的8和9腳設定成序列埠,硬體的接腳如下(收、發模組都一樣)。如果XBee膜組有銜接轉接板,也能透過它的TxD和RxD腳與Arduino相連,接線方式也和下圖相同。

連接XBee模組與Arduino控制板

XBee通訊程式碼也和藍牙模組相同,請直接使用「藍牙模組補充說明(四):無線連結兩個Arduino控制板」底下的LED控制程式碼測試。

未完待續…

認識Arduino與C語言的函式指標以及函式指標陣列

讀者詢問如何在Arduino中建立數個自訂函式,並且透過「函式指標陣列」,在不使用if…else或switch…case等條件判斷式的情況下,讓程式依據變數的值,執行不同的自訂函式。

下文將先介紹Arduino與C程式語言的函式指標語法。

建立函式指標程式

就像變數一樣,函式(function)同樣被暫存在某個記憶體區塊,可以透過指標(pointer)取用;指向函式的指標稱為「函式指標(function pointer)」

底下的Arduino程式宣告了一個hello()自訂函式,並透過一個叫做‘f’的指標指向並執行它:

函式指標程式示範

若在Arduino執行此程式,將能在序列埠監控視窗看見“hello world.”訊息。

函式指標的語法

函式指標的語法如下:

函式指標的語法

指標名稱必須用代表「優先處理」的小括號包圍,如果少了小括號,程式敘述的意義將大不相同:

指標名稱必須用代表「優先處理」的小括號包圍

上面的Arduino程式碼,若用C語言改寫,將變成:

函式指標的參數傳遞與傳回值

假如要透過指標參照具有輸入參數和傳回值的函式,例如,一個計算並傳回兩整數相加值的自訂函式“sum”:

計算並傳回兩整數相加值的自訂函式“sum”

函式指標的定義也要跟著修改:

具備參數傳遞與傳回值的函式指標

完整的Arduino範例程式如下:

相同功能的C語言程式的範例如下:

函式指標陣列

認識函式指標的語法之後,函式指標陣列的語法也很容易理解。假設程式事先宣告了名叫fn0, fn1和fn3的函式,底下的敘述將透過自訂的 "f" 指標陣列指向它們:

底下是Arduino版本的函式指標陣列範例,上傳程式碼之後,開啟序列埠監控視窗,接著在序列埠監控視窗中輸入0~2的數字,程式將執行對應的fn0~fn2函式。

底下是C程式語言的版本:

延伸閱讀

XBee模組通訊實驗(二):認識XBee

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 S1模組的MAC位址(出廠序號)

XBee的MAC位址分成高(High)低(Low)兩部份,凡是Digi公司生產的XBee裝置,其高位址一定是0013A200;低位址則是Digi公司設定的唯一值,如上圖的40CA509A。

頻道、PAN識別碼和位址的關係如下圖:

頻道、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相容的序列轉接板

這個轉換板通常只用在透過電腦設置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軟體。

X-CTU軟體操作畫面

按下「新增XBee」或「搜尋XBee」鈕,加入XBee裝置。這是按下「搜尋XBee」鈕的畫面,筆者在電腦上連接兩個XBee裝置,因此點選兩個序列埠:

搜尋XBee畫面

接下來的設定畫面用於選擇XBee模組的序列通訊參數,通常使用預設值即可:

序列通訊參數設定畫面

按下Finish(完成)鈕,X-CTU工具將依據上圖的序列通訊參數,嘗試連結XBee模組。下圖顯示找到兩個XBee模組(註:XBee模組預設是「終端」裝置):

搜尋到的模組畫面

點選要加入的模組,並按下「加入選取的裝置」按鈕,即可開始在X-CTU中讀取與設置XBee模組的參數:

讀取模組參數的畫面

底下列舉即將使用的幾項「網路與安全(Networking & Security)」參數:

網路與安全(Networking & Security)參數

  • CH(通訊頻道):連線設備的頻道必須一致,預設為C。
  • ID(PAN識別碼):連線設備的PAN識別碼必須一致,預設為3332。
  • DH(目標高位址):連線對象的高位址,預設為0。
  • DL(目標低位址):連線對象的低位址,預設為0。
  • MY(16位元位址):用戶自訂的位址,可能值為0~0xFFFF。
  • SH(裝置序號-高):裝置的出廠高位序號,不可修改。
  • SH(裝置序號-低):裝置的出廠低位序號,不可修改。

未完待續…

XBee模組通訊實驗(一):認識ZigBee

XBee是Digi International(以下簡稱Digi)公司製造,具備資料採集功能的無線通訊模組。XBee產品有不同的型號,各自擁有不同的天線類型和功能,比較常見的是S1和S2模組,詳請參閱Digi公司的XBee商品頁,以及XBee Buying Guide(採購指南)

筆者跟朋友借來兩個XBee S1模組,外觀、接腳圖與特點如下(詳細特性請參閱PDF格式的XBee S1技術文件):

XBee S1模組外觀

XBee模組接腳圖

  • 工作電壓:2.8 ~ 3.4 V
  • 20個針腳:含9個數位I/O及5個類比輸入腳(與數位腳共用);針腳間距為2.0mm。
  • 內建鞭形天線
  • 室內傳輸距離:30公尺
  • 室外傳送距離(無遮蔽物):100公尺
  • 無線工作頻率:2.4GHz
  • 無線傳輸資料速率:250Kbps

IEEE 802.15.4與ZigBee通訊協定

“XBee”是Digi公司的商品名稱,它支援802.15.4或者ZigBee通訊協定。

802.15.4是IEEE(電機電子工程師學會)發布的無線傳輸標準,其特點是連線簡易、低數據傳輸率以及低功耗,適合家庭網路、工業自動化和醫療看護等應用。

ZigBee是在IEEE 802.15.4標準上,加入路由和其他聯網功能。ZigBee的名稱源自蜜蜂(bee)發現蜜源時,會跳「8字舞(waggle dance)」來告訴同伴方向和距離。ZigBee通訊協定由ZigBee聯盟合作開發,適合商業和工業的各種低數據傳輸率應用(註:聯盟廠商包含Honeywell、三菱電機、飛思卡爾半導體、摩托羅拉、三星電子、西門子、德州儀器、NXP、Atmel……等等)。

比較 ZigBee、Wifi和藍牙

ZigBee和802.15.4

WiFi(802.11標準)

藍牙

主要應用領域

無線監測和控制

高速無線網際網路

無線設備連結

傳輸速率(理論值)

250Kbps

11Mbps (802.11b) ~ 100Gbps(802.11ay)

720Kbps

典型傳輸距離

100公尺

50~100公尺

10~100公尺

特色

低功耗、網路節點數最大可達65000個。

速度、普及

使用便利

資料引用來自維基百科:

ZigBee網路架構

網路的構成方式又稱為拓樸(topology)。ZigBee支援點對點(point-to-point)單點對多點(point-to-multipoint)或者星狀(star)以及網狀(Mesh)架構,每個網路設備都稱作「節點」。

設置ZigBee網路時,要決定每個裝置(節點)的任務:

  • 協調器(Coordinator):ZigBee網路包含唯一的協調器,管理網路的設置。
  • 路由器(Router):同一個網路可以包含多個路由,負責轉發其他節點的訊號。
  • 終端(Endpoint):同一個網路可以包含多個終端,ZigBee的終端無法直接和其他終端通訊。

點對點(point-to-point)拓樸

點對點通訊,指的是兩個網路設備直接相連。像手機藍牙連接Arduino藍牙序列埠模組,或者手機畫面透過Miracast/WiFi-Direct技術投影到電視機,都是點對點連線。

一般家庭的網路都屬於星狀架構,中心節點是基地台,每個節點的訊息都要經過它收發。萬一基地台故障,整個網路就中斷了。

單點對多點(point-to-multipoint)或星狀(star)拓樸

網狀網路用在網路節點彼此距離超過無線傳輸範圍的場合,像普及於台灣各縣市的iTaiwan免費無線網路,就是由許多路由器交織而成。

網狀(Mesh)拓樸

底下網狀網路圖片取自非洲DIY建立WiFi Mesh網路的案例,這份PDF文件說明了網狀網路的優點和規劃方式,並且介紹如何透過FreifunkDD-WRT韌體,將普通市售無線基地台變成網狀網路節點。

網狀(Mesh)拓樸

非洲某些地區因為地廣人稀,無法吸引公司鋪設有線網路,所以偏鄉居民用無線網狀網路架設網際網路連線。圖中每一戶代表一個區域,包含一個無線網狀路由(mesh node),連接其他網狀路由;其中一個或多個路由,還負責連接到網際網路。每個路由都彼此相連,因此如果其中某個路由故障,並不會癱瘓整個網路。

未完待續…