三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

用STM32F103ZET6和HC-06蓝牙模块,从零打造一台手机遥控小车(附完整代码与接线图)

用STM32F103ZET6和HC-06蓝牙模块,从零打造一台手机遥控小车(附完整代码与接线图)

从零构建STM32蓝牙遥控小车:硬件搭建与代码实战指南

项目概述与核心挑战

对于刚接触STM32开发的电子爱好者来说,将理论知识转化为实际项目往往面临诸多困难。一个典型的蓝牙遥控小车项目涉及GPIO控制、PWM生成、串口通信等多个核心知识点,而如何将这些分散的技术点整合成一个可运行的整体,正是本教程要解决的核心问题。

不同于简单的模块测试,完整项目需要面对三大挑战:多模块供电系统的稳定性、外设驱动的代码架构设计、以及蓝牙指令的实时响应机制。我们将使用STM32F103ZET6作为主控,配合HC-06蓝牙模块和L298N电机驱动,构建一个响应灵敏、运行稳定的遥控平台。

1. 硬件系统搭建

1.1 关键元件选型与功能分析

主控制器:STM32F103ZET6(正点原子精英板)

  • 72MHz Cortex-M3内核
  • 64KB SRAM + 512KB Flash
  • 丰富的外设接口(5个USART、3个SPI等)

执行机构:

  • L298N双H桥电机驱动模块
    • 驱动电压:5-35V
    • 单路持续输出电流:2A
    • 内置5V逻辑电源输出
  • MG995舵机(转向控制)
    • 工作电压:4.8-7.2V
    • 扭矩:9.4kg·cm
    • 180°旋转范围

通信模块:HC-06蓝牙串口模块

  • 工作频率:2.4GHz
  • 默认波特率:9600/115200
  • 通信距离:约10米(视环境而定)

1.2 供电系统设计

多模块供电是项目成功的关键,推荐采用三级供电方案:

模块供电方案电压需求电流需求
STM32开发板LM2596降压模块5V<500mA
L298N12V锂电池直接供电12V峰值2A
HC-06开发板3.3V输出3.3V<40mA

重要提示:所有模块必须共地!建议使用星型接地法,将所有GND线集中连接到电源负极。

1.3 硬件连接示意图

主要引脚连接关系:

STM32F103ZET6 <--> 外围设备 ----------------------------- PF0-PF3 <--> L298N IN1-IN4 PC6 (TIM3_CH1) <--> 舵机信号线 PA9 (USART1_TX) <--> HC-06 RX PA10 (USART1_RX) <--> HC-06 TX

电机驱动接线示例:

// L298N控制引脚定义 #define MOTOR1_IN1 GPIO_Pin_0 // PF0 #define MOTOR1_IN2 GPIO_Pin_1 // PF1 #define MOTOR2_IN1 GPIO_Pin_2 // PF2 #define MOTOR2_IN2 GPIO_Pin_3 // PF3

2. 软件架构设计

2.1 模块化代码组织

推荐采用分层架构设计:

project/ ├── Drivers/ │ ├── motor.c # 电机驱动 │ ├── pwm.c # 舵机控制 │ └── bluetooth.c # 蓝牙通信 ├── Inc/ # 头文件目录 └── Src/ └── main.c # 主控制逻辑

2.2 电机驱动实现

motor.h关键定义:

typedef enum { MOTOR_STOP, MOTOR_FORWARD, MOTOR_BACKWARD } MotorState; void Motor_Init(void); void Motor_SetState(uint8_t motorNum, MotorState state);

motor.c核心函数:

void Motor_SetState(uint8_t motorNum, MotorState state) { switch(motorNum) { case 1: switch(state) { case MOTOR_STOP: GPIO_SetBits(GPIOF, MOTOR1_IN1|MOTOR1_IN2); break; case MOTOR_FORWARD: GPIO_ResetBits(GPIOF, MOTOR1_IN1); GPIO_SetBits(GPIOF, MOTOR1_IN2); break; // 其他状态处理... } break; // 电机2处理... } }

2.3 PWM舵机控制

舵机角度控制关键参数:

角度脉冲宽度(ms)占空比(20ms周期)
0°0.52.5%
90°1.57.5%
180°2.512.5%

PWM初始化代码:

void PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 时钟配置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 时基配置:20ms周期 TIM_TimeBaseStruct.TIM_Prescaler = 71; // 72MHz/72 = 1MHz TIM_TimeBaseStruct.TIM_Period = 19999; // 1MHz/(19999+1) = 50Hz TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); // PWM通道配置 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OC1Init(TIM3, &TIM_OCInitStruct); TIM_Cmd(TIM3, ENABLE); }

3. 蓝牙通信协议设计

3.1 指令集定义

设计简洁的指令协议:

指令字节功能描述参数范围
0x01前进-
0x02后退-
0x03左转0-255
0x04右转0-255
0x00停止-

3.2 串口中断处理

USART1配置示例:

void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE)) { uint8_t cmd = USART_ReceiveData(USART1); switch(cmd) { case 0x01: Motor_SetState(1, MOTOR_FORWARD); Motor_SetState(2, MOTOR_FORWARD); break; // 其他指令处理... } } }

3.3 手机端控制方案

推荐使用以下Android应用:

  • 蓝牙串口助手:支持自定义按钮和指令发送
  • Arduino RC Controller:提供摇杆控制界面
  • Serial Bluetooth Terminal:支持脚本编写

4. 系统调试与优化

4.1 常见问题排查表

现象可能原因解决方案
电机不转供电不足检查12V电源电流输出能力
舵机抖动电源干扰增加1000μF滤波电容
蓝牙连接不稳定波特率不匹配确认HC-06与STM32波特率一致
控制响应延迟主循环处理过慢优化代码结构,使用中断

4.2 性能优化技巧

  1. 电源去耦:

    • 在每个电机电源输入端并联0.1μF陶瓷电容
    • 在STM32的5V输入处增加220μF电解电容
  2. 代码优化:

    // 使用位带操作替代标准库函数 #define MOTOR1_IN1_BIT ((uint32_t)0x40010800) // PF0 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) void Motor_FastSet(uint8_t pin, uint8_t state) { *(volatile uint32_t*)BITBAND(MOTOR1_IN1_BIT, pin) = state; }
  3. 蓝牙抗干扰:

    • 将HC-06天线远离电机和电源线
    • 在蓝牙模块VCC与GND之间添加10μF电容

4.3 扩展功能建议

  1. 速度分级控制:

    void Motor_SetSpeed(uint8_t level) { // level: 0-3 const uint16_t speeds[] = {0, 30, 70, 100}; TIM_SetCompareX(TIMx, speeds[level]); }
  2. 状态反馈功能:

    • 通过蓝牙回传电池电压
    • 添加LED指示灯显示当前模式
  3. 自动避障扩展:

    if(HC-SR04_GetDistance() < 20) { Motor_SetState(1, MOTOR_STOP); Motor_SetState(2, MOTOR_STOP); }

在完成基础版本后,尝试为小车添加超声波模块实现自动避障,或者通过MPU6050实现姿态控制。这些扩展不仅能提升项目复杂度,更能深入理解STM32的多外设协同工作

← 返回列表