CC2541通过RSSI测距详细图文教程
一、简介 本文介绍如何在SimpleBLEPeripheral工程中,CC2541通过RSSI粗略测距。
二、实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:Smart RF(主芯片CC2541)
三、转载:http://blog.csdn.net/feilusia
四、基础知识 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。
五、实验前提
在进行本文步骤前,请先完成以下两篇博文的步骤: 1、《CC2541之串口收发》:http://blog.csdn.net/feilusia/article/details/47431659 2、《CC2541之RSSI》:http://blog.csdn.net/feilusia/article/details/48628203
六、代码修改 1、修改RSSI回调函数(simpleBLEPeripheral.c中) //******************************************************************************
//name: simpleBLEPeripheralRssiCB
//introduce: RSSI回调函数
//parameter: newRSSI:接收信号强度
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016
//******************************************************************************
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("dBrn");
//输出距离
NPI_PrintString("DIST:");
NPI_PrintValue("", nBuf[0], 10);
NPI_PrintValue("", nBuf[1], 10);
NPI_PrintValue("", nBuf[2], 10);
NPI_PrintString("cmrn");
NPI_PrintString("rn");
NPI_PrintString("rn");
}
2、添加RSSI测距的算法函数1)写一个RSSI测距的算法函数(simpleBLEPeripheral.c中)
[cpp] view plain copy
[/url][url=https://code.csdn.net/snippets/1640124/fork]
- //******************************************************************************
- //name: GUA_CalcDistByRSSI
- //introduce: 通过RSSI计算距离
- //parameter: rssi:接收信号强度
- //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测距的算法函数(simpleBLEPeripheral.c中)
[cpp] view plain copy
[/url][url=https://code.csdn.net/snippets/1640124/fork]
- static float GUA_CalcDistByRSSI(int rssi);
3)添加算法相关的头文件(simpleBLEPeripheral.c中)
[cpp] view plain copy
[/url][url=https://code.csdn.net/snippets/1640124/fork]
- #include
- #include "stdio.h"
七、实验结果
用app连接CC2541时,能打印出RSSI与距离
由于更新太慢,因此需要app端不断地发送数据,这样才能快速更新:
可以看到更新RSSI与距离的频率明显增快。 因此,粗略用RSSI测距实验成功。
|