你无法用制造问题的思路解决问题

前言

英荔和恩孚联合举办的火星资源挑战赛,去年(月球资源挑战赛)全国有数百支队伍参加,赛事使用了哪吒扩展板来驱动小车, @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

可以从这里加载自定义的代码库:

参考