💡 划重点
- 主控 nRF52840,低功耗蓝牙,适合头盔轻量化与长续航。
- 感知用 LSM6DS3 六轴加速度计,检测急减速、自由落体与冲击。
- 执行用震动马达提醒骑手,同时通过 BLE 向手机发送碰撞事件。
- 目标成本 140 元内,适合通勤、公路骑行与外卖骑手。
- 判定逻辑:加速度突变超过 3g 且持续 20ms,触发碰撞报警。
需求洞察
目标用户是城市通勤骑行者、公路车爱好者、外卖与快递骑手。真实痛点在于:摔倒或碰撞后,若无人发现,可能延误救援;骑行中手机不便查看,普通码表没有碰撞报警;专业碰撞检测设备价格高、体积大、续航短。为什么值得做:头盔是骑行必备装备,把检测模块贴在头盔内衬或后侧,不影响佩戴和风阻。碰撞后先本地震动确认,再通过蓝牙通知手机,由手机发送定位给紧急联系人。成本低、可复制,对独骑、夜骑、偏远路线尤其有价值。该方案还能记录碰撞前后数据,帮助复盘事故原因。
方案设计
感知层:LSM6DS3 三轴加速度计,I2C 读取,量程 ±8g,输出频率 100Hz。检测线性加速度突变、自由落体、姿态角变化。控制层:nRF52840,运行碰撞判定算法,管理低功耗休眠与中断唤醒。执行层:震动马达 P0.05 PWM 驱动,碰撞后震动 2 秒,提醒骑手。日志/联网层:BLE 广播设备名,连接手机后发送事件;本地可存最近 10 次碰撞时间戳,掉电不丢。供电:3.7V 锂电池经 TP4056 充电,nRF52840 内部稳压。外壳用 3D 打印或热缩管,魔术贴固定于头盔后部。算法上先用滑动窗口滤波,再比较合加速度与动态阈值,降低骑行颠簸误报。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 合计 |
|---|---|---|---|---|
| nRF52840 开发板 | 1 | 主控与 BLE | 75 | 75 |
| LSM6DS3 模块 | 1 | 加速度感知 | 20 | 20 |
| 震动马达 | 1 | 碰撞提醒 | 3 | 3 |
| 3.7V 500mAh 锂电池 | 1 | 供电 | 15 | 15 |
| TP4056 充电板 | 1 | 充电管理 | 3 | 3 |
| 导线、魔术贴、热缩管 | 1 套 | 连接与固定 | 10 | 10 |
| 合计 | 126 |
接线与结构
LSM6DS3 与 nRF52840 使用 I2C:SDA=P0.06,SCL=P0.08。震动马达信号=P0.05,接三极管或 MOS 管驱动,避免 IO 过流。微调理由:nRF52840 默认 I2C 常用 P0.04/P0.05,但 P0.05 已分配给震动 PWM,为避免冲突,将 I2C 改到 P0.06/P0.08。电源:锂电池正负接 TP4056,输出接开发板 3V3 与 GND;马达单独从电池取电,共地。结构:主控与电池放头盔后侧小盒,加速度计贴内衬顶部,马达贴后颈处。所有导线用热缩管包裹,防止骑行震动导致短路。
核心代码
#include <Wire.h>
#include <ArduinoBLE.h>
#include <LSM6DS3.h>
LSM6DS3 imu(I2C_MODE, 0x6A);
BLEFloatCharacteristic crashChar("2A37", BLERead | BLENotify);
const int motorPin = 5;
float ax, ay, az, lastAz;
unsigned long lastTime;
void setup() {
pinMode(motorPin, OUTPUT);
Wire.begin();
imu.begin();
imu.settings.accelRange = 8;
imu.settings.accelSampleRate = 100;
BLE.begin();
BLE.addService(crashService);
BLE.advertise();
}
void loop() {
BLEDevice central = BLE.central();
ax = imu.readFloatAccelX();
ay = imu.readFloatAccelY();
az = imu.readFloatAccelZ();
float delta = abs(az - lastAz);
if (delta > 3.0 && millis() - lastTime > 2000) {
digitalWrite(motorPin, HIGH);
delay(2000);
digitalWrite(motorPin, LOW);
lastTime = millis();
}
lastAz = az;
delay(10);
}
说明:实际量产需加中断唤醒、阈值滤波、低功耗定时,并避免 delay 阻塞 BLE。
调试步骤
- 用示例程序读 LSM6DS3 原始值,确认 I2C 地址 0x6A。
- 静置校准,记录三轴均值,作为零点。
- 轻拍头盔,观察加速度峰值,设定阈值 3g、持续时间 20ms。
- 连接手机蓝牙调试助手,确认能收到碰撞事件。
- 测试震动马达,调整 PWM 占空比到合适强度。
- 整机装壳,连续记录 8 小时功耗,确保休眠电流低于 50uA。
- 模拟摔倒:从 1 米高度落下,检查误报与漏报。