一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、HCSR04超声波、SG90舵机、
无线遥控、陀螺仪、螺旋桨驱动电机、红外寻迹避障模块等。
主要功能:
系统运行后,LCD1604显示传感器检测的俯仰角、横滚角、超声波距离、红外检测信号状态及小车运行状态等;系统默认处于手动模式,可通过无线遥控控制无人机飞行,当发送模式设置指令,系统进入自动模式;通过左右红外检测使无人机按照指定轨迹运行,当超声波检测距离小于避障距离则无人机上升避障,完成后下降继续按照轨迹飞行。当检测到定点投物位置时,无人机开始下降,当到达指定点后开启舵机夹具。在飞行过程中系统根据无人机姿态角度自动调整到平衡位置。
无线遥控指令:
0X01–>前进
0X02–>后退
0X03–>左转
0X04–>右转
0X05–>上升
0X06–>下降
0X07–>停止
0X08–>夹具开启
0X10–>模式
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统功能控制
void sys_fun_ctrl(void)
{
//手动控制模式
if(sys_ctrl.mode==1)
{
switch(USART1_RX_BUF[0])
{
case STOP_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=0;break;
case FORWD_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=1;break;
case BACK_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=2;break;
case LEFT_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=3;break;
case RIGHT_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=4;break;
case UP_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=5;break;
case DOWN_CMD: USART1_RX_BUF[0]=0;sys_ctrl.dir=6;break;
case OPEN_CMD:
USART1_RX_BUF[0]=0;
sg90_set_angel(4);
delay_ms(200);
sg90_set_angel(0);
break;
}
}
//自动控制模式
else
{
//未到达目的地
if(sys_ctrl.destok==0)
{
//有感应到目的地位置
if(sys_ctrl.dest==1)sys_ctrl.dir=6;
//没有感应到目的地位置
else
{
//根据红外感应按照轨迹运行
switch(sys_ctrl.ired)
{
case 0: sys_ctrl.dir=1;break;//左右未感应,前进
case 1: sys_ctrl.dir=3;break;//左感应,左转
case 2: sys_ctrl.dir=4;break;//右感应,右转
case 3:
//遇到障碍物,避障
if(sys_ctrl.dis<DIS_MIN)sys_ctrl.dir=5;//上升
else sys_ctrl.dir=6;//下降
break;
}
}
}
//到达目的地
else
{
sys_ctrl.dir=0;
sg90_set_angel(4);
delay_ms(100);
sg90_set_angel(0);
}
}
//根据欧拉角控制飞行状态
if(sys_ctrl.pitch>0)sys_ctrl.dir=1;
else if(sys_ctrl.pitch<0)sys_ctrl.dir=2;
if(sys_ctrl.roll>0)sys_ctrl.dir=4;
else if(sys_ctrl.roll<0)sys_ctrl.dir=3;
//飞行控制
fly_run_sta(sys_ctrl.dir);
}
//应用控制系统
void appdemo_show(void)
{
u8 i=5;
sys_parm_init();//系统参数初始化
ctrl_pin_init();
pcf8591_init();
sg90_init();
sr04_init();
fmotor_init();
USART1_Init(9600);
while(i--)
{
//获取俯仰角
sys_ctrl.pitch=pcf8591_read_adcvalue(1);
sys_ctrl.pitch=cal_map(sys_ctrl.pitch,0,255,0,100)-50;
//获取横滚角
sys_ctrl.roll=pcf8591_read_adcvalue(0);
sys_ctrl.roll=cal_map(sys_ctrl.roll,0,255,0,100)-50;
delay_ms(100);
}
lcd1604_init();//LCD1604初始化
sys_open_show();//系统初始界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。