家门电子值守
作者:cruelfox
一、作品简介
作品名称:家门电子值守。设想是使用RSL10搭配低功耗的加速度传感器,贴于门板的背面,通过采集加速度信息,检测敲门引起的门板振动和开门引起的门板加速运动,从而对敲门和开门的事件进行记录。RSL10的BLE功能实时将状态信息发送给BLE终端机,可以进行日志查看,还可以实现对其它电子设备的操控,例如拓展出无线门铃、入侵报警等功能。
二、系统框图
作品包括贴于门板后面的无线传感单元(使用RSL10-COIN-GEVB开发板)和可移动使用的BLE终端机(使用RSL10-QFN-EVB开发板)两部分。无线传感单元是从机,使用3V纽扣电池供电;BLE终端机是主机,可用小型磷酸铁锂供电,也可以通过USB供电。
无线传感单元通过RSL10-COIN-GEVB预留I2C接口连接一只KX023三轴加速度传感器。
BLE终端机通过RSL10-QFN-EVB 的Arduino接口连接扩展PCB,其上有一个I2C接口的96x64单色图形液晶模块用于信息显示;还有6个按钮直接连在GPIO上用于操控。
无线传感单元与BLE终端机通过BLE连接进行信息交互。
三、各部分功能说明
无线传感单元启动后以50Hz采样率采集三轴加速度信号,并通过KX023内置的信号处理功能产生”DoubleTap”状态标志。RSL10软件通过Z轴加速度信号处理,识别开门动作,并直接读取KX023的”DoubleTap”检测结果作为敲门判断。加速度信号采集是24小时不间断工作的,BLE功能也是持续开启。当没有与BLE终端机连接时,它处于连续广播状态(1500ms间隔)。当BLE终端机扫描到设备并发起连接后,两者一直处于连接状态(400ms间歇),除非通信故障或一方掉电。
BLE终端机启动后将自动扫描无线传感单元,并主动发起连接。连接成功后将获得目标设备的内部时间日期信息,并提供修改日期时间的操作界面。然后,BLE终端机显示当前最新的事件(开门和敲门)信息记录,并可以浏览目标设备内存储的最多达1024条事件记录。
BLE终端机的工作模式状态转移图如下:
无线传感单元使用了一个自定义的BLE服务,包含两个Characteristic, 其中一个用于向终端传送日志记录(每条4字节,一次传输4条);另一个用于向终端发送状态信息(8字节,使用Notify方式),和接收终端发来的命令。
无线传感单元的省电模式尤其重要,因为它要一直处于数据采集和处理状态,且无线通信是一直开启的,节省任何部分的耗电都关系到电池工作时间。因为KX023传感器有内部少量的缓存,在50Hz 数据速率下最多可以存储0.8秒的16-bit三轴加速度数据,只要RSL10的唤醒周期小于这个时间即可保证不丢失数据。本设计中,无线传感单元的RSL10主要工作在Sleep模式,也就是将它在不需要工作的时候的电流降到最低。通过RTC定时唤醒进行传感器数据访问和BLE操作,定时器的设置由BLE SDK函数自动完成,软件不直接干预,仅仅是读取了RTC的计数器值用于软件计时(因为没有硬件日历时钟功能)。
通过功耗优化处理,无线传感单元的持续工作平均电流大约是30微安(包括KX023的工作电流11微安左右,包括COIN板上的温度传感器吃掉2微安)。BLE广播模式下平均电流比连接状态下稍小一些,是无线部分工作时间减少所致。
在对BLE无线终端进行功耗优化时遇到障碍,因为RSL10若即使用到Standby模式,连接成功后却无法正常通信。最后只让其在普通模式下工作,RSL10有700~800微安的工作电流。不过无线终端是用户界面,不用一直开机。
四、作品源码
如论坛帖子附件上传。
从机和主机程序分别在SDK的 peripheral_server_sleep 和 central_client_uart两个例子的基础上进行开发。程序框架没有改变,都是基于Event Kernel 消息驱动的。
代码使用GNU Makefile 进行工程组织,使用arm-none-eabi-gcc工具链进行编译。无线传感单元和BLE终端机的代码目录分别在home_mon和central子目录下。
五、作品功能演示视频
上传至 EE 大学堂: https://training.eeworld.com.cn/course/6120
用贴在门后的加速度传感单元(RSL10+KX023)检测振动和运动,实现开门和敲门的事件检测,并通过BLE与终端机进行信息交互,在手持终端机上实现日志查看。
手持终端机也是RSL10实现的。开机后自动扫描目标设备并连接,连接后获取设备的时间日期信息(此时可以修改),然后进入日志界面。
视频中第一次敲门没有检测成功。
六、项目总结
这个项目终于草草地收尾了——实在时间来不及完善了。本来计划了无线门铃的功能,PCB上都安排了蜂鸣器,没来得及软件里把功能做进去。虽然比起初的时间表延长了两周时间,没料到后面做LCD 界面功能做到了最后一刻。
RSL10 BLE部分上手挺不容易的,前期就因为程序结构没有看懂,拖了进度。这部分文档缺少了,虽然我曾写过BLE应用的程序,也没有理解那么透,就捉襟见肘了。
帖子分享汇总:
敲门事件和开门动作的检测
https://bbs.eeworld.com.cn/thread-1171117-1-1.html
RSL10的I2C操作与KX023加速度测量数据读取
https://bbs.eeworld.com.cn/thread-1170822-1-1.html
RSL10的低功耗模式
https://bbs.eeworld.com.cn/thread-1170349-1-1.html
关于RSL10 SDK中Event Kernel部分的代码分析(下)
https://bbs.eeworld.com.cn/thread-1168940-1-1.html
关于RSL10 SDK中Event Kernel部分的代码分析(上)
https://bbs.eeworld.com.cn/thread-1168457-1-1.html
SDK BLE范例工程的命令行编译(HeartRate设备)
https://bbs.eeworld.com.cn/thread-1164617-1-1.html
SDK范例工程的命令行编译(blinky)
https://bbs.eeworld.com.cn/thread-1164611-1-1.html
RSL10的片上内存资源
https://bbs.eeworld.com.cn/thread-1164147-1-1.html
RSL10开发板电路概览
https://bbs.eeworld.com.cn/thread-1163113-1-1.html
七、其他
|