基于STM32智能小车控制,红外循迹

目录

一、蓝牙相关配置

1.串口介绍

​编辑

 2.硬件连接 ​编辑

3. 配置蓝牙

1.AT指令

4.软件CUBEIDE相关配置

1.串口配置

2. 代码

二、配置电机(L298N)

1.查看原理图

 2.软件配置

3.代码

三、红外循迹

1.原理图

 2、软件配置

​3、代码


一、蓝牙相关配置

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);			//右大转
	  }
	  			  
  }

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值