2024年电子设计竞赛H题总结(24.6s省一)

1. 项目总结


H题自动行驶小车,个人感觉难点就在,要跑的稳、跑的准、跑得快。

此篇文章使用的陀螺仪为维特的HWT101,因为我在调试的时候发现mpu6050实在是太慢,数据都不是连续的,我太菜的缘故,非常难给陀螺仪数据写PID,由于没多少时间,发现维特的这个速度快,但是费钱。瞧不上这种方案的佬可以忽略。

循迹模块就是普通的灰度循迹。主控为MSPM0G3507官方的那块板子。

比完赛放假->开学->一堆事情处理,到现在终于闲下来了。

2.算法简介


大致流程如下

第一题就直接锁定陀螺仪0度向前走,而后编码器的值(我已经换算成圈数)达到某一值时停止即可。速度和陀螺仪航向角均为闭环反馈控制。

第二题就是首先锁0度,和第一题一样走,走完之后切换为循迹。我的循迹采用的还是对速度进行了闭环控制,使得速度更稳定些。而后七路循迹什么都没有扫到的情况下,判断为走出半圆(这里可消抖处理,避免因为走的过程中的机械抖动导致判断出现误差)。走出半圆后切换为锁定陀螺仪数值180度向前走,固定脉冲值,而后再切换循迹,再判断无黑线扫到,停车。每个切换的过程中均加入声光提示即可。这里有个小优化,就是将声光提示放入中断,比如说100ms的中断。操作起来就是,先将某个标志位置1,然后中断判断1后,声光提示,然后进入这个100ms中断3次之后标志位置0,声光提示结束。这样非阻塞式,让主函数可以丝滑衔接下一个任务。

  

第三题就是,一开始锁定需要前进的角度,比如我之前测试的47度向前走固定的脉冲数即可,然后怎么让他丝滑一些呢,我的做法是(以第一步为例),沿直线走到一定的位置之后,将航向角的给定值调整为0度左右,再走固定的脉冲数,第一步和第二步速度一样,只有脉冲数和航向角的给定值不一样。走完前两步之后,让他正好落在C点,开始循迹,这样会显得特别丝滑没有停顿。进入循迹之后,同第二问,走出半圆之后,又同第一步,改变航向角的给定值走到D点即可。

第四问,我就是for循环执行了四遍第三题。

需要补充的是,陀螺仪的数据,维特的数据是0-359,而有时候,比如第一题0可以直接跳到359的话,误差突然变大会使系统崩溃,为此我给陀螺仪的数据进行了一定的处理。

总的来说难点还是再陀螺仪上,我是逃兵,处理不了MPU6050,如果MPU6050读取的速度能够快的话,其实方案是可以一样的。

非常大的不足之处在于,没有路径反馈,说白了就是不知道自己走到了哪,一旦跑偏了就完了,也就是类似我这种加了纯前馈给脉冲数的做法,不过禁用摄像头的情况下确实也难以做到知道自己走到哪儿的程度。 

附上部分代码:

case 5:
    {
    Xans_speed = 5;
    for (i=0; i<=3; i++) {
    /*摆正,然后转头*/
    /*陀螺仪修正*/
    yawflag = 1;
    if(i == 0) Motor_Config(&work_flag, 18, 18, null, 8.8, 8.8, -48, yaw_speed);
    else if(i == 1) Motor_Config(&work_flag, 18, 18, null, 7.68, 7.68, -46, yaw_speed);
    else if(i == 2) Motor_Config(&work_flag, 18, 18, null, 7.72, 7.72, -45, yaw_speed);
    else if(i == 3) Motor_Config(&work_flag, 18, 18, null, 7.85, 7.85, -46, yaw_speed);
    /*找线*/
    Motor_Config(&work_flag, 18, 18, null, 1.56, 1.56, 3, yaw_speed);
    //Motor_Config(&work_flag, 3, 3, null,null, null, 25, spd_position);
    //Motor_Config(&work_flag, -3, 3, null,null, null, null, speedpid);
    work_flag.Priority = null;
    while(1)
    {
        delay_ms(10);
        if(M||L1||L2||L3||R1||R2||R3)
        {
            bl_flag =1;
            break;
        }else if(!M&&!L1&&!L2&&!L3&&!R1&&!R2&&!R3)
            {
                Motor_Config(&work_flag, 3, 3, null,null, null, 15, spd_position);
            }
    }
    /*循迹*/
    Motor_Config(&work_flag, 12, 12, SLeft, null, null, null, speedpid);
    /*等待循迹结束(识别不到),到达B点声光提示,然后左转一下*/
    globel_position = 0;
    while(1)
    {
        delay_ms(10);
        if(!M&&!R1&&!L1&&!R2&&!L2&&!R3&&!L3&&globel_position>1056)
        {
            bl_flag =1;
            break;
        }
    }
 
    /*摆头*/
    yawflag = 0;
    /*直走*/
    if(i == 0) Motor_Config(&work_flag, 18, 18, null, 7.18, 7.18, 226, yaw_speed);
    else if(i == 1) Motor_Config(&work_flag, 18, 18, null, 7.23, 7.23, 226, yaw_speed);
    else if(i == 2) Motor_Config(&work_flag, 18, 18, null, 7.18, 7.18, 226, yaw_speed);
    else if(i == 3) Motor_Config(&work_flag, 18, 18, null, 7.23, 7.23, 226, yaw_speed);
    /*找线*/
    Motor_Config(&work_flag, 18, 18, null, 2, 2, 176, yaw_speed);
    //Motor_Config(&work_flag, 3, -3, null,null, null, null, speedpid);
    work_flag.Priority = null;
    while(1)
    {
        delay_ms(10);
        if(R2||M||R1||R3||L1||L2||L3)
        {
            bl_flag =1;
            break;
        }else if(!M&&!L1&&!L2&&!L3&&!R1&&!R2&&!R3){
            
            Motor_Config(&work_flag, 3, 3, null,null, null, -15, spd_position); 
        }
    }
 
     /*循迹*/
    Motor_Config(&work_flag, 12, 12, Smiddle, null, null, null, speedpid);
    /*等待循迹结束(识别不到),到达B点声光提示,然后右转一下,这里右转是方便第四题继续走*/
    globel_position = 0;
    while(1)
    {
        delay_ms(10);
        if(!M&&!R1&&!L1&&!R2&&!L2&&!L3&&!R3&&globel_position>1056)
        {
            bl_flag =1;
            break;
        }
    }
    }
        Motor_Config(&work_flag, 0, 0, null, null, null, null, Frees);
        Pwm1_Set(0);Pwm2_Set(0);
        break;
    }

最终视频:

24年H题成品版,翻相册翻到的,要清内存了。

代码工程:https://download.csdn.net/download/m0_63289056/89756749 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值