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