servo

Micro:bit on otto

Hello, otto otto 是个可爱的 Arduino 开源双足教育机器人项目。寒假前,福州哈雷创客空间的朋友找到我说希望整个 micro:bit(mbt) 的冬令营,本来想说之前做的RC车换个玩具车的底盘就能上了,结果被嫌弃说车子满大街,而且希望小朋友们能多学点东西,体现一点逼格。后来找来找去,发现 otto 还是比较合适。因为扯到动作的话,可以说是无底洞,够玩很久的。好吧,那就 otto 吧。 框架设计 接下活儿,就发现原来还是个不小的坑。因为主控还是 micro:bit,金手指部分的 IO 口其实少得可怜,除去鳄鱼夹口、按键、LED、i2c、SPI以后,只有 P8、P16 可用。还有 IDE 部分,makecode 在浏览器里拖来拖去感觉是很方便,但是也确实太占地方了……超过三层的嵌套看过去就是很大一坨了,而且传参数部分还有分行处理,平常一行的代码也会变得一大坨。写库的话,如果是这样,大家平时看不到,还是可以忍受,但是来小朋友来玩就不太合适了。 库的部分,也是不看不知道,一看吓一跳。内容其实也是很多,那最简单的舵机转至特定角度来说,本质是保持一个特定占空比的脉冲输出。在火车扳道这类的动作中,比较直接,只要一条指令就可以了,然后 PWM 保持住就可以了。而在机器人则全然不是这么一回事。这里有了速度的概念,在 5 秒和在 0.5 秒内从 0 度到 90 度,对于机器人来说,是完全不同的两个概念,前者可以实现一个金鸡独立的动作,而后者则会因为动作太快直接倒地。这里就出现了动作帧的概念。毕竟模拟舵机的命令周期是 25ms。那么基本就是每 25ms 有一个动作帧。一个 5 秒的连续动作,拆分成 5000 / 25 = 200 帧。 于是代码分为三层:1)最底层:保持 PWM 信号;2)中间层:拆分动作帧并发送至最底层;3)业务层:动作业务逻辑,发送到中间层。这里对于 mbt 以及 mbed 就有很多问题: PWM 口不足,其实也有看到实现了三只舵机驱动的版本。 哪怕通过 PCA9685 扩展 PWM 口,中间层感觉在 mbt 上感觉也不太容易实现,一方面:这部分有实时性很高,而 mbt 在接口部分已经经过了层层封装,而且看起来用的还是“高级语言”。 如果 microbit 这么忙的话,对于蓝牙连接等会不会有比较大的影响? 想来想去,还是觉得把底下两层外移,引入一块舵机板来解决问题。好在 mbt 的串口能转发到金手指上。至于舵机板呢?那就自己开发好了,反正手也痒了很久了。