【BLE】CC2541之通過RSSI測距

本篇博文最後修改時間:2016年11月11日,09:21。


一、簡介

本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。


二、實驗平臺

協議棧版本:BLE-CC254x-1.4.0

編譯軟件:IAR 8.20.2

硬件平臺:Smart RF(主芯片CC2541)


版權聲明

博主:si_zhou_qun_84342712

聲明:喝水不忘挖井人,轉載請註明出處。

原文地址:http://write.blog.csdn.net/postedit?ref=toolbar

聯繫方式:[email protected]

開源4軸羣:84342712

甜甜的大香瓜的小店(淘寶店):


四、基礎知識

1、通過RSSI測距的公式是什麼?

答:


其中,

1)P:當前RSSI。

2)A:主從機1米距離時的RSSI。

3)n:傳播因子,與溫度、溼度等環境相關。

4)r:當前距離。


2、上述公式如何使用?

答:

上述的公式A與n都是變化的,按理說在不同的主機、環境的測距開始前,都需要校準A、變換n後才能正常使用公式。

但本篇採用的粗略方法是:

1)app連接CC2541,讀出1米時的RSSI約爲-59dB,則將代碼中公式中的A定爲-59dB。

2)百度發現常用的n有一個範圍,選了一個常用的傳播因子3.0。

這樣,就能粗略地得P與r的一一對應關係。


3、RSSI更新很慢,導致測出的距離更新也很慢,如何解決?

答:

由於RSSI是主從機通信過程產生的,因此需要主從機不停地進行數據通信後,RSSI才能得到更新。

實測:從機發往主機的數據,無法更新從機端的RSSI。

需要主機端主動發送數據給從機,從機才能快速更新RSSI。


五、實驗前提

    請先學習如下2篇文章:

     1  http://blog.csdn.net/si_zhou_qun_84342712/article/details/53170335

     2 http://blog.csdn.net/si_zhou_qun_84342712/article/details/53170312

六、代碼修改

1、修改RSSI回調函數(simpleBLEPeripheral.c中)

  1. //******************************************************************************              
  2. //name:             simpleBLEPeripheralRssiCB              
  3. //introduce:        RSSI回調函數             
  4. //parameter:        newRSSI:接收信號強度          
  5. //return:           none            
  6. //author:           甜甜的大香瓜       
  7. //email:            [email protected]     
  8. //changetime:       2016.04.09           
  9. //******************************************************************************   
  10. static void simpleBLEPeripheralRssiCB( int8 newRSSI )    
  11. {    
  12.     float nfDist = GUA_CalcDistByRSSI(newRSSI);         //通過算法獲得r,單位爲m  
  13.     int nDist = (int)(nfDist * 100);                    //將r的數值放大100倍,單位爲cm  
  14.     uint8 nBuf[3] = {0};  
  15.       
  16.     //將浮點型數據轉爲整型,便於發送串口  
  17.     nBuf[0] = nDist/100;        //百位  
  18.     nBuf[1] = (nDist%100)/10;   //十位      
  19.     nBuf[2] = nDist%10;         //個位  
  20.   
  21.         
  22.     //輸出RSSI,用10進製表示    
  23.     NPI_PrintValue("RSSI:-", (uint8) (-newRSSI), 10);    
  24.     NPI_PrintString("dB\r\n");    
  25.   
  26.     //輸出距離  
  27.     NPI_PrintString("DIST:");     
  28.     NPI_PrintValue("", nBuf[0], 10);    
  29.     NPI_PrintValue("", nBuf[1], 10);  
  30.     NPI_PrintValue("", nBuf[2], 10);       
  31.     NPI_PrintString("cm\r\n");     
  32.     NPI_PrintString("\r\n");       
  33.     NPI_PrintString("\r\n");       
  34. }   


2、添加RSSI測距的算法函數

1)寫一個RSSI測距的算法函數(simpleBLEPeripheral.c中)

  1. //******************************************************************************              
  2. //name:             GUA_CalcDistByRSSI              
  3. //introduce:        通過RSSI計算距離             
  4. //parameter:        rssi:接收信號強度          
  5. //return:           距離            
  6. //author:           甜甜的大香瓜       
  7. //email:            [email protected]     
  8. //changetime:       2016.04.09           
  9. //******************************************************************************   
  10. static float GUA_CalcDistByRSSI(int rssi)    
  11. {    
  12.     uint8 A = 59;  
  13.     float n = 3.0;  
  14.       
  15.     int iRssi = abs(rssi);    
  16.     float power = (iRssi-A)/(10*n);         
  17.     return pow(10, power);    
  18. }   

2)聲明RSSI測距的算法函數(simpleBLEPeripheral.c中)
  1. static float GUA_CalcDistByRSSI(int rssi);  

3)添加算法相關的頭文件(simpleBLEPeripheral.c中)
  1. #include <math.h>  
  2. #include "stdio.h"  

七、實驗結果

用app連接CC2541時,能打印出RSSI與距離


由於更新太慢,因此需要app端不斷地發送數據,這樣才能快速更新:



可以看到更新RSSI與距離的頻率明顯增快。

因此,粗略用RSSI測距實驗成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章