用STM32CubeIDE玩转HC-05蓝牙:从手机APP控制到舵机PWM的物联网小项目实战
用STM32CubeIDE玩转HC-05蓝牙:从手机APP控制到舵机PWM的物联网小项目实战
在创客圈子里,用手机APP远程控制硬件设备总是能带来奇妙的满足感。想象一下,你桌上的舵机随着手机滑块的移动而精准转动,这种"隔空取物"的体验正是物联网的魅力所在。本文将带你用STM32F103核心板、HC-05蓝牙模块和9g舵机,搭建一个完整的蓝牙控制系统。不同于枯燥的外设讲解,我们会通过项目驱动式学习,串联USART串口通信、定时器PWM等关键技术点,最终实现从手机发送指令到舵机响应的完整链路。
1. 硬件准备与环境搭建
1.1 物料清单与电路连接
你需要准备以下硬件组件:
- STM32F103C8T6最小系统板(Blue Pill)
- HC-05蓝牙模块(建议选择带底板版本)
- SG90微型舵机(工作电压4.8-6V)
- USB转TTL模块(用于蓝牙模块初始配置)
- 杜邦线若干
接线示意图如下:
| 设备 | STM32引脚 | 备注 |
|---|---|---|
| HC-05 TX | PA10 | USART1_RX |
| HC-05 RX | PA9 | USART1_TX |
| HC-05 VCC | 3.3V | 注意电压匹配 |
| HC-05 GND | GND | 共地 |
| 舵机信号线 | PA6 | TIM3_CH1 PWM输出 |
| 舵机电源 | 外部5V | 避免主板供电不足 |
注意:舵机工作电流较大,建议使用独立电源供电,避免STM32板载稳压芯片过载。
1.2 STM32CubeIDE工程配置
打开STM32CubeIDE,按照以下步骤创建工程:
- 点击
File > New > STM32 Project - 在MCU选择器中输入
STM32F103C8,选择对应型号 - 工程命名如
Bluetooth_Servo_Control,点击Finish
关键外设配置:
// 在CubeMX界面进行如下设置: 1. USART1: - Mode: Asynchronous - Baud Rate: 9600 - Word Length: 8 Bits - Parity: None - Stop Bits: 1 2. TIM3: - Clock Source: Internal Clock - Channel1: PWM Generation CH1 - Prescaler: 71 - Counter Period: 19999 // 产生50Hz PWM信号(周期20ms)生成代码前,记得在Project Manager标签页勾选Generate peripheral initialization as a pair of '.c/.h' files,这将使外设配置更清晰。
2. 蓝牙通信协议设计
2.1 HC-05模块的AT指令配置
在接入STM32前,先用USB转TTL工具配置蓝牙模块:
- 按住HC-05底板上的按键上电,进入AT模式(指示灯慢闪)
- 使用串口助手发送以下指令:
AT+NAME=MyServoCtrl # 设置设备名称 AT+PSWD=1234 # 设置配对密码 AT+UART=9600,0,0 # 设置波特率 AT+ROLE=0 # 设为从机模式 - 重启后模块应快闪,等待手机连接
2.2 简易通信协议设计
为简化手机APP开发,我们定义如下指令格式:
S<角度值># # 示例:S90# 表示转动到90度位置在STM32端实现协议解析:
void USART1_IRQHandler(void) { static uint8_t rx_data[10], idx = 0; if(USART1->SR & USART_SR_RXNE) { uint8_t ch = USART1->DR; if(ch == 'S') { idx = 0; // 开始新指令 } else if(ch == '#') { rx_data[idx] = '\0'; int angle = atoi((char*)rx_data); Set_Servo_Angle(angle); // 调用舵机控制函数 idx = 0; } else if(idx < sizeof(rx_data)-1) { rx_data[idx++] = ch; } } }3. PWM舵机控制实现
3.1 舵机控制原理
SG90舵机的控制特性:
- PWM周期:20ms(50Hz)
- 脉宽范围:0.5ms-2.5ms
- 对应角度:0°-180°
在STM32中,通过调节TIM3的CCR1寄存器值改变占空比:
CCR1 = (PulseWidth / Period) * (ARR + 1) 例如: - 0°: 0.5ms → CCR1 = 50 - 90°: 1.5ms → CCR1 = 150 - 180°: 2.5ms → CCR1 = 2503.2 角度转换函数实现
在tim.c中添加舵机控制函数:
void Set_Servo_Angle(uint8_t angle) { if(angle > 180) angle = 180; // 限幅保护 uint16_t pulse = 50 + (angle * 200) / 180; // 线性映射 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse); }测试时可在main循环中添加扫描代码:
for(int i=0; i<=180; i+=10) { Set_Servo_Angle(i); HAL_Delay(500); }4. 手机APP交互方案
4.1 安卓APP快速开发方案
无需专业开发,使用MIT App Inventor可视化编程:
- 访问ai2.appinventor.mit.edu
- 添加以下组件:
BluetoothClient:用于连接HC-05Slider:范围0-180,调节舵机角度Button:连接/断开蓝牙
关键代码块(伪代码):
当 滑块1.位置被改变: 如果 蓝牙连接1.已连接: 发送文本 "S" & 滑块1.位置 & "#"4.2 iOS快捷指令方案
对于iPhone用户,可通过快捷指令实现控制:
- 创建新快捷指令
- 添加"通过蓝牙发送"动作
- 输入指令格式如"S90#"
- 可绑定到桌面图标快速触发
5. 系统优化与调试技巧
5.1 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 蓝牙无法连接 | 波特率不匹配 | 检查AT指令配置 |
| 舵机抖动无反应 | 电源供电不足 | 使用独立5V电源 |
| 指令响应延迟 | 串口中断优先级低 | 调整NVIC优先级 |
| PWM输出不稳定 | 定时器分频设置错误 | 重新计算Prescaler/ARR值 |
5.2 进阶优化方向
协议增强:
- 增加校验和:
S90A3#(A3为90的校验字节) - 添加多舵机支持:
S1:90#表示1号舵机转90°
- 增加校验和:
低功耗模式:
// 在无操作时进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 通过蓝牙唤醒 HAL_UARTEx_EnableStopMode(&huart1);手机APP功能扩展:
- 预设位置记忆(如"开门角度"、"关闭角度")
- 运动轨迹录制与回放
- 多设备组网控制
这个项目虽然小巧,但完整涵盖了物联网系统的三个关键层:感知层(舵机)、传输层(蓝牙)、应用层(手机APP)。当你看到自己编写的代码通过无线信号让机械结构动起来时,那种创造力的迸发正是嵌入式开发的乐趣所在。
