【BLE】CC2541之通过RSSI测距

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文介绍如何在SimpleBLEPeripheral工程中,通过RSSI粗略测距。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

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


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:

1)《CC2541之串口收发》:http://blog.csdn.net/feilusia/article/details/47431659

2)《CC2541之RSSI》:http://blog.csdn.net/feilusia/article/details/48628203


五、基础知识

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、修改RSSI回调函数(simpleBLEPeripheral.c中

//******************************************************************************            
//name:             simpleBLEPeripheralRssiCB            
//introduce:        RSSI回调函数           
//parameter:        newRSSI:接收信号强度        
//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的数值放大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");     
} 


2、添加RSSI测距的算法函数

1)写一个RSSI测距的算法函数(simpleBLEPeripheral.c中)

//******************************************************************************            
//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中)
static float GUA_CalcDistByRSSI(int rssi);

3)添加算法相关的头文件(simpleBLEPeripheral.c中)

#include <math.h>
#include "stdio.h"

七、注意事项

手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:

方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。


八、实验结果

用app连接CC2541时,能打印出RSSI与距离


由于更新太慢,因此需要app端不断地发送数据,这样才能快速更新:



可以看到更新RSSI与距离的频率明显增快。

因此,粗略用RSSI测距实验成功。


  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值