侯艷波,秦會斌 ,胡建人,周迎新
(杭州電子科技大學電子信息學院,杭州310018)
近年來,隨著物聯網概念的提出,無線通信和無線傳感器網絡技術得到了越來越廣泛的應用。ZigBee 作為一種短距離無線通信網絡技術,因為其有著低成本,低功耗,高容量,高安全,體積小,自組網等技術優勢,正越來越受工程師們的青睞[4]。ZigBee 主要應用在家庭和樓宇的自動控制,商業中的智慧標簽,智能交通以及無線抄表領域。本文將ZigBee 技術應用于家庭控溫節能系統,可以使系統安裝免于布線,擴展及維護更加方便。
采用高性能的ARM 處理器作為系統控制核心,移植操作系統后可以提供給用戶良好的交互界面,另一方面系統的功能升級變的更加容易。
家庭控溫節能系統主要由控制核心、ZigBee 無線通信網絡、終端執行單元3 部分組成。家庭控溫節能系統的結構框圖如圖1 所示。
控制核心的ARM 處理單元通過RS232 接口與ZigBee 網絡的協調器連接到無線網絡中,與各個終端執行單元通過無線信號進行通信。執行單元的MCU(Atmega16 單片機)通過RS232 接口和ZigBee網絡的終端節點連在一起接入網絡,通過ZigBee 終端節點接收來自控制核心的命令或者上傳傳感器采集的數據到控制核心。如果遇到通信距離很大或者障礙物較多阻礙信號的問題,可采取加入ZigBee 路由節點中繼的方法解決。

圖1 控溫節能系統框圖
在執行單元可以加入若干受控對象。本系統利用執行單元1 完成對窗子開或關的控制,利用執行單元2 完成對窗簾開合的控制,利用執行單元3 完成對空調的控制。各個執行單元模塊添加了光強傳感器(TSL2561)及溫度傳感器(DS18B20),傳感器采集數據后通過ZigBee 終端節點傳送給ZigBee 網絡的協調器節點,最后由協調器節點匯集各個執行單元的數據傳送給控制核心。控制中心收到數據處理完畢后,完成控制指令的自動發送,也可以人為地發送控制命令給各執行單元。例如:夏天的中午光照很強烈,晴朗的天氣里室內光照強度可達500 lx ~5 000 lx,陽光照進屋內會使室溫迅速升高。當控制核心檢測到室內光照超過1 000 lx,溫度超過28 ℃時就會向執行單元發送關窗,拉窗簾遮光的命令。這樣就能夠減少空調的使用,達到節約電能的目的。如果溫度繼續上升,當控制核心檢測到室溫超過32 ℃時會發送打開空調的命令,并將溫度設定為28 ℃的環保溫度值,提供一個適宜的溫度環境。
使用ZigBee 和ARM 技術為系統功能擴展提供了極大的便利。例如,當原有系統中需要新加入燈光節能控制的功能時,只需要增加一個ZigBee 終端節點連接到燈光控制的執行單元電路上,然后控制核心ARM 處理器的操作系統中加入相應的軟件即可完成功能擴展。在此過程中無須進行過多布線,也無須改變原有系統的功能模塊。
該系統的電路設計工作主要由控制核心電路設計,ZigBee 模塊電路設計以及執行單元電路設計等3 部分構成。這里簡要介紹前2 部分。
圖2 為控制核心的接口電路。S3C2440 內部集成了LCD 控制器,可將觸摸屏引腳對應連接。TXD與RXD 為串口的TTL 發送與接收端,與MAX3232對應引腳相連。為了能夠遠程監控系統狀態,ARM處理器外接了DM9000 網卡接入因特網。

圖2 控制核心接口電路
圖3 是串口TTL 電平轉232 電平的轉換電路。控制核心的ARM 處理器及ZigBee 模塊的CC2530和執行單元的Atmega16 的串口引腳都是TTL 電平,為了能與PC 機進行串口通信方便調試程序,用MAX3232 芯片將TTL 電平轉換為232 電平。

圖3 MAX3232 串口通信電路
圖4為ZigBee 無線通信模塊電路。ZigBee 網絡中的所有節點都可以使用同一個電路,在ZigBee無線網絡中的協調器功能、路由功能及終端功能是由軟件來區分的[5-6]。

圖4 ZigBee 無線通信模塊電路
控制核心的處理器外接一塊256 M Nandflash 芯片和一塊RAM 芯片。首先移植U-Boot 到Nandflash中作為控制核心的Bootloader。操作系統選擇免費開源的Linux。虛擬機終端下進入內核目錄,運行#make menuconfig 后定制Linux-2.6.32 內核,配置完成后交叉編譯Linux 內核。注意配置的時候U-Boot 的MACH_TYPE 參數要和Linux 內核的MACH_TYPE一致,否則不能成功引導內核。然后移植串口、網卡、Nandflash 等內核驅動,使控制中心的軟件平臺與硬件平臺能夠正常工作。最后用Mkyaffs2image 文件系統制作工具制作文件系統映像,并用QT 開發自己的GUI(圖形用戶界面)。
調試好控制核心以后,在和協調器進行串口通信的時候,需要將串口的控制臺功能取消。進入內核目錄下,用VIM 編輯器打開.Config 文件,然后找到CONFIG_CMDLINE 命令參數行,將CONFIG_CMDLINE =“initrd = 0x32000000,0x200000 root =/dev/ram rw console = ttysAC0 mem = 64M" 改為CONFIG_CMDLINE=“initrd=0x32000000,0x200000
root=/dev/ram rw console=NULL mem=64M"
TI 公司的免費協議棧Z-stack 2007 可以運行在CC2530 上面。開發者只需根據實際需要再應用層添加自己的任務,然后修改相應的硬件層端口即可[7]。具體工作如下:
(1)在MT 層中,修改MT_UART.h 中串口的默認設置,取消流控,并把波特率由38400 改為115200。
#define MT_UART_DEFAULT_OVERFLOW TURE
改為:
#define MT_UART_DEFAULT_OVERFLOW FALSE
將
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400
改為:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
(2)在MT_UART.c 文件中,修改串口回調函數。
將uartConfig. callBackFunc = MT _ UartProcessZTool Data;改為uartConfig. callBackFunc=rxCB;rxCB 負責把串口接收到的數據存入數據緩沖區databuf 中。rxCB 函數關鍵代碼如下:
rxlen=Hal_UART_RxBufLen(MT_UART_DEFAULT_PORT);//接收緩沖區數據長度,字節為單位
databuf=osal_mem_alloc(rxlen);//分配空間
HalUARTRead (MT _ UART _ DEFAULT _ PORT,databuf,rxlen);//讀取串口數據存入databuf 中
下面一段代碼用來判斷ZigBee 模塊從串口收到的是命令還是數據:
//協議規定幀頭以/D 開始代表數據
if((databuf[0]==47)&&(databuf[1]==68))
//設置串口收到消息事件標志,請求APP 層處理 osal_set_
event(SampleApp_TaskID,UART_RX_DAT_CB_EVT);
//限定只能協調器向ZigBee 網絡發命令
#ifdef ZDO_COORDINATOR
//協議規定幀頭以/C 開始命令
else if((databuf[0]= =47)&&(databuf[1]= =67)) osal_
set_event(SampleApp_TaskID,UART_RX_CMD_CB_EVT);
#endif
else
osal_mem_free(databuf); //釋放內存
(3)在應用層加入用戶任務的事件標志及完成相應的處理函數。在SampleApp. h 中新增簇ID 及事件標志:
#define SAMPLEAPP_SPIDATA_CLUSTERID 1//簇ID
#define SAMPLEAPP_FLASH_CLUSTERID 2
#define SAMPLEAPP_ADDR_CLUSTERID 3
#define SAMPLEAPP_COMMAND_CLUSTERID 4
#define UART_RX_DAT_CB_EVT 0x0002
#define UART_RX_CMD_CB_EVT 0x0004
#define SAMPLEAPP_SEND_NWKADDR_EVT 0x0008
#define SAMPLEAPP_COMMAND_PERIODIC_MSG_EVT
0x0010//新增的事件標志
(4)簇ID 列表SampleApp_ClusterList 中也相應增加上面定義的簇ID,然后在消息處理函數中增加如下代碼:
if(events & UART_RX_DAT_CB_EVT)//串口接收數據
{
SampleApp_SPI_SendData(databuf,rxlen);
return(events ^ UART_RX_DAT_CB_EVT);
}
if(events & UART_RX_CMD_CB_EVT)//串口接收命令
{
SampleApp_SPI_SendCommand(databuf,rxlen);
return(events ^ UART_RX_CMD_CB_EVT);
}
當ZigBee 網絡的協調器接收到控制核心傳來的內容后,判別出是命令還是數據,并設置不同的事件標志后發送給網絡中的其他節點,其他節點接收到數據后,根據事件標志來做不同的處理。同時,終端節點的串口如果接收到傳感器數據,可以回傳給協調器,協調器通過串口傳遞給控制核心處理。
終端執行單元的MCU 采用性價比較高的Atmega16 單片機,運行在此單片機上的軟件用C 語言編寫。軟件主要完成以下功能:
(1)檢測串口是否收到來自控制核心的數據或命令;
(2)收到命令則向執行單元發送執行請求;
(3)收到數據則設定設備的參數;
(4)設置硬件看門狗定時器,增加系統可靠性。

圖5 終端執行單元軟件流程圖
執行單元的傳感器數據不采用周期性上傳的方式,而是接受到控制核心的請求數據命令后才上傳。采用后者所說的方式可以進一步降低整個系統的功耗[8]。
圖6 為無線ZigBee 網絡中的協調器,路由器和終端。圖7 為傳感器采集到的數據通過ZigBee 模塊串口發送到PC 上位機軟件。圖8 為控制中心觸摸屏顯示的傳感器采集的數據信息。

圖6 協調器、路由、終端模塊實物

圖7 協調器、路由、終端的網絡組建

圖8 控制中心觸屏顯示監控信息
本系統設計實現過程中主要應用了嵌入式技術以及ZigBee 無線通信技術。系統設計的重點放在如何使系統安裝簡便,容易擴展上。軟件擴展升級可以在控制核心的操作系統上進行,硬件擴展升級可以增加新的終端節點。經過調試,傳感器網絡能夠搭建起來,控制中心能夠接收和處理傳感器信息。
[1] 瞿雷,劉勝德,胡咸斌. ZigBee 技術及應用[M]. 北京:北京航空航天大學出版社,2007:374-468.
[2] 李文仲.ZigBee2007/PRO 協議棧實驗與實踐[M]. 北京:北京航空航天大學出版社,2009.
[3] 高守瑋,吳燦陽,楊超. ZigBee 技術實踐教程[M]. 北京:北京航空航天大學出版社,2009:247-288.
[4] Shahin Farahani.ZigBee Wireless Networks and Transceivers[M].British Library Cataloguing-in-Publication Data,2008:285-289.
[5] 施文灶,王平,黃晞. 無線傳感器網絡在智能家居中的應用[J].福建大學學報,2010,26(6):60-63.
[6] 劉禮建,張廣明.基于ZigBee 無線技術的智能家居管理系統設計[J].計算機技術與發展,2011,21(12):250-253.
[7] 高素萍,李旭斌,鐘德永. 智能窗控制系統的設計與實現[J].樓宇自動化,2009,20:8-10.
[8] 陳江波.智能住宅自動報警與查詢系統的研究與設計[D].山東:山東大學信息學院,2008.