【免费开源】基于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硬件控制与嵌入式编程,也为后续扩展如循迹导航、视觉识别或自动寻路提供了坚实的硬件与软件基础。整体来看,本项目兼具实用性和拓展性,是入门智能机器人开发的优秀案例。

相关推荐
AAA修煤气灶刘哥9 分钟前
MySQL 查文本查哭了?来唠唠 ES 这货:从 “啥是 ES” 到 Java 撸代码,一篇整明白!
java·后端·elasticsearch
金銀銅鐵11 分钟前
[Java] 浅析密封类(Sealed Classes) 在 class 文件中是如何实现的
java·后端
007php00714 分钟前
Go语言面试:传值与传引用的区别及选择指南
java·开发语言·后端·算法·面试·golang·xcode
唐叔在学习16 分钟前
从MD5到RSA,一文读懂常见的加密算法
后端
javadaydayup18 分钟前
为什么 MyBatis Mapper 接口能像普通 Bean 一样被 @Autowired?
后端·mybatis
考虑考虑1 小时前
Redis8中的布谷鸟过滤器
redis·后端·程序员
Sammyyyyy1 小时前
Node.js 做 Web 后端优势为什么这么大?
开发语言·前端·javascript·后端·node.js·servbay
重庆穿山甲2 小时前
Cola架构深度解析:企业级应用架构设计指南
后端
IT_陈寒2 小时前
🔥5个必学的JavaScript性能黑科技:让你的网页速度提升300%!
前端·人工智能·后端