1. 项目概述
这个基于STM32的蓝牙手势控制小车项目,是我在指导本科生毕业设计时开发的一个典型物联网应用案例。它完美结合了嵌入式开发、传感器技术和无线通信三大核心技术模块。整个系统采用主从机架构,通过蓝牙实现双向通信,利用MPU6050姿态传感器捕捉手势动作,最终转化为小车的运动控制指令。
作为一款教学演示项目,它涵盖了物联网终端开发的完整流程:从硬件选型、PCB设计、嵌入式编程到无线通信协议实现。特别适合作为电子信息类专业的课程设计或毕业设计选题,能够帮助学生快速掌握STM32开发、传感器应用和无线通信等实用技能。
2. 系统架构设计
2.1 硬件组成
系统采用双STM32F103C8T6构成主从架构,这是经过多方考量后的最优方案:
主机端配置:
- 主控芯片:STM32F103C8T6(72MHz Cortex-M3内核)
- 显示模块:0.96寸OLED(SSD1306驱动)
- 无线模块:HC-05蓝牙模块(Class 2,10米传输距离)
- 执行机构:L298N电机驱动模块(驱动四路直流电机)
- 状态指示:有源蜂鸣器+LED指示灯
从机端配置:
- 主控芯片:STM32F103C8T6(与主机同型号,降低开发难度)
- 传感器:MPU6050六轴姿态传感器(±16g加速度量程)
- 无线模块:HC-05蓝牙模块(与主机配对通信)
硬件选型心得:STM32F103C8T6作为经典款ARM芯片,资源丰富且性价比极高。两个蓝牙模块需预先通过AT指令配置为主从模式,建议购买已配对好的套装,可省去配对环节。
2.2 通信协议设计
蓝牙通信采用自定义串口协议,数据帧格式如下:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 0 | 0xFF | 帧头标识 |
| 1 | 0xAA | 帧头标识 |
| 2 | 指令类型 | 0x01-手势 0x02-状态 |
| 3 | 数据长度 | 后续数据字节数 |
| 4~n | 数据内容 | 具体指令参数 |
| n+1 | 校验和 | 前面所有字节的累加和 |
实测在10米范围内,通信延迟可控制在50ms以内,完全满足实时控制需求。为提高可靠性,建议在代码中加入超时重发机制。
3. 核心功能实现
3.1 手势识别算法
MPU6050输出的原始数据需要经过滤波和姿态解算:
c复制// 卡尔曼滤波简化实现
float KalmanFilter(float newAngle, float newRate, float dt) {
float rate = newRate - bias;
angle += dt * rate;
P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
P[0][1] -= dt * P[1][1];
P[1][0] -= dt * P[1][1];
P[1][1] += Q_bias * dt;
float S = P[0][0] + R_measure;
float K[2];
K[0] = P[0][0] / S;
K[1] = P[1][0] / S;
float y = newAngle - angle;
angle += K[0] * y;
bias += K[1] * y;
P[0][0] -= K[0] * P[0][0];
P[0][1] -= K[0] * P[0][1];
P[1][0] -= K[1] * P[0][0];
P[1][1] -= K[1] * P[0][1];
return angle;
}
手势判定逻辑:
- 前倾超过15度 → 前进指令
- 后倾超过15度 → 后退指令
- 左倾超过20度 → 左转指令
- 右倾超过20度 → 右转指令
- 加速度骤增 → 急停指令
调试技巧:阈值设置需考虑人体工程学,建议先用串口打印传感器数据,观察不同手势时的数值范围,再确定合适阈值。
3.2 电机控制实现
采用PWM调速实现精准控制,关键配置:
c复制// TIM3 PWM初始化示例
void PWM_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 899; // 10kHz PWM
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
电机驱动真值表:
| IN1 | IN2 | 电机状态 |
|---|---|---|
| 0 | 0 | 停止 |
| 1 | 0 | 正转 |
| 0 | 1 | 反转 |
| 1 | 1 | 刹车 |
4. 开发注意事项
4.1 硬件搭建要点
-
电源管理:
- 电机驱动需独立供电(建议7-12V/2A)
- 控制电路采用3.3V稳压供电
- 两地之间共地处理必不可少
-
PCB设计经验:
- 电机驱动线路走线要宽(建议≥1mm)
- 数字与模拟地分开布局
- 蓝牙天线区域避免铜箔覆盖
-
装配技巧:
- MPU6050安装位置应尽量靠近小车重心
- 蓝牙模块天线朝向影响通信质量
- 线缆需用扎带固定,避免拉扯
4.2 软件调试技巧
-
分模块测试流程:
- 先单独测试MPU6050数据采集
- 再验证蓝牙通信可靠性
- 最后整合完整控制逻辑
-
常见问题排查:
- 蓝牙无法连接:检查主从模式设置
- 电机不转:测量驱动芯片使能端电压
- 姿态数据异常:检查传感器I2C地址
-
性能优化建议:
- 适当降低OLED刷新率(≥10Hz即可)
- 蓝牙发送间隔建议150-200ms
- 启用STM32硬件看门狗
5. 项目扩展方向
这个基础框架可以衍生出多个进阶版本:
-
视觉增强版:
- 增加OpenMV实现目标跟踪
- 结合手势+视觉混合控制
-
物联网云平台版:
- 通过ESP8266接入云平台
- 实现远程监控与控制
-
自动驾驶版:
- 增加超声波/红外避障
- 开发自动路径规划算法
-
竞技比赛版:
- 强化电机动力(改用370减速电机)
- 增加对战功能模块
在实际教学中,我会要求学生至少实现一个扩展功能。这不仅能锻炼工程实践能力,还能培养创新思维。这个项目的魅力在于它的可扩展性——从简单的课程设计到复杂的竞赛作品,都能基于这个框架进行开发。
