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

相关推荐
小菜鸟学代码··3 小时前
STM32文件详解
stm32·单片机·嵌入式硬件
马浩同学4 小时前
【GD32】从零开始学GD32单片机 | DAC数模转换器 + 三角波输出例程
c语言·单片机·嵌入式硬件·mcu
CC呢6 小时前
基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统
数据库·mongodb
最后一个bug7 小时前
STM32MP1linux根文件系统目录作用
linux·c语言·arm开发·单片机·嵌入式硬件
wenchm7 小时前
细说STM32F407单片机IIC总线基础知识
stm32·单片机·嵌入式硬件
嵌入式lover8 小时前
STM32项目之环境空气质量检测系统软件设计
stm32·单片机·嵌入式硬件
kenwblack9 小时前
STM32 SPI读取SD卡
stm32·单片机
兰_博9 小时前
51单片机驱动1602液晶显示
单片机·嵌入式硬件·51单片机
深圳市青牛科技实业有限公司 小芋圆9 小时前
开关电源特点、分类、工作方式
前端·科技·单片机·物联网·分类·数据挖掘·新能源
我qq不是451516529 小时前
单片机优先级
单片机·嵌入式硬件