【Arduino】2017年电子设计大赛B题 滚球控制系统|板球系统

该文介绍了一个基于ArduinoDue的滚球控制系统的设计过程。系统采用Pixy摄像头检测小球位置,并通过PID控制算法调整舵机,使小球能沿指定轨迹滚动。文章详细记录了从机械结构设计到软件编程的整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**本文由@ray 出品,转载请注明出处。 **
**文章链接: **
http://blog.youkuaiyun.com/wz22881916/article/details/78161080


今年电赛我们队伍选择的是B题,滚球控制系统。最后我们得到了省特和国一,也算是了结了我大一时的心愿吧。下面对这次比赛进行一下总结,以后回忆起来的时候也有个念想。

滚球控制系统是一个多变量、非线性控制对象,是球杆系统的二维扩展。本系统以Arduino Due为核心控制板,通过摄像头采集到球的位置信息,经过PID的控制算法来控制舵机的运行,从而控制小球的运动。其目的是让一个自由滚动的小球能够平衡在平板上特定的位置,或者沿一定的轨迹滚动。经测试,系统能够实现题目要求的各项功能,实测指标均达到或超过题设要求。
关键词:滚球控制系统;Arduino Due;位置检测;PID控制

当时网传已经有板球系统这道题了,虽然说心里没当一回事,但是还是默默地查起了一些资料。
板球系统、板球系统,最关键的就是需要检测到球的位置,然后通过板的机械运动将球保持在指定的位置上。
怎么检查球的位置呢?有两种不错的方法:一种方法是利用电阻屏,还有一种是利用摄像头。这两种方法比赛之前我都试过,电阻屏的话市场上有卖的一般就是7寸-17寸的四线、五线电阻屏,它获取小球位置比较灵敏,而且精度高、延迟低,对小球的材质、颜色没有要求,但是要求小球具备一定的重量,要不然检测不到球呀。至于摄像头检测小球的位置的话,一种方法是检测圆形,另一种方法是颜色检测,一般颜色检测的速度会快一些。如果使用摄像头检测小球位置的话,那么对处理器的运算速度要求较高,而且对光线的要求也较大,但是也可以使用开源摄像头(如OpenMV,pixy等),直接把小球位置信息等通过I2C、USART传输回单片机上。我们最后使用的就是Pixy。

最后赛题出来的时候,我们就傻眼了,居然和网传的消息那么像,但是尺寸却那么巨大。本来写好的电阻屏的程序是用不到了,只能用摄像头检测小球位置这种方法了。

当然我们想,小的我们都做好了,大的岂不是直接把原来的结构放大一些就是啦。但是后来发现我们想多了,尺寸变大许多导致的结果就是,机械结构需要重新设计。之前小板球系统的稳定性超级好,根本不会出现板子的抖动问题。但是等系统变大许多,板子变得很大很重,摄像头需要架设的很高,就带来了许多问题了。

摄像头是距离板子1m多的位置,这带来的后果就是,可能摄像头找不到那么小的球的位置了。

在比赛的那几天中,我们的机械结构换了4套。感觉一直都是在做木工活。第一套结构是纯木质的,各个部位全部用胶粘死。第二套是板子用的泡沫板,其他部分还是木质的。第三套是板子用的黑色喷漆铁板,支架是铁的,底板是木的,整套结构超级重、而且也不能拆卸。第四套结构的话,我们板子选择的是60601cm的雪弗板,这个比较轻、而且也比较平,底板是PVC版,画原理图然后切割,支持部分是铝架,所有部分均可拆卸。

等机械结构做好之后,还剩一天的时间来写程序,简直奔溃,感觉比赛的大部分时间全部都在设计机械结构。但是这是非常必要的,因为机械结构如果不好,你的程序优化的再好,也是不会稳定的,尤其是这么巨大的一个装置。

前面说了一堆废话,下面说一点有用的:
①我们选用的控制器是Arduino Due。因为使用它开发简单方便快速,而且时钟频率大84Mhz,相比于普通的stm32f1一点也不逊色。本来想直接用树莓派了,但是想到用树莓派可能有违规的可能,所以还是算了。
②摄像头选择的是pixy。利用Pixy图像识别传感器检测小球位置坐标。Pixy支持多物体、多色彩的颜色识别,同时也支持多种通信方式,它搭载的图像传感器配合强大的硬件,可以将小球的位置坐标信息快速地发送给微控制器。注意!!!这可是直接把小球的坐标发到单片机里唉,所以你用性能差一点的单片机也没有关系了,这大大的简化了程序的复杂性,省去了自己写图像处理部分的事,节省了许多时间。
③舵机的话我们试了好多舵机,贵的、便宜的,最后还是选择了MG996R。具体原因我不多说,大家可以买来试试。

(待续。。。)


更新一下我们使用的支架尺寸,总共分为3部分,有的部分买多了的是为了试哪种长度合适:

底座:
3060 欧标 350mm 6根  (底座)

最上面的伸出来的:
3060 欧标 820mm 1根   
3060 欧标 810mm 1根
3060 欧标 550mm 1根

竖着的:
3060 欧标 900mm 1根
3060 欧标 1100mm 1根
3060 欧标 1200mm 2根
3060 欧标 1500mm 1根


60*60 角件 套 9套(含紧固件)
30*30 角件 套 13套(含紧固件)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

### MATLAB实现小球平衡控制系统 小球平衡控制系统是一种典型的自动控制实验平台,通常用于验证线性化模型和控制器设计的有效性。以下是基于MATLAB的小球平衡控制系统设计思路以及代码示例。 #### 控制系统建模 在建立小球平衡控制系统的数学模型时,可以将其视为一个倒立摆问的简化版本。假设小车上的小球沿轨道移动并受到重力作用,则可以通过牛顿第二定律推导其动力学方程[^1]: \[ m \ddot{x} = F - k_f v - m g \sin(\theta) \] 其中 \(m\) 是小球的质量,\(F\) 是施加于小球的作用力,\(k_f\) 表示摩擦系数,\(v\) 是速度,而 \(\theta\) 则表示倾斜角度。 为了便于分析,在实际应用中常采用状态空间形式来描述该系统。设状态变量为位置 \(x\) 和速度 \(\dot{x}\),则有如下表达式[^2]: \[ \begin{bmatrix} \dot{x}_1 \\ \dot{x}_2 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -\frac{k}{m} & -\frac{c}{m} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{m} \end{bmatrix} u \] 这里 \(x_1=x, x_2=\dot{x}, u=F\)。 #### PID控制器设计 对于此类单输入单输出(SISO)系统,PID控制器因其简单性和有效性被广泛应用于工业领域。下面给出了一种基本的离散时间PID算法实现方式[^3]: ```matlab function control_signal = pid_controller(error, kp, ki, kd, Ts, prev_error, integral_term) % 计算积分项 integral_term = integral_term + error * Ts; % 防止积分饱和 (Anti-windup mechanism) if abs(integral_term) > 1e6 integral_term = sign(integral_term) * 1e6; end derivative_term = (error - prev_error)/Ts; % 输出控制信号 control_signal = kp*error + ki*integral_term + kd*derivative_term; end ``` 此函数接收误差值 `error` 及比例增益 `kp`, 积分增益 `ki`, 微分增益 `kd`, 时间步长 `Ts`, 上一时刻误差 `prev_error` 和累积积分项 `integral_term` 参数作为输入,并返回相应的控制量 `control_signal`. #### 完整仿真程序 以下是一个完整的MATLAB脚本文件,它集成了上述提到的状态空间模型与PID控制器逻辑: ```matlab clc; clear all; close all; % System parameters m = 1; % Mass of the ball [kg] g = 9.81; % Gravitational acceleration [m/s^2] k = 5; % Spring constant [N/m] c = 0.5; % Damping coefficient [Ns/m] A = [0 1; (-k/m),(-c/m)]; B = [0; 1/m]; C = eye(2); D = zeros(2); sys_c = ss(A,B,C,D); % Continuous-time state-space model [num,den]=ss2tf(sys_c.A, sys_c.B, sys_c.C, sys_c.D); G=tf(num, den,'InputDelay',0); Ts=0.01; % Sampling time [s] sys_d=c2d(sys_c,Ts,'zoh'); % Controller gains tuning via trial-and-error method or Ziegler-Nichols rules etc. Kp = 10; Ki = 2; Kd = 0.1; t_sim=[0:Ts:10]; % Simulation duration vector ref_pos=zeros(size(t_sim)); for i=round(length(t_sim)*0.2):length(t_sim)-1 ref_pos(i)=1; % Step reference input at t=2 sec end sim('pid_control_system.slx'); figure(); plot(t_sim,xout(:,1),'r-',t_sim,yout,'b--','LineWidth',1.5); legend('Position Response','Reference Position'); xlabel('Time[s]'); ylabel('Ball position[m]'); grid on; title('Step response with PID controller'); disp(['Final steady-state error:', num2str(xout(end,1)-yout(end))]); ``` 注意:以上代码中的某些部分可能需要根据具体硬件配置调整参数设置或者修改接口定义等内容才能正常运行。
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值