MicroBlocks 编程案例: 创建哪吒扩展板库
文章目录
你无法用制造问题的思路解决问题
前言
英荔和恩孚联合举办的火星资源挑战赛,去年(月球资源挑战赛)全国有数百支队伍参加,赛事使用了哪吒扩展板来驱动小车, @Leeyve 和 @Jackson 希望基于 MicroBlocks 平台来开展赛事(替代 MakeCode 平台)。于是我这两天试着在 MicroBlocks 里接管哪吒扩展板以及小车使用到的其他传感器/执行器。
思路
哪吒扩展板来自恩孚公司, 恩孚的产品在海外很受欢迎(MicroBlocks 官方的例子有些就用了恩孚的扩展板)。我喜欢恩孚这家公司的开放作风,他们的产品文档开放又出色。之前我们在 CodeLab 有一些新的脑洞,恩孚的 CPO @song兄 都非常乐意提供支持。
哪吒扩展板相关的驱动代码,都在 Github 上: PlanetX_MicroPython/nezha.py
我打算将这些代码翻译到 MicroBlcoks,和MicroBlocks 编程案例: 创建 Sphero RVR 代码库的思路一样。
困境
结果遇到了困难。
比赛小车驱动的设备,基本都采用 I2C 通信。当前工作的实质是变着花样摆弄 I2C。将电机和舵机接入 MicroBlcoks 相当简单,翻译这部分 MicroPython 代码即可,只用了一会儿功夫, 第一次运行就成功了!
但接入颜色传感器花了我好几个小时!
颜色传感器 MicroPython 驱动 比较复杂,但也只是摆弄 I2C 而已,但与电机/舵机这类执行器不同,颜色传感器需要从 I2C 地址获取数据(不只是写入数据)。
驱动的代码量很大:
代码始终没有按照预期运行。我猜测错误的最大可能是大量 16 进制数造成的(诸如粗心导致的输入错误之类的),反复检查了 5-10 遍代码,始终没找到这方面的任何错误。
MicroBlocks 平台提供的强大支持
一筹莫展之下,我想了个主意,先缩小错误的范围,不想每次都检查一大堆的代码。 策略是对比 颜色传感器 MicroPython 驱动 和 MicroBlocks 的代码中间结果的差别,定位出最早的异常。
很快我将异常定位到了 _i2cread_color
:
虽然定位到了错误区域,始终看不出哪儿出了问题。
你无法用于制造问题的思路解决问题。
我试着直接操控 register, 也没有搞定(我是 I2C 新手)。
无奈之下,我放弃了自己折腾。 准备看看 MicroBlocks 其他使用 I2C 的驱动是怎么写的。
我找到了一个其他型号的颜色传感器: TCS34725
MicroBlocks 平台强大的功能之一是允许用户深入到积木底下: 展开定义!通过不停地展开定义,我不断进入到更深层的地方。我终于弄懂了原因!
于是我修复了代码。
若不是 MicroBlocks 平台提供的强大支持,我不知要多久才能解决这个问题,或者根本解决不了。
演示
我们来看看使用 nezha 代码库驱动的 demo:
nezha 代码库还未完成,完成后我会提交到官方。有一些比赛会使用的设备没有接入,诸如 AI 摄像头和 4 路灰度传感器,但它们都采用 I2C 通信,复杂度也不如颜色传感器,问题应该不大。
尝鲜
愿意尝鲜的同学可以下载使用它: nezha.ubl
可以从这里加载自定义的代码库:
参考
文章作者 种瓜
上次更新 2022-01-25