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

相关推荐
深圳市青牛科技实业有限公司 小芋圆36 分钟前
什么是空气电容器?
人工智能·单片机·嵌入式硬件·语音识别·小家电
KIOXIA铠侠总代1 小时前
推动高效能:东芝TB67H301FTG全桥直流电机驱动IC
单片机·嵌入式硬件
编程者也2 小时前
Linux应用开发-第三章Linux的目录IO
linux·服务器·嵌入式硬件
小小怪下士的编程小屋3 小时前
FreeRTOS的任务间通信
c语言·stm32·单片机·嵌入式硬件
PyAIGCMaster3 小时前
将带有 商店idr 商品信息的json导入到mongodb后,能不能根据商店id把所有商品全部提取并转为电子表格
数据库·mongodb
EAK电阻3 小时前
电阻负载柜或无功负载组?
单片机·嵌入式硬件
heater4043 小时前
【STM32】GPIO复用和映射
stm32·单片机·嵌入式硬件
IoT_H24 小时前
74HC165芯片验证
stm32·单片机·嵌入式硬件
MCUFANS1237 小时前
基于 STM32 的智能睡眠呼吸监测系统设计
stm32·单片机·嵌入式硬件
嵌入式-老费10 小时前
上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)
单片机·嵌入式硬件