nRF52实践:蓝牙BLE学习的阶段性总结

·  阅读 45

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

标题强调的是“阶段性总结”,可能会继续研究,也可能暂时告一段落,因此,抓紧时间总结一下,好给自己一个交代。

今年2月份开始决定研究蓝牙,年初给自己定的目标有 LiteOS、分布式方面,但因时制宜先着手研究了BLE,——不让自己空闲就好。到了年中,时间过去了近4个月,花在蓝牙的时间不多,但好歹也算入了个门。毕竟要忙工作,忙于买菜带娃等生活琐事。因此写写流水账,记录一下。

购买板子之后就没有下一步了,连demo也没跑。一个月时间后,后来突然想起来有这事,但不知是大锤还是大妞把一些配件弄丢了。于是又买了块板子,顺便把配件凑齐了,有了2块板子可以同时研究主从机的开发。

不知是不是传统,某宝上卖开发板的都不包邮,哪怕花了近300块大洋,反而买电源降压板、钮扣电池都包邮。技术支持在页面介绍上是非常好的,但当我看到源码包里包含大量的编译中间文件时,又降低了我的预期。我想找个入门的文档,即介绍板子的功能模块或按键或开关之类的,但找不到,从略显杂而全的众多文档、代码中搜索,找出了有用的信息,再记录,终于有了一点认识。我一般是让自己对整体框架、硬件资源有个直观认识,再逐步深入研究,毕竟各人的研发习惯不同。

说到这,不得不顺便提一下这几年积累下来的习惯。

一般地,我会单独做一个相关的专项笔记系列,分类记录,比如板子的基本情况,包括板子截图,模块,使用注意事项。比如开发环境搭建过程,包括编辑、编译、烧写等事项。比如开发手记,包括实现功能的记录。至于代码方面,则必须使用 git 仓库管理,必须上推送到远程仓库。

开始前,在网上看了些入门的帖子,当然厂商自带的资料也看了,但那些资料不是主要参考来源。前期准备工作完毕,就真正着手开发了。

首先搭建环境,在此过程走了点弯路,先是搞了 nRF Connect 的开发环境,但看了开发的代码,感觉太复杂了,于是切换成旧的 SDK。之后用官方的LED示例,编译烧写,竟然成功了。又看了一些厂家开源的demo,发现和官方SDK类似度很高,个人感觉,很多 nrf52832 板子,可以拿官方SDK的代码直接编译就能使用了,——至少笔者使用过的例子就如是。

接着研究按键和LED,SDK例程代码使用了定时器实现了LED操作和按键检测,熟悉了接口后,参考例程代码,保持算法机制不变,另外实现了一套控制代码,根据按键的操作来决定LED流水的速度和方向等。这其中,让大锤和大妞参与进来,主要负责提需求,我充当系统分析角色,因为实际上肯定是我来引导他们兄妹的。 为了让大锤对二进制有直观的认知,而板子上恰好有四个LED灯,于是实现了二进制LED灯演示功能,将0~15转换成二进制,映射到四个LED上,哪个比特为1则相应的灯亮,再让大锤用1和0依次记录。原则是以玩促学,所以以玩为主,即知道按哪个键,灯是向左边动,按哪个键灯流动的速度快,至于是不是学习了,不作要求。

接着研究温度数据获取,因为有示例,所以并不复杂,但因为涉及 BLE 协议,起初是直接用寄存器读取,失败,后改为带sd开关的接口才成功。从中也深刻认识到外设的接口调用,与是否带 BLE 协议有密切关系。

接着研究 flash 方面,深刻体会到 BLE 回调机制。开始时,在 BLE 事件回调函数中保存 flash,不成功,后加标志,在主函数循环中判断标志,再写 flash,这样才成功。

接着研究自定义 GATT 服务,基于 SDK 的 NUS 示例实现。除了收发数据外,还加了一个通道发温度数据,但是在测试 BLED 传输性能方面却遇到大问题。因为抓包环境只成功过一两次,无法分析包,只能靠打印包号和未时来判断,经过摸索,发现时间间隔和包的数量成反比,定时2毫秒最多能发40个字节,定时1秒可达100字节。至于耗时,大部分的包耗时几毫秒,但间隔若干包就会出现数十毫秒的耗时。这过程花费了大量时间,也消磨了信心,最后没有解决实时性发送数据问题,暂时挂起。花那么多时间,但没实质进展,肯定是哪里出问题,在没有足够知识存备情况,暂停是较好的方法。

于是找了看门狗和电压这种简单的外设下手,同样有示例代码,只需封装接口即可。BLE 有电池服务器,传输的是电量百分比,这个功能在真正产品中肯定要实现的,原理是根据电压转换成电量百分比,为了测试电量实际的百分比,又在某宝上买了块CR2032电池,但放到板子上发现LED灯都不亮,无法启动,于是作罢。

另外,初步研究了 MPU6050,网上资料很多,但自己实操起来却是另一番景象。打通寄存器读写数据是很简单的,确认好读写地址就行。但是,读到的数据变化十分频繁,稍动一下板子数据就乱跳。后来做了零点校准,再转换成单位,就比较正常了。还顺带学习了弧度和角速度,右手坐标,还尝试看飞行控制理论,但实在复杂,人到中年,脑子不灵光了,于是放弃。后来参考网上帖子做了个重力流水灯,因为写错了反余弦函数,搞了很久,但最后成功了,可以根据板子倾斜的方向和角度控制流水灯的方向和速度。幸好当初买了2块板子,否则不够分又得打架了,兄妹俩一人一块,玩得不亦乐乎,但两天过后就不愿意玩了。

结合看,研究或实现了的功能有:按键及LED、温度、flash、自定义服务、看门狗、电压,重力传感器,等等。至此,也差不多完结了。

对于新手而言,一定不能急,官方的资料是最好的,慢慢来是最快的方法。开始时,看到BLE有大量的概念,一时不知如何下手,但花些时间多看几次,也会有了解。另外一点,要清楚自己研究的定位,我是偏向软件方面的,硬件方面略过不看,但因代码实现涉及的,则去了解,总之是以实用功能驱动学习。像 BLE 扫描和搜索,回调机制,以及定时器等,都是在实现某些功能时,去看源码,再加上日志调试观察流程,了解大概原理,顺便补充理论知识,像环形缓冲,队列等,有待后续再研究了。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改