基于STM32的蓝牙小车项目详解
源码下载 完整项目已打包,开源免费:shangjinzhu.blog.csdn.net/article/det...
一、项目概述
随着智能小车和物联网技术的发展,基于STM32的蓝牙小车已成为学习嵌入式开发和无线控制的热门项目。本项目基于STM32微控制器,结合蓝牙通信、超声波测距、电机驱动及编码器,实现了一辆可远程控制、具备避障功能的智能小车。
核心功能包括:
- 蓝牙无线遥控小车前进、后退、转向、停止
- 超声波实时测距,实现前方障碍物自动避障
- 电机PWM驱动,实现速度控制
- 编码器计数,实现小车行驶里程统计
该项目不仅适合初学者学习STM32硬件控制,也可作为智能机器人开发的基础平台。

二、硬件设计与接口说明
本项目的硬件设计主要包括STM32主控板、电机驱动模块、蓝牙模块、超声波模块、编码器及LED/按键等外围设备。各功能与IO口对应关系如下表:
功能/外设 | IO口 | 备注 |
---|---|---|
LED | GPIOA 12, GPIOC 13 | 官方例程与补充 |
Key | GPIOA 15, GPIOA 0 | 官方例程与补充 |
ADC | GPIOA 4 | 官方例程 |
I2C | GPIOB 8, GPIOB 9 | 官方例程 |
USART1 | TX: PA9, RX: PA10 | 官方例程 |
USART2 | TX: PA2, RX: PA3 | 官方例程 |
USART3 | TX: PB10, RX: PB11 | 官方例程 |
Soft I2C | PB8, PB9 | 官方例程 |
超声波测距 - 控制输出 | GPIOB 1 | 官方例程 |
超声波测距 - 定时器输入 | Timer3: GPIOB 0 | 官方例程 |
电机转向控制 - AIN2 | GPIOB 15 | 官方例程 |
电机转向控制 - AIN1 | GPIOB 14 | 官方例程 |
电机转向控制 - BIN1 | GPIOB 13 | 官方例程 |
电机转向控制 - BIN2 | GPIOB 12 | 官方例程 |
电机PWM输出 - CH1 | GPIOA 8 | 官方例程 |
电机PWM输出 - CH4 | GPIOA 11 | 官方例程 |
编码器输入 - Timer2 | GPIOA 0, GPIOA 1 | 官方例程 |
编码器输入 - Timer4 | GPIOB 6, GPIOB 7 | 官方例程 |
定时器输出 - Timer3 CH3 | PB0 | 官方例程 |
定时器输出 - Timer3 CH4 | PB1 | 官方例程 |
定时器输入 - Timer1 CH1 | PA8 | 官方例程 |
定时器输入 - Timer3 CH1 | PA6 | 官方例程 |
延时功能 | Timer4 | 官方例程 |
系统时间 | Timer2 | 官方例程 |
电机控制备用 | PA1, PA2, PA3, PA4 | 补充 |
硬件连接说明
- 电机驱动模块:使用H桥控制小车前后左右运动,PWM信号控制速度。
- 蓝牙模块:通过USART串口与STM32通信,实现手机APP远程控制。
- 超声波模块:通过GPIO输出Trig信号,输入Echo信号到定时器捕获,实现精确测距。
- 编码器:利用定时器输入捕获计数,实现轮速与里程测量。
- LED与按键:用于状态指示和手动控制。

三、STM32开发环境搭建
本项目采用STM32F103系列开发板,开发工具为 STM32CubeIDE。开发步骤如下:
- 创建STM32工程,选择对应芯片型号
- 配置时钟、GPIO、定时器、USART、ADC等外设
- 生成初始化代码
- 编写功能模块程序
外设初始化示例(C语言)
c
// GPIO初始化
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// LED GPIO初始化
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
四、蓝牙控制实现
1. 蓝牙通信原理
蓝牙模块(如HC-05)通过串口与STM32通信,接收手机APP发送的控制指令。常用指令如:
指令 | 功能 |
---|---|
'F' | 前进 |
'B' | 后退 |
'L' | 左转 |
'R' | 右转 |
'S' | 停止 |
2. USART串口接收示例
c
uint8_t rx_data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
switch(rx_data)
{
case 'F': move_forward(); break;
case 'B': move_backward(); break;
case 'L': turn_left(); break;
case 'R': turn_right(); break;
case 'S': stop_car(); break;
}
HAL_UART_Receive_IT(&huart2, &rx_data, 1);
}
}
五、电机驱动与PWM控制
小车的速度通过PWM信号控制,方向通过H桥电机驱动器控制。
PWM初始化示例
c
void MX_TIM1_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 71;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
六、超声波避障功能
超声波模块通过Trig产生10μs脉冲,Echo输入到定时器,测量高电平时间,计算距离:
c
float get_distance(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(0.01);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
uint32_t duration = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
float distance = duration * 0.034 / 2;
return distance;
}
当距离小于设定阈值时,小车自动停止或转向。
七、编码器实现里程计数
利用编码器信号和定时器捕获,统计轮子旋转次数,计算行驶距离和速度。
c
uint32_t encoder_count = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
encoder_count = __HAL_TIM_GET_COUNTER(htim);
}
}
八、软件整合与逻辑流程
- 初始化外设
- 启动PWM输出
- 启动USART接收蓝牙指令
- 循环读取超声波距离,判断是否避障
- 根据蓝牙指令控制小车运动
- 读取编码器数据进行速度/里程统计
整体流程图如下:
css
[蓝牙接收指令] --> [解析指令] --> [控制电机PWM与方向]
|
v
[超声波测距]
|
距离 < 阈值 ? --> [停止/转向]
|
v
[编码器计数]
九、调试与优化
- 蓝牙通信:检查串口波特率是否匹配,确保数据稳定传输
- PWM调速:通过调整占空比实现平滑加速/减速
- 超声波测距:注意防止干扰,超声波避障逻辑可增加滤波
- 编码器:避免抖动导致计数不准确,可使用硬件滤波或软件防抖
十、总结
通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。 本项目基于STM32微控制器,成功实现了一辆具备蓝牙远程控制、超声波避障、电机PWM调速以及编码器里程计数功能的智能小车。通过对GPIO、USART、定时器、PWM和I2C等外设的综合运用,系统能够稳定响应蓝牙指令,同时具备自动避障能力。该项目不仅适合初学者学习STM32硬件控制与嵌入式编程,也为后续扩展如循迹导航、视觉识别或自动寻路提供了坚实的硬件与软件基础。整体来看,本项目兼具实用性和拓展性,是入门智能机器人开发的优秀案例。