【Proteus仿真】【Arduino单片机】寻迹避障蓝牙遥控小车

文章目录


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使LCD1602液晶,L298电机,直流电机,HC05/06蓝牙模块,HCSR04超声波,红外寻迹模块等。

主要功能:

系统运行后,LCD1602显示小车运行状态、模式、检测距离;

当小车在蓝牙模式,可通过蓝牙发送命令控制小车前进、后退、左转、右转、模式、LED开关;

当小车在寻迹模式,通过左右红外传感器感应寻迹,前进时LED亮,否则灭;

当小车在避障模式,通过超声波检测距离,当距离小于避障值,右转,否则前进;

蓝牙控制命令(十六进制):

0X10->前进

0X11->后退

0X12->左转

0X13->右转

0X14->停止

0X15->蓝牙模式

0X16->寻迹模式

0X17->避障模式

0X18->LED开

0X19->LED关


二、软件设计

c 复制代码
/*
作者:嗨小易(QQ:3443792007)

*/



//系统数据获取
void sys_data_get(void)
{
	while(1)
	{
    //获取距离
		sys_ctrl.dis=ultrasonicwave_measure();
		//红外感应
		if(HW_L==0 && HW_R==1)sys_ctrl.ir=1;
		else if(HW_L==1 && HW_R==0)sys_ctrl.ir=2;
		else if(HW_L==1 && HW_R==1)sys_ctrl.ir=0;

		break;
	}
}

//系统数据显示
void sys_data_show(void)
{
  while(1)
  {
    //模式显示
		if(sys_ctrl.mode==0)lcd1602_show_string(2,0,"LY");
		else if(sys_ctrl.mode==1)lcd1602_show_string(2,0,"XJ"); 
		else if(sys_ctrl.mode==2)lcd1602_show_string(2,0,"BZ");
		//红外感应状态显示
		if(sys_ctrl.ir==0)lcd1602_show_string(6,0,"N");
		else if(sys_ctrl.ir==1)lcd1602_show_string(6,0,"L");
		else if(sys_ctrl.ir==2)lcd1602_show_string(6,0,"R"); 
		//距离显示
		lcd1602_show_nums(11,0,sys_ctrl.dis,3,0);

    break;
  }
}

//系统数据设置
void sys_data_set(void)
{
  if(Serial.available())  //当串口接收到信息后
  {
    UART_RX_BUF[0]=Serial.read();//读取接收到的数据
  }

  //模式选择
	if(UART_RX_BUF[0]==CAR_MODE_LY)
	{
		sys_ctrl.dir=0;
		sys_ctrl.mode=0;
	}
	else if(UART_RX_BUF[0]==CAR_MODE_XJ)sys_ctrl.mode=1;
	else if(UART_RX_BUF[0]==CAR_MODE_BZ)sys_ctrl.mode=2;
  
  //蓝牙模式
	if(sys_ctrl.mode==0)
	{
		//蓝牙控制命令
		switch(UART_RX_BUF[0])
		{
			case CAR_FORM://前进
				sys_ctrl.dir=1;
				break;
			case CAR_BACK://后退
				sys_ctrl.dir=2;
				break;
			case CAR_LEFT://左转
				sys_ctrl.dir=3;
				break;
			case CAR_RIGHT://右转
				sys_ctrl.dir=4;
				break;
			case CAR_STOP://停止
				sys_ctrl.dir=0;
				break;
			case LED_ON://LED开
				LED(0);
				break;
			case LED_OFF://LED关
				LED(1);
				break;
		}		
	}
	if(UART_RX_BUF[0]!=0)UART_RX_BUF[0]=0;		
}

//系统功能控制
void sys_fun_ctrl(void)
{
  //蓝牙模式
	if(sys_ctrl.mode==0)
	{
		//小车控制
		switch(sys_ctrl.dir)
		{
			case 0:car_stop();break;//停止
			case 1:car_forward();break;//前进
			case 2:car_back();break;//后退
			case 3:car_left();break;//左转
			case 4:car_right();break;//右转
		}
//		//小车状态显示
//		_car_staus_show(sys_ctrl.dir);
//		if(sys_ctrl.dir!=0)sys_ctrl.dir=0;		
	}
	//寻迹模式
	else if(sys_ctrl.mode==1)
	{
		//如果没有感应黑线,前进,开灯
		if(sys_ctrl.ir==0)
		{
			LED(0);
			sys_ctrl.dir=1;
			car_forward();
		}
		//如果左侧感应黑线,左转,关灯
		else if(sys_ctrl.ir==1)
		{
			LED(1);
			sys_ctrl.dir=3;
			car_left();
		}
		//如果右侧感应黑线,右转,关灯
		else if(sys_ctrl.ir==2)
		{
			LED(1);
			sys_ctrl.dir=4;
			car_right();
		}	
	}
	//避障模式
	else if(sys_ctrl.mode==2)
	{
		LED(1);
		//如果检测距离大于避障距离,前进
		if(sys_ctrl.dis>BZ_VALUE)
		{
			sys_ctrl.dir=1;
			car_forward();	
		}
		//如果检测距离小于避障距离,右转
		else
		{
			sys_ctrl.dir=4;
			car_right();	
		}	
	}
	
	//小车状态显示
	_car_staus_show(sys_ctrl.dir);
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619





联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

相关推荐
scan16 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu016 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
马剑威(威哥爱编程)7 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
掘金-我是哪吒7 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
深圳市青牛科技实业有限公司8 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比9 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie9 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
全能全知者9 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
齐 飞9 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
西瓜籽@10 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计