基于STM32hal库的蓝牙小车

该博客介绍了如何使用STM32F407ZGT6开发板,结合L298N电机驱动模块和JDY-31蓝牙模块,实现四轮小车的蓝牙遥控控制。通过STM32CubeMX配置GPIO、RCC时钟和UART,编写C代码实现接收蓝牙指令控制小车前进、后退、左右转及停止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

材料:

(1)stm32f407zgt6最小系统开发板

(2)l298n电机驱动模块1个

(3)四个电机

(4)JDY-31蓝牙模块

一、组装

(1)L298N电机驱动模块与stm32开发板接线如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_17,color_FFFFFF,t_70,g_se,x_16

(2)蓝牙接线:

VCC接stm32开发板的3.3v~5v,GND接stm32开发板的GND,TXD接stm32开发板的PA10引脚,RXD接stm32开发板的PA9引脚。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_17,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 

二、主要程序

1、STM32CUBEMX配置如下:

(1)引脚配置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 说明:

1)定义2个电机的引脚,都是GPIOB

2)motor11和motor12分别为电机(1)的两个引脚

3)motor21和motor22分别为电机(2)的两个引脚

(2)配置RCC时钟:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

(3) 时钟的配置:watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

(4)UART配置: 

1)选择所需UART
2)选择Mode为异步通讯方式(常用)
3)设置基础参数:波特率为115200 Bits/s;传输数据长度为8 Bit;奇偶检验无;停止位1;接收和发送都使能 。
注意 CubeMX默认打开的引脚确实为最常用的引脚,但有时与电路板并不相符。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 

三、程序

main.c

while (1)
  {
		  HAL_UART_Receive(&huart1,&rx,1,HAL_MAX_DELAY);
		if(rx=='o')
		{
		     car_go_straight();//前进
			
		}
		else if(rx=='f')
		{
		    car_go_after();//后退
				
		}
		else if(rx=='l')
		{
		  car_go_left();//左转
		}
			else if(rx=='r')
		{
		 car_go_right();//右转
		}
		else 
		{
		  car_go_ahead();//停止
		}
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

如果发送个字符“o”小车就会前进,发送个字符“f”小车就会后退,发送个字符“l”小车就会左转,发送个字符“r”小车就会右转,发送其他字符小车就停止 。

main.h

#include "main.h"

电机程序:

Motor.c

#include "motor.h"

//前进
void car_go_straight(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);
	
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET);
}

//右转
void car_go_right(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);

   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_SET);

}

//左转
void car_go_left(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_SET);

   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET); 

}


//停止
void car_go_ahead(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);

   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET);

}


//后退
void car_go_after(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_SET);

   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_SET);

}

 

Motor.h

#ifndef __MOTOR_H_
#define __MOTOR_H_

#include "main.h"

void car_go_straight(void);
void car_go_right(void);
void car_go_left(void);
void car_go_ahead(void);
void car_go_after(void);

#endif

4、手机端调试软件

APP:SPP蓝牙串口

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

 

 

### STM32F407 蓝牙遥控小车实现方案 #### 硬件准备 为了构建基于STM32F407的蓝牙遥控小车,所需的主要组件如下: - **控制器**:stm32f407vet6核心板用于处理各种传感器输入并执行相应的动作[^3]。 - **电机驱动**:采用两块L298N模块来控制四台TT马达的工作状态,从而完成小车的方向调整和速度变化[^2]。 - **电源管理**:选用LM2596稳压模块配合12V 18650锂电池供电给整个电路系统提供稳定电力支持。 - **通信接口**:CC2540蓝牙4.0模块负责接收来自移动设备发出的操作命令并通过UART协议传递至MCU进行解析处理。 #### 硬件连接 确保所有电子元件按照正确的方式相互链接至关重要。具体来说就是将各个功能模块之间建立可靠的电气接触路径,比如把电机驱动器接到微处理器上指定引脚位置,并且让蓝牙收发装置也接入到合适的通讯端口中去[^1]。 #### STM32CubeMX配置 启动STM32CubeMX软件工具来进行初始化设置工作之前,先要了解清楚目标开发平台的具体参数规格以及外设资源分配情况。对于本项目而言,则需重点考虑如何开启定时器中断服务程序以便精确测量时间间隔;另外还需注意使能USART串行口以方便后续调试过程中的数据交换操作。 ```c // 配置USART波特率 MX_USART2_UART_Init(); ``` #### 代码编写 编程阶段涉及到多个方面内容的学习掌握,包括但不限于底层寄存器操作技巧、高级函数调用方法论等知识点。下面给出一段简单的伪代码片段用来说明基本逻辑框架结构: ```c #include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void){ HAL_Init(); // 初始化HAL SystemClock_Config(); // 设置系统时钟 MX_GPIO_Init(); // GPIO初始化 MX_TIM2_Init(); // 定时器TIM2初始化 while (true) { if(HAL_GetTick() % 100 == 0){ // 每隔一定周期读取一次蓝牙信号 uint8_t data; HAL_UART_Receive(&huart2, &data, sizeof(data), HAL_MAX_DELAY); // 接受蓝牙发送的数据 switch(data){ case 'W': /* 前进 */ break; case 'S': /* 后退 */ break; case 'A': /* 左转 */ break; case 'D': /* 右转 */ break; default : /* 默认停止*/ break; } // 更新显示信息... } // 控制电机转动... } } ```
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值