前言在嵌入式开发领域STM32系列微控制器因其高性能和丰富的外设而广受欢迎。本文将基于一个完整的STM32蓝牙小车项目详细介绍其硬件配置、软件架构以及关键代码实现。这个项目使用STM32F103C8作为主控通过蓝牙模块接收控制指令驱动电机实现前进、后退、转向等动作并通过OLED屏幕显示当前状态。适合嵌入式爱好者和学生学习参考。项目源码基于Keil MDK开发环境使用标准外设库StdPeriph_Lib。完整代码可在GitHub或相关平台获取。项目概述功能特性蓝牙控制通过串口接收蓝牙模块指令支持前进、后退、左转、右转、停止五种动作。电机驱动双电机独立控制实现差分驱动。状态显示OLED屏幕实时显示小车状态和指令。PWM调速使用定时器PWM输出控制电机速度。硬件配置主控芯片STM32F103C8T6蓝牙模块HC-05或类似串口蓝牙模块连接到USART1电机驱动L298N或TB6612电机驱动模块电源锂电池或DC电源5V/3.3V供电硬件连接电机1PA4/PA5控制方向TIM2_CH1输出PWM电机2PB10/PB11控制方向TIM2_CH2输出PWM蓝牙PA9(TX)/PA10(RX)软件架构项目采用模块化设计主要文件结构如下main.c主程序入口处理指令解析和状态机motor.c/h电机控制模块Serial.c/h串口通信模块pwm.c/hPWM输出模块Library/STM32标准外设库材料准备1主控芯片stm32f103c8t6*1遥控模块HC-05蓝牙串口模块电源模块1.5v干电池*5DC-120533A DC电源转换模块电机驱动减速电机*2TB6612 *2面包板*1接线若干由于我是用热熔胶自己diy的小车所以我的大小可以直接契合面包板就省去了焊接部分。关键代码分析主程序main.c主程序初始化各模块后进入循环检测串口接收标志。收到指令后通过switch语句执行相应动作int main(void){motor_Init();Serial_Init();OLED_Init(); // 假设有初始化函数OLED_ShowString(1, 1, Bluetooth Car);OLED_ShowString(2, 1, Ready...);while(1){if(Serial_RxFlag 1){char cmd Serial_RxPacket[0];switch(cmd){case 1: motor_set(100); motor_set3(100); OLED_ShowString(3, 1, Forward ); break;case 2: motor_set(-100); motor_set3(-100); OLED_ShowString(3, 1, Backward ); break;case 3: motor_set(0); motor_set3(100); OLED_ShowString(3, 1, Left ); break;case 4: motor_set(100); motor_set3(0); OLED_ShowString(3, 1, Right ); break;case 0: default: motor_set(0); motor_set3(0); OLED_ShowString(3, 1, Stop ); break;}Serial_RxFlag 0;}Delay_ms(10);}}指令映射这里我用的是江协科技的蓝牙串口小程序的按键操控常见问题1前进两电机正转2后退两电机反转3左转左电机停右电机正转4右转右电机停左电机正转0停止速度范围是 -100-1000即为停止电机控制模块motor.c电机控制使用H桥原理通过GPIO控制方向PWM控制速度void motor_set(int8_t speed){if(speed 0){GPIO_SetBits(GPIOA, GPIO_Pin_4); // IN1高GPIO_ResetBits(GPIOA, GPIO_Pin_5); // IN2低pwm_set(speed); // PWM输出} else if(speed 0){GPIO_SetBits(GPIOA, GPIO_Pin_5); // IN2高GPIO_ResetBits(GPIOA, GPIO_Pin_4); // IN1低pwm_set(-speed);} else {GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5); // 刹车}}串口通信模块Serial.c使用USART1中断接收数据波特率9600void Serial_Init(void){// GPIO和USART配置USART_InitStructure.USART_BaudRate 9600;USART_InitStructure.USART_WordLength USART_WordLength_8b;// ... 其他配置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// NVIC配置USART_Cmd(USART1, ENABLE);}中断处理函数在stm32f10x_it.c中将接收到的字节存入缓冲区设置标志位。测试与调试硬件连接确保电机驱动、蓝牙模块、OLED正确连接电源稳定。串口调试使用串口助手发送指令观察电机响应。电机不转检查驱动模块供电和信号线连接蓝牙无响应确认波特率匹配模块配对成功PWM调速调整PWM占空比测试速度控制。蓝牙配对配置HC-05模块确保与手机APP通信正常。完整代码链接: https://pan.baidu.com/s/1pm35TQAuxcCKkuWz2nKjHg?pwd1111 提取码: 1111
基于stm32的二驱蓝牙小车
前言在嵌入式开发领域STM32系列微控制器因其高性能和丰富的外设而广受欢迎。本文将基于一个完整的STM32蓝牙小车项目详细介绍其硬件配置、软件架构以及关键代码实现。这个项目使用STM32F103C8作为主控通过蓝牙模块接收控制指令驱动电机实现前进、后退、转向等动作并通过OLED屏幕显示当前状态。适合嵌入式爱好者和学生学习参考。项目源码基于Keil MDK开发环境使用标准外设库StdPeriph_Lib。完整代码可在GitHub或相关平台获取。项目概述功能特性蓝牙控制通过串口接收蓝牙模块指令支持前进、后退、左转、右转、停止五种动作。电机驱动双电机独立控制实现差分驱动。状态显示OLED屏幕实时显示小车状态和指令。PWM调速使用定时器PWM输出控制电机速度。硬件配置主控芯片STM32F103C8T6蓝牙模块HC-05或类似串口蓝牙模块连接到USART1电机驱动L298N或TB6612电机驱动模块电源锂电池或DC电源5V/3.3V供电硬件连接电机1PA4/PA5控制方向TIM2_CH1输出PWM电机2PB10/PB11控制方向TIM2_CH2输出PWM蓝牙PA9(TX)/PA10(RX)软件架构项目采用模块化设计主要文件结构如下main.c主程序入口处理指令解析和状态机motor.c/h电机控制模块Serial.c/h串口通信模块pwm.c/hPWM输出模块Library/STM32标准外设库材料准备1主控芯片stm32f103c8t6*1遥控模块HC-05蓝牙串口模块电源模块1.5v干电池*5DC-120533A DC电源转换模块电机驱动减速电机*2TB6612 *2面包板*1接线若干由于我是用热熔胶自己diy的小车所以我的大小可以直接契合面包板就省去了焊接部分。关键代码分析主程序main.c主程序初始化各模块后进入循环检测串口接收标志。收到指令后通过switch语句执行相应动作int main(void){motor_Init();Serial_Init();OLED_Init(); // 假设有初始化函数OLED_ShowString(1, 1, Bluetooth Car);OLED_ShowString(2, 1, Ready...);while(1){if(Serial_RxFlag 1){char cmd Serial_RxPacket[0];switch(cmd){case 1: motor_set(100); motor_set3(100); OLED_ShowString(3, 1, Forward ); break;case 2: motor_set(-100); motor_set3(-100); OLED_ShowString(3, 1, Backward ); break;case 3: motor_set(0); motor_set3(100); OLED_ShowString(3, 1, Left ); break;case 4: motor_set(100); motor_set3(0); OLED_ShowString(3, 1, Right ); break;case 0: default: motor_set(0); motor_set3(0); OLED_ShowString(3, 1, Stop ); break;}Serial_RxFlag 0;}Delay_ms(10);}}指令映射这里我用的是江协科技的蓝牙串口小程序的按键操控常见问题1前进两电机正转2后退两电机反转3左转左电机停右电机正转4右转右电机停左电机正转0停止速度范围是 -100-1000即为停止电机控制模块motor.c电机控制使用H桥原理通过GPIO控制方向PWM控制速度void motor_set(int8_t speed){if(speed 0){GPIO_SetBits(GPIOA, GPIO_Pin_4); // IN1高GPIO_ResetBits(GPIOA, GPIO_Pin_5); // IN2低pwm_set(speed); // PWM输出} else if(speed 0){GPIO_SetBits(GPIOA, GPIO_Pin_5); // IN2高GPIO_ResetBits(GPIOA, GPIO_Pin_4); // IN1低pwm_set(-speed);} else {GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5); // 刹车}}串口通信模块Serial.c使用USART1中断接收数据波特率9600void Serial_Init(void){// GPIO和USART配置USART_InitStructure.USART_BaudRate 9600;USART_InitStructure.USART_WordLength USART_WordLength_8b;// ... 其他配置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// NVIC配置USART_Cmd(USART1, ENABLE);}中断处理函数在stm32f10x_it.c中将接收到的字节存入缓冲区设置标志位。测试与调试硬件连接确保电机驱动、蓝牙模块、OLED正确连接电源稳定。串口调试使用串口助手发送指令观察电机响应。电机不转检查驱动模块供电和信号线连接蓝牙无响应确认波特率匹配模块配对成功PWM调速调整PWM占空比测试速度控制。蓝牙配对配置HC-05模块确保与手机APP通信正常。完整代码链接: https://pan.baidu.com/s/1pm35TQAuxcCKkuWz2nKjHg?pwd1111 提取码: 1111