本次引擎2.0.5
编辑工具VSCode
神奇的脑洞浮现!CocosCreator如何模拟电机转速控制呢?
哇咔咔!KUOKUO带你学知识,0基础也能看懂!
我相信我们在生活中都接触过小的直流电机,玩具里就有很多。
我们都知道对于直流电机,我们给上一定的电压,它就会工作,就会转起来。
对于我们的正常生活来说,转速变化多与少并不重要,快一点,慢一点都可以。
但是,对于一些需要固定转速的应用场景来说,转速的稳定至关重要。
如何稳定?
比如一个的直流电机,我们给上一定电压,电机的转速就会从0提高到某一个值,并运行下去。
突然,由于某些原因,电机振动了一下,导致转速下降了一些,你觉得这样的工作状态不满足要求,
你想提高转速,准备升高给定的电压,但是你不知道升多少!怎么办?
你灵机一动!买了一个转速测量装置,装了上去。转速显示目前是1800转,但是你想获得2000转。
你就提高电压,同时盯着那个转速显示,1850,1880,1900,1950,,,,2010,,
哎呀,超过了,怎么办?你又开始降压,,,哎呀!又低了。。。。
这就是人为控制不了的情况。
。。。。。。
这就人们设计PID自动调节器的目的!它能有效的调整转速使电机稳定运行。
不明白PID是啥?没错,我正要讲呢!!!
而且还是用CocosCreator来讲!
正片开始!
新建个工程,建个背景,找个轮子素材(圆的就行,其实不是圆的也行,模拟电机转的)
如图:
然后让我们写个轮子的脚本:round吧;并绑定在轮子上。
这样改变speed就可以控制转速,让轮子转起来。
看看转起来啦!
好了,让我们写个总控制脚本,来控制速度。
新建main.js绑定在Canvas上。
用require获取round脚本,然后初始化时速度为0;
嗯,好了。我们再添加文本显示速度吧!
这样观察更直观:
给出代码:
var round = require('round');
cc.Class({
extends: cc.Component,
properties: {
Round : {
type : round,
default : null,
},
label : cc.Label,
},
onLoad () {
this.Round.speed = 0;
},
start () {
this.Round.speed = 100;
},
update (dt) {
this.label.string = this.Round.speed + '';
},
});
嗯,这样转速就很直观了。
我们先模拟一下刚才的操作:
给电压后,电机启动。用计时器写一下。20秒到达2000转。
次数要记得减去1;
看一下效果:
怎么样,有感觉没!!!
接下来,我们突然转速下降。人为去调整。
看代码:
var round = require('round');
// 获取脚本
cc.Class({
extends: cc.Component,
properties: {
Round : {
type : round,
default : null,
},
// 显示转速
label : cc.Label,
// time间隔
time : 0
},
onLoad () {
// 初始为0
this.Round.speed = 0;
this.time = 0;
},
start () {
// 模拟启动过程
// this.schedule(function() {
// this.Round.speed += 1;
// },0.01,2000 - 1,0);
// 转速突然掉到1800
this.Round.speed = 1800;
},
update (dt) {
this.time += dt;
// 人为每两秒调整一下
if (this.time >= 2) {
this.time = 0;
// 模拟人为调整电压的升速降速
// 人不是精确的,随机数取整
var num = Math.floor(100 * Math.random());
if (this.Round.speed < 2000) {
this.Round.speed += num;
}
else if (this.Round.speed > 2000) {
this.Round.speed -= num;
}
}
// 实时的转速
this.label.string = this.Round.speed + '';
},
});
效果:
多了降,少了升,但是不精确;
这就是人为很难做到转速的调整的,这样看大家应该明白了。
接下来,我们先介绍PID中的P环节:比例环节。
它能实现快速性,人是2秒完成一次,但电路很快完成一次。
而且它是根据当前转速与目标转速的差来调速的。
看代码一下子就懂:
它会先求出当前值与目标值的差,如果差的大,升压快,如果差小了就慢慢升。
看效果:
这样转速会快速上升到接近目标转速,但是达不到目标值。
怎么办?
加入PID中的I积分环节;
就是在变化量少的时候累加变化量,让其快速达到目标转速。
还是上代码:
这样它会在2000转速附近浮动,稳定性弱些,但是抵抗扰动能力强。
不信??我们试一下,我们新建个按钮!
突然一个原因让它转速下降到1000,看它是否快速恢复!
绑定脚本,函数;
试一试:
当转速在2000浮动时,突减转速。
看,恢复快吧!一般的工程用PI调节就够了。
但是我还是讲一下PID调节器中的微分环节D
通俗的讲就是把转速的变化提前预知,做到转速无超调(就是尽量不过2000转)
看一下实现代码:(很简单的)
这样转速无超调,稳定2000以下:
怎么样,明白了吗?
O(∩_∩)O~~