实现敲击功能,单击,双击,三击,分别打印相应Log

app gsensor status
app gsensor on
app gsensor off
跳线帽记得接上。




LIS2DW12 三轴 G-Sensor 敲击检测
已实现功能
板载 ST LIS2DW12 的单击、双击和三击检测已经接入 `bt_watch`。设备启动后,
传感器服务自动打开加速度采样,不需要额外执行 shell 命令。
串口或 USB CDC 日志示例:
```text
gsensor LIS2DW12 tap detector ready
gsensor TAP_SINGLE
gsensor TAP_DOUBLE
gsensor TAP_TRIPLE
```
日志分别表示单击、双击、三击。默认开启,也可以使用以下命令:
| 命令 | 作用 |
| --- | --- |
| `app gsensor status` | 查看敲击检测是否开启 |
| `app gsensor off` | 关闭敲击检测日志 |
| `app gsensor on` | 重新开启检测,清除未完成的手势 |
开关只控制本次运行的敲击检测,下次启动恢复默认开启。加速度采样仍由原有运动
算法管理;关闭敲击检测不会关闭计步、抬腕等算法使用的传感器。
板级连接和数据流程
当前 ATS3089P 板级配置已经存在,不需要新增设备树节点:
| 信号 | 引脚/配置 |
| --- | --- |
| I2C SCL | GPIO55,I2CMT1 |
| I2C SDA | GPIO56,I2CMT1 |
| INT1 | GPIO54 |
| 7 位 I2C 地址 | `0x19` |
| 加速度寄存器 | `0x28` 起始,6 字节 XYZ |
| 芯片 ID | `WHO_AM_I 0x0F = 0x44` |
工程原有的 `CONFIG_SENSOR_ACC_LIS2DW12=y` 和 `CONFIG_SENSOR_MANAGER=y` 已启用。
启动流程为:`sensor_service` 初始化自定义 LIS2DW12 HAL,Cywee 运动算法请求
加速度后,I2CMT1 以约 20 ms 周期读取三轴数据,`algo_port.c` 在送入运动算法
前把同一份数据交给敲击检测器。
检测规则
检测器先计算三轴加速度幅值平方,不限定在 X/Y/Z 某一个轴上敲击:
```text
amplitude² = ax² + ay² + az²
```
当前参数如下:
| 参数 | 值 | 说明 |
| --- | ---: | --- |
| 冲击阈值 | `20 m/s²` | 超过该值计为一次冲击峰值 |
| 释放阈值 | `13 m/s²` | 低于该值后才允许计下一次冲击 |
| 手势窗口 | `450 ms` | 第一次冲击起算,窗口内累计 1/2/3 次 |
| 最小间隔 | `70 ms` | 过滤同一次敲击产生的重复采样 |
单击和双击在窗口结束后输出;三击在第三次满足间隔要求的冲击样本处理时输出。
第二、第三击必须都位于第一击之后 450 ms 内,且相邻有效冲击至少间隔 70 ms。
恰好到达 450 ms 的冲击属于下一组。三击报告后仍保留去抖时间,过滤第三击的
反弹;连续高加速度在释放之前只计一次;时间戳回退的样本忽略。
当前采样率为 50 Hz,DMA 每 10 点、约 200 ms 提交一次。因此实际看到日志时,
还可能有约 0~200 ms 的批处理延迟,不能把串口日志到达时间当成敲击发生时间。
幅值包含重力,敲击方向、佩戴方式和外壳结构仍会影响触发,需实板调整阈值。
很短或很轻的冲击可能落在两个采样点之间而漏检;强烈摇晃也可能误触发。
当前只在系统唤醒时检测,不支持敲击唤醒深度休眠。休眠和恢复时会丢弃未完成的
手势,避免恢复后打印休眠前的单击或双击。调试时先按键唤醒、保持系统处于唤醒
状态再敲击。`tap detector ready` 表示检测模块完成初始化;仍需查看 HAL 的
LIS2DW12 探测/启用日志,确认 I2C 传感器工作正常。
代码入口
-
`framework/sensor/tap_gsensor.c`:状态机、阈值和日志输出。
-
`framework/sensor/tap_gsensor.h`:初始化和样本输入接口。
-
`framework/sensor/algo_port.c`:接收 `ID_ACC` 样本并调用检测器。
-
`framework/sensor/sensor_service.c`:传感器服务启动时初始化检测器。
-
`application/bt_watch/src/main/system_app_shell.c`:`app gsensor` 命令。
-
`zephyr/framework/sensor/sensor_hal/devices/sensor_acc_lis2dw12.c`:现有
LIS2DW12 HAL、I2CMT1 采样和 GPIO54 数据就绪链路。
调试方法
-
烧录本次固件并打开 USB CDC 日志。
-
查看 LIS2DW12 HAL 日志并执行 `app gsensor status`,确认传感器工作正常、
敲击检测为 `ON`。保持系统唤醒。
- 在板子或外壳的固定位置分别敲击一次、两次、三次。建议两次之间间隔
100~180 ms,三击总时间小于 450 ms,各组动作间隔至少 1 秒。观察
`TAP_SINGLE`、`TAP_DOUBLE`、`TAP_TRIPLE`。
- 若单击经常不触发,降低 `TAP_PEAK_SQ_MS2` 对应的 20 m/s²;若走动或
振动误触发,提高该阈值或降低释放阈值。修改后重新编译即可。
当前实现复用原有 20 ms 数据就绪和 DMA 通道,没有把硬件 TAP 中断额外路由到
GPIO54。这样不会干扰已有的加速度采样和运动算法;同时软件累计方式可以支持
LIS2DW12 硬件本身没有的三击动作。
编译和固件包
在仓库 `26A` 目录执行 `ninja -C application/bt_watch/outdir/ats3089p_dev_watch`
编译;随后在 `zephyr` 目录执行:
```powershell
python build.py -n -p -b ats3089p_dev_watch -a bt_watch
```
敲击功能版本的固件包位于:
```text
application/bt_watch/outdir/ats3089p_dev_watch/_firmware/
ats3089p_dev_watch_261013_gsensor_tap.fw
ats3089p_dev_watch_261013_gsensor_tap_debug.fw
```
使用原来的烧录工具烧录 `.fw` 即可。具体实板敲击灵敏度需按上述方法验证。
验证记录
ATS3089P `bt_watch` 完整编译及 `.fw` 打包已通过,19 项状态机测试全部通过。
在 `26A` 目录执行:
```powershell
python application/bt_watch/tests/gsensor_tap/run_tests.py
```
测试在 Cortex-M33 模拟器中运行本次固件 ELF 的真实检测代码,覆盖单/双/三击、
持续高电平、释放阈值、70/450 ms 边界、报告后反弹、时间戳回退、64 位时间戳、
开关和复位。日志输出和 Boot ROM `memset` 使用替身。测试验证软件逻辑,实际
传感器、敲击幅值和采样漏检仍需实板验证。