文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2013)10-0069-03
在傳統(tǒng)的數(shù)據(jù)采集中,較多采用RS485或CAN現(xiàn)場(chǎng)總線將分散節(jié)點(diǎn)的數(shù)據(jù)傳給數(shù)據(jù)接收器。由于有線傳輸,在安裝和維修方面會(huì)給實(shí)際應(yīng)用帶來(lái)許多不必要的麻煩。若采集數(shù)據(jù)節(jié)點(diǎn)對(duì)移動(dòng)性要求比較高,則這種有線傳輸方式有時(shí)卻行不通。因此,若各數(shù)據(jù)采集節(jié)點(diǎn)通過(guò)無(wú)線方式將數(shù)據(jù)傳給數(shù)據(jù)接收器,則可以很好地解決上述的問(wèn)題。在工業(yè)應(yīng)用中2.45 GHz無(wú)線通信具有頻段免費(fèi)、通信距離遠(yuǎn)的優(yōu)點(diǎn)。目前基于2.45 GHz無(wú)線通信比較成熟的應(yīng)用有無(wú)繩電話、ZigBee、WiFi、藍(lán)牙等。它們有統(tǒng)一的協(xié)議標(biāo)準(zhǔn),但是具有協(xié)議復(fù)雜、開(kāi)發(fā)難度大、周期長(zhǎng)等不足。Nordic Semiconductor 公司的nRF24L01 系類單片無(wú)線收發(fā)芯片采用封閉協(xié)議通信, 而各個(gè)廠家可以根據(jù)自己的需求制定自己的通信協(xié)議[1-3]。因此采用以nRF24L01芯片為核心的射頻模塊對(duì)節(jié)點(diǎn)采集的數(shù)據(jù)進(jìn)行無(wú)線傳輸具有低成本、易開(kāi)發(fā)等優(yōu)點(diǎn)。
但2.45 GHz無(wú)線通信的距離還是非常有限的,如ZigBee在2~20 m、WiFi在2~200 m。因此可以在接收器上移植TCP/IP網(wǎng)絡(luò)協(xié)議,最終通過(guò)遠(yuǎn)程網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)接收器的控制。遠(yuǎn)程訪問(wèn)管理數(shù)據(jù)接收器有兩種方式:C/S(客戶機(jī)/服務(wù)器)模式和B/S(瀏覽器/服務(wù)器)模式。C/S模式只能在小范圍內(nèi)的網(wǎng)絡(luò)環(huán)境中應(yīng)用,缺乏靈活性,開(kāi)發(fā)周期長(zhǎng)而且升級(jí)難。而采用B/S模式,只要在和設(shè)備聯(lián)網(wǎng)的任何地方,合法用戶就可以通過(guò)瀏覽器遠(yuǎn)程管理控制接收器[4]。因此它具有系統(tǒng)維護(hù)方便、開(kāi)發(fā)周期短的優(yōu)勢(shì)。
1 遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)設(shè)計(jì)
基于nRF24L01射頻模塊的遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)結(jié)構(gòu)如圖1所示。數(shù)據(jù)接收器以S3C2440為處理器,外圍擴(kuò)展nRF24L01射頻模塊、存儲(chǔ)模塊和網(wǎng)絡(luò)通信模塊。各數(shù)據(jù)采集節(jié)點(diǎn)由低功耗MCU、射頻模塊和傳感器數(shù)據(jù)采集電路構(gòu)成。每個(gè)節(jié)點(diǎn)有一個(gè)ID號(hào),將它與采集到數(shù)據(jù)一起寫(xiě)到發(fā)送包的數(shù)據(jù)域中,然后通過(guò)射頻模塊發(fā)送給接收器的射頻接收單元進(jìn)行處理。在該系統(tǒng)中,S3C2440與nRF24L01射頻模塊通信由6根信號(hào)線組成,它們分別為:主機(jī)出從機(jī)進(jìn)數(shù)據(jù)線(MOSI) 、主機(jī)進(jìn)從機(jī)出數(shù)據(jù)線(MISO)、時(shí)鐘線(SCK)、設(shè)備選擇線(CS) 、中斷標(biāo)志線(IRQ)和接收發(fā)送模式選擇線(CE) [2-4]。IRQ中的信號(hào)可以代表不同突發(fā)情況的中斷事件:nRF24L01在發(fā)送模式下成功發(fā)送數(shù)據(jù)中斷;nRF24L01在接收模式下正確接收數(shù)據(jù)中斷;nRF24L01在發(fā)送模式下,達(dá)到最大重傳次數(shù)中斷。
S3C2440通過(guò)SPI接口對(duì)nRF24L01的相關(guān)寄存器進(jìn)行操作,以實(shí)現(xiàn)對(duì)射頻模塊的初始化和相關(guān)信息處理。為了利用Linux中比較成熟的網(wǎng)絡(luò)功能實(shí)現(xiàn)遠(yuǎn)程控制,在接收器上移植了嵌入式Linux操作系統(tǒng)。而在Linux系統(tǒng)中,所有的外部設(shè)備都被看作是目錄/dev下的一個(gè)文件,并為用戶的訪問(wèn)提供了一種標(biāo)準(zhǔn)接口[4]。因此在本系統(tǒng)開(kāi)發(fā)前要實(shí)現(xiàn)nRF24L01射頻模塊字符設(shè)備驅(qū)動(dòng)程序。
2 nRF24L01通信功能實(shí)現(xiàn)
nRF24L01單片無(wú)線收發(fā)器芯片內(nèi)置頻率發(fā)生器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器等功能模塊。通過(guò)在芯片外圍擴(kuò)展少量的器件形成的射頻模塊可以利用全雙工的SPI串行接口與MCU實(shí)現(xiàn)通信。它有125個(gè)頻點(diǎn),能夠?qū)崿F(xiàn)點(diǎn)對(duì)點(diǎn)、點(diǎn)對(duì)多點(diǎn)的無(wú)線通信。當(dāng)nRF24L01工作在“ShockBurstTM”方式下時(shí),數(shù)據(jù)包格式由前導(dǎo)碼、地址、數(shù)據(jù)域和CRC校驗(yàn)這4部分組成。其中前導(dǎo)碼由硬件自動(dòng)進(jìn)行處理,當(dāng)nRF24L01在發(fā)送模式下自動(dòng)加入前導(dǎo)碼,在接收模式下自動(dòng)去除前導(dǎo)碼。它的作用是給芯片穩(wěn)定接收或發(fā)送預(yù)留一定的時(shí)間。地址長(zhǎng)度為3~5 B,它由寄存器SETUP_AW進(jìn)行設(shè)定。數(shù)據(jù)域?yàn)榘l(fā)送包的有效載荷,長(zhǎng)度可以為1~32 B。CRC校驗(yàn)是可以選擇的,它由控制寄存器中的EN_CRC位來(lái)決定[3]。
數(shù)據(jù)采集節(jié)點(diǎn)中的nRF24L01設(shè)置為發(fā)送模式,節(jié)點(diǎn)將采集到的數(shù)據(jù)按照自己規(guī)定的格式填充到發(fā)送包的數(shù)據(jù)域。接收器的nRF24L01設(shè)置為接收模式用于接收節(jié)點(diǎn)發(fā)送的數(shù)據(jù)。在發(fā)送模式下芯片有6個(gè)數(shù)據(jù)通道可供選擇,而每個(gè)數(shù)據(jù)通道作為RF信道中一個(gè)邏輯通道,它們有自己的地址[2-3]。因此可以將數(shù)據(jù)采集節(jié)點(diǎn)的數(shù)據(jù)包地址設(shè)置為接收器nRF24L01芯片6個(gè)數(shù)據(jù)通道中某個(gè)未被利用的通道地址。從而實(shí)現(xiàn)一個(gè)接收器可以接收6個(gè)節(jié)點(diǎn)的數(shù)據(jù)。若節(jié)點(diǎn)個(gè)數(shù)大于6,則要采用一些防碰撞算法來(lái)解決數(shù)據(jù)沖突。
采用純ALOHA算法即隨機(jī)延遲算法可以用于解決上述問(wèn)題,數(shù)據(jù)采集節(jié)點(diǎn)利用隨機(jī)數(shù)生成函數(shù)產(chǎn)生一個(gè)在(N1,N2)之間的隨機(jī)數(shù),把這個(gè)隨機(jī)數(shù)給定時(shí)計(jì)數(shù)器賦值,使得定時(shí)器的定時(shí)間隔在(T1,T2)之間[5]。若增大T2-T1,則發(fā)生碰撞的概率減小。
在nRF24L01射頻模塊驅(qū)動(dòng)程序設(shè)計(jì)中主要實(shí)現(xiàn)了open()、close()、ioctl()、poll()等函數(shù)。其中open()和close()函數(shù)完成對(duì)設(shè)備模塊的打開(kāi)與關(guān)閉;poll() 函數(shù)是用戶空間調(diào)用select()函數(shù)的接口,用來(lái)監(jiān)測(cè)設(shè)備文件的狀態(tài)。若射頻模塊成功接收到發(fā)射單元發(fā)送的數(shù)據(jù)則會(huì)返回文件可讀,而在其他時(shí)候則處于阻塞狀態(tài)。ioctl()函數(shù)為用戶程序提供了對(duì)nRF24L01射頻模塊操作的相關(guān)命令,如:RDID_NUM命令用于接收數(shù)據(jù),SENDID命令用于修改并發(fā)送數(shù)據(jù)。
3 數(shù)據(jù)接收器軟件設(shè)計(jì)
遠(yuǎn)程數(shù)據(jù)接收器的軟件基于Linux操作系統(tǒng),主要由BOA服務(wù)器、CGI程序、nRF24L01射頻模塊驅(qū)動(dòng)程序和SQLite3數(shù)據(jù)庫(kù)組成,如圖2所示。用戶通過(guò)瀏覽器向遠(yuǎn)程BOA服務(wù)器發(fā)出HTTP請(qǐng)求,服務(wù)器的守護(hù)進(jìn)程接收到請(qǐng)求后創(chuàng)建一個(gè)CGI進(jìn)程,它將瀏覽器發(fā)送的相關(guān)數(shù)據(jù)設(shè)置成環(huán)境變量,然后執(zhí)行URL指定的CGI程序[4]。在整個(gè)軟件設(shè)計(jì)中CGI程序起著承上啟下的作用:一方面它從環(huán)境變量或標(biāo)準(zhǔn)輸入讀取用戶輸入數(shù)據(jù),并根據(jù)瀏覽器發(fā)送的相關(guān)命令對(duì)nRF24L01射頻模塊和SQLite3數(shù)據(jù)庫(kù)進(jìn)行操作;另一方面它把處理結(jié)果回送給BOA服務(wù)器及Web瀏覽器。
4 CGI程序設(shè)計(jì)
用戶通過(guò)瀏覽器管理遠(yuǎn)程數(shù)據(jù)接收器主要實(shí)現(xiàn)以下功能:控制nRF24L01射頻模塊接收或不接收來(lái)自數(shù)據(jù)采集節(jié)點(diǎn)中的數(shù)據(jù)、顯示采集到的實(shí)時(shí)數(shù)據(jù)和歷史數(shù)據(jù)。在本系統(tǒng)設(shè)計(jì)中,將用戶提交HTML表單數(shù)據(jù)的方式設(shè)置為GET方法,因此當(dāng)表單提交時(shí),用戶的控制命令被保存到環(huán)境變量QUERY_STRING中。CGI程序首先通過(guò)getenv()函數(shù)獲取環(huán)境變量QUERY_STRING的內(nèi)容,然后根據(jù)環(huán)境變量的內(nèi)容執(zhí)行不同的操作,CGI程序流程圖如圖3所示?!?/p>
4.1 射頻模塊應(yīng)用程序設(shè)計(jì)
射頻模塊通過(guò)Posix消息隊(duì)列接收CGI程序發(fā)送的消息,消息的內(nèi)容有兩種:使射頻模塊接收數(shù)據(jù)采集節(jié)點(diǎn)到達(dá)的數(shù)據(jù)包命令和停止接收命令。由于System V 消息隊(duì)列無(wú)法通知CGI程序何時(shí)在消息隊(duì)列中放置了一個(gè)消息,同時(shí),若采用msgrcv()函數(shù)一直輪詢,CPU的效率會(huì)比較低,而Posix消息隊(duì)列中的mq_notify()函數(shù),可以實(shí)現(xiàn)當(dāng)CGI程序發(fā)送消息時(shí),能夠通過(guò)異步事件通知消息隊(duì)列的接收端。但是消息隊(duì)列描述字(mqd_t變量)不是“普通”描述字,不能通過(guò)select()函數(shù)檢測(cè)消息隊(duì)列是否為可讀狀態(tài)[6]。然而可以通過(guò)以下方式實(shí)現(xiàn):首先,創(chuàng)建一個(gè)管道,通過(guò)select()函數(shù)等待檢測(cè)管道的可讀狀態(tài);然后通過(guò)mq_notify()函數(shù)使當(dāng)消息隊(duì)列有消息到來(lái)時(shí)產(chǎn)生一個(gè)SIGUSR1信號(hào),并且通過(guò)signal()函數(shù)捕獲這個(gè)信號(hào)。在信號(hào)處理函數(shù)中向管道寫(xiě)入任意一個(gè)字符的數(shù)據(jù),使select()函數(shù)返回管道為可讀狀態(tài),從而程序向下執(zhí)行,通過(guò)mq_receive()函數(shù)讀取消息隊(duì)列的消息。之后根據(jù)消息的內(nèi)容對(duì)nRF24L01射頻模塊執(zhí)行不同的操作。射頻模塊應(yīng)用程序的流程圖如圖4所示。
在主線程中,設(shè)置了一個(gè)初始化為0的變量flag,用于標(biāo)記射頻模塊當(dāng)前是否已設(shè)置為接收節(jié)點(diǎn)數(shù)據(jù)。若第一次從消息隊(duì)列接收到使射頻模塊接收數(shù)據(jù)的命令,則將flag設(shè)置為1,并創(chuàng)建采集線程。當(dāng)flag為1且接收到停止接收數(shù)據(jù)命令時(shí),則調(diào)用close()函數(shù)關(guān)閉射頻模塊設(shè)備,同時(shí)調(diào)用pthread_cancel()函數(shù)結(jié)束采集線程。
在采集線程中,首先調(diào)用SQLite3提供的C API接口函數(shù)sqlite3_open()打開(kāi)或創(chuàng)建數(shù)據(jù)庫(kù),并調(diào)用sqlite3_exec()函數(shù)創(chuàng)建兩個(gè)數(shù)據(jù)表,其中一個(gè)用于存儲(chǔ)實(shí)時(shí)數(shù)據(jù),一個(gè)用于存儲(chǔ)歷史數(shù)據(jù)。其次,通過(guò)open()函數(shù)打開(kāi)射頻模塊設(shè)備,調(diào)用ioctl()函數(shù)向射頻模塊發(fā)送一些設(shè)備初始化的設(shè)置命令。初始化后設(shè)備等待節(jié)點(diǎn)數(shù)據(jù)的到來(lái),一旦數(shù)據(jù)到達(dá)便返回設(shè)備為可讀狀態(tài),于是可以調(diào)用ioctl()函數(shù)中的RDID_NUM命令接收數(shù)據(jù)。最后通過(guò)sqlite3_exec()函數(shù)執(zhí)行數(shù)據(jù)庫(kù)操作的insert語(yǔ)句,將數(shù)據(jù)存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)表中。
4.2 數(shù)據(jù)顯示線程
用戶通過(guò)瀏覽器查詢各節(jié)點(diǎn)采集到的數(shù)據(jù),是由CGI程序中數(shù)據(jù)顯示子線程實(shí)現(xiàn)的。數(shù)據(jù)顯示子線程根據(jù)接收到的命令從不同的數(shù)據(jù)表中讀取數(shù)據(jù)。該系統(tǒng)對(duì)數(shù)據(jù)的顯示以簡(jiǎn)潔的直方圖形式呈現(xiàn),而沒(méi)有采用圖片這種比較占用資源的方式。以直方圖形式顯示數(shù)據(jù)能夠滿足大多數(shù)工業(yè)控制中對(duì)數(shù)據(jù)顯示的需求。系統(tǒng)測(cè)試時(shí),各數(shù)據(jù)采集節(jié)點(diǎn)以MSP430F2121單片機(jī)為MCU、以DS18B20溫度傳感器采集周?chē)臏囟?、用nRF24L01射頻模塊將采集到溫度以無(wú)線的方式傳輸給數(shù)據(jù)接收器。同時(shí)節(jié)點(diǎn)中射頻模塊的天線采集PCB天線,而接收器的天線采用增益為3 dBi棒狀天線,在此條件下,該數(shù)據(jù)接收器能夠接收100 m范圍內(nèi)的節(jié)點(diǎn)數(shù)據(jù),并通過(guò)網(wǎng)絡(luò)把數(shù)據(jù)返回到Web頁(yè)面中。應(yīng)用本系統(tǒng)對(duì)室內(nèi)溫度進(jìn)行監(jiān)測(cè)得到的數(shù)據(jù)截圖如圖5所示。
將無(wú)線射頻通信技術(shù)和網(wǎng)絡(luò)技術(shù)應(yīng)用于傳感器數(shù)據(jù)采集領(lǐng)域具有非常好的前景,該數(shù)據(jù)接收器可用于在惡劣的環(huán)境下對(duì)環(huán)境參數(shù)的多點(diǎn)監(jiān)測(cè)。數(shù)據(jù)接收器的射頻模塊PCB的布局對(duì)整體的性能有很大影響,同時(shí)采用大增益的天線可以使接收器獲取更遠(yuǎn)距離的節(jié)點(diǎn)數(shù)據(jù)。在軟件設(shè)計(jì)中由于采用了異步事件通知消息隊(duì)列的機(jī)制,因此在select()等待管道為可讀狀態(tài)時(shí)要注意處理由于信號(hào)中斷而使select()返回的EINTR狀態(tài)。
參考文獻(xiàn)
[1] 李雄飛,孫俊杰,陳磊,等.基于ZigBee技術(shù)的無(wú)線設(shè)備狀態(tài)監(jiān)測(cè)系統(tǒng)[J].儀表技術(shù)與傳感器,2012(12):139-140.
[2] 黃智偉. 單片無(wú)線發(fā)射與接收電路設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2009.
[3] SEMICONDUCTOR N. nRF24L01 Single Chip 2.4 GHz Transceiver Product Specification[EB/OL].[2007]. http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01.
[4] 劉剛,趙劍川. Linux系統(tǒng)移植[M].北京:清華大學(xué)出版社,2011.
[5] 鄧一文,張紅雨,張鵬程,等.RFID高頻讀寫(xiě)器防碰撞算法研究[J].電子設(shè)計(jì)工程,2011(19):31-34.
[6] STEVENS W R. Unix 網(wǎng)絡(luò)編程卷2:進(jìn)程間通信[M].楊繼張, 譯.北京:清華大學(xué)出版社,2001.