当前位置 博文首页 > JayChanChan的博客:【Hello,电赛】2020电赛从备战到回顾(F题)

    JayChanChan的博客:【Hello,电赛】2020电赛从备战到回顾(F题)

    作者:[db:作者] 时间:2021-08-27 22:21

    #瞎扯几句

    2020应该让所有人难忘的一年。赋闲大半年,开学两行泪。博主也是突然从大二被迫成了大三老油条。大一的时候身边就有同学开始展露科创竞赛方面的头角,后来成了学院有名的带佬。咱当时觉得好玩也是羡慕,奈何学生工作和课程压力大,一直没有付出实际行动。
    之前虽然参加过电赛校赛,但是比较水基本上纯硬件。但是接触过单片机没有项目经验,契机出现在大二下学期,就那个大半年在家的超长学期。刚好专业安排课程,之前接触过所以加上课程实验要求在很多地方磨来磨去花了很多功夫纠错,也算是踩了很多坑最后加深了理解。自己尝试做了一个小车,没有花太多时间,然后感觉自己行了。就开始往STM32过渡,有意电赛。

    关于当时的很多细节已经没有很多印象,这篇文章是根据残缺的记忆和当时的记录写下来的,更多的是感受分享,给想参加电赛的同学一点经验,也是终于有空遂了这个愿(电赛结束就开始疯狂补落下的课,也懒)。

    前期准备

    开学以后距离开赛还有一个月的时候,当时也出了清单,老师组织开了一次会基本上催了一下就紧锣密鼓开始了。很粗糙的分工了,我和队友A负责代码,队友B负责报告和打杂。清单一出最大的感觉就是控制类可能会考小车+测温,心电+测温,摄像头+小车,也没什么经验就开始盲目的准备。
    假期之前做的小项目,我和队友A都做了,我用的51他用的STM32,他32用的比我熟练些。我直到开学也只是搭建好了32的环境有了一定了解。出来清单以后他开始准备摄像头、云台的控制,我开始学习stm32,开学以后基本上课下时间都泡在实验室了,基本上花了一周时间熟悉了各个模块,自己做小车练手。材料是三个人分摊的,每人买了一部分。云台假期队友A玩过他自己买了,心电模块果断弃了。
    在这里插入图片描述

    出题

    我记得好像是当天早上八点出题,结果前天晚上江苏那边好像泄题了。队友大喜过望,看到C题小车和G题云台大喜过望,感觉好几个都能做。当晚还没定题,然后我心大的早上睡到了八点。后来分析以后,说服队友选了F题。当时冲的是F题温度部分分值高,容易拿,而且红外测温模块简单跑了下例程感觉问题不大,队友A当时对Openmv有了解,后面部分感觉也能下手。
    在这里插入图片描述
    比赛过程中还是比较顺利地。队友A直接负责后面人脸识别部分、Openmv和stm32的通信。
    第一天我基本上就写了个框架,然后把LCD一级界面、按键和测温部分整合了一下。
    第二天开始改整理的工程文件,LCD加了二级界面,把测温和识别、识别口罩等几个模式的二级界面写完。然后发现测温模块出BUG,当时红外模块跑商家源码测温基本就停留在34附近误差挺大了,找别的组要了别的店铺的例程发现还需要加修正函数(好像是指尖或手表面温度到人体温度还要经过修正,后来我们在测温界面索性加了物体表面温度和修正后的温度)。MLX90614资料也挺少的,后来找到一个比较靠谱的厂家提供的这个芯片的额温转体温参考算法。(元件买对店铺也挺关键的,给的例程出问题就很难受了)
    厂家给的算法贴下面:

    https://www.sekorm.com/news/53997296.html

    第三天基本都在根据那个算法调参数找最佳的情况,然后队友A的人脸识别也差不多成型了。把他那部分和我的整合了一下再整体调速。(为了控制人脸识别的准确性,想加个距离检测把距离人脸的位置控制在我们识别准确度最高的范围内,一开始加的超声波模块后来它的中断导致按键扫描很不稳定就ban掉了,买了一个小贵的激光测距模块,资源少代码多移植起来太费劲后来索性放弃。)第三天其实整体差不多已经出来了,就是测温和人脸识别的准确性有待调整,我和队友B就开始着手搭硬件。(一方面图省钱又感觉没必要买三脚架,那天我和队友就在实验楼瞎溜达,捡了不少木板木棒啥的,就有了最后的鬼样子,我们的结构挺独特的,当时在厕所锯木头也闹了挺大动静)
    Tip:LCD下面那一坨黑的复评时候专家组还问了,其实就是自己画的最小系统板下面塞了电源和开关乱七八糟的用热熔胶封死了。
    在这里插入图片描述
    其实第三天基本上就做出来了,只是很多误差不尽如人意,当时在这个题对比其他组进度算快了。后面就是反复调试测温部分和人脸识别如何提高识别准确度。

    部分代码

    完整代码可以有需要的可以留下邮箱,当时和队友代码整合以后两边运行边改,时间一长也忘记最后那个是最终烧录的工程,不保证有效,只有一定参考意义。(而且这个是准备期间小车、云台、PID集合的项目,我们在它的基础上改的)

    #include "stm32f10x.h"
    #include "delay.h"
    #include  "sys.h"
    #include "led.h"
    #include "beep.h"
    #include "key.h"
    #include "pwm.h"
    #include "exit_x.h"
    #include "lcd_init.h"
    #include "lcd.h"
    #include "pic.h"
    #include "timer.h"
    #include "USART1.h"
    #include "mlx90614.h"
    #include "smbus.h"
    #include "duoji.h"
    #include "display.h"
    
    uint8_t brr[20];
    uint8_t arr[10];
    uint8_t Rxover=0;
    //unsigned char Temp[10];
    
    sMlx90614Typ sMlx;
    u8  mode=0;
    u8 matched,state;
    u8 stranger=1;
    
    
    
    /*     
    -----------蜂鸣器-----------
           PB11 -> OUT
    -----------按键-----------
           PB10 PB12 PB13 
    ---------------------------
    */
     int main(void)
     {		
    		u8 i=5;
    		u8 ls_mode;
    		float	fTbody;
    		delay_init();
    	 	LED_Init();
    	 	KEY_Init();
    	  Exit_Init();   //外部中断引脚与LCD冲突?
    		LCD_Init();		//LCD初始化
    		BEEP_Init();
    		vMLX90614_Init(&sMlx,MLX90614_SMBUS_ADDR);
    		vSMBus_Init();//初始化
    		SysTick_CLKSourceConfig(1000);
    	  USART1_Init(115200);
    		LCD_Fill(0,0,LCD_W,LCD_H,BLACK);	 
    		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    //		PWM4_Init(50);	 //50hz   PWM输出
    //	 	Time3_Init(1000,50,50);//1000hz  云台PWM
    //		Timer2_Init(50);  //中断
    	 	while(1)
    	{
    //		
    //			/* 获取环境温度 */
    //			ucMLX90614_GetTA(&sMlx) ;
    //			/* 获取人体额头温度 */
    //			ucMLX90614_GetTO1(&sMlx) ;
    //			delay_ms(1000) ;
    //			/* 计算补偿后的人体温度 */
    //			fTbody = ucMLX90614_TempComp(&sMlx) ;
    //		
    //		LCD_ShowString(0,0,"Temp1:",WHITE,BLACK,16,0);
    //		LCD_ShowFloatNum1(72,0,sMlx.Ta,4,WHITE,BLACK,16);
    //		LCD_ShowString(0,24,"Temp2:",WHITE,BLACK,16,0);
    //		LCD_ShowFloatNum1(72,24,sMlx.To1,4,WHITE,BLACK,16);
    //		LCD_ShowString(0,48,"Temp3:",WHITE,BLACK,16,0);
    //		LCD_ShowFloatNum1(72,48,fTbody,4,WHITE,BLACK,16);		
    		
    //		mode = KEY_Scan();	
    //		if(ls_mode != mode)
    //		{
    //			LCD_Fill(0,0,LCD_W,LCD_H,BLACK); //模式变化时清屏
    //			ls_mode = mode;
    //		}
    //		LCD_Fill(72,128,32,48,BLACK);	
    //		if(ls_mode == 0) 
    //			i = 0;
    //		switch(ls_mode)
    //		{
    //			case 0:
    //							Dispaly(); break;//主界面
    //			case 1: 
    //							Tem_Dispaly(); 
    //							break;
    //			case 2:	
    //							Face_Rec();								//队内识别
    //							Face_Dispaly(); 
    //							break;
    //			case 3:														//陌生人信息录入
    //							Learn_dispaly();
    //							Learn_extract();
    //							break;			
    							if(i==0) { LED0 = !LED0; i++;} 
    //						
    			case 4: break;														//口罩识别
    //		}
    	}	 
     }
    
     
    
     
     
    
    

    心得

    整体下来其实做了不知四天三夜,漫长又充满动力总感觉时间不够的时光,大家一块儿为了一个目标做到最好。可圈可点的是几乎没怎么熬夜,中间也出了各种问题:队友意外把最宝贵的Openmv烧了、降压模块和最小系统板也糊了好几块等等。
    单就这个题目来看,想做出来并不难。但是要最好确实有难度,而且其实做得好的话是可以做成产品拿来用的,而不是和我们一样赶进度搭个木头架子。(身边有A组他们有的集成以后还加外壳做成可佩戴加了一堆花里胡哨就很强,同题的有的加了语音播报和三脚架长焦镜头确实砸了不少钱)
    值得吐槽的是这个题卷的很厉害,基本上每个队都把要求做完了,发挥部分其实很少有很独到的点子(除了那个学长把人脸识别加在了镜头上做成了冒牌谷歌眼镜),大家基本上都差不多,就看谁更稳。实际上一开始感觉最好拿到手的测温部分也是好多队伍翻车的原因,线下测试前天整体完成一遍才发现我们的测温模块好像有问题,借了弃赛的同学的测温模块。评测时候虽然在自己学校也是着实紧张了挺长时间。
    今年的复评环节也挺迷的,山东赛区很混乱,同题的从上午八点等到下午催必须全部结束一块儿上去,评委要求我们测了测温度,简单聊了聊。别的组还问了通信协议,A组的还要求重新演示,C组则就问了问最大爬坡角度就结束了。据说线下测试别的学校都放水了基本部分要求低,发挥部分给的高,最后整个学校出了一组一等奖,自己侥幸拿了二等没有空手而归。(还是感觉今年F题偶然性太大了,基本要求全部满分也拿不了省一)
    不过学到了东西也有所收获也算心满意足了。
    在这里插入图片描述
    墙裂建议有想法的同学差不多掌握完常用模块以后通过项目练手,积累经验。

    祝大家都能取得好成绩,共勉!

    留言回复可能比较慢,比较着急的可以自行下载。

    2020电赛F题程序

    cs