【BLE】CC2541之通过RSSI测距

本篇博文最后修改时间:2016年11月11日,09:21。


一、简介

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


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

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


版权声明

博主:si_zhou_qun_84342712

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

原文地址: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中)

  1. //******************************************************************************              
  2. //name:             simpleBLEPeripheralRssiCB              
  3. //introduce:        RSSI回调函数             
  4. //parameter:        newRSSI:接收信号强度          
  5. //return:           none            
  6. //author:           甜甜的大香瓜       
  7. //email:            [email protected]     
  8. //changetime:       2016.04.09           
  9. //******************************************************************************   
  10. static void simpleBLEPeripheralRssiCB( int8 newRSSI )    
  11. {    
  12.     float nfDist = GUA_CalcDistByRSSI(newRSSI);         //通过算法获得r,单位为m  
  13.     int nDist = (int)(nfDist * 100);                    //将r的数值放大100倍,单位为cm  
  14.     uint8 nBuf[3] = {0};  
  15.       
  16.     //将浮点型数据转为整型,便于发送串口  
  17.     nBuf[0] = nDist/100;        //百位  
  18.     nBuf[1] = (nDist%100)/10;   //十位      
  19.     nBuf[2] = nDist%10;         //个位  
  20.   
  21.         
  22.     //输出RSSI,用10进制表示    
  23.     NPI_PrintValue("RSSI:-", (uint8) (-newRSSI), 10);    
  24.     NPI_PrintString("dB\r\n");    
  25.   
  26.     //输出距离  
  27.     NPI_PrintString("DIST:");     
  28.     NPI_PrintValue("", nBuf[0], 10);    
  29.     NPI_PrintValue("", nBuf[1], 10);  
  30.     NPI_PrintValue("", nBuf[2], 10);       
  31.     NPI_PrintString("cm\r\n");     
  32.     NPI_PrintString("\r\n");       
  33.     NPI_PrintString("\r\n");       
  34. }   


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

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

  1. //******************************************************************************              
  2. //name:             GUA_CalcDistByRSSI              
  3. //introduce:        通过RSSI计算距离             
  4. //parameter:        rssi:接收信号强度          
  5. //return:           距离            
  6. //author:           甜甜的大香瓜       
  7. //email:            [email protected]     
  8. //changetime:       2016.04.09           
  9. //******************************************************************************   
  10. static float GUA_CalcDistByRSSI(int rssi)    
  11. {    
  12.     uint8 A = 59;  
  13.     float n = 3.0;  
  14.       
  15.     int iRssi = abs(rssi);    
  16.     float power = (iRssi-A)/(10*n);         
  17.     return pow(10, power);    
  18. }   

2)声明RSSI测距的算法函数(simpleBLEPeripheral.c中)
  1. static float GUA_CalcDistByRSSI(int rssi);  

3)添加算法相关的头文件(simpleBLEPeripheral.c中)
  1. #include <math.h>  
  2. #include "stdio.h"  

七、实验结果

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


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



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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章