用STM32CubeIDE玩转HC-05蓝牙:从手机APP控制到舵机PWM的物联网小项目实战

📅 2026/7/13 5:50:10 👁️ 阅读次数 📝 编程学习
用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 TXPA10USART1_RX
HC-05 RXPA9USART1_TX
HC-05 VCC3.3V注意电压匹配
HC-05 GNDGND共地
舵机信号线PA6TIM3_CH1 PWM输出
舵机电源外部5V避免主板供电不足

注意:舵机工作电流较大,建议使用独立电源供电,避免STM32板载稳压芯片过载。

1.2 STM32CubeIDE工程配置

打开STM32CubeIDE,按照以下步骤创建工程:

  1. 点击File > New > STM32 Project
  2. 在MCU选择器中输入STM32F103C8,选择对应型号
  3. 工程命名如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工具配置蓝牙模块:

  1. 按住HC-05底板上的按键上电,进入AT模式(指示灯慢闪)
  2. 使用串口助手发送以下指令:
    AT+NAME=MyServoCtrl # 设置设备名称 AT+PSWD=1234 # 设置配对密码 AT+UART=9600,0,0 # 设置波特率 AT+ROLE=0 # 设为从机模式
  3. 重启后模块应快闪,等待手机连接

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 = 250

3.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可视化编程:

  1. 访问ai2.appinventor.mit.edu
  2. 添加以下组件:
    • BluetoothClient:用于连接HC-05
    • Slider:范围0-180,调节舵机角度
    • Button:连接/断开蓝牙

关键代码块(伪代码):

当 滑块1.位置被改变: 如果 蓝牙连接1.已连接: 发送文本 "S" & 滑块1.位置 & "#"

4.2 iOS快捷指令方案

对于iPhone用户,可通过快捷指令实现控制:

  1. 创建新快捷指令
  2. 添加"通过蓝牙发送"动作
  3. 输入指令格式如"S90#"
  4. 可绑定到桌面图标快速触发

5. 系统优化与调试技巧

5.1 常见问题排查

现象可能原因解决方案
蓝牙无法连接波特率不匹配检查AT指令配置
舵机抖动无反应电源供电不足使用独立5V电源
指令响应延迟串口中断优先级低调整NVIC优先级
PWM输出不稳定定时器分频设置错误重新计算Prescaler/ARR值

5.2 进阶优化方向

  1. 协议增强

    • 增加校验和:S90A3#(A3为90的校验字节)
    • 添加多舵机支持:S1:90#表示1号舵机转90°
  2. 低功耗模式

    // 在无操作时进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 通过蓝牙唤醒 HAL_UARTEx_EnableStopMode(&huart1);
  3. 手机APP功能扩展

    • 预设位置记忆(如"开门角度"、"关闭角度")
    • 运动轨迹录制与回放
    • 多设备组网控制

这个项目虽然小巧,但完整涵盖了物联网系统的三个关键层:感知层(舵机)、传输层(蓝牙)、应用层(手机APP)。当你看到自己编写的代码通过无线信号让机械结构动起来时,那种创造力的迸发正是嵌入式开发的乐趣所在。