💡 划重点
- 芯片选型:nRF52840 搞定 BLE 低功耗与高速处理,直接驱动震动马达
- 传感器:LSM6DS3 六轴加速度计精准捕捉碰撞加速度突变
- 反馈方式:微型震动马达贴合后脑,碰撞即震,毫秒级触觉预警
- 成本严控:全部物料低于140元,适合批量出街
- 接线简洁:I2C 双线读取加速度,PWM 驱动马达,抗干扰易封装
需求洞察
目标用户 城市通勤骑行族、外卖骑手、夜骑爱好者。他们在复杂交通中频繁穿梭,低头看手机导航或回头观察时极易忽略后方来车,普通头盔只是被动防护,无法提前报警。
真实痛点
- 碰撞发生前毫无感知,等身体感受到时伤害已成定局。
- 传统头盔缺乏主动提醒,骑行者无法获知尾部碰撞风险。
- 市面上智能头盔售价动辄800元以上,大众难以接受。
为什么值得做
用不到140元的硬件成本,为普通骑行头盔赋予碰撞检测+触觉告警能力。nRF52840 既有 BLE 又可做本地实时计算,LSM6DS3 加速度计灵敏度高、功耗低,震动马达反馈直接,不依赖视觉和听觉,适合嘈杂骑行环境。方案可快速集成到头盔内衬,不改变外形,安全合规,真正落地的低成本智能安全装备。
方案设计
感知层
LSM6DS3 三轴加速度计通过 I2C 连接主控,以 200 Hz 采样率实时采集 X/Y/Z 加速度值。设置动态阈值算法:当合加速度突然超过 2.5g 且持续 10ms 以上,判定为碰撞事件。支持倾斜检测辅助判断头盔是否脱落。
控制层
nRF52840 负责读取传感器、运行碰撞逻辑、触发马达震动、管理 BLE 广播。主控内置 FPU,可做轻量级滤波(滑动平均消除骑行振动误报)。状态机分普通骑行、碰撞报警、低电量三种模式。
执行层
震动马达接 P0.05 输出 PWM,碰撞发生后以 100% 占空比震动 2 秒,给予骑手最直接的体感预警。静默模式下可做短震确认开机或低电提醒。
日志/联网层
利用 nRF52840 内建 BLE 5.0,将碰撞事件、加速度峰值、时间戳广播给手机 APP。不需要持续连接,采用广播包传递紧急数据,并预留 GATT 服务用于事后读取黑匣子记录,保留最近 20 次碰撞日志。
物料清单
| 序号 | 物料名称 | 数量 | 用途 | 估算单价(元) | 小计(元) |
|---|---|---|---|---|---|
| 1 | nRF52840 模块 (Seeed XIAO BLE) | 1 | 主控+BLE | 55 | 55 |
| 2 | LSM6DS3 六轴加速度计模块 | 1 | 碰撞感知 | 22 | 22 |
| 3 | 微型震动马达 (10mm 纽扣式) | 1 | 触觉反馈 | 8 | 8 |
| 4 | 3.7V 300mAh 锂聚合物电池 | 1 | 供电 | 18 | 18 |
| 5 | TP4056 充电保护模块 | 1 | 充电管理 | 5 | 5 |
| 6 | 贴片 MOSFET (SI2302) + 电阻电容 | 1套 | 马达驱动 | 3 | 3 |
| 7 | 软排线、绝缘胶、头盔内衬魔术贴 | 1套 | 连接与固定 | 5 | 5 |
| 合计 | 116 |
总成本116元,远低于140元预算,留有充足余量。
接线与结构
基于 nRF52840 模块的 GPIO 分配:
- LSM6DS3 使用硬件 I2C:SDA 接 P0.13,SCL 接 P0.15。这两个引脚是模块默认 I2C 数据线,无需额外上拉。
- 震动马达控制:PWM 输出接 P0.05,串联 10kΩ 电阻至 MOSFET 栅极,漏极接马达,源极接地,马达另一端接电池正极。反并联二极管保护。
- 电池接模块 BAT 引脚,充电模块接电池正负极。
- 所有元件焊接在 20mm×40mm 的小型 PCB 上,总成嵌入头盔后脑勺部位内衬,通过魔术贴固定,避免硬物直接接触头部。
微调理由:原建议只提到 I2C 未指定具体引脚,现选用模块默认 I2C 接口引脚,方便直接使用 Wire 库,无需重新映射,提高兼容性;震动使用 P0.05 保持与原建议一致,该引脚支持硬件 PWM,驱动稳定。
核心代码
基于 Arduino 框架,使用 Adafruit_LSM6DS 和 Bluefruit 库。
#include <Arduino.h>
#include <Adafruit_LSM6DS3.h>
#include <bluefruit.h>
#define VIB_PIN 5 // P0.05
#define COLLISION_THRESHOLD 2.5 // g
Adafruit_LSM6DS3 lsm6ds3;
BLEDis bledis;
BLEUart bleuart;
volatile bool collision_detected = false;
void setup() {
pinMode(VIB_PIN, OUTPUT);
digitalWrite(VIB_PIN, LOW);
Serial.begin(115200);
if (!lsm6ds3.begin_I2C()) {
while(1) delay(10);
}
Bluefruit.begin();
Bluefruit.setTxPower(4);
bledis.begin();
bleuart.begin();
}
void loop() {
sensors_event_t accel;
lsm6ds3.getEvent(&accel;);
float total_g = sqrt(sq(accel.acceleration.x) + sq(accel.acceleration.y) + sq(accel.acceleration.z)) / 9.8;
if (total_g > COLLISION_THRESHOLD && !collision_detected) {
collision_detected = true;
analogWrite(VIB_PIN, 255);
delay(2000);
analogWrite(VIB_PIN, 0);
// BLE广播碰撞包
uint8_t data[6];
memcpy(data, &total;_g, 4);
bleuart.write(data, 6);
collision_detected = false;
}
// 每秒慢闪 LED 或低电检测省略
delay(10);
}
代码骨架实现了加速度读取、碰撞阈值判断、马达震动及 BLE 数据发送,可直接在 PlatformIO 下编译。
调试步骤
- 硬件连通性测试:用万用表确认 I2C 上拉正常,扫描设备地址 0x6A 回应。
- 静止态校准:水平放置模块,串口输出三轴加速度,确认 Z 轴约 1g。
- 碰撞阈值调试:用手掌拍击模块,观察串口输出总加速度峰值,据此调整阈值。
- 马达驱动验证:单独置高 P0.05,确认马达正常震动,MOSFET 不发热。
- BLE 抓包:使用 nRF Connect 手机 APP 扫描设备,查看广播包内容。
- 整机佩戴测试:戴上头盔模拟骑行,做急刹、甩头,确保不误报,真实撞击能触发。
- 功耗测试:串入电流表,静态功耗低于 5mA,300mAh 电池可续航 >48 小时。