侯艷波,秦會(huì)斌 ,胡建人,周迎新
(杭州電子科技大學(xué)電子信息學(xué)院,杭州310018)
近年來(lái),隨著物聯(lián)網(wǎng)概念的提出,無(wú)線通信和無(wú)線傳感器網(wǎng)絡(luò)技術(shù)得到了越來(lái)越廣泛的應(yīng)用。ZigBee 作為一種短距離無(wú)線通信網(wǎng)絡(luò)技術(shù),因?yàn)槠溆兄统杀?,低功耗,高容量,高安全,體積小,自組網(wǎng)等技術(shù)優(yōu)勢(shì),正越來(lái)越受工程師們的青睞[4]。ZigBee 主要應(yīng)用在家庭和樓宇的自動(dòng)控制,商業(yè)中的智慧標(biāo)簽,智能交通以及無(wú)線抄表領(lǐng)域。本文將ZigBee 技術(shù)應(yīng)用于家庭控溫節(jié)能系統(tǒng),可以使系統(tǒng)安裝免于布線,擴(kuò)展及維護(hù)更加方便。
采用高性能的ARM 處理器作為系統(tǒng)控制核心,移植操作系統(tǒng)后可以提供給用戶良好的交互界面,另一方面系統(tǒng)的功能升級(jí)變的更加容易。
家庭控溫節(jié)能系統(tǒng)主要由控制核心、ZigBee 無(wú)線通信網(wǎng)絡(luò)、終端執(zhí)行單元3 部分組成。家庭控溫節(jié)能系統(tǒng)的結(jié)構(gòu)框圖如圖1 所示。
控制核心的ARM 處理單元通過(guò)RS232 接口與ZigBee 網(wǎng)絡(luò)的協(xié)調(diào)器連接到無(wú)線網(wǎng)絡(luò)中,與各個(gè)終端執(zhí)行單元通過(guò)無(wú)線信號(hào)進(jìn)行通信。執(zhí)行單元的MCU(Atmega16 單片機(jī))通過(guò)RS232 接口和ZigBee網(wǎng)絡(luò)的終端節(jié)點(diǎn)連在一起接入網(wǎng)絡(luò),通過(guò)ZigBee 終端節(jié)點(diǎn)接收來(lái)自控制核心的命令或者上傳傳感器采集的數(shù)據(jù)到控制核心。如果遇到通信距離很大或者障礙物較多阻礙信號(hào)的問(wèn)題,可采取加入ZigBee 路由節(jié)點(diǎn)中繼的方法解決。
圖1 控溫節(jié)能系統(tǒng)框圖
在執(zhí)行單元可以加入若干受控對(duì)象。本系統(tǒng)利用執(zhí)行單元1 完成對(duì)窗子開(kāi)或關(guān)的控制,利用執(zhí)行單元2 完成對(duì)窗簾開(kāi)合的控制,利用執(zhí)行單元3 完成對(duì)空調(diào)的控制。各個(gè)執(zhí)行單元模塊添加了光強(qiáng)傳感器(TSL2561)及溫度傳感器(DS18B20),傳感器采集數(shù)據(jù)后通過(guò)ZigBee 終端節(jié)點(diǎn)傳送給ZigBee 網(wǎng)絡(luò)的協(xié)調(diào)器節(jié)點(diǎn),最后由協(xié)調(diào)器節(jié)點(diǎn)匯集各個(gè)執(zhí)行單元的數(shù)據(jù)傳送給控制核心??刂浦行氖盏綌?shù)據(jù)處理完畢后,完成控制指令的自動(dòng)發(fā)送,也可以人為地發(fā)送控制命令給各執(zhí)行單元。例如:夏天的中午光照很強(qiáng)烈,晴朗的天氣里室內(nèi)光照強(qiáng)度可達(dá)500 lx ~5 000 lx,陽(yáng)光照進(jìn)屋內(nèi)會(huì)使室溫迅速升高。當(dāng)控制核心檢測(cè)到室內(nèi)光照超過(guò)1 000 lx,溫度超過(guò)28 ℃時(shí)就會(huì)向執(zhí)行單元發(fā)送關(guān)窗,拉窗簾遮光的命令。這樣就能夠減少空調(diào)的使用,達(dá)到節(jié)約電能的目的。如果溫度繼續(xù)上升,當(dāng)控制核心檢測(cè)到室溫超過(guò)32 ℃時(shí)會(huì)發(fā)送打開(kāi)空調(diào)的命令,并將溫度設(shè)定為28 ℃的環(huán)保溫度值,提供一個(gè)適宜的溫度環(huán)境。
使用ZigBee 和ARM 技術(shù)為系統(tǒng)功能擴(kuò)展提供了極大的便利。例如,當(dāng)原有系統(tǒng)中需要新加入燈光節(jié)能控制的功能時(shí),只需要增加一個(gè)ZigBee 終端節(jié)點(diǎn)連接到燈光控制的執(zhí)行單元電路上,然后控制核心ARM 處理器的操作系統(tǒng)中加入相應(yīng)的軟件即可完成功能擴(kuò)展。在此過(guò)程中無(wú)須進(jìn)行過(guò)多布線,也無(wú)須改變?cè)邢到y(tǒng)的功能模塊。
該系統(tǒng)的電路設(shè)計(jì)工作主要由控制核心電路設(shè)計(jì),ZigBee 模塊電路設(shè)計(jì)以及執(zhí)行單元電路設(shè)計(jì)等3 部分構(gòu)成。這里簡(jiǎn)要介紹前2 部分。
圖2 為控制核心的接口電路。S3C2440 內(nèi)部集成了LCD 控制器,可將觸摸屏引腳對(duì)應(yīng)連接。TXD與RXD 為串口的TTL 發(fā)送與接收端,與MAX3232對(duì)應(yīng)引腳相連。為了能夠遠(yuǎn)程監(jiān)控系統(tǒng)狀態(tài),ARM處理器外接了DM9000 網(wǎng)卡接入因特網(wǎng)。
圖2 控制核心接口電路
圖3 是串口TTL 電平轉(zhuǎn)232 電平的轉(zhuǎn)換電路??刂坪诵牡腁RM 處理器及ZigBee 模塊的CC2530和執(zhí)行單元的Atmega16 的串口引腳都是TTL 電平,為了能與PC 機(jī)進(jìn)行串口通信方便調(diào)試程序,用MAX3232 芯片將TTL 電平轉(zhuǎn)換為232 電平。
圖3 MAX3232 串口通信電路
圖4為ZigBee 無(wú)線通信模塊電路。ZigBee 網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都可以使用同一個(gè)電路,在ZigBee無(wú)線網(wǎng)絡(luò)中的協(xié)調(diào)器功能、路由功能及終端功能是由軟件來(lái)區(qū)分的[5-6]。
圖4 ZigBee 無(wú)線通信模塊電路
控制核心的處理器外接一塊256 M Nandflash 芯片和一塊RAM 芯片。首先移植U-Boot 到Nandflash中作為控制核心的Bootloader。操作系統(tǒng)選擇免費(fèi)開(kāi)源的Linux。虛擬機(jī)終端下進(jìn)入內(nèi)核目錄,運(yùn)行#make menuconfig 后定制Linux-2.6.32 內(nèi)核,配置完成后交叉編譯Linux 內(nèi)核。注意配置的時(shí)候U-Boot 的MACH_TYPE 參數(shù)要和Linux 內(nèi)核的MACH_TYPE一致,否則不能成功引導(dǎo)內(nèi)核。然后移植串口、網(wǎng)卡、Nandflash 等內(nèi)核驅(qū)動(dòng),使控制中心的軟件平臺(tái)與硬件平臺(tái)能夠正常工作。最后用Mkyaffs2image 文件系統(tǒng)制作工具制作文件系統(tǒng)映像,并用QT 開(kāi)發(fā)自己的GUI(圖形用戶界面)。
調(diào)試好控制核心以后,在和協(xié)調(diào)器進(jìn)行串口通信的時(shí)候,需要將串口的控制臺(tái)功能取消。進(jìn)入內(nèi)核目錄下,用VIM 編輯器打開(kāi).Config 文件,然后找到CONFIG_CMDLINE 命令參數(shù)行,將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 公司的免費(fèi)協(xié)議棧Z-stack 2007 可以運(yùn)行在CC2530 上面。開(kāi)發(fā)者只需根據(jù)實(shí)際需要再應(yīng)用層添加自己的任務(wù),然后修改相應(yīng)的硬件層端口即可[7]。具體工作如下:
(1)在MT 層中,修改MT_UART.h 中串口的默認(rèn)設(shè)置,取消流控,并把波特率由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 文件中,修改串口回調(diào)函數(shù)。
將uartConfig. callBackFunc = MT _ UartProcessZTool Data;改為uartConfig. callBackFunc=rxCB;rxCB 負(fù)責(zé)把串口接收到的數(shù)據(jù)存入數(shù)據(jù)緩沖區(qū)databuf 中。rxCB 函數(shù)關(guān)鍵代碼如下:
rxlen=Hal_UART_RxBufLen(MT_UART_DEFAULT_PORT);//接收緩沖區(qū)數(shù)據(jù)長(zhǎng)度,字節(jié)為單位
databuf=osal_mem_alloc(rxlen);//分配空間
HalUARTRead (MT _ UART _ DEFAULT _ PORT,databuf,rxlen);//讀取串口數(shù)據(jù)存入databuf 中
下面一段代碼用來(lái)判斷ZigBee 模塊從串口收到的是命令還是數(shù)據(jù):
//協(xié)議規(guī)定幀頭以/D 開(kāi)始代表數(shù)據(jù)
if((databuf[0]==47)&&(databuf[1]==68))
//設(shè)置串口收到消息事件標(biāo)志,請(qǐng)求APP 層處理 osal_set_
event(SampleApp_TaskID,UART_RX_DAT_CB_EVT);
//限定只能協(xié)調(diào)器向ZigBee 網(wǎng)絡(luò)發(fā)命令
#ifdef ZDO_COORDINATOR
//協(xié)議規(guī)定幀頭以/C 開(kāi)始命令
else if((databuf[0]= =47)&&(databuf[1]= =67)) osal_
set_event(SampleApp_TaskID,UART_RX_CMD_CB_EVT);
#endif
else
osal_mem_free(databuf); //釋放內(nèi)存
(3)在應(yīng)用層加入用戶任務(wù)的事件標(biāo)志及完成相應(yīng)的處理函數(shù)。在SampleApp. h 中新增簇ID 及事件標(biāo)志:
#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//新增的事件標(biāo)志
(4)簇ID 列表SampleApp_ClusterList 中也相應(yīng)增加上面定義的簇ID,然后在消息處理函數(shù)中增加如下代碼:
if(events & UART_RX_DAT_CB_EVT)//串口接收數(shù)據(jù)
{
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);
}
當(dāng)ZigBee 網(wǎng)絡(luò)的協(xié)調(diào)器接收到控制核心傳來(lái)的內(nèi)容后,判別出是命令還是數(shù)據(jù),并設(shè)置不同的事件標(biāo)志后發(fā)送給網(wǎng)絡(luò)中的其他節(jié)點(diǎn),其他節(jié)點(diǎn)接收到數(shù)據(jù)后,根據(jù)事件標(biāo)志來(lái)做不同的處理。同時(shí),終端節(jié)點(diǎn)的串口如果接收到傳感器數(shù)據(jù),可以回傳給協(xié)調(diào)器,協(xié)調(diào)器通過(guò)串口傳遞給控制核心處理。
終端執(zhí)行單元的MCU 采用性價(jià)比較高的Atmega16 單片機(jī),運(yùn)行在此單片機(jī)上的軟件用C 語(yǔ)言編寫。軟件主要完成以下功能:
(1)檢測(cè)串口是否收到來(lái)自控制核心的數(shù)據(jù)或命令;
(2)收到命令則向執(zhí)行單元發(fā)送執(zhí)行請(qǐng)求;
(3)收到數(shù)據(jù)則設(shè)定設(shè)備的參數(shù);
(4)設(shè)置硬件看門狗定時(shí)器,增加系統(tǒng)可靠性。
圖5 終端執(zhí)行單元軟件流程圖
執(zhí)行單元的傳感器數(shù)據(jù)不采用周期性上傳的方式,而是接受到控制核心的請(qǐng)求數(shù)據(jù)命令后才上傳。采用后者所說(shuō)的方式可以進(jìn)一步降低整個(gè)系統(tǒng)的功耗[8]。
圖6 為無(wú)線ZigBee 網(wǎng)絡(luò)中的協(xié)調(diào)器,路由器和終端。圖7 為傳感器采集到的數(shù)據(jù)通過(guò)ZigBee 模塊串口發(fā)送到PC 上位機(jī)軟件。圖8 為控制中心觸摸屏顯示的傳感器采集的數(shù)據(jù)信息。
圖6 協(xié)調(diào)器、路由、終端模塊實(shí)物
圖7 協(xié)調(diào)器、路由、終端的網(wǎng)絡(luò)組建
圖8 控制中心觸屏顯示監(jiān)控信息
本系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)過(guò)程中主要應(yīng)用了嵌入式技術(shù)以及ZigBee 無(wú)線通信技術(shù)。系統(tǒng)設(shè)計(jì)的重點(diǎn)放在如何使系統(tǒng)安裝簡(jiǎn)便,容易擴(kuò)展上。軟件擴(kuò)展升級(jí)可以在控制核心的操作系統(tǒng)上進(jìn)行,硬件擴(kuò)展升級(jí)可以增加新的終端節(jié)點(diǎn)。經(jīng)過(guò)調(diào)試,傳感器網(wǎng)絡(luò)能夠搭建起來(lái),控制中心能夠接收和處理傳感器信息。
[1] 瞿雷,劉勝德,胡咸斌. ZigBee 技術(shù)及應(yīng)用[M]. 北京:北京航空航天大學(xué)出版社,2007:374-468.
[2] 李文仲.ZigBee2007/PRO 協(xié)議棧實(shí)驗(yàn)與實(shí)踐[M]. 北京:北京航空航天大學(xué)出版社,2009.
[3] 高守瑋,吳燦陽(yáng),楊超. ZigBee 技術(shù)實(shí)踐教程[M]. 北京:北京航空航天大學(xué)出版社,2009:247-288.
[4] Shahin Farahani.ZigBee Wireless Networks and Transceivers[M].British Library Cataloguing-in-Publication Data,2008:285-289.
[5] 施文灶,王平,黃晞. 無(wú)線傳感器網(wǎng)絡(luò)在智能家居中的應(yīng)用[J].福建大學(xué)學(xué)報(bào),2010,26(6):60-63.
[6] 劉禮建,張廣明.基于ZigBee 無(wú)線技術(shù)的智能家居管理系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(12):250-253.
[7] 高素萍,李旭斌,鐘德永. 智能窗控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].樓宇自動(dòng)化,2009,20:8-10.
[8] 陳江波.智能住宅自動(dòng)報(bào)警與查詢系統(tǒng)的研究與設(shè)計(jì)[D].山東:山東大學(xué)信息學(xué)院,2008.