2019电赛总结(序)
6月初,我基本上把PID和STM32调通,配合队友搭建的小车,加上一个超声波的传感器,开始学着调PID。后续也跟进了一些其他的视频,以及文档,把PID理解深化了一些。
其实电机输出无非两种,一种是像风力摆一样,0->工作,另一种是小车一样,常速->变速以实现差速转向,舵机其实也是,90°->其他角度。
但是,问题开始渐渐露出,队友的事情远不止我想的那么少。每个人都有自己的安排,我们无法安排好别人的时间。我一直以为队友在学STM32,事实上,别人在为了保研而努力复习,在为了90还是91而刻苦。对于我而言,80分足以,多余的部分,竞赛加分他不香吗?(其实我并没有保研的希望,只是想在大学里拿下一些奖项,也算无悔的青春)获奖就可以加0.1-0.3的GPA。可他又想竞赛还想拿到很高的成绩加GPA,怎么可能兼得呢!?有那么一刻我的心还是拔凉拔凉的。搞比赛都不能一心一意,何况我们只有三个月不到的时间,不破釜沉舟,我们怎么可能拿到奖励?
我们之间开始有了争执,因为能力实在是太菜,如果提前一年准备电赛,再菜也能慢慢修炼成大佬。可是三个月不到,怎么可能。作为我自己,已然全力以赴,为了这一次想拼一把,但是队友的所作所为让我心里冒起了凉气。
我并非有意冒犯追求成绩的同学。竞赛当然是给成绩锦上添花,可以没有。**但是在找队友的时候,一定要想清楚为何参加比赛,否则,几个人的志向不同,比赛很难做下去。**对于我们三个月零基础上电赛,真的是少见了吧。不得不投入更多的时间去训练。
一开始我打算6月下旬做风力摆,当时已经从网上找到了很多的资料,也认真研读了代码,各种准备,但是,很可惜,直到期末结束,7月中旬,才真真正正做出了风力摆。6月下旬斗志不佳,整个团队都很涣散,所以低迷直到期末考试结束。这期间我基本完成了32和pid的学习,看了一些四元数(欧拉角,MPU6050用到),玩了下陀螺仪(匿名四轴的上位机软件一绝),还看了一些openmv(很遗憾只学了最开始的几节,大致是色块阈值之类,后面串口都不会用)。虽然没有直接上系统,基本上模拟的效果是有的了。建议学习PID练手用霍尔编码电机,有反馈值和pwm输出,刚刚好。
由于实验室历年来都有同学参加电赛,我们自然地继承了他们的获奖作品。看着4年前的国一作品。我们心中不胜感慨,那么好的东西,今年落到我们手上了!!!拆!队友开始了中国式学习道路,开始拆国一的硬件。除了轴流风机的线太难分辨,其他都还好。轴流风机的驱动是MOS管放大电流来的,单片机的引脚接到了mos管的栅极(G),mos管大致是12V电压吧,(一般的H桥驱动等对轴流风机驱动能力不是很强,转速略慢)。整个系统的电压来自于监控电源(第一次听说)220->12V直流电。而我成功让电源短路了。一度怀疑人生。几个月内,短路了一个航模电池,短路了监控电源,还让旁边实验室的空开也干掉了。我这辈子怕是不合适学电吧。哎。
实验室的大佬特别抠,自己买了平衡车还不给我们玩。(怕被打,不多说)
7.15-7.19的校赛,由于宣传力度不够,所以参赛人数不多。(很多同学都直接回去了。不过我想说一句,想通过校赛就能参加国赛的同学真的是在做梦。什么都不练习,就算出了校赛,推荐去参加国赛,也是丢脸。要想拿奖,只有踏踏实实地练习,很一丝丝灵感,加上运气)
我们参赛题目就是风力摆。准备了那么久,还是有些小兴奋。我一直建议队友自己焊一块电路驱动,他焊接了,虽然效果不是很好(买的转接口大小不合适,而且仿照国一大佬的电路,焊出来居然不能用)最后不得已还是用了前人的硬件。但是线路老化,于是重新给换了线。(不得不说,焊接也要多练才行,看焊接水平就知道硬件菜如狗)(当然也不是怪队友菜,队友之前也继承了学长的衣钵,有一堆电子器件,自己也花了很多钱在硬件上。但是吧,我就觉得他练习少了,这是真的,硬件就是要多动手)
他研究好了电路,我这边也给出了单片机的程序,我记得是四路PWM输出(对于风机来说,单个风机即时制动是不可能的,要靠对向风机的反转制动),加上mpu6050的I2C输出(PB10,11,源码如是没有改过)。
我在别人的代码上修改以适应我们自己的电路系统(国一硬件+国二代码+菜鸡修改=风力摆),后来我感觉别人的代码不够好(代码变量值得学习,但是分类就很鸡肋了,而且还带着上位机回传的串口通信??有些忘掉了,总之对于500000的波特率很方,于是我删掉了上位机回传,把波特率改成115200,舒服多了。)
但是删这个过程中很麻烦,简单的删掉后,欧拉角的数据该从哪里获取呢(原来是在主函数里获取)?我最后把采样数据包装成函数,然后被定时器调用。这个修改的过程还是很难受的,出了很多bug,导致代码一度不能用。MPU6050有一个dmp模式,需要初始化。还有就是,extern 变量这个问题。一个变量aaaa在一个c文件里被声明并且extern之后,其他地方使用aaaa时就不必再定义了(全局、局部定义这个变量aaaa都是不合法的)
雄关漫道,渐渐也有了自己的风格,喜欢把东西分类,有了面向对象的感觉。
一个风力摆怎么能满足比赛呢。我又物色了17年的控制类题目,滚球控制系统,拿来练手。这时候已经没有什么可以直接用的物资了。去淘宝上定制了一块40x40cm的黑色亚克力板(如果想练手,建议不要用亚克力,边上容易形变,另外不要用黑色的,容易反光,摄像头把光当成小球误读数据)。别说,蛮贵的,这就花了40块。(预算电赛花个1000多,三个人平摊一下,还能接受,后面真香)
俩天才队友在亚克力板上用AB胶粘万向节的时候,把万向节方向搞反了(苦笑不得),于是浪费了俩天重新做这个部分。底座部分直接取实验室的木板,在边上粘上俩舵机(控制xy方向),连接好亚克力板、万向节和细杆、舵机。另外一边就是支架,上面放一个摄像头(openmv,采集小球位置,串口传输返回给STM32)。电源是220V降24V(因为便宜,而且有现成的),再降压稳压到5V给单片机供电。注意:舵机和单片机的电源要分开给,最好单片机先上电初始化,再打开舵机(就是在舵机的回路上加开关)。
板球结构基本上是这样了,过程中遇到的最大的问题就是舵机电压不稳,这一点一直影响到了省赛。(如上加粗,一定要分开给电源)另外就是摄像头采集的图像不是平面的而是有弧度的(鱼眼镜头??)这个需要纠正。摄像头采集的对象尽量减少干扰,(我们用白球,和白色的反光就很配,而且不建议用白色作为目标,一旦天气变化,可能颜色的阈值就变化了,采集不到目标)另外需要注意一下,安装舵机的时候,尽量让它在中值(偏转90°)的部分,差一点没关系,可以单片机软件调参到平衡。
其实对于控制小球来说,不过就是球的位移需要一个速度和时间,等效成加速度和时间,继续推导就是亚克力板对小球受到的合力(重力,支撑力)的影响,所以就是亚克力板的角度问题咯,最后就是舵机来决定角度。
再多的理论分析不如调一下,让小球稳定在亚克力板上。(当然前期很难受,球很滑一下子就掉下去了)对于PID算法,还是很容易控制小球的,只要舵机响应时间和范围匹配PID计算的结果。(提前预算好舵机每20ms能移动多大角度,PID调的值范围和这PWM是否匹配,PWM影响占空比进而控制舵机角度)其实一般来说舵机完全能控制到位的,建议不要把舵机移动的角度设置太大,其实亚克力板能在X\Y方向偏移10度完全就足够了。(需要换算成舵机角度,我有些忘了)
只要能定到板子上,后面基本很好做了,就是不停的设置新的目标点,让小球很稳的到达这个点。
板球练习基本上就结束了,时间也来到8月,没有时间再练习倒立摆了,很遗憾。但是我认为,个人完成了板球的思考,还是很不错的。
这段时间完成了简单的滤波器(平滑滤波,中位值滤波等),以及把PID从简单的变成了指针式,可以方便调用。同时完成了最后的一版,电赛模板,把电赛的OLED显示等都作了优化,写了自己的UI设计,虽然,这个设计,最后没能用上(因为比赛最后那晚,电脑炸了。被电感感人的炸了。代码全没了。PCIE去哪儿读取。。哎)
2019电赛总结(二)