TA的每日心情 | 开心 2017-5-15 14:59 |
---|
签到天数: 8 天 连续签到: 1 天 [LV.3]偶尔看看II
|
概述:
作为可穿戴芯片,首先应该能完成的就是计步服务。CurieIMU库提供了计步功能的函数,BLE GATT服务里也提供了 "Running Speed and Cadence" (跑步速度与节奏) 服务,但具体如何把IMU和BLE结合起来,完成一个完整的计步服务,例程里并没有。本帖提供一个完整的,结合IMU和BLE的计步服务。
图:达到的效果
目的:
使用CurieNano,编写使用IMU计步,使用BLE传输数据的程序。并使用手机APP NRF toolbox显示计步数据。
需要:
硬件需要:CurieNano、手机
软件需要:Arduino 101 2.x+库、NRF toolbox(一款手机上的多功能BLE服务获取APP)
知识储备:查询GATT服务、使用CurieNano编写GATT服务
下载NRF toolbox可以去奈何大大的帖子:http://www.arduino.cn/thread-22901-1-1.html
编写CurieNano的GATT服务可以参考我的帖子:【CurieNano教程1】教你查询GATT并编写相关BLE服务:https://www.cirmall.com/bbs/thread-95296-1-1.html
编程思路:
1、使用IMU完成计步
使用IMU计步非常简单,只需要调用现成的函数。首先,在setup()函数里,需要初始化设置CurieIMU为计步模式:- CurieIMU.begin();
- CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
- CurieIMU.setStepCountEnabled(true);
复制代码 然后CurieIMU就会自动完成计步,你随时可以调用以下函数获取当前累计步数:仅仅获取累计步数是不行的,因为接下来我们会看到BLE RSC服务需要传送的数据是“每分钟步数”,我们设法在Curie上完成这个数据的计算。方法很简单,每4分钟运行一次loop函数,获取新的步数并减去旧的步数,得到4秒内计步的数值。然后乘以15,就是每分钟步数。
2、查询计步相关的GATT服务
BLE计步服务是 "Running Speed and Cadence" (RSC) ,蓝牙官网对该服务描述请参考:
https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.service.running_speed_and_cadence.xml
如果不明白如何查询GATT服务,或查到了不知道如何编写相应的Arduino程序,可以参考我的这篇帖子:
【CurieNano教程1】教你查询GATT并编写相关BLE服务:https://www.cirmall.com/bbs/thread-95296-1-1.html
我们看到,在RSC服务提供了众多服务数据,包括行走速度、每步长度、每分钟步数等。因为我们只有Curie自带的加速度计陀螺仪,无法测出这么多数据,因此我们只计算每分钟步数,其他数据统统置0。
仔细阅读RSC服务的要求后,得到编程思路如下:程序要建立一个UUID为0x1814的RSC服务、一个UUID为0x2A53的CSC Measurement特征、一个UUID为0x2A54的CSC Feature特征。其中CSC Feature特征包括2字节,我们让它恒为0。CSC Measurement特征包括4字节(最短情况下):第一字节为控制字符Flags,我们让它恒为0;中间2字节是行走速度,我们让它恒为0;后1字节是每分钟步数,我们使用计算出的每分钟步数数据,不断地更新它。
代码:- #include <CurieIMU.h>
- #include <CurieBLE.h>
- BLEPeripheral blePeripheral;
- // Running Speed and Cadence (RSC) 服务: UUID=1814
- // 完整的RSC服务字段描述请见 https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.rsc_measurement.xml
- BLEService RSC("1814");
- // RSC Feature 特征:UUID=2A54,Property=Read,数据长度=2 (因此直接使用Short类型)
- BLEShortCharacteristic RSCFeature("2A54", BLERead);
- // RSC Measurement 特征:UUID=2A53,Property=Notify,数据长度=4Byte
- BLECharacteristic RSCMeasure("2A53", BLENotify , 4);
- void setup() {
- // 初始化BLE
- blePeripheral.setLocalName("Curie");
- blePeripheral.setAdvertisedServiceUuid(RSC.uuid());
- blePeripheral.addAttribute(RSC);
- blePeripheral.addAttribute(RSCFeature);
- blePeripheral.addAttribute(RSCMeasure);
- blePeripheral.begin();
- RSCFeature.setValue(0);
- // 初始化IMU为计步模式并开始计步
- CurieIMU.begin();
- CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
- CurieIMU.setStepCountEnabled(true);
- }
- // 每 INTERVAL 秒,BLE发送一次数据
- #define INTERVAL 4
- void loop() {
- // RSC Measurement 特征 的4Byte发送缓冲区
- static uint8_t data[4] = {0,0,0,0};
- // 上一次计步的步数,即INTERVAL秒前的计步步数
- static uint32_t lastStepCnt=0;
- // 每分钟步数
- static uint8_t spm;
- // 每分钟步数 = (此次计步步数-INTERVAL秒前的计步步数) * 每分钟60秒 / INTERVAL
- spm = (CurieIMU.getStepCount() - lastStepCnt) * 60 / INTERVAL;
-
- lastStepCnt = CurieIMU.getStepCount();
- // 根据RSC的字段描述
- // RSC Measurement 特征的第三字节为每分钟步数
- // 在仅有加速度计陀螺仪的情况下,仅能完成计步
- // 而其他字段,Curie缺乏相关传感器无法测量,因此保持为0
- data[3] = spm;
-
- // 更新RSC Measurement
- RSCMeasure.setValue(data,4);
- // 等待INTERVAL秒
- delay(INTERVAL*1000);
- }
复制代码 程序测试:
首先,你需要一个装有NRF toolbox的手机,下载NRF toolbox可以去奈何大大的帖子:http://www.arduino.cn/thread-22901-1-1.html
上传代码到CurieNano后,打开NRF toolbox,点击RSC,在下方点击Connect,选择"Curie"进行连接,然后带着CurieNano走几步路,就可以看到手机屏幕上的计步数据更新。
图:程序测试流程
|
|