CC2431是一款帶定位引擎的片上系統(tǒng)。
文章詳細介紹基于RSSI技術的無線定位引擎的特點、功能、定位算法、軟件操作方法;說明定位引擎使用參數(shù)的定義、測量獲取方法、使用注意事項等;最后根據(jù)定位引擎在使用中存在的定位覆蓋范圍小和不具備三維定位能力的不足給出兩種改進方法。
引言
CC2431是TI公司推出的帶硬件定位引擎的片上系統(tǒng)(SoC)解決方案,能滿足低功耗ZigBee/IEEE 802.15.4無線傳感器網(wǎng)絡的應用需要。CC2431定位引擎基于RSSI(Received Signal Strength Indicator,接收信號強度指示)技術,根據(jù)接收信號強度與已知參考節(jié)點位置準確計算出有關節(jié)點位置,然后將位置信息發(fā)送給接收端。相比于集中型定位系統(tǒng),RSSI功能降低了網(wǎng)絡流量與通信延遲,在典型應用中可實現(xiàn)3~5 m定位精度和0.25 m的分辨率。本文在簡述基于RSSI定位技術的基礎上,詳細介紹CC2431無線定位引擎的功能、特點及使用方法,并且針對CC2431無線定位引擎定位范圍小和只能進行二維定位的不足之處給出了改進方法。
1 RSSI定位技術
RSSI是指節(jié)點接收到的無線信號強度大小。在基于接收信號強度指示RSSI的定位中,已知發(fā)射節(jié)點的發(fā)射信號強度,接收節(jié)點根據(jù)接收到信號的強度計算出信號的傳播損耗,利用理論和經(jīng)驗模型將傳輸損耗轉(zhuǎn)化為距離,再利用已有的算法計算出節(jié)點的位置。該技術硬件要求較低、算法相對簡單,在實驗室環(huán)境中表現(xiàn)出良好特性;但由于環(huán)境因素變化的原因,在實際應用中往往還需要進行改進。
2 CC2431無線定位引擎
CC2431無線定位引擎基于RSSI技術,定位系統(tǒng)由參考節(jié)點和盲節(jié)點組成。參考節(jié)點是一個位于已知位置的靜態(tài)節(jié)點,這個節(jié)點知道自己的位置并可以將其位置通過發(fā)送數(shù)據(jù)包通知其他節(jié)點。盲節(jié)點從參考節(jié)點處接收數(shù)據(jù)包信號,獲得參考節(jié)點位置坐標及相應的RSSI值并將其送入定位引擎,然后可以讀出由定位引擎計算得到的自身位置。由參考節(jié)點發(fā)送給盲節(jié)點的數(shù)據(jù)包至少包含參考節(jié)點的坐標參數(shù)水平位置X和豎直位置Y,而RSSI值可由接收節(jié)點計算獲得。
2.1 定位引擎
定位引擎的使用非常簡單,只要將所需參數(shù)寫入定位引擎,等待定位引擎計算完畢就可以直接讀出計算結果。所需參數(shù)如表1所列。
表1 定位引擎輸入?yún)?shù)
500)this.width=500" border=0>
2.2 RSSI參數(shù)
當CC2431接收到一個數(shù)據(jù)包后會自動將RSSI值添加到該數(shù)據(jù)包中。RSSI值為數(shù)據(jù)包接收在開始的8個周期中的平均值,用1個字節(jié)表示。當一個數(shù)據(jù)包從CC2431的FIFO中讀出時,倒數(shù)第二個字節(jié)包含RSSI值,這個值在接收到實際數(shù)據(jù)包的8個符號后測量得到,也可在數(shù)據(jù)包接收的同時獲得。此時RSSI將反映當時接收信號的強度,而不一定是接收到的數(shù)據(jù)的信號強度,從而增加了大量節(jié)點同時使用信道時RSSI值出錯的可能性。
CC2431包含一個RSSI寄存器,此寄存器保留與上述相同的值,但它并不鎖定,因此寄存器值不能用于進一步的計算。只有與接收到的數(shù)據(jù)相關的被鎖定的RSSI值才能認為是接收數(shù)據(jù)時獲得的正確RSSI測量值。
RSSI的理論值可以由式(1)表示:
500)this.width=500" border=0>
其中,射頻參數(shù)A和n用于描述網(wǎng)絡操作環(huán)境。在全向模式下,射頻參數(shù)A被定義為用dBm表示的距發(fā)射端1 m處接收到的信號強度絕對值。如信號強度為-40 dBm,那么參數(shù)A被定為40。定位引擎的期望參數(shù)A為30.0~50.0,精度為0.5。參數(shù)A用無符號定點數(shù)值給出,最低位為小數(shù)位,而其余各位為整數(shù)位。A的一個典型值為40.0。
射頻參數(shù)n被定義為路徑損失指數(shù),它指出了信號能量隨著到收發(fā)器距離的增加而衰減的速率。衰減與d-n成比例,這里d是發(fā)射器和接收器之間的距離。實際寫入定位引擎的參數(shù)n是一個通過查表得到的整數(shù)索引值n_index,如表2所列。
表2 參數(shù)n查詢表
500)this.width=500" border=0>
例如,通過測量得到n=2.98,查表得到最接近的有效值為3.00,相應的索引值是13。因此,整數(shù)13作為參數(shù)n寫入定位引擎中。參數(shù)n以[0,31]之間的整數(shù)索引寫入定位引擎,索引用整數(shù)表示。如n=7寫入為000000111,n的典型值是13。
2.3 參考節(jié)點數(shù)量
一般來說參考節(jié)點越多越好,要得到一個可靠的定位坐標至少需要3個參考節(jié)點。如果參考節(jié)點太少,節(jié)點間影響會很大。一個錯誤的RSSI值能明顯改變所得的位置坐標,錯誤的RSSI值在此即為不適合理論值的RSSI值,可能由于多路信號或信號被墻壁阻擋等造成。另外,如果盲節(jié)點位于參考節(jié)點網(wǎng)格外部,很可能結果與實際使用位置差別很大,因此不應該跟蹤位于網(wǎng)格之外的目標。
2.4 定位算法
首先,定位操作應該使用“最優(yōu)”參考節(jié)點,即使用具有最高RSSI值的8個參考節(jié)點。其他節(jié)點都應放棄。如果得不到8個節(jié)點,則應該使用盡可能多的節(jié)點。
可用于軟件操作的算法很多,例如在圖1所示的區(qū)域中,在X、Y方向上每隔30 m放置一個參考節(jié)點,圖中白色節(jié)點為盲節(jié)點,其他節(jié)點為參考節(jié)點。第1步,確定具有最高RSSI值的一個節(jié)點并計算一個補償值,使之“移動”到64 m×64 m范圍的中心。由于已知來自此節(jié)點的RSSI值,所以到此節(jié)點的距離很容易得到。第2步,確定除“最強”節(jié)點之外的其他使用節(jié)點,即圖中黑色節(jié)點。所有節(jié)點用第1步中的補償值進行修正。第3步,所有獲得值送入定位引擎最終讀出結果位置。最后一步,將補償值添加到計算位置中。完成這些計算之后,盲節(jié)點在全局網(wǎng)格中的位置就確定了。
500)this.width=500" border=0>
圖1 定位算法示意圖
2.5 軟件操作
在定位引擎運行之前,必須使能定位引擎寄存器LOCENG的第4位LOCENG.EN。當要停止定位引擎運行時,應往LOCENG.EN寫入0關斷引擎的時鐘信號,從而降低CC2431的功耗。對定位引擎的操作,主要就是對與定位引擎有關的寄存器的操作。
定位引擎運行時需要輸入3~8個參考坐標。參考坐標是以m為單位的,它表示各個參考節(jié)點的位置,其數(shù)值位于0~63.75,最高精度為0.25 m,以最低2位為小數(shù)部分,剩余6位為整數(shù)部分。參考坐標存放于RF寄存器REFCOORD中。在寫入REFCOORD之前,寄存器LOCENG的第1位 LOCENG.REFLD必須寫入1,用于指示一組參考坐標將要被寫入。一旦坐標寫入過程開始(LOCENG.REFLD=1),8對坐標必須一次性寫入。當定位引擎使用少于8個參考坐標時,要將未用的參考坐標寫入0.0。
RSSI值在[-40 dBm,-95 dBm]之間,精度為0.5 dBm,寫入值中應去掉負號。如RSSI的值為-50.35 dB,寫入到定位引擎為50.5。注意,未用的參考坐標必須用0.0作為RSSI值寫入。如果僅有部分參數(shù)寫入,定位引擎將不能正確工作。
所有的測量參數(shù)應寫入RF寄存器MEASPARM中。在寫入MEASPARM之前,寄存器LOCENG的第2位LOCENG.PARLD必須寫入1,表示一組測量參數(shù)將被寫入。一旦參數(shù)寫入開始(LOCENG.PARLD=1),所有10個參數(shù)必須一次性全部寫入。測量參數(shù)必須按照 [A,n,rssi0,rssi1,…,rssi7]順序?qū)懭隡EASPARM寄存器,任何未使用的位必須寫0。10個參數(shù)全部寫完之后,LOCENG.PARLD必須寫入0。
參數(shù)坐標和測量參數(shù)寫入之后,通過把寄存器LOCENG第0位LOCENG.RUN寫入1啟動定位估計計算。通常,LOCENG.RUN被置1 后的1 200個系統(tǒng)周期之后,LOCENG的第3位LOCENG.DONE被置1。此時,估計坐標可從LOCX和LOCY寄存器讀出。定位引擎不產(chǎn)生任何中斷請求。在新的結果被計算出來或下一次重新啟動之前,估計坐標值在LOCX和LOCY中保持有效。
下面給出一個簡單的定位引擎操作函數(shù):
void CalculatePostition(LOC_REF_NODE refNodes[LOC_ENGINE_NODE_CAPA], uint a_val, uint n_index, uint *locX,uint *locY) {
uint i;//啟動定位引擎
LOC_DISABLE();
LOC_ENABLE();//使能LOC_REFERENCE_LOAD,準備寫入?yún)⒖甲鴺?br /> LOC_REFERENCE_LOAD(TRUE);//寫入?yún)⒖甲鴺?br /> for(i=0;i<LOC_ENGINE_NODE_CAPACITY;i++) {
REFCOORD=refNodes[i].x;
RERCOORD=refNodes[i].y;}//參考坐標寫入完成
LOC_REFERENCE_LOAD(FALSE);//使能LOC_PARAMETER_LOAD,準備寫入測量參數(shù)
LOC_PARAMETER_LOAD(TRUE);
MEASPARM=a_val;
MEASPARM=n_index;
for(i=0;i<LOC_ENGINE_NODE_CAPACITY;i++) {
MEASPARM=refNodes[i].rssi;
}//測量參數(shù)寫入完成
LOC_PARAMETER_LOAD(FALSE);//啟動定位估計計算
LOC_RUN();//等待完成后讀出坐標值
while(!LOC_DONE());
*locX=LOCX;
*locY=LOCY;//關閉定位引擎
LOC_DISABLE();
}
定位引擎操作流程如圖2所示。
500)this.width=500" border=0>
圖2 定位引擎操作流程
3 存在問題及改進
CC2431的無線定位引擎在應用中存在兩個問題。首先,定位引擎可以處理最高達64 m的X、Y值,對實際應用來說這個區(qū)域太小,因此擴展區(qū)域非常必要。這可以通過簡單的軟件預處理算法得到,例如每個節(jié)點用2個字節(jié)的X、Y代表。因為精度為0.25 m,從而最大范圍為16 384 m(214=16 384)。其次,定位引擎得到的只是二維坐標,如何區(qū)分不同的水平面,就只能通過軟件方法處理。例如,可以首先確定最近的參考節(jié)點并讀出此節(jié)點的水平值。這個水平值被假定為盲節(jié)點所在的層,之后盲節(jié)點要保證只有同層節(jié)點被輸入到定位引擎當中。水平層用一個字節(jié)Z來表示,則可以區(qū)分256個不同的層。
結語
CC2431是一款針對無線傳感器網(wǎng)絡ZigBee/IEEE 802.15.4的片上系統(tǒng)(SoC)解決方案,其具備的硬件定位引擎具有硬件設備要求低、定位精度高的特點,很好地滿足了需求。本文在詳細討論了定位引擎操作原理、使用方法的基礎上,給出了可行的應用擴展方法??梢灶A見,CC2431的無線定位引擎將在無線網(wǎng)絡定位方面具有更加優(yōu)異的表現(xiàn)。
參考文獻
[1] CC2430 PRELIMINARY Data Sheet.Rev 1.03,2005.
[2] CC2431 PRELIMINARY Data Sheet.Rev 1.0,2007.
[3] 孫利民,等. 無線傳感器網(wǎng)絡[M]. 北京:清華大學出版社,2005.
宋保業(yè)(研究生),主要研究方向為無線傳感器網(wǎng)絡。