💡 划重点

  • 主控采用 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);
}

调试步骤

  1. 上电后测量 3.3V 与 5V 是否正常,TP4056 充电指示灯是否亮。
  2. 用 I2C 扫描程序确认 LSM6DS3 地址为 0x6A 或 0x6B,串口打印三轴加速度,静止时合加速度约 1g。
  3. 调整阈值:先设 2.5g 和 4.0g,用手掌拍击头盔模拟碰撞,观察串口与震动。
  4. 测试震动马达:从 50 到 200 占空比,确认振动强度且电流不超过 100mA。
  5. 打开手机 nRF Connect,连接 BLE,订阅 UART 服务,确认收到 ALARM 字符串。
  6. 跌落测试:在软垫上从 50 cm 高度跌落头盔,记录峰值加速度,微调阈值。
  7. 功耗测试:正常状态电流应低于 2mA,告警时短时升高。若偏高,降低采样率或启用 LSM6DS3 中断唤醒。
  8. 连续骑行 2 小时,检查是否误报,必要时加入陀螺仪角速度辅助判断。

设计图

骑行头盔碰撞检测结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报