【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设计,视频分享,技术交流。

相关推荐
SundayBear4 小时前
零基础入门MQTT协议
c语言·单片机
嗯嗯=5 小时前
STM32单片机学习篇9
stm32·单片机·学习
松涛和鸣10 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客13 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆13 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
jghhh0114 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖15 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3215 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van15 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程
电化学仪器白超15 小时前
③YT讨论
开发语言·python·单片机·嵌入式硬件