OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3242|回复: 17

全国电子设计竞赛滚球控制系统的设计与实现

[复制链接]

12

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2018-8-2
在线时间
39 小时
发表于 2019-7-8 19:18:58 | 显示全部楼层 |阅读模式
浅谈滚球控制系统的设计与实现
作者:林宏伟        学校:某校        时间:2019-7-8
                又到了两年一次的全国电子设计竞赛了,大家肯定都在认真准备比赛了,本人也在学校专心准备比赛中,闲着无聊就把13年,15年,17年的国赛题目  (控制类)全做了一遍,嗯,十分理想吧,现在我就和大家分享下我在完成17年滚球控制系统这个题目的思路和程序代码(亲测有效)。
                ok,咋们先看一下17年滚球控制系统的具体要求,如下图所示,看任务要求知,我们需要一个边长65*65cm的正方形板子,我设计的是30*30cm的正方形板(经过测试确实是板子越大越容易实现功能,调试起来十分方便),之所以用小的是因为不会占地方,小嘛!

板球1.png           板球2.png

                首先,我们先来确定这个滚球控制系统的结构,多年比赛经验,结构一定要确定好,不然后期一堆坑等着你(踩多了)。ok,下面是我的结构图。注意观察舵机臂和板子连接处的结构,舵机臂与板子连接时千万不要固定死,一定要留有扭转的结构,这样板子才不会变形,如果咋们把舵机臂和板子连接起来固定死,这样会让板子变形,但是如果加个类似万向节的结构就可以避免板子变形了(板子变形是十分严重的现象,后期调试十分奔溃!!!!)
结构图.png
下面是硬件和结构清单:
1.两个180舵机
2.万向节*3 一个固定板子中心点,另外两个作为舵机臂和板子的连接结构
3.舵机臂(可以自己打印也可以直接买)
4.STM32f1最小系统*1,降压*2(舵机要单独供电!!!)
                接下来,我们来分析这个系统的主要部分分为多少个,其实这个滚球控制系统可以分为两个部分:识别部分和驱动部分。
                识别部分:识别的话我选用openmv,因为这个模块入门非常快速,基本有点python的入门知识就可以很快入门这个openmv,识别程序如下所示,利用图像的灰度,寻找小球,仔细调节小球的阈值就可以了,这部分不需要花多少时间,例程也是直接上openmv官网参考和修改的,十分简单,主要串口通信时的通信协议!!!!!
  1. while(True):
  2.         clock.tick()
  3.         Blank=0
  4.         img = sensor.snapshot()#抓取图像
  5.         blobs = img.find_blobs([green_threshold],x_stride=9,y_stride=9,area_threshold=6)#找点
  6.         if blobs:       #找到了小球
  7.                 for b in blobs:
  8.                         img.draw_cross(b[5],b[6])       #在右上方的监视器画十字叉丝
  9.         else:
  10.             Blank=1
  11.         if Blank:
  12.             output_str=bytearray([0xff,0xff])  #打印坐标
  13.             print('NoFind\n')
  14.         else:
  15.             output_str=bytearray([int(b[5]),int(b[6])])  #打印坐标
  16.             print('Find:')
  17.             print(' ', b[5],b[6])
  18.         
复制代码
               驱动
部分:
            
  PID算法如下,我是直接移植平衡小车之家的平衡小车的PID算法,这套算法十分成熟,所以个人建议不需要花太多时间去修改,最多就改改幅度值,积分限幅等,如果想理解PID,大家可以去网上搜索下PID算法的解说,网上资源十分多,我也是参考网上的资料去理解PID算法的
  1.    float  Differential,Bias,Balance_Ki=0.2;//定义差分变量和偏差
  2.          static float Last_Bias,Integration,Balance_Integration,Flag_Target;  //上一次的偏差值
  3.          int balance;//平衡的返回值
  4.          Bias=(Angle-Zero_Y);  //===求出平衡的角度中值 和机械相关  
  5.          Differential=Bias-Last_Bias;  //求得偏差的变化率         
  6.        
  7.          Flag_Target=0;
  8.          Integration+=Bias;
  9.          if(Integration<-500) Integration=-500;        //积分限幅
  10.          if(Integration>500)  Integration=500;       
  11.          Balance_Integration=Integration*Balance_Ki;   //积分控制
  12.                
  13.          balance=Balance_Kp*Bias/100+Balance_Kd*Differential/10+Balance_Integration;   //===计算平衡控制的舵机PWM  PD控制   kp是P系数 kd是D系数
  14.          Last_Bias=Bias;  //保存上一次的偏差
  15.          return balance;  //返回值
复制代码
            
  控制程序我采用定时中断的方式,每15ms查询一次,利用中断来实现控制小球滚到区域2,如下所示,这里的Zero_X=180,Zero_Y=105是小球在区域2时候的坐标数值,可以通过摄像头获取小球停止在区域2的坐标,也就是说这里Zero_X=180,Zero_Y=105是这套系统的期望值,我们的任务就是整定PID参数让小球可以到达期望的坐标位置上,其实PID就是对偏差进行积分微分比例运算,使偏差接近于0.开始我设定这个坐标作为期望值,然后先置零Y轴的电机控制程序(不动)后再开始调节一个X轴的PID,因为X,Y轴的PID其实都是一样的,也就是说调节好一个轴,另外一个轴也是一样的参数。开始先调节比例参数P,P的作用就是增加系统的回复力,调节到合适的时候出现的现象就是小球在区域2来回滚动,不会超过太多,滚动几圈后就会脱离(正常现象),如果P过大就会出现超调,这时候系统回复力很大,一下子就把球甩出去了(哈哈),P过小就回复不过来,整体感觉很慢!我这边是用PD控制器,调节好P后就可以开始调D,这时候P不需要置零,直接加D进去调节,混合调节,这样现象更加明显,D在这里的作用就是提高系统的与判性,也就是未卜先知,提前知道小球要滚到那里啦,而且D是抑制P的。D只能慢慢加,加到合适时候,整个系统就会十分稳定,小球也很快到达指定的区域啦!
  1.                         Zero_X=180,Zero_Y=105;
  2.              
  3.                    Position_Y=rxbuf[1];
  4.                          Position_X=rxbuf[0];

  5.                         //位置控制模式中,对舵机的速度进行限幅控制,防止舵机卡死
  6.                         if(Target_X<-Max_Target) Target_X=-Max_Target;       
  7.                         if(Target_X>Max_Target)  Target_X=Max_Target;         
  8.                         if(Target_Y<-Max_Target) Target_Y=-Max_Target;       
  9.                         if(Target_Y>Max_Target)  Target_Y=Max_Target;               
  10.                         if(start == 0) Target_Y = 0,Target_X = 0;
  11.                         //赋值PWM
  12.                         Set_Pwm(Target_Y,Target_X);
  13.       Last_Target_X=Target_X;        //保存上一次的值                               
  14.       Last_Target_Y=Target_Y;
复制代码
滚球6.jpg 滚球4.jpg 滚球5.jpg
(由于不能发视频我就发图了。。哈哈)
这个滚球控制系统只要实现这个功能后其他功能都是一样的啦,只是修改期望值和时间而已
            
  END
            
  结语:谢谢老师同学以及我的队友们,谢谢


哈哈,加油
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-4-23
在线时间
29 小时
发表于 2019-7-9 09:35:28 | 显示全部楼层
老哥能发一份源码不?
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-7-9
在线时间
15 小时
发表于 2019-7-9 23:03:01 | 显示全部楼层
同求源码
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-5-14
在线时间
7 小时
发表于 2019-7-16 11:54:32 | 显示全部楼层
不错不错,有心啦
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-7-27
在线时间
3 小时
发表于 2019-7-28 01:06:02 | 显示全部楼层
zhiben9 发表于 2019-7-9 09:35
老哥能发一份源码不?

可以

回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-7-25
在线时间
16 小时
发表于 2019-7-29 16:10:49 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-7-29
在线时间
0 小时
发表于 2019-7-29 16:45:51 | 显示全部楼层
心动的的感觉
谢谢老哥的分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-7-15
在线时间
3 小时
发表于 2019-7-29 16:51:04 | 显示全部楼层
老哥能发一份源码吗
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-4-23
在线时间
29 小时
发表于 2019-7-29 19:23:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
发表于 2019-7-29 20:16:39 | 显示全部楼层
你好,我想问下为什么把P的输出值除了100,D的输出值除10.,为什么不在赋值的时候就减小这个倍数呢
balance=Balance_Kp*Bias/100+Balance_Kd*Differential/10+Balance_Integration;
回复 支持 反对

使用道具 举报

12

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2018-8-2
在线时间
39 小时
 楼主| 发表于 2019-7-30 08:00:27 | 显示全部楼层
SSNCDSS 发表于 2019-7-29 20:16
你好,我想问下为什么把P的输出值除了100,D的输出值除10.,为什么不在赋值的时候就减小这个倍数呢
balanc ...

这个只是把PD倍数进行倍增或倍减,可以不加进去的,加进去只是方便点而已
哈哈,加油
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-8-4
在线时间
5 小时
发表于 2019-8-4 12:57:20 | 显示全部楼层
老哥,能发份源码嘛
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-7-13
在线时间
14 小时
发表于 2019-8-5 20:32:44 | 显示全部楼层

同求源码
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-5-8
在线时间
10 小时
发表于 2019-8-6 10:22:37 | 显示全部楼层
大佬。通讯源码可以发下不
回复 支持 反对

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-8-6 11:24:45 | 显示全部楼层
哈,看来是个高手啦,比赛的累计
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-1
在线时间
6 小时
发表于 2019-8-6 11:27:45 | 显示全部楼层
学习下。多谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2024-4-29
在线时间
0 小时
发表于 2024-4-29 13:47:50 | 显示全部楼层
老哥能发一下源码吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2024-4-29
在线时间
0 小时
发表于 2024-4-29 13:48:20 | 显示全部楼层
老哥求源码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 00:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表