失败的格斗机器人-自制可编程混控

        自制可编程混控是什么概念? 没玩过的朋友们可能一脸问号。 格斗机器人圈的神仙们有很多机电工程师,航模高手, 有几个甚至是全运会的模型操控运动员选手。 我猜想, 航模的背景大大的影响了格斗机器人的操控方式。 和航模一样, 格斗机器人大家普遍都是用车模或者航模的枪控、多通道遥控器。 这些遥控器的好处是信号稳定, 传输延迟低, 信号完美适配各种pwm/ppm输入的电机驱动、电机调速器等, 这就使得航模遥控器在格斗机器人中很常用。 当然, 也不乏高手自己解决通信问题或者电子的接口, 但是大部分还是用遥控器来解决的。

所以什么是混控? 比如说你的机器是四驱的, 有四个电机。 你怎么控制他前后左右呢? 总不能一个推杆控制一个电机吧? 这太抽象了。 混控就是让两个推杆控制四个电机: 前推左边杆四轮正传, 左推右边杆左轮慢右轮块, 这样就能用两个杆控制四个电机让机器运动了。

         在铁甲雄心的比赛中, 饶厂长虽然比赛机器人整体设计缺陷较多, 但是对于行走的控制非常自豪, 想怎么混控怎么混控, 想设置什么功能设置什么功能。 像我的这台机器, 我用两个通道分别控制前后行走与左右行走, 一个通道控制角度旋转, 一个通道控制点火动作,一个通道控制陀螺仪矫正的积分与增益开关, 一个通道控制机器翻转后的控制反向与增益反向。因此开关陀螺仪矫正, 切换正反行走, 同时控制三个轮子平移又自旋, 完全不在话下。这些复杂逻辑如果想靠调遥控器混控来完成的话, 怕是要把人急死也搞不定, 但如果用Arduino这种单片机完成的话, 还是比较容易得(当然, stm8 , stm32, msp430等等所有MCU都可以满足我们的需求, 只是arduino比较方便快捷)。

        图中的机器人正在绕场地中心横移, 而这看起来比较老练的操作是我从未拿过遥控器的队友很快就掌握了的。 虽然在比赛中没用出来就被铲起来了, 但这并不妨碍我对我的混控方法洋洋自得。事实证明, 这套独立供电的系统可扩展性强, 抗干扰性强, 稳定性也不错。

1. PPM/舵机信号
在开始做这一切之前, 如果搞不清楚你的接收机是什么信号, 你的驱动板是什么信号, 那做混控什么的简直就是噩梦了。 常玩航模的朋友们对接收机的信号肯定是很清楚的, 这是典型的PPM信号, 舵机、电调等航模常用器件的输入都是这种信号, 使得舵机、电调的信号线可以直接接到接收机上, 这样的安装很方便。
标准PPM刷新率是50Hz(周期20ms),但也遇到过60Hz(周期约16ms)的接收机,如GR3E 3通道接收机。7通道接收机WFR07的周期是21.2ms。 我们的主角PPM长这样:

         最上面的是多路PPM调制的信号, 是接收机关心的, 我们不需要了解。 中间几路就是我们要的PPM信号。 如果我们有示波器, 或是单片机能够串口输出的话, 你就能够实时的拨动遥控器, 看一看每一路的变化了。 以六通道为例, 遥控器的摇杆、拨码开关、旋钮都对应着固定的通道号(有的也可以设置),因此每一路通道的变化都可以通过PPM的高电平宽度来侦测到。  
         PPM信号是一个周期性的方波信号,周期为20ms,也就是50Hz的刷新频率。PPM每一周期中的高电平持续时间为1~2ms(1000us~2000us)。以双手回中的遥控器为例, 在摇杆的自然位置, 这四路通道的脉宽通通为1500us左右。 如果偏差较远, 可以通过微调校准中心。

 2. 脉宽捕获/外部中断与定时器
   我们用示波器这种设备可以观测信号的脉宽, 那如何让单片机做到呢? 有的单片机有脉宽捕获功能, 如STM8, STM32等等, 可以通过配置寄存器设置引脚直接捕获脉宽。 Arduino据我所知貌似没有这种功能, 但是有外部中断与定时器。 单片机(Arduino)的引脚能够被脉宽跳变所触发, 当脉宽跳变且跳为高的时候, 开始计时, 当跳变为低的时候, 停止计时, 则脉宽被捕获到。 
     
   有的同学说, Arduino 有pulseIn函数, 可以直接测脉宽, 当然可以, 但不建议, 因为这不是硬件触发, 执行效率较低, 在没有操作系统调度的情况下不建议使用。 
    
   有的同学问, Arduino Uno行不行? mega行不行? 理论上说, 都行, 但是注意, uno只有两路外部中断接口, mega只有6路而且mega体积比较大, 如果你要3路信号接上的话, uno就没戏了。 我本人使用的是Arduino 的M0这款, 有13路中断, 主频48M还不错, 我6路做输入6路做输出刚刚满足。 最好别用3.3v电平的主控, 会造成一些麻烦, 建议使用M0即可。

3. 混控的数学
混控该怎么说呢, 要复杂可以很复杂, 要简单可以非常简单。 我自己的三轮万向轮混控就是一个公式解决了问题。 当然, 每个人的思维习惯不同, 我们搞控制的以及习惯了用数学模型思考了, 可能反而搞得很复杂。 实际上混控愿意如何实现主要看自己的手感和习惯, 当然了解其基本原理也是有些价值的。

以两轮行走系统为例, 上面三个式子就是我们所要的一切了。
Vr Vl分别是右轮和左轮的线速度, v为车辆整体沿运动方向的速度, w为方向角速度(l为两轮的距离, 是个常量)。 我们混控就靠这俩公式即可。 比如, 我希望我能达到如下效果:

理解这步很关键!假设左边上下动杆为通道1, 右边左右动杆为通道2, 则我捕获通道1的脉宽则与v对应, 而捕获的通道2的脉宽与w对应。 接下来再通过v与w值, 直接求取Vr和Vl, 并直接输出给驱动板即可。
例子1:
我左边推到最上, 右边不动, 则通道一脉宽为2000us, 则v = 2000 – 1500; 
右杆在中间, 则通道2脉宽为1500, 则w = 1500-1500 = 0; 求解得到Vr = 500, Vl = 500;(二元一次方程组)
那么, 对应两个轮子的脉宽为, Pwr = Vr+1500; Pwl = Vl + 1500;
如果求解出给驱动的脉宽超过1000-2000这个范围怎么办? 这是一个关键点, 究竟是限制速度保证转速还是限制转速保证速度, 就看个人手感了。 理解了这一点, 混控的程序就非常简单了。

三、开始设计我们的混控

1. 硬件
硬件讲起来注意事项比较多,①接线: Arduino直接接接收机怎么接? 一根一根杜邦线的吗?容易掉吧。 接上然后粘起来? 额, 怎么调试呢。 最好是专门设计一块转接板, 将3pin的接口设计在上面, 把电源、信号以及gnd都排布好, 方便直接连接。 Arduino连接电调、驱动同理。

②隔离:我们不是很确定购买的电调、驱动什么的是否做了光耦隔离, 假如没有的话很容易造成电流反向烧毁主板, 造成不必要的麻烦, 在设计PCB的时候就把管沟隔离设计到输出信号端。

③供电:主控怎么供电? 直接电调引出来5v? 电池直接? better not。 最好的方式就是隔离供电。 假如电池电压较高, 如24v、 48v等, 建议使用稳压芯片给主控供电。 假如电池电压本身就不高, 建议使用一块比较小的电池单独供电。 当然, 电池质量好且不超过12v的话电池直接给arduino Vin口供电即可。

2. 软件
软件的注意事项更多:
①滤波: 如果不希望自己的轮子在原地一抖一抖的话, 加个滤波是你的第一选择。 中值滤波, 专抗尖峰噪声, 低延时, 完美解决此问题。
 
②看门狗: 如果不希望万一失控后机子再也控不住的话, 你最好加看门狗。 如果你不知道看门狗是什么的话真的要恶补一下单片机知识了, 这个我就不解释了, 狗年大吉。
③用定时中断或操作系统: 如果你不希望控制周期时长时短或者卡在什么莫名其妙的地方的话, 用定时中断或操作系统吧, 千万别跑在loop里。

说点什么

avatar
  Subscribe  
提醒
error: Content is protected !!