💡 划重点
- 主控采用 nRF52840,搭配 LSM6DS3 三轴加速度计,实现碰撞与摔倒检测。
- 本地震动马达 P0.05 PWM 提醒,BLE 同步向手机告警。
- 双阈值判断:2.5g 疑似、4.0g 确认,降低骑行颠簸误报。
- 目标成本 129 元,可嵌入普通骑行头盔后脑勺位置。
- 低功耗设计,适合通勤、公路车、外卖骑手等长时间骑行场景。
需求洞察
目标用户是城市通勤骑行者、公路车与山地车爱好者、外卖骑手以及共享单车高频用户。真实痛点在于:骑行中发生摔倒或碰撞后,用户可能失去行动能力,无法手动呼救;手机通常放在背包或骑行服口袋,紧急时难以取出;独自骑行时无人知晓位置和状态。为什么值得做?头盔是骑行安全最后一道防线,在头盔内集成碰撞检测,不改变佩戴习惯,却能在关键时刻自动发出求救信号。nRF52840 自带 BLE 与低功耗特性,LSM6DS3 体积小、功耗低,适合头盔内狭窄空间。成本控制在 140 元内,具备批量推广可能。
方案设计
感知层:LSM6DS3 通过 I2C 输出三轴加速度,采样率 104 Hz,量程 ±8g。算法计算合加速度 mag = sqrt(ax²+ay²+az²),当 mag > 2.5g 进入疑似碰撞状态,mag > 4.0g 且持续 50 ms 确认碰撞。同时利用 LSM6DS3 内置自由落体与唤醒中断,进一步降低误报。
控制层:nRF52840 作为主控,Cortex-M4F 内核,运行状态机。状态包括正常、疑似、确认、告警、恢复。确认后锁定事件,防止重复触发。
执行层:震动马达接 P0.05,PWM 驱动。疑似时短震 200 ms,确认后强震 800 ms,提醒骑行者。
日志/联网层:BLE 作为无线通道,手机 App 或 nRF Connect 接收事件。上报内容包括时间戳、峰值加速度、电量、设备编号。本地可用环形缓冲区保存最近 10 次事件,掉电丢失可接受。后续可扩展 GPS 模块,但当前方案优先控制成本。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 合计 |
|---|---|---|---|---|
| nRF52840 模块 | 1 | 主控与 BLE | 55 元 | 55 元 |
| LSM6DS3 模块 | 1 | 三轴加速度检测 | 12 元 | 12 元 |
| 震动马达 | 1 | 本地提醒 | 5 元 | 5 元 |
| 3.7V 500mAh 锂电池 | 1 | 供电 | 18 元 | 18 元 |
| TP4056 充电模块 | 1 | 锂电池充电 | 4 元 | 4 元 |
| 轻触开关 | 2 | 电源与配对 | 1 元 | 2 元 |
| 电阻电容 | 若干 | 滤波与上拉 | 5 元 | 5 元 |
| 洞洞板/PCB | 1 | 固定电路 | 10 元 | 10 元 |
| 头盔内衬海绵与 3M 胶 | 1 | 安装减震 | 8 元 | 8 元 |
| 塑料外壳 | 1 | 保护电路 | 10 元 | 10 元 |
| 合计 | 129 元 |
接线与结构
LSM6DS3 的 VCC 接 3.3V,GND 接 GND,SDA 接 nRF52840 的 P0.06,SCL 接 P0.08。震动马达正极接 P0.05,负极接 GND,串联 100Ω 电阻限流。电池经 TP4056 后接主控 VCC 与 GND。电源开关接电池正极。若使用 Adafruit Feather nRF52840,I2C 默认引脚可能不同,可改用 P0.06/P0.08 并初始化 Wire.begin(P0.06, P0.08)。震动 PWM 保持 P0.05 不变。结构上,主控与电池放在头盔后脑勺位置,用海绵包裹减震;LSM6DS3 贴在头盔顶部中心,尽量靠近头部,减少头盔壳体形变干扰。所有导线用热缩管固定,避免骑行中晃动。
核心代码
以下为 Arduino 骨架,基于 Adafruit nRF52 BSP 与 Adafruit_LSM6DS3 库。
#include <Wire.h>
#include <Adafruit_LSM6DS3.h>
#include <Adafruit_BluefruitLE_SPI.h>
#define PIN_VIB 0.05
#define PIN_SDA 0.06
#define PIN_SCL 0.08
Adafruit_LSM6DS3 lsm6ds3;
float warnTh = 2.5;
float alarmTh = 4.0;
void vibrate(uint8_t duty, uint16_t ms) {
analogWrite(PIN_VIB, duty);
delay(ms);
analogWrite(PIN_VIB, 0);
}
void setup() {
Serial.begin(115200);
pinMode(PIN_VIB, OUTPUT);
Wire.begin(PIN_SDA, PIN_SCL);
if (!lsm6ds3.begin_I2C(0x6A, &Wire;)) {
while (1);
}
ble.begin();
ble.echo(false);
ble.info();
}
void loop() {
lsm6ds3.getEvent(&accel;, &gyro;, &temp;);
float ax = accel.acceleration.x;
float ay = accel.acceleration.y;
float az = accel.acceleration.z;
float mag = sqrt(ax*ax + ay*ay + az*az);
if (mag > alarmTh) {
vibrate(180, 800);
ble.print("AT+BLEUARTTX=");
ble.println("ALARM");
delay(2000);
} else if (mag > warnTh) {
vibrate(80, 200);
}
delay(10);
}
调试步骤
- 上电后测量 3.3V 与 5V 是否正常,TP4056 充电指示灯是否亮。
- 用 I2C 扫描程序确认 LSM6DS3 地址为 0x6A 或 0x6B,串口打印三轴加速度,静止时合加速度约 1g。
- 调整阈值:先设 2.5g 和 4.0g,用手掌拍击头盔模拟碰撞,观察串口与震动。
- 测试震动马达:从 50 到 200 占空比,确认振动强度且电流不超过 100mA。
- 打开手机 nRF Connect,连接 BLE,订阅 UART 服务,确认收到 ALARM 字符串。
- 跌落测试:在软垫上从 50 cm 高度跌落头盔,记录峰值加速度,微调阈值。
- 功耗测试:正常状态电流应低于 2mA,告警时短时升高。若偏高,降低采样率或启用 LSM6DS3 中断唤醒。
- 连续骑行 2 小时,检查是否误报,必要时加入陀螺仪角速度辅助判断。