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

相关推荐
用户685453759776915 分钟前
同步成本换并行度:多线程、协程、分片、MapReduce 怎么选才不踩坑
后端
javaTodo23 分钟前
Claude Code 记忆机制详解:从 CLAUDE.md 到 Auto Memory,六层体系全拆解
后端
LSTM9744 分钟前
使用 C# 和 Spire.PDF 从 HTML 模板生成 PDF 的实用指南
后端
JaguarJack1 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
BingoGo1 小时前
为什么 PHP 闭包要加 static?
后端
是糖糖啊1 小时前
OpenClaw 从零到一实战指南(飞书接入)
前端·人工智能·后端
百度Geek说1 小时前
基于Spark的配置化离线反作弊系统
后端
Java编程爱好者2 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
后端
苏三说技术2 小时前
Spring AI 和 LangChain4j ,哪个更好?
后端