【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)

基于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 补充

硬件连接说明

  1. 电机驱动模块:使用H桥控制小车前后左右运动,PWM信号控制速度。
  2. 蓝牙模块:通过USART串口与STM32通信,实现手机APP远程控制。
  3. 超声波模块:通过GPIO输出Trig信号,输入Echo信号到定时器捕获,实现精确测距。
  4. 编码器:利用定时器输入捕获计数,实现轮速与里程测量。
  5. LED与按键:用于状态指示和手动控制。

三、STM32开发环境搭建

本项目采用STM32F103系列开发板,开发工具为 STM32CubeIDE。开发步骤如下:

  1. 创建STM32工程,选择对应芯片型号
  2. 配置时钟、GPIO、定时器、USART、ADC等外设
  3. 生成初始化代码
  4. 编写功能模块程序

外设初始化示例(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);
    }
}

八、软件整合与逻辑流程

  1. 初始化外设
  2. 启动PWM输出
  3. 启动USART接收蓝牙指令
  4. 循环读取超声波距离,判断是否避障
  5. 根据蓝牙指令控制小车运动
  6. 读取编码器数据进行速度/里程统计

整体流程图如下:

css 复制代码
[蓝牙接收指令] --> [解析指令] --> [控制电机PWM与方向]
                     |
                     v
                [超声波测距]
                     |
             距离 < 阈值 ? --> [停止/转向]
                     |
                     v
                [编码器计数]

九、调试与优化

  1. 蓝牙通信:检查串口波特率是否匹配,确保数据稳定传输
  2. PWM调速:通过调整占空比实现平滑加速/减速
  3. 超声波测距:注意防止干扰,超声波避障逻辑可增加滤波
  4. 编码器:避免抖动导致计数不准确,可使用硬件滤波或软件防抖

十、总结

通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。 本项目基于STM32微控制器,成功实现了一辆具备蓝牙远程控制、超声波避障、电机PWM调速以及编码器里程计数功能的智能小车。通过对GPIO、USART、定时器、PWM和I2C等外设的综合运用,系统能够稳定响应蓝牙指令,同时具备自动避障能力。该项目不仅适合初学者学习STM32硬件控制与嵌入式编程,也为后续扩展如循迹导航、视觉识别或自动寻路提供了坚实的硬件与软件基础。整体来看,本项目兼具实用性和拓展性,是入门智能机器人开发的优秀案例。

相关推荐
uhakadotcom1 小时前
使用postgresql时有哪些简单有用的最佳实践
后端·面试·github
IT毕设实战小研1 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计
bobz9651 小时前
QT 字体
后端
泉城老铁1 小时前
Spring Boot 中根据 Word 模板导出包含表格、图表等复杂格式的文档
java·后端
用户4099322502121 小时前
如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法?
后端·github·trae
风象南1 小时前
开发者必备工具:用 SpringBoot 构建轻量级日志查看器,省时又省力
后端
RainbowSea2 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 04
java·spring boot·后端
楽码2 小时前
理解自动修复:编程语言的底层逻辑
后端·算法·编程语言
RainbowSea2 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 03
java·spring boot·后端
Young55662 小时前
RAG?你真的了解RAG吗?
人工智能·后端