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

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

  • 一、项目介绍
  • 二、硬件介绍
    • 1、芯片介绍
    • 2、直流电机及驱动
    • 3、红外线探测模块
    • 4、蓝牙模块
  • 三、软件实现

一、项目介绍

整理一位朋友做的基于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、直流电机及驱动

基于STM32的智能小车——循迹+避障+蓝牙_第1张图片

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的智能小车——循迹+避障+蓝牙_第2张图片
    STM32与模块 引脚链接表如下:
    基于STM32的智能小车——循迹+避障+蓝牙_第3张图片

4、蓝牙模块

蓝牙使用前一定要使用软件格式化,不然如果蓝牙之前有绑定过别的ID后就会新连接不上!
这里我们使用的是STM32的串口3与蓝牙进行通信;
基于STM32的智能小车——循迹+避障+蓝牙_第4张图片

蓝牙模块APP功能设定:

基于STM32的智能小车——循迹+避障+蓝牙_第5张图片

三、软件实现

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);
		}
	}
}

基于STM32的智能小车——循迹+避障+蓝牙_第6张图片

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

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

在这里插入图片描述

你可能感兴趣的:(#,STM32开发,课程设计+硬件设计,stm32,单片机,arm)