基于STM32的智能小车控制详解:蓝牙配置、电机控制与红外循迹
基于STM32的智能小车控制详解:蓝牙配置、电机控制与红外循迹
本文详细介绍了基于STM32的智能小车控制,包括蓝牙配置、电机控制和红外循迹三个方面的内容。文章结构清晰,每个部分都包含了硬件连接、软件配置和代码实现,适合有一定基础的嵌入式开发人员参考。
一、蓝牙相关配置
1.串口介绍
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
2.硬件连接
3. 配置蓝牙
1.AT指令
AT+NAME=8888 //名字
AT+NAME? //查看名字
AT+PSWD="6666" //密码
AT+PSWD? //查看名字
AT+UART=9600,0,0 //波特率
AT+UART? //查看波特率
AT+RESET //重启
设置成功都会返回 OK
4.软件CUBEIDE相关配置
1.串口配置
开启串口中断
2. 代码
打印函数,用于测试的。
开启接收中断
进入串口接收中断回调函数,此函数为弱函数,即在主函数中调用便可覆盖之前执行的内容,执行现在打印的函数。
手机连上蓝牙发送信息;串口界面打印 111111 换行 hello 就表示可以进入中断函数,
二、配置电机(L298N)
1.查看原理图
ENA和ENB使能,ENA控制INT1和INT2,ENB控制INT3和INT4。
分别对应PA0,PA1,PB15,PB14,PB13,PB12。
2.软件配置
这里我们使用PWM(脉冲宽度调制),指1秒内信号从高电平到低电平再回到高电平的次数,即高电平在一个周期所占比。可以调节左右两边车轮的速度。这里就不细讲了。
3.代码
1.在主函数里面开启PWM
模块化,在Core/Src下面添加一个.c文件,在里面添加用到的头文件。
#include "DJ.h"
#include "main.h"
#include "stm32f1xx_hal.h"
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
//电机正转
void DJ(int a,int b)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,a);
HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,b);
HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_SET);
}
//电机反转
void BACK(int c,int d)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,c);
HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,d);
HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_RESET);
}
在Core/INC文件夹里面添加一个.h文件
#ifndef INC_DJ_H_
#define INC_DJ_H_
void DJ(int a,int b);
void BACK(int c,int d);
#endif
在main.c里中断接收函数里添加如下代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart3,data,1,10); //发送函数
if(data[0] == 'a')
{
DJ(150,150); //前进
}
if(data[0] == 'b')
{
DJ(10,150); //左转
}
if(data[0] == 'c')
{
DJ(0,0); //停止
}
if(data[0] == 'd')
{
BACK(150,150); //后退
}
if(data[0] == 'e')
{
DJ(150,10); //右转
}
HAL_UART_Receive_IT(&huart3,data,1); //开启接收中断
}
第一步测试在串口界面打印了就说明是可以通信的,在手机蓝牙调试器软件上发相应的字符
就能实现相应的功能,
蓝牙控制小车功能已经实现,
三、红外循迹
1.原理图
引脚分别对应PC4,PC5,PB0,PB1,PB2。
2、软件配置
3、代码
1.放在main.c文件里面,头文件下面主函数之前,也可以模块化代码,步骤和上面一样。
因为该红外传感器0是黑色,1是其他颜色
int KZ(void)
{
int flag=0;
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==0 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
{
flag=1;//左转大弯
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
{
flag=2; //左转小弯
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
{
flag=3;//慢速前进
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
{
flag=4; //右转小弯
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
{
flag=5; //右转大弯
}
return flag;
}
2.在主函数while循环里添加如下代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(KZ()==1)
{
DJ(50,100); //左大转
}
if(KZ()==2)
{
DJ(100,200); //左小转
}
if(KZ()==3)
{
DJ(200,200); //前进
}
if(KZ()==4)
{
DJ(200,100); //右小转
}
if(KZ()==5)
{
DJ(200,50); //右大转
}
}
循迹功能也可以显示了,也可以在此基础上添加一些其他功能。
