问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的智能小车控制详解:蓝牙配置、电机控制与红外循迹

创作时间:
作者:
@小白创作中心

基于STM32的智能小车控制详解:蓝牙配置、电机控制与红外循迹

引用
CSDN
1.
https://blog.csdn.net/weixin_56589662/article/details/129864935

本文详细介绍了基于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);            //右大转
    }
}

循迹功能也可以显示了,也可以在此基础上添加一些其他功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号