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测距相关推荐
- 基于RSSI测距的多边定位法(附代码与讲解视频)
基于RSSI测距的多边定位法 (一)实验目的 (二)实验内容 1.RSSI测距原理 2.多边定位法 (三)实验结果 (四)结果分析 (五)心得体会 (六)附录 1.Python代码: 2.B站讲解视频 ...
- ESP32 BLE 学习:关于 RSSI 与发射功率
ESP32 BLE 学习:关于 RSSI 与发射功率 文章目录 ESP32 BLE 学习:关于 RSSI 与发射功率 蓝牙发射功率 RSSI(接收的信号强度指示) API 函数设置和获取 发射功率 蓝 ...
- 基于jupyter notebook的python编程-----通过python编程实现RSSI测距定位技术仿真
基于jupyter notebook的python编程-----通过python编程实现RSSI测距定位技术仿真目录 一.RSSI测距定位简介 1.什么是RSSI测距定位 2.RSSI测距定位优点 3 ...
- Matlab2013学习之四种定位技术(TOA、TDOA、RSSI测距、RSSI指纹)
首先,这几种定位是跟着老师提供的思路做的,对于将其修改成python语言,还没有完成. 至于各种定位原理,有太多人介绍了,就不逐一介绍了. 文章目录 一.TOA定位算法性能仿真 1.1.toa定位要求 ...
- rssi室内定位算法原理_一种基于RSSI测距的室内定位方法与流程
本发明涉及室内定位领域,尤其涉及一种基于RSSI测距的室内定位方法. 背景技术: : 室内无线定位,是指利用无线网络和定位终端提供待测节点位置.速度和方向等相关信息的服务.对于一个定位算法而言,评价其 ...
- rssi测距原理及公式
作为一种全新的信息获取和处理方式,无线传感器网络可以应用在广泛的领域内实现复杂的大规模监测和追踪任务,而网络自身的定位是大多数应用的基础.基于距离的定位是通过测量节点间距来实现的.利用RSSI测距只需 ...
- rssi算法c语言,CC2640R2F学习笔记(21)——通过RSSI测距
一.背景 1.1 通过RSSI测距公式 D = D0 * 2^((X0 – X)/K) 其中, 1)D:当前距离. 2)D0:校准距离(如2米时值为2000). 3)X0:校准RSSI(主从机2米距离 ...
- 蓝牙钥匙解决方案 BLE RSSI 测距
1.理论公式 RSSI计算距离的公式原理为d = 10 ^ ( RSSI – A ) / ( 10 * n ) a) d为车辆与被计算目标节点之间的距离数值 b ...
- 【IoT】TI BLE CC2541 串口控制蓝牙详解
一.简介 本文以SimpleBLECentral工程为例,介绍串口控制蓝牙. 过程: 扫描从机 - 根据从机号连接指定从机 - 获取RSSI值(信号强度) - 向char1写入特征值 - 断开连接 二 ...
最新文章
- 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用
- Django项目实战前要做的事情
- Spring事务配置的五种方式 说明
- android console命令,我们可以通过两种方式进入Android的console: 1. 直接执行命令emulator -shell; 2....
- 数据用压缩 bcd 码 java_IT职场新人选python,go还是java?用数据来说话
- 5 年之后,产品经理,没了?
- java运行显示“找不到或无法加载主类”的解决办法(linux)
- 【重磅分享】从零到一搭建推荐系统指南白皮书.pdf(附48页下载链接)
- windows10连接小米耳机Redmi AirDots 2
- 如何对matlab .m代码文件进行加密
- 模糊c均值聚类及python实现
- EDP to LVDS转换设计电路|EDP to LVDS转接板电路|Capstone/CS5211芯片电路原理图参考
- .net接入微信二维码支付(模式二)
- 那些年的java游戏_那些年我们曾经玩过的游戏,你还记得几个
- 世纪难题,当Python爬虫遇到短信验证码如何处理?
- linux 读卡器信息,Linux如何使用笔记本自带的SD/MMC读卡器
- 正余弦函数的matlab仿真,实现正余弦信号的算法比较
- 《你曾说,你喜欢篮球》
- 数据结构课程设计报告-职工信息管理系统
- BAD_POOL_CALLER蓝屏故障
热门文章
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
- Vue_error Expected indentation of 2 spaces but found 3 indent问题整理
- Java 洛谷 P1008 三连击
- Hibernate实现limit查询报错 unexpected token: ? near line 1, column 30 [from cn.com.bean.Layer limit ? ,
- 如何去除小数点后面多余的0_704密封胶如何使用?怎么样去除多余的704密封胶?...
- 学校机房项目交换机的配置
- 在linux下创立bash文件,Linux文件管理及bash特性
- python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...
- 成功解决在excel表格中仅在某列内插入一个空白单元格,使其下部的数据整体下移一格
- AI之Robot:带你玩转机器人DIY机器人——让你成为机器人的真正主人