文章目录
一、功能简介
本项目使用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设计,视频分享,技术交流。