本篇博文最後修改時間:2016年11月11日,09:21。
一、簡介
本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。
二、實驗平臺
協議棧版本:BLE-CC254x-1.4.0
編譯軟件:IAR 8.20.2
硬件平臺:Smart RF(主芯片CC2541)
三、版權聲明
聲明:喝水不忘挖井人,轉載請註明出處。
原文地址: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中)
- //******************************************************************************
- //name: simpleBLEPeripheralRssiCB
- //introduce: RSSI回調函數
- //parameter: newRSSI:接收信號強度
- //return: none
- //author: 甜甜的大香瓜
- //email: [email protected]
- //changetime: 2016.04.09
- //******************************************************************************
- static void simpleBLEPeripheralRssiCB( int8 newRSSI )
- {
- float nfDist = GUA_CalcDistByRSSI(newRSSI); //通過算法獲得r,單位爲m
- int nDist = (int)(nfDist * 100); //將r的數值放大100倍,單位爲cm
- uint8 nBuf[3] = {0};
- //將浮點型數據轉爲整型,便於發送串口
- nBuf[0] = nDist/100; //百位
- nBuf[1] = (nDist%100)/10; //十位
- nBuf[2] = nDist%10; //個位
- //輸出RSSI,用10進製表示
- NPI_PrintValue("RSSI:-", (uint8) (-newRSSI), 10);
- NPI_PrintString("dB\r\n");
- //輸出距離
- NPI_PrintString("DIST:");
- NPI_PrintValue("", nBuf[0], 10);
- NPI_PrintValue("", nBuf[1], 10);
- NPI_PrintValue("", nBuf[2], 10);
- NPI_PrintString("cm\r\n");
- NPI_PrintString("\r\n");
- NPI_PrintString("\r\n");
- }
1)寫一個RSSI測距的算法函數(simpleBLEPeripheral.c中)
- //******************************************************************************
- //name: GUA_CalcDistByRSSI
- //introduce: 通過RSSI計算距離
- //parameter: rssi:接收信號強度
- //return: 距離
- //author: 甜甜的大香瓜
- //email: [email protected]
- //changetime: 2016.04.09
- //******************************************************************************
- static float GUA_CalcDistByRSSI(int rssi)
- {
- uint8 A = 59;
- float n = 3.0;
- int iRssi = abs(rssi);
- float power = (iRssi-A)/(10*n);
- return pow(10, power);
- }
2)聲明RSSI測距的算法函數(simpleBLEPeripheral.c中)
- static float GUA_CalcDistByRSSI(int rssi);
3)添加算法相關的頭文件(simpleBLEPeripheral.c中)
- #include <math.h>
- #include "stdio.h"
七、實驗結果
用app連接CC2541時,能打印出RSSI與距離
可以看到更新RSSI與距離的頻率明顯增快。
因此,粗略用RSSI測距實驗成功。