
用STM32CubeIDE玩转HC-05蓝牙从手机APP控制到舵机PWM的物联网小项目实战在创客圈子里用手机APP远程控制硬件设备总是能带来奇妙的满足感。想象一下你桌上的舵机随着手机滑块的移动而精准转动这种隔空取物的体验正是物联网的魅力所在。本文将带你用STM32F103核心板、HC-05蓝牙模块和9g舵机搭建一个完整的蓝牙控制系统。不同于枯燥的外设讲解我们会通过项目驱动式学习串联USART串口通信、定时器PWM等关键技术点最终实现从手机发送指令到舵机响应的完整链路。1. 硬件准备与环境搭建1.1 物料清单与电路连接你需要准备以下硬件组件STM32F103C8T6最小系统板Blue PillHC-05蓝牙模块建议选择带底板版本SG90微型舵机工作电压4.8-6VUSB转TTL模块用于蓝牙模块初始配置杜邦线若干接线示意图如下设备STM32引脚备注HC-05 TXPA10USART1_RXHC-05 RXPA9USART1_TXHC-05 VCC3.3V注意电压匹配HC-05 GNDGND共地舵机信号线PA6TIM3_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模式指示灯慢闪使用串口助手发送以下指令ATNAMEMyServoCtrl # 设置设备名称 ATPSWD1234 # 设置配对密码 ATUART9600,0,0 # 设置波特率 ATROLE0 # 设为从机模式重启后模块应快闪等待手机连接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周期20ms50Hz脉宽范围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 i0; i180; i10) { 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。当你看到自己编写的代码通过无线信号让机械结构动起来时那种创造力的迸发正是嵌入式开发的乐趣所在。