基于STM32的智能小车——循迹+避障+蓝牙

一、项目介绍

整理一位朋友做的基于STM32开发板设计一台智能小车,自己的文件不见了;可以实现自动循迹、避障、蓝牙控制等功能!整体不难实现,希望正在做或者准备做的朋友有一定的帮助。

二、硬件介绍

1、芯片介绍

本次项目采用的是基于ARM Cortex-M4内核的STM32F407开发板:
芯片参数:
1.IO口
(1)STM32F407ZGT6:144引脚 114个IO口
(2)大部分IO口都耐 5V (模拟通道除外)
(3)支持调试: SWD和JTAG,SWD只要2根数据线
2、通信接口多达17个 3.定时器多达17个
(1)3个I2C接口 4.16个DMA通道
(2)6个串口 5.32位 高性能ARM Cortex-M4处理器
(3)3个SPI接口 6.时钟 高达168MHz
(4)2个CAN2.0 7.支持FPU(浮点运算)和DSP指令
(5)2个USB OTG
(6)1个SDIO

2、直流电机及驱动

在这里插入图片描述

3、红外线探测模块

规格参数如下:

  1. 工作电压:DC 3.3V-5V
  2. 工作电流:尽量选择1A以上电源供电
  3. 工作温度:-10℃—+50℃
  4. 安装孔径:M3螺丝
  5. 检测距离:1mm至60 CM可调,距离越近性能越稳定,白色反射距离远。
  6. 尺寸大小:中控板4.4mm×4.0mm×12mm(长×宽×高)小板向前25mm×12mm×12mm
  7. 输出接口:6线制接口(1234为4路信号输出端,+为正电源,-为负电源也就是地线)
  8. 输出信号:TTL电平(可直接连接单片机I/0号,感应到传感器反射回来的红外光时,红指示灯亮,输出低电平;没有红外光时,指示灯不亮,输出高电平。)
    在这里插入图片描述
    STM32与模块 引脚链接表如下:
    在这里插入图片描述

4、蓝牙模块

蓝牙使用前一定要使用软件格式化,不然如果蓝牙之前有绑定过别的ID后就会新连接不上!
这里我们使用的是STM32的串口3与蓝牙进行通信;
在这里插入图片描述

蓝牙模块APP功能设定:

在这里插入图片描述

三、软件实现

mian.c文件

#include "gec_init.h"
#include "gec_gpio.h"
#include "gec_time.h"
#include "gec_uart.h"
#include "gec_int.h"

// 红外循迹、避障模块IO宏定义
#define GL  Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_9)
#define GR  Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_11)
#define L  Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_6)
#define R  Gec_GPIO_Get_Value(GPIOG,GPIO_Pin_15)

int i;
int cmd;
uint8_t recv_buf[4];

//小车控制
void car_contrl(int i,int j,int k,int l) 
{
	Gec_GPIO_Set_Value(GPIOB,GPIO_Pin_7,i);
	Gec_GPIO_Set_Value(GPIOD,GPIO_Pin_6,j);
	Gec_GPIO_Set_Value(GPIOA,GPIO_Pin_4,k);
	Gec_GPIO_Set_Value(GPIOD,GPIO_Pin_7,l);
}

// 电机驱动IO初始化
void car_contrl_init()  
{
	Gec_GPIO_Init(GPIOB,GPIO_Pin_7,GPIO_MODE_OUT_PP);
	Gec_GPIO_Init(GPIOD,GPIO_Pin_6,GPIO_MODE_OUT_PP);
	Gec_GPIO_Init(GPIOA,GPIO_Pin_4,GPIO_MODE_OUT_PP);
	Gec_GPIO_Init(GPIOD,GPIO_Pin_7,GPIO_MODE_OUT_PP);
}

//小车电平判断
void tracking_init()
{
	Gec_GPIO_Init(GPIOC,GPIO_Pin_6,GPIO_MODE_IN_PULLUP);
	Gec_GPIO_Init(GPIOG,GPIO_Pin_15,GPIO_MODE_IN_PULLUP);
	Gec_GPIO_Init(GPIOC,GPIO_Pin_9,GPIO_MODE_IN_PULLUP);
	Gec_GPIO_Init(GPIOC,GPIO_Pin_11,GPIO_MODE_IN_PULLUP);
}

void go_back()//后退
{
	car_contrl(0,1,0,1);
}
void go_up()//前进
{
	car_contrl(1,0,1,0);
}
void go_back_right()//后右
{
car_contrl(0,0,0,1);
}
void go_back_left()//后左
{
car_contrl(0,1,0,0);
}
void go_up_right()//前右
{
	car_contrl(1,0,0,0);
}
void go_up_left()//前左
{
	car_contrl(0,0,1,0);
}
void go_circle_right()//原地右转
{
car_contrl(1,0,0,1);
}
void go_circle_left()//原地左转
{
car_contrl(0,1,1,0);
}
void stop()//停止
{
car_contrl(0,0,0,0);
}

// 蓝牙模块
void bluetooth_ISR(void)   
{
	uint8_t Res;
				
		if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
			{	
				Res = USART_ReceiveData(USART3); 
				recv_buf[i++]=Res;
	
				if(i==4)
					{
						if((recv_buf[0]+recv_buf[1]+recv_buf[2])%256 == recv_buf[3])
						 {
						  	cmd = recv_buf[1]; 
							  i=0;
						 }
					}
	  	} 
}
	


int main(void)
{
	//初始化
	car_contrl_init();
	tracking_init();
	Gec_UART_Init(USART3,9600,USART_Parity_No,8,USART_StopBits_1);
	Gec_Int_Register(BSP_INT_ID_USART3,bluetooth_ISR); 
	Gec_Int_Enable(BSP_INT_ID_USART3); 
	uint8_t set_name[]="AT+NAME=CAOLE\r\n";
	Gec_UART_Write(USART3,set_name,sizeof(set_name));
	

	while(1)
	{
	//小车控制
	
		//1、蓝牙控制
		if(cmd == 0x01)
			{
				go_up();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x02)
			{
				go_back();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x03)
			{
				go_up_left();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x04)
			{
				go_up_right();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x05)
			{
				go_back_left();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x06)
			{
				go_back_right();
				mdelay(50);
				stop();
	  	}
		else if(cmd == 0x07)
			{
				go_circle_left();
				mdelay(50);
				stop();
			}
		else if(cmd == 0x08)
			{
				go_circle_right();
				mdelay(50);
				stop();
			}	
		else if(cmd == 0x09)
			{
				stop();
			}	
		else if(cmd==0x0A)
		{
			if(L==0&&R==0)
		{
			go_up();
		}
		
		//2、循迹控制
		else if(L==1&&R==0)
		{
			go_up_right();
			mdelay(5);
			stop();
			mdelay(5);
		}
		else if(L==0&&R==1)
		{
			go_up_left();
			mdelay(5);
			stop();
			mdelay(5);
		}
		else if(L==1&&R==1)
		{
			stop();
			mdelay(5);
		}
		}
		else if(cmd==0x0B)
		{
			if(GL==1&&GR==1)
		{
			go_up();
			mdelay(1000);
			stop();
		}
		
		//3、避障控制
		else if(GL==0&&GR==0)
		{
			go_back();
			mdelay(1000);
			stop();
		}
		else if(GL==0&&GR==1)
		{
			go_back_left();
			mdelay(1000);
			stop();
		}
		else if(GL==1&&GR==0)
		{
			go_back_right();
			mdelay(1000);
			stop();
		}
		}
		else if(cmd == 0x0C)
		{
			go_circle_right();
			mdelay(500);
		}
	}
}

在这里插入图片描述

总结:基本功能完美实现,但是也有美中不足,如:代码没有对速度进行控制,全程是输出一个匀速,可以结合PWM和PID算法对小车速度进行控制,这样更加完美!

想要获取更多资源,可以关注公众号:Kevin的学习站,“天下代码都在抄,抄来抄去有提高”,希望此文对您有一定的帮助,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!

在这里插入图片描述

  • 60
    点赞
  • 348
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
基于STM32智能小车的复位电路是一个重要的电路组成部分,主要用于在出现异常情况时重新启动系统,将所有的寄存器和外设初始化为默认状态。 复位电路一般由复位按钮(Reset Button)、复位电源和复位电路组成。当按下复位按钮时,复位电源会将电源电平发送给STM32芯片的复位引脚(NRST),从而触发复位操作。 具体来说,复位电路的主要工作原理如下: 1. 复位按钮(Reset Button)将通过电压下拉电阻连接到GND电平,当按下按钮时,控制电路上的电阻阻值发生变化,从而改变了复位电压的输入,将NRST引脚拉低,触发复位操作。 2. 复位电源通常是一个稳压电源芯片,它可以保证当其他电源异常时,仍能提供稳定的电源给芯片进行复位操作。 3. 复位电路中还可以添加附加的电路保护元件,例如电容、电感等,以提高复位电路的稳定性和抗干扰能力。 当STM32芯片接收到复位信号后,系统会立即中断当前的运行状态,停止处理器的工作,并将存储器和寄存器的值恢复为默认状态。这样就可以确保下一次开机或系统异常时,始终能够从预定义的启动状态开始重新初始化。 总而言之,基于STM32智能小车的复位电路是通过复位按钮、复位电源和复位电路实现的,它能够提供稳定的电源和正确的电平给芯片,从而在系统异常时能够进行有效的复位操作,确保系统正常启动和运行。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值