2021电赛国赛F小车题总结——附源码,源工程文件

2021年电赛结束了,这里分享一下F小车题代码和方案。
多少个通宵不眠夜,只能说已经全力以赴,结束了现在已经问心无愧了。
@山东赛区 组内成员:大三*3

目录

*
部分
开始前的碎碎念
方案设计

+ 硬件连线表:(没更新,可能啊可能有点点问题)
+
* 蓝牙:
* openMV:
* 灰度 循迹:
* OLED : 3.3or5V
* L298N-stm32(motor.h)
* L298N-电机
* 电机编码器-stm32
* 红外(药品放置、到达检测)-stm32
stm32 代码,逻辑

+ 1车
+ 2车
+ openMV识别
+ 总结

部分

  1. 方案设计
  2. 硬件连接
  3. stm32巡线、控制(我实现部分 有源代码、工程文件)
  4. openMV识别数字、识别终点停止
  5. 总结反思

开始前的碎碎念

出来题目的时候觉得还行,没什么特别奇怪不会的部分。之前因为赛题准备器材里面有很奇怪的角度测量、透明空心球,一直以为会是控制器用,搞得我们准备控制题的很紧张……当时各种预测都有,结果今年出了小车题

在暑假准备的时候准备了stm32和430控制的小车(需要代码可以留言,有几次还是跑的很稳的。当然当时学430上手的时候还是挺难搞的,以后有空再写一个文档。)
暑假准备的……只准备了相关模块,但是小车供电啊之类的 硬件连接设计没有自己想好(12V转5V等,我们天真的以为随便用一个12-5的模块就行,结果没有稳压没有保护,模块电流限制等等问题都没有考虑……竞赛的时候用了坏的再换就很痛苦……)

2021电赛国赛F小车题总结——附源码,源工程文件

暑假准备的时候问了一个已经毕业的大佬学长,大佬:学会Verilog、FPGA……我:??? 数电模电可再见吧,我不行。

我:啊这,然后我们准备的时候就定了选控制题……(忘了这个大佬打的是什么题了,应该可能不是控制题)

; 方案设计

emm发题前我们还在忙一些课业之类的事情,属实是忙的没空在11月怎么准备。11.3我们还在期待明天延期吧……😂

11.4早上有点睡过了,发题了我还在睡觉😂

来了实验室就开始讨论方案: 主要实现以下方面:

  1. 循迹 (红外不行👉灰度传感器)
  2. 识别数字(openMV) 我们有一块3 一块4 4的处理速度更快

stm32部分是我实现
openMV部分我一点不会(暑假懒了),由队友实现
硬件弄车另一个队友 (暑假弄了个半成品车模,不太行 准备的还是不太够)

2021电赛国赛F小车题总结——附源码,源工程文件
当时想着之前轮速有问题显示以下用PID控制,但是嘛,时间不太够,最后没用PID…… PWM单控制速度慢点也非常稳

晚上九点多老师回去了我们还在吵是3个红外还是2个红外

然后给老师发消息问,然后开了个腾讯会议问(为什么当时不直接通话……)

硬件连线表:(没更新,可能啊可能有点点问题)

3个灰度(老师建议保证抓住线,我们临时就买了6个)
2个附加的红外 防止撞到墙
1个红外识别药品

蓝牙:

(PA2 3)

PB10 TX
PB11 RX

openMV:

PA9 RXD

PA10 TXD

灰度 循迹:

灰度(PA3) 左PA4 中PA5 右stm32PA5PA6PA7

白色)的时候输出低电平

OLED : 3.3or5V

OLEDSCLSDAstm32PB0PB1

RES 接 PB11 如果是用4针iic接口这个脚可以不接

L298N-stm32(motor.h)

L298NPWA(左)IN1IN2PWMB(右)IN3IN4stm32PA8PB14PB15PA11PB13PB12

PA8驱动力弱?

L298N-电机

L298NM1(左)M2M1(右)M2电机OUT1OUT2OUT1OUT2

电机编码器-stm32

电机编码器C1(左)C2C1(右)C2stm32PB7PB6PA0PA1

电机 :【 M1 GND C1 C2 3.3V M2 】

红外(药品放置、到达检测)-stm32

printf("%d,%d,drug%d\r\n",xunji_1,xunji_2,drug);

白色是0 (接受0)

黑色(未接收1)

红外传感器药品检测是否到达检测1是否到达检测2stm32PC8PC6PC7

LED (调试方便、显示)

LEDLED_leftLED_straightLED_rightstm32PA0PA1PA2

stm32 代码,逻辑

1车

  1. 读openMV数据:

  2. 0:直走

  3. 1:左转
  4. 2:右转
  5. 3:停止

  6. 循迹 (一定要走的稳不然晃动太大会对openMV读数造成很大影响)

  7. 控制电机(跑、掉头、转弯)
  8. 放药去,取药返回

2021电赛国赛F小车题总结——附源码,源工程文件

main里面代码不多,都在引用

int main(void)
{
    u8 i;
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

    TIM5_PWM_Init(1000,9);
    MY_NVIC_PriorityGroupConfig(2);

    delay_init();
    LED_Init();
    usart3_init(9600);
    uart_init(115200);

    Motor_Init();
    Xj_Init();
    infrared_INIT();
    LED_straight = 0;
    LED_right = 0;
    LED_left = 0;

    while(1)
    {

        read_openMV();
        if(start_flag==1)
        {
            if(!drug&&(go_des==0))   {go_des=1;delay_ms(5);}
            if(go_des ==1)
            {
                if(!i) {i=1;CarForward();delay_ms(100);}
                Xj_read();
                hongwai_avoid();
                if(state_arrive==1){hongwai_avoid();}
            }
        while(state_arrive==2){LED_left=1;
                delay_ms(400);CarStop();}
        }
    }
}

openMV控制部分和下面的循迹是我写的自己满意的地方

void read_openMV()
{
    u8 back;

    if(USART_RX_STA&0x8000)
        {
            recived =1;
            LED_g=0;
            if(!start_flag)
            {
            start_flag=1;
            }

            len=USART_RX_STA&0x3fff;
            for(t=0;t<len;t++)
            {
                 if(USART_RX_BUF[t]==0xb3)
                     if(USART_RX_BUF[t+1]==0xb3)
                          n=t+2;
            }
            for(t=0;n<len;t++,n++)
            UsartDisPlay[t] = USART_RX_BUF[n];

            USART_RX_STA=0;

            if(go_des)
            {
                if(UsartDisPlay[0]=='0')
                {

                    CarForward();
                    switch(turn_car2)
                    {
                        case(1):printf("1/r/n");break;
                        case(2):printf("2/r/n");break;
                        default:break;
                    }

                }
                else if(UsartDisPlay[0]=='1')
                {

                    turn_car2=2;

                    if(!state_arrive){delay_ms(300+100+100+200);}
                    if(state_arrive){delay_ms(50);}

                    CarBigLeft();
                }
                else if(UsartDisPlay[0]=='2')
                {

                    turn_car2=1;

                    if(!state_arrive){delay_ms(300+100+100+200);}
                    if(state_arrive){delay_ms(50);}
                    CarBigRight();
                }
                else if(UsartDisPlay[0]=='3')
                {
                    state_arrive+=1;
                    if(drug==0)
                        {

                        CarForward();
                        delay_ms(400+200+200);
                        LED_right = 1;

                        while(!drug){
                            switch(turn_car2)
                            {
                                case(1):printf("1/r/n");break;
                                case(2):printf("2/r/n");break;
                                default:break;
                            }
                        CarStop();
                        }
                        LED_right = 0;
                        CarFaceBack();
                        delay_ms(50);
                        }

                }
        }
    }
}

循迹,速度慢的时候很稳~

void Xj_read()
{
    u16 i;
    if(XJ_MEDIUM)
    {
        CarForward();
    }

    if(XJ_LEFT==1)
        {
            if(!XJ_MEDIUM)
            {
                    LED_left=1;
                    LED_right = 0;
                    LED_straight = 0;
            Set_Pwm(0,leftspeedinit+100);i = 1;}
            if(XJ_MEDIUM)

            {i = 0;Set_Pwm(leftspeedinit-50+30,rightspeedinit-50-50); }
        }
    else if(XJ_RIGHT==1)
        {
            if(!XJ_MEDIUM)
            {
                    LED_left=0;
                    LED_right = 1;
                    LED_straight = 0;
                Set_Pwm(leftspeedinit+100,0);

                i = 1;
            }
            if(XJ_MEDIUM)

            {
            i=0;Set_Pwm(leftspeedinit-50-50,rightspeedinit-50+30); }
        }

}

只放关键代码,工程文件晚点再发吧……

2车

2车实际没太多时间测 可能代码不好


int main(void)
{
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

    TIM5_PWM_Init(1000,9);
    MY_NVIC_PriorityGroupConfig(2);

    delay_init();
    LED_Init();
    usart3_init(9600);
    uart_init(115200);

    Motor_Init();
    Xj_Init();
    infrared_INIT();

    while(1)
    {
        u16 i,t;
        u8 flag;
        if(USART3_RX_STA&0X8000)
        {
            flag =1;
            LED_g=0;
        if(USART3_RX_BUF[0]=='1'){turn_car2 = 1;}
        if(USART3_RX_BUF[0]=='2'){turn_car2 = 2;}
            USART3_RX_STA=0;
        }

        while(flag)
        {
            read_openMV();
            if(start_flag==1)
            {
                if(!drug)   {go_des=1;delay_ms(5);}
                if(go_des ==1)
                {
                    if(!i) {i=1;CarForward();delay_ms(100);}
                    Xj_read();
                    hongwai_avoid();
                }
            }
        }
    }
}

openMV

void read_openMV()
{
    u8 back;

    if(USART_RX_STA&0x8000)
        {
            recived =1;
            LED_g=0;
            if(!start_flag)
            {
            start_flag=1;
            }

            len=USART_RX_STA&0x3fff;
            for(t=0;t<len;t++)
            {
                 if(USART_RX_BUF[t]==0xb3)
                     if(USART_RX_BUF[t+1]==0xb3)
                          n=t+2;
            }
            for(t=0;n<len;t++,n++)
            UsartDisPlay[t] = USART_RX_BUF[n];

            USART_RX_STA=0;

            if(go_des)
            {
                if(UsartDisPlay[0]=='0')
                {
                    LED_left=0;
                    LED_right = 0;
                    LED_straight = 1;
                    CarForward();
                }
                else if(UsartDisPlay[0]=='1')
                {
                    switch(turn_car2)
                            {
                                case(1):{
                                    LED_right = 0;
                                    LED_straight = 0;
                                    LED_left = 1;CarBigLeft();}break;
                                case(2):{
                                    LED_straight = 0;
                                    LED_left = 0;
                                    LED_right = 1;
                                    CarBigRight();
                                }break;
                                default:break;
                            }
                    CarBigLeft();
                }
                else if(UsartDisPlay[0]=='3')
                {
                    while(1)
                    {
                    CarStop();
                    LED_right = 1;
                    LED_straight = 1;
                    LED_left = 1;
                    }

                }
        }
    }
}

openMV识别

这部分不是我做的hhh,一直在看队友录模板、调整精度

总结

  1. 和老师交流不够(比完赛微信和老师总结了下,比赛前都不太认识这个老师,😂 )
  2. 进度太慢,开始我折腾什么oled显示,简单点不好吗
  3. 方案讨论的不充分,讨论的自以为差不多就开始莽( 经验积累不够,过程把握不充分
  4. 什么都想要最后就会什么都得不到( 过于理想化
  5. 调试花了挺多时间的,控制嘛……

  6. 硬件太不稳了,花了我们很多时间( 前期准备不足

  7. 杜邦线、端子连接、和电池连接
  8. 电池,我买的航模电池80多一个,后来我们整了5大块航模电池。电池电压一遍,之前测的参数就gg
  9. ……很多很多问题
  10. 持续更新

老师:很多经验教训需要总结,先休息好,进入学习状态,以后机会很多。

代码:
蓝牙1车:链接:https://pan.baidu.com/s/1gIsHPX7HccK6Uns2c_B_qg
提取码:ji9d

蓝牙2车:链接:https://pan.baidu.com/s/18MaYlvZyOE6h7lEjkp6DNQ
提取码:fzwf

2021电赛国赛F小车题总结——附源码,源工程文件
2021电赛国赛F小车题总结——附源码,源工程文件
吃饭的时候在操场摸到了学校的猫猫(好像他叫桶桶来着)
2021电赛国赛F小车题总结——附源码,源工程文件

Original: https://blog.csdn.net/sherryaxx/article/details/121322605
Author: sherryaxx
Title: 2021电赛国赛F小车题总结——附源码,源工程文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/701921/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球