欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

BLE】CC2541之通过RSSI测距

发布时间:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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测距实验成功。

    总结

    以上是生活随笔为你收集整理的BLE】CC2541之通过RSSI测距的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。