用STM32CubeIDE玩转HC-05蓝牙和舵机:一个物联网小车的完整项目搭建实录

张开发
2026/4/28 10:09:14 15 分钟阅读

分享文章

用STM32CubeIDE玩转HC-05蓝牙和舵机:一个物联网小车的完整项目搭建实录
用STM32CubeIDE玩转HC-05蓝牙和舵机一个物联网小车的完整项目搭建实录在嵌入式开发领域没有什么比亲手打造一个能跑能动的实物项目更令人兴奋了。想象一下用手机蓝牙控制一辆自制的小车看着它按照指令灵活转向——这种将代码转化为物理运动的成就感正是吸引无数开发者入坑嵌入式的原因。本文将带你从零开始基于STM32CubeIDE开发环境整合HC-05蓝牙模块和舵机控制完成一个物联网小车的全流程开发。1. 项目规划与硬件选型1.1 核心组件清单一个基础的蓝牙遥控小车需要以下核心部件主控芯片STM32F103C8T6性价比高社区资源丰富蓝牙模块HC-05经典蓝牙2.0模块AT指令配置简单执行机构9g微型舵机用于转向控制直流电机驱动板如L298N电源系统18650电池组5V稳压模块车体结构亚克力底盘套件或3D打印件1.2 硬件连接示意图[手机蓝牙] ←→ HC-05模块 │ ↓ STM32F103C8T6 │ ├─→ 舵机(PWM控制) └─→ 电机驱动板提示实际接线时务必注意HC-05模块的TXD/RXD要与MCU的USART引脚交叉连接即TXD接RXDRXD接TXD。2. STM32CubeIDE工程配置2.1 新建工程与时钟配置启动STM32CubeIDE选择File New STM32 Project在芯片选择器中输入STM32F103C8选择对应型号在Clock Configuration标签页设置HSE为外部晶振通常8MHz配置系统时钟为72MHz最大频率2.2 外设初始化使用CubeMX图形化工具配置关键外设外设类型配置参数注意事项USART1波特率9600, 8数据位, 无校验需与HC-05模块波特率一致TIM3PWM模式, 50Hz频率舵机标准控制频率GPIO电机控制引脚设为推挽输出驱动能力要足够// 自动生成的PWM初始化代码片段 htim3.Instance TIM3; htim3.Init.Prescaler 71; htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 19999; // 对应50Hz3. 蓝牙通信协议设计3.1 AT指令配置HC-05通过串口发送以下AT指令初始化蓝牙模块ATNAMEMyCar # 设置设备名称 ATPSWD1234 # 设置配对密码 ATUART9600,0,0 # 设置通信参数注意发送AT指令前需按住模块上的按键进入AT模式此时LED会慢闪约2秒一次。3.2 自定义控制协议设计简单的ASCII协议实现手机控制指令功能描述示例数据F前进F\nB后退B\nL左转舵机角度L90\nR右转舵机角度R45\n对应的解析代码示例void USART1_IRQHandler(void) { if(USART1-SR USART_SR_RXNE) { char cmd USART1-DR; switch(cmd) { case F: motor_forward(); break; case L: uint8_t angle atoi(USART1-DR); set_servo_angle(angle); break; // 其他指令处理... } } }4. 舵机控制精要4.1 PWM占空比计算舵机角度与PWM脉宽的对应关系角度脉宽(ms)占空比(72MHz时钟)0°0.550090°1.51500180°2.52500实现函数示例void set_servo_angle(uint8_t angle) { uint16_t pulse 500 angle * 11.11; // 500-2500映射到0-180° __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, pulse); }4.2 平滑运动技巧避免舵机瞬时大角度跳变// 渐进式角度调整 void smooth_move(uint8_t target_angle) { static uint8_t current 90; while(current ! target_angle) { current (target_angle current) ? 1 : -1; set_servo_angle(current); HAL_Delay(20); // 每步间隔20ms } }5. 电机驱动与运动控制5.1 双电机差速转向通过左右轮速度差实现转向运动模式左轮动作右轮动作前进正转正转左转停止正转原地旋转反转正转对应的GPIO控制逻辑#define MOTOR_L_FW GPIO_PIN_SET #define MOTOR_L_BW GPIO_PIN_RESET void motor_control(bool L_FW, bool L_BW, bool R_FW, bool R_BW) { HAL_GPIO_WritePin(GPIOA, MOTOR_L_PIN, L_FW ? MOTOR_L_FW : MOTOR_L_BW); // 其他引脚控制类似... }5.2 抗干扰设计电机电源与MCU电源隔离在电机驱动板电源端并联1000μF电容信号线串联100Ω电阻6. 调试与优化实战6.1 常见问题排查表现象可能原因解决方案蓝牙无法连接波特率不匹配检查双方串口参数舵机抖动不转电源功率不足外接5V 2A电源电机响应延迟软件消抖时间过长调整HAL_Delay值控制指令错乱串口接收缓冲区溢出增加指令校验码6.2 功耗优化技巧在无操作时进入STOP模式通过蓝牙唤醒void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { HAL_PWR_DisableSleepOnExit(); // 处理唤醒后的操作 }7. 项目扩展方向手机APP升级使用MIT App Inventor开发专属控制界面多模式切换增加红外遥控或语音控制模块环境感知加装超声波模块实现避障功能状态反馈通过蓝牙回传电池电压等数据在完成基础版本后试着为小车增加一个急停功能——当检测到特定指令时立即切断电机电源。这个功能在实际操作中非常实用我在第一次路测时就因为缺少急停机制差点让小车冲出桌面。后来在电机驱动电路上增加了一个MOSFET开关通过独立IO口控制安全系数大幅提升。

更多文章