【Proteus仿真与Arduino单片机】实现寻迹避障蓝牙遥控小车的详细教程

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者

  • 一、功能简介

    本项目使用Proteus8仿真Arduino单片机控制器,使LCD1602液晶,L298电机,直流电机,HC05/06蓝牙模块,HCSR04超声波,红外寻迹模块等。
    主要功能:
    系统运行后,LCD1602显示小车运行状态、模式、检测距离;
    当小车在蓝牙模式,可通过蓝牙发送命令控制小车前进、后退、左转、右转、模式、LED开关;
    当小车在寻迹模式,通过左右红外传感器感应寻迹,前进时LED亮,否则灭;
    当小车在避障模式,通过超声波检测距离,当距离小于避障值,右转,否则前进;
    蓝牙控制命令(十六进制):
    0X10->前进
    0X11->后退
    0X12->左转
    0X13->右转
    0X14->停止
    0X15->蓝牙模式
    0X16->寻迹模式
    0X17->避障模式
    0X18->LED开
    0X19->LED关


    二、软件设计

    /*
    作者:嗨小易(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设计,视频分享,技术交流。

    作者:Hai小易

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Proteus仿真与Arduino单片机】实现寻迹避障蓝牙遥控小车的详细教程

    发表回复