上一篇文章《遥控汽车项目中通过Arduino控制双舵机》中分享了如何用Arduino控制遥控器间接遥控赛车:Arduino控制舵机→舵机带动电位器→电位器替代遥控器旋钮→遥控控制赛车,这种方法虽然开发比较快速,但技术不直接,中间增加了控制环节,特别是增加了新的机械装置,不是好的解决方案。
再次拆解和分析遥控赛车
- 遥控和接收机
遥控器和接收器之间是一个6通道通用遥控和接收机。查阅资料,了解到一般流程:遥控器将电位器信号值编码为PWM信号,再将多个PWM值编码为多路复合PMW信号,通过2.4GHz无线通信协议将复合PWM信号发送给接收机,接收机再解码分解为多通道PWM信号,分别对应多路3针插口。 - 遥控赛车转弯
这个比较简单,通常是通过一个舵机直接控制赛车左右方向旋转。 - 遥控赛车油门和刹车
这个稍微复杂一点,涉及到航模领域的专业知识,需要借助一个电调的装置(电子调速器),该装置通过接收PWM信号,调整电机的转速,具体原理可以看相关资料,这里不展开,不影响我们测试控制方式。
了解以上知识后,我们可以修改控制流程,直接将Arduino装到模型车上,通过无线(WiFi或者蓝牙)将计算机的油门方向值传输给Arduino。所以,➊我们不需要了解多路PWM编解码知识,我们可以用自定义格式传输油门方向值;➋方向舵机可以直接调用Arduino内置的Servo库控制;➌需要了解电调的控制方式。
如何控制电调器?
PWM英文全称为(Pulse-width modulation)。也称占空比信号,它表示高电平时长占整个信号周期的比例。电调虽然是通过PWM占空比控制电机速度,但他用的PWM频率和Arduino的PWM频率是不一致的,直接通过Arduino的PWM信号接线端是无法控制的。
仔细阅读航模电调的PWM控制协议,发现它实际是用一个2ms周期的方波来控制的,1ms高电平1ms低电平表示0,1.5ms高电平0.5ms低电平表示0.5,2ms都是高电平表示1(如果是-1~+1的范围,对应换算为ms高电平1ms低电平表示-1,1.5ms高电平0.5ms低电平表示0,2ms都是高电平表示1)。看到这里你就发现,这根本就不是PWM*(至少不是标准PWM,叫50Hz的PWM信号?)*。
到底如何控制电调呢?
仔细回想一下第一节所说的遥控器连接通用接收机如何控制电调的。我们会发现,通用接收机并不需要规定每个通道具体连接什么设备:是舵机控制方向,还是电调调整速度。把不同的通道的接线对调,会发现遥控器的方向变成油门了。等等,既然是通用协议,不同通道可以对调,也就是说,在航模领域,他们事实上都是遵循舵机控制协议的。
所以,我们何必要研究电调协议呢?
直接把电调当成一个舵机就好了,直接把上一版本通过舵机控制电调器的代码直接写入直控主板,开机测试,果然,一切就是这么直接,这么简单,这么美好。
for (int i = 0; i < SERVO_COUNT; i++) {
servo[i].write(servoValues[i]);
}