BLE】CC2541之通过RSSI测距
本篇博文最后修改時(shí)間:2017年01月06日,11:06。
?
一、簡(jiǎn)介
本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測(cè)距。
?
二、實(shí)驗(yàn)平臺(tái)
協(xié)議棧版本:BLE-CC254x-1.4.0
編譯軟件:IAR 8.20.2
硬件平臺(tái):Smart RF(主芯片CC2541)
?
?
三、版權(quán)聲明
?
博主:甜甜的大香瓜
聲明:喝水不忘挖井人,轉(zhuǎn)載請(qǐng)注明出處。
原文地址:http://blog.csdn.NET/feilusia
聯(lián)系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
香瓜單片機(jī)之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
?
四、實(shí)驗(yàn)前提
1、在進(jìn)行本文步驟前,請(qǐng)先閱讀以下博文:
暫無
?
2、在進(jìn)行本文步驟前,請(qǐng)先實(shí)現(xiàn)以下博文:
1)《CC2541之串口收發(fā)》:http://blog.csdn.net/feilusia/article/details/47431659
2)《CC2541之RSSI》:http://blog.csdn.net/feilusia/article/details/48628203
?
五、基礎(chǔ)知識(shí)
1、通過RSSI測(cè)距的公式是什么?
答:
其中,
1)P:當(dāng)前RSSI。
2)A:主從機(jī)1米距離時(shí)的RSSI。
3)n:傳播因子,與溫度、濕度等環(huán)境相關(guān)。
4)r:當(dāng)前距離。
?
2、上述公式如何使用?
答:
上述的公式A與n都是變化的,按理說在不同的主機(jī)、環(huán)境的測(cè)距開始前,都需要校準(zhǔn)A、變換n后才能正常使用公式。
但本篇采用的粗略方法是:
1)app連接CC2541,讀出1米時(shí)的RSSI約為-59dB,則將代碼中公式中的A定為-59dB。
2)百度發(fā)現(xiàn)常用的n有一個(gè)范圍,選了一個(gè)常用的傳播因子3.0。
這樣,就能粗略地得P與r的一一對(duì)應(yīng)關(guān)系。
?
3、RSSI更新很慢,導(dǎo)致測(cè)出的距離更新也很慢,如何解決?
答:
由于RSSI是主從機(jī)通信過程產(chǎn)生的,因此需要主從機(jī)不停地進(jìn)行數(shù)據(jù)通信后,RSSI才能得到更新。
實(shí)測(cè):從機(jī)發(fā)往主機(jī)的數(shù)據(jù),無法更新從機(jī)端的RSSI。
需要主機(jī)端主動(dòng)發(fā)送數(shù)據(jù)給從機(jī),從機(jī)才能快速更新RSSI。
?
六、實(shí)驗(yàn)步驟
1、修改RSSI回調(diào)函數(shù)(simpleBLEPeripheral.c中)
?
//******************************************************************************
//name: simpleBLEPeripheralRssiCB
//introduce: RSSI回調(diào)函數(shù)
//parameter: newRSSI:接收信號(hào)強(qiáng)度
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.09
//******************************************************************************
static void simpleBLEPeripheralRssiCB( int8 newRSSI )
{
float nfDist = GUA_CalcDistByRSSI(newRSSI); //通過算法獲得r,單位為m
int nDist = (int)(nfDist * 100); //將r的數(shù)值放大100倍,單位為cm
uint8 nBuf[3] = {0};
//將浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)為整型,便于發(fā)送串口
nBuf[0] = nDist/100; //百位
nBuf[1] = (nDist%100)/10; //十位
nBuf[2] = nDist%10; //個(gè)位
//輸出RSSI,用10進(jìn)制表示
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");
}
?
?
2、添加RSSI測(cè)距的算法函數(shù)
1)寫一個(gè)RSSI測(cè)距的算法函數(shù)(simpleBLEPeripheral.c中)
?
//******************************************************************************
//name: GUA_CalcDistByRSSI
//introduce: 通過RSSI計(jì)算距離
//parameter: rssi:接收信號(hào)強(qiáng)度
//return: 距離
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//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測(cè)距的算法函數(shù)(simpleBLEPeripheral.c中)
3)添加算法相關(guān)的頭文件(simpleBLEPeripheral.c中)
?
?
#include <math.h>
#include "stdio.h"
?
七、注意事項(xiàng)
手機(jī)可能緩存了之前的代碼(在更新過CC2541的代碼之后,都需要清除手機(jī)端的緩存!!!),因此要清除緩存,清除緩存的方法如下:
方法一:關(guān)閉app、關(guān)閉藍(lán)牙總開關(guān)、打開藍(lán)牙總開關(guān)、打開app。
方法二:手機(jī)重啟。
?
?
八、實(shí)驗(yàn)結(jié)果
用app連接CC2541時(shí),能打印出RSSI與距離
由于更新太慢,因此需要app端不斷地發(fā)送數(shù)據(jù),這樣才能快速更新:
可以看到更新RSSI與距離的頻率明顯增快。
因此,粗略用RSSI測(cè)距實(shí)驗(yàn)成功。
總結(jié)
以上是生活随笔為你收集整理的BLE】CC2541之通过RSSI测距的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nrf51822-提高nordic bl
- 下一篇: 事件控制寄存器(AFIO_EVCR) (