首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)

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

原创
作者头像
一键难忘
发布2025-08-16 00:02:39
发布2025-08-16 00:02:39
7610
举报
文章被收录于专栏:技术汇总专栏技术汇总专栏

基于STM32的蓝牙小车项目详解

源码下载

完整项目已打包,开源免费:https://shangjinzhu.blog.csdn.net/article/details/150432527

一、项目概述

随着智能小车和物联网技术的发展,基于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. 读取编码器数据进行速度/里程统计

整体流程图如下:

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

九、调试与优化

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

十、总结

通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于STM32的蓝牙小车项目详解
    • 一、项目概述
    • 二、硬件设计与接口说明
      • 硬件连接说明
    • 三、STM32开发环境搭建
      • 外设初始化示例(C语言)
    • 四、蓝牙控制实现
      • 1. 蓝牙通信原理
      • 2. USART串口接收示例
    • 五、电机驱动与PWM控制
      • PWM初始化示例
    • 六、超声波避障功能
    • 七、编码器实现里程计数
    • 八、软件整合与逻辑流程
    • 九、调试与优化
    • 十、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档