在最初的方案中,无名创新提供了一个使用ADC安全绳按键控制的无遥控器方案。然而,该方案存在一些问题。首先,安全绳与无人机始终连接在一起,这在飞行过程中存在很大的危险性。其次,在许多比赛中,使用这种方案是被禁止的。例如,在今年(2023)的电赛中,无人机必须要求使用一键启动功能。
为了改进现有方案,提供以下建议:
-
引入无线启动技术:考虑使用无线通信技术(如蓝牙或Wi-Fi)来实现无线启动功能。这样一来,无需通过安全绳与无人机连接,大大降低了飞行过程中的危险性。
-
开发一键启动功能:利用现有的传感器和控制器,设计并实现一键启动功能。该功能应简单易用,使飞行员能够轻松地启动无人机,提高其操作效率。
-
遵守比赛规则:确保所提出的改进方案符合比赛规则和要求。了解并遵守比赛组织者对无人机启动方式的要求,以确保您的方案在比赛中合规。
通过采取以上改进措施,以符合比赛规则。
可以尝试改变ADC安全绳控制的程序逻辑,通过获取串口信息来进行相应的处理。
无线通信及控制方案:
1. 串口通信
在硬件资源驱动的Usart.c文件中进行如下更改:
-
将串口0用于前视摄像头,因此需要修改相应的代码。
-
在中断处理函数UART0_IRQHandler中,添加代码来处理接收到的数据。
-
创建一个名为car_data的数组来保存接收到的数据。
具体代码如下:
uint8_t receivedData[8] = {0};
uint8_t byteCount = 0; // 记录已接收字节数的计数器
uint8_t car_data[8]; // 保存接收数据
void UART0_IRQHandler(void)//UART0中断函数
{
//获取中断标志 原始中断状态 不屏蔽中断标志
uint32_t flag = UARTIntStatus(UART0_BASE,1);
//清除中断标志
UARTIntClear(UART0_BASE,flag);
//判断FIFO是否还有数据
while(UARTCharsAvail(UART0_BASE))
{
uint8_t ch = UARTCharGet(UART0_BASE);
receivedData[byteCount] = ch; // 将接收的字符保存到数组中
byteCount++; // 增加计数器
// 如果我们已经接收了8个字节,执行所需的操作
if(byteCount == 8)
{
//USART0_Send(receivedData, 8);
if(receivedData[0] == 0xbb && receivedData[1] == 0x30) //当数据满足小车要求
{
memcpy(car_data, receivedData, 8); // 使用memcpy来复制数组
//USART0_Send(car_data, 8);
}
byteCount = 0; // 重置计数器
// 在这里添加处理接收到的8个字节的数据的代码
}
}
}
通过以上修改,我们在接收到数据后将其保存在car_data数组中,并留出了处理接收数据的代码的空间。这样,您可以在其他程序中查看接收到的信息并进行相应的处理。实现基本的无线接收。
在Usart.c文件中提供了一个名为USART0_Send的发送函数,使用方法如下:
1.通过调用USART0_Send函数发送一个8字节数组,示例代码如下:
USART0_Send(receivedData, 8);
2.通过调用USART0_Send函数发送一个字符串,示例代码如下:
USART0_Send("你好\r\n", 8);
如果你在Usart.c中查找其他串口的发送函数,可以参考以下优化建议:
-
首先,检查Usart.c文件中是否定义了其他串口的发送函数。
-
如果找到了其他串口的发送函数,根据函数的命名规则和参数列表,调用相应的发送函数进行数据发送。
-
如果没有找到其他串口的发送函数,可以自行编写一个发送函数来满足需求。你可以参考USART0_Send函数的实现方式,在Usart.c文件中添加新的发送函数,并根据需要修改函数名和参数列表。
2. ADC安全绳控制程序更改
在状态估计与基础飞行控制中ADC_Button.c文件中进行如下更改:
1. 修改宏定义,使能ADC按键控制
#define ADC_Button_Control_Enable 1//使能按键控制时设置为1,反之设置为0
2. 在ADC_Button.h文件中通过使用extern
关键字进行声明,表明car_data
数组在其他
文件中已经定义和初始化。
extern uint8_t car_data[8];//接收数据数组
3. 修改判断逻辑,根据接收数组的内容来更改Key_Value
的值
ADC最终是通过Key_Value的数值来判断ADC安全绳是否被按下(此处暂未考虑长按
断按)
使用我们即可通过在这段代码前通过对接收数组数字的判断,来更改Key_Valued值
if(car_data[2] == 0x01) Key_Value = 1; //解锁
if(car_data[2] == 0x02)
{
Key_Value = 2; //上锁
}
if(car_data[2] == 0x03)
{
Key_Value = 3; //开发模式
}
if(car_data[2] == 0x04)
{
Key_Value = 4; //降落
}
if(car_data[2] == 0x05) adc_ppm_update_flag = 0; //释放遥控器权限
if(car_data[2] == 0x00) Key_Value = 0;
虽然上面更改确实可以实现解锁和SDK模式,但用于我们没考虑到长短按情况,我这里将对应长按短按情况,直接修改到数组中,也能实现急停。具体修改如下:
if(car_data[2] == 0x01) Key_Value = 1; //解锁
if(car_data[2] == 0x02)
{
Key_Value = 2; //上锁
//以下为该按键实现的任务
adc_ppm_update_flag=0;//控制权限给释放给其它渠道获取的PPM:PPM接收机、地面站虚拟遥控器
//故按键启动后,此时短按下按键,遥控器控制权限瞬间会释放给接收机
//遥控器接管后,可以手动控制飞机安全降落
if(Controler_State==Unlock_Controler)//如果处于解锁状态
{
Bling_Set(&Light_3,5000,1000,0.5,0,GPIO_PORTF_BASE,GPIO_PIN_3,0);
}
Controler_State=Lock_Controler;//直接上锁
}
if(car_data[2] == 0x03)
{
Key_Value = 3; //开发模式
ADC_Button3.press = LONG_PRESS; //设置为长按
}
if(car_data[2] == 0x04)
{
Key_Value = 4; //降落
ADC_Button4.press = SHORT_PRESS;
}
if(car_data[2] == 0x05) adc_ppm_update_flag = 0;
if(car_data[2] == 0x00) Key_Value = 0;
我们修改了判断逻辑,根据接收到的数组内容来更改Key_Value
的值,并添加了相应的任务实现。
在此,我们就只需要通过串口发送相应数据,即可控制无人机一键启动 如:
发送不同dat[8]数组,以实现相应功能
uint_8 dat[8] = {0xbb, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00,0x00}; //解锁
uint_8 dat[8] = {0xbb, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00,0x00}; //上锁
uint_8 dat[8] = {0xbb, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00,0x00}; //SDK开发者模式
uint_8 dat[8] = {0xbb, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00,0x00}; //降落
uint_8 dat[8] = {0xbb, 0x30, 0x05, 0x00, 0x00, 0x00, 0x00,0x00}; //释放遥控器权限