💡 划重点
- > 本项目在 75 元预算内,利用 XIAO ESP32-S3 与 MPU6050 惯性测量单元,打造一款可以贴附在背带或内衣上的微型坐姿矫正器。设备实时检测脊柱前倾与侧弯角度,一旦超出健康阈值,立刻通过贴合皮肤的超薄震动马达发出无声提醒。全部组件使用锂电供电、USB-C 充电,无屏无声,靠震动完成行为闭环,适合长时间静坐的学生与白领。
需求洞察
目标用户
- 备考学生:每天伏案 8~12 小时,注意力高度集中,往往无暇关注自己的身体姿态。
- 办公室白领:长期面对屏幕,肩颈酸痛已成日常,但又不愿佩戴厚重矫正带或被人发现。
真实痛点
腰椎、颈椎问题多见于 20-35 岁人群,核心病因不是“不会坐”,而是“忘记要坐好”。市面智能矫正器多依赖手机 APP 或声音提醒,干扰大、私密性差,且价格通常超过 200 元。物理背带束缚感强,夏天闷热,坚持率极低。
为什么值得做
低价、隐蔽、即刻反馈是改变行为的关键。通过 ESP32-S3 强大的低功耗与运算能力,结合 MPU6050 三轴加速度与陀螺仪,可以在本地完成姿态解算,无需手机参与。微型震动马达直接作用于皮肤,只有佩戴者能察觉到提醒,不打扰旁人,成本可控在 75 元内。
方案设计
整体架构分为感知层、控制层、执行层与日志/联网层。
感知层
- MPU6050(6 轴 IMU)粘贴在背带中心位置,对应胸椎 T5-T7 区域。通过连续读取加速度与角速度数据,使用互补滤波或 DMP 计算欧拉角。
- 以初始标定姿势(挺拔坐姿)为参考,设定前倾角阈值(俯仰角 ±15°)与侧弯角阈值(横滚角 ±10°)。
控制层
- 主控采用 XIAO ESP32-S3,外形仅拇指大小,可直接缝合或粘贴在背带侧面。它负责 I²C 读取 MPU6050、姿态解析、阈值判定、驱动震动马达,并通过深度睡眠与轻度睡眠模式大幅度降低待机功耗。
- 电源管理:接入带保护板的小型锂聚合物电池(150~200 mAh),USB-C 直连开发板的 VBUS 与 GND 充电,板载电压调节器输出 3.3V 供系统使用。
执行层
- 微型扁平震动马达通过 GPIO 控制三极管或 N-MOS 管驱动,发出柔和但清晰的震动。马达本身厚度不到 3 mm,可完全隐藏在织带夹层中。
- 震动模式:短促连续震动 200 ms,间隔 2 秒重复,直至姿势恢复到正常范围 5 秒以上才停止。
日志/联网层(可选,用于进阶功能)
- ESP32-S3 自带 Wi-Fi 与 BLE,可在将来通过低功耗蓝牙与手机建立连接,将每日姿势统计数据同步到轻量级 APP 或小程序。本项目第一版不强制联网,以独立震动反馈为核心。
物料清单
| 序号 | 物料名称 | 数量 | 用途 | 估算单价(元) |
|---|---|---|---|---|
| 1 | XIAO ESP32-S3 开发板 | 1 | 主控与电源管理 | 25 |
| 2 | MPU6050 模块(GY-521) | 1 | 姿态检测 | 8 |
| 3 | 微型扁平震动马达(10×2.7 mm) | 1 | 无声提醒 | 5 |
| 4 | 150 mAh 锂聚合物电池(带保护板) | 1 | 供电 | 12 |
| 5 | USB-C 充电转接板(或直接利用 XIAO USB) | 1 | 充电接口 | 0(板载) |
| 6 | N-MOS 管(SI2302 或 2N7002) + 10kΩ 电阻 | 1 | 震动驱动 | 2 |
| 7 | 弹性织带背带 / 魔术贴固定带 | 1 | 结构载体 | 10 |
| 8 | 细硅胶导线、焊锡、绝缘胶布 | 若干 | 电气连接 | 5 |
| 9 | 3D 打印外壳或柔性贴片基座 | 1 | 固定电子部件 | 8 |
| 合计 | 75 |
所有物料合计约 75 元,可通过批量采购进一步压低价格。
接线与结构
依据给定 GPIO,建议接线如下,并在理由中说明微调:
- MPU6050 I²C:XIAO ESP32-S3 的 GPIO5(SDA)、GPIO6(SCL)。此为默认 I²C 端口,无需改动。
- 震动马达控制:GPIO7。该引脚支持 PWM,可灵活调节震动强度或实现微妙触觉模式。如后期需增加一个指示灯或额外传感器,可将普通数字 IO 用于马达开关,PWM 功能保留备用,故此处保持 GPIO7。
- 电源:锂电池正负极分别接 XIAO 的 BAT+ 和 GND(注意开发板背面的充电焊盘)。XIAO 板载锂电池充电管理,USB-C 直接插入即可充电,无需额外充电板。
- 结构:MPU6050 焊接在小型柔性板上,通过 4 根细硅胶线(VCC, GND, SDA, SCL)连接至 XIAO。震动马达固定于织带内侧靠近肩胛骨位置。整个过程用热缩管和硅胶固定,避免运动产生断裂。XIAO 用热熔胶粘在织带边缘,电池也用魔术贴固定,方便取下充电。
微调理由:以上已严格遵循 GPIO5/6 和 GPIO7,未做改动。唯一补充说明 XIAO 的 USB-C 直接充电,省去独立充电模块,符合成本限制。
核心代码
以下为基于 Arduino IDE 的 PlatformIO 骨架,使用 XIAO ESP32-S3 和 MPU6050 库。代码完成姿态读取、简单倾角计算与震动反馈。
#include <Wire.h>
#include <MPU6050_tockn.h>
MPU6050 mpu(Wire);
const int motorPin = 7;
// 阈值(度)
const float PITCH_THRESHOLD = 15.0; // 前倾
const float ROLL_THRESHOLD = 10.0; // 侧弯
bool isWarning = false;
unsigned long lastVibrate = 0;
const unsigned long vibrateInterval = 200; // 震动 200ms 开启
void setup() {
Serial.begin(115200);
pinMode(motorPin, OUTPUT);
digitalWrite(motorPin, LOW);
Wire.begin(5, 6); // SDA=5, SCL=6
mpu.begin();
// mpu.calcGyroOffsets(true); // 首次需静态校准,写入后可注释
Serial.println("MPU6050 OK");
}
void loop() {
mpu.update();
float pitch = mpu.getAngleX(); // 假设 X 轴对应俯仰
float roll = mpu.getAngleY(); // Y 轴对应横滚
if (abs(pitch) > PITCH_THRESHOLD || abs(roll) > ROLL_THRESHOLD) {
isWarning = true;
} else {
isWarning = false;
digitalWrite(motorPin, LOW);
}
if (isWarning) {
// 间歇震动
unsigned long now = millis();
if (now - lastVibrate < vibrateInterval) {
digitalWrite(motorPin, HIGH);
} else if (now - lastVibrate < 2000) {
digitalWrite(motorPin, LOW);
} else {
lastVibrate = now; // 重新计时
}
}
delay(20);
}
说明:MPU6050_tockn库使用内置 DMP 或互补滤波输出角度,直接调用getAngleX/Y。实际安装时需根据模块粘贴方向重新映射俯仰与横滚轴。初始校准可在第一次上电时读取静止角度作为零点偏移。
调试步骤
- 固件烧录与静态校准:将代码上传至 XIAO ESP32-S3,打开串口监视器(115200 波特率)。保持 MPU6050 绝对静止,运行
mpu.calcGyroOffsets(true)一次,校准成功后注释掉该行,避免重复覆盖零点。 - 角度映射验证:手持模块模拟前倾(俯仰角变大)、侧弯(横滚角变大),观察串口打印的 pitch 和 roll 值是否与物理动作一致。若方向相反,交换
getAngleX与getAngleY或在安装时翻转模块。 - 震动阈值匹配:佩戴背带,坐成标准姿势,记录 pitch 和 roll 读数作为偏移基准。在代码中减去该基准,使标准坐姿角度接近 0。然后故意驼背、侧歪,观察震动触发是否正确。用
PITCH_THRESHOLD微调敏感度。 - 功耗评估:串联万用表测量整机工作电流(约 15~25 mA),确认 150 mAh 电池可连续工作 5-6 小时。若需延长续航,可在 loop 中插入
esp_light_sleep_start()定时唤醒。 - 结构可靠性测试:连续佩戴 1 小时,检查线缆是否松动,震动是否脱落,并用热熔胶进行二次固定。
设计图
矫正坐姿背带贴片结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报