前言

阅读本文的你可能有这样的需求:你刚在网上买了个新设备,颜色传感器、可编程书包或者 24 路舵机控制板之类的东西。 你在 MicroBlocks 内置的积木库里,怎么也没找到这个新设备的驱动库,可你又想使用 MicroBlocks 对新设备进行编程,怎么办呢?

别着急, 这篇文章正是为你写的。

怎么做

写驱动库很难吧?

为新设备写驱动库,听起来是一件吓人的事。在大多数硬件编程平台中,你需要进入 “底层” 去工作,这些平台会把用户界面打扮的漂漂亮亮,可等你一旦进入 “底层”,会发现它简直混乱得像你的卧室。

他们将材料一块块胡乱堆在一起,然后用石灰岩做外墙,使其外表光鲜 – Alan Kay 《软件: 艺术,工程,数学还是科学?》

当你在"底层"写驱动,你就不再能够使用之前学到的技能来编程,因为你现在可是在"底层"工作!今天的大多数图形化编程系统都如此,无论是 MakeCode、Scratch、node-red,还是 Mind+、慧编程、Kittenbot…

用户怎么看待这件事呢? 用户似乎应该抱怨这类平台的可扩展性很差,抱怨系统设计者没有能力打造更加一致的系统,抱怨他们根本没有理解终端用户编程的含义…

可用户通常被"底层"开发者教导说,那才是真正的编程。他们好像在说你之前用的东西只是糊弄小孩的玩意儿。这是今天计算机文化相当可悲的一面。 Bret Victor 在 The Future of Programming 里对所谓 “真正的编程” 这种无知和傲慢做了相当辛辣的讽刺。

可生长的系统

一个系统,如果希望随着时间的流逝,帮助用户成长,并且与用户一起成长,它应该认真对待可扩展性和可生长性,它应该支持终端用户轻松扩展它(Hypercard 是这类系统中的典范)。用户社区应该掌控这个系统,而不能指望工作在"底层"的开发者(他们就像垄断"识字"的"神职人员")。

MicroBlocks 正是这样可由用户轻松扩展的可生长系统。在架构设计时,它充分考虑了可生长性和可扩展性。

MicroBlocks 允许你在图形化环境构建驱动库!(另一个拥有强大扩展能力的图形化系统是伯克利的 Snap!)

你不需要进入"底层",在普通用户的编程界面里,就可直接构建新的驱动库,来驱动的新设备。

操作步骤

下面,我们进入操作环节。

具体而言,将新设备引入 MicroBlocks ,可分为以下三步:

  1. 弄清楚新设备使用的硬件通信协议。
  2. 在 IDE 创建自定义积木(通常是对通信协议的包装)。
  3. 将自定义积木移入新创建的库(根据需要分发它)。

接下来,让我们开始逐一讨论。

1. 弄清楚新设备使用的硬件通信协议

如果你购买的新设备有在线文档,通过查阅文档可以快速弄清通信协议。设备厂商通常会开放出主流平台的驱动(诸如 Arduino、MicroPython、JavaScript(MakeCode)), 只需要将这些驱动翻译到 MicroBlocks 中即可。顺便一提,Adafruit 开放了大量优秀的 Arduino/MicroPython 驱动库: Adafruit Github

以恩孚科技的游戏手柄(Joystick:bit V2)为例。

通过查阅文档, 可以发现它简单使用了模拟信号和数字信号。它的 JavaScript(MakeCode) 驱动在这里

2. 在 IDE 创建自定义积木

弄懂了通信协议,我们就可以在 MicroBlocks IDE 创建自定义积木了。

先在设置中开启 显示高级积木:

文档JavaScript 驱动 可以获知振动马达连接在 Pin 16 接口。

让我们创建一个自定义积木来控制震动马达。

首先点击 IDE 左侧的 我的积木:

可以看到有两个选项:

  • 新建命令积木(输出, 用于控制执行器)
  • 新建报告积木(输入,用于从传感器获取数据)

控制震动马达属于第一种。

创建命令积木, 给积木库起一个名字,并且指定它接收的参数(默认为100),这和在 Scratch 中创建自制积木几乎一样。

接下来,让我们参考设备文档和驱动的说明,给积木赋予实际功能:

至此,我们就完成了第一个自定义积木,点击它就可以让你的游戏手柄震动!

在 MicroBlocks IDE 创建自定义积木的好处是,可以复用过去在 MicroBlocks 中的所有经验。也可使用 MicroBlocks 强大的实时调试能力!这带来极大效率提升,更重要的是,整个过程非常有趣,just for fun :-)

同样道理,你可以创建新的自定义积木,来驱动游戏手柄的其他功能。

3. 将自定义积木移入新的库

当你完成驱动新设备所需的自定义积木,可能会想如何分发这些积木给其他用户,就像分发一个软件库。

将自定义积木移入新的库即可。

首先让我们在 IDE 里创建一个新的库(确保你已经开启 显示高级积木) :

我们给它起名叫 “Joystick”。

我们需要给这个新的库设置一些信息。

填写完库信息后,点击保存。

不同的颜色代表不同类型的设备,游戏手柄通常被视为一种传感器(输入设备),从用户那儿获取输入信息。当然它可能也有输出功能(诸如震动,但这不是它的主要功能)。所以我们选择紫色(输入)。

创建完 “Joystick” 库后,我们就可以把之前创建的自定义积木拖入库中:

完成后,在 “Joystick” 库里就能看到你的积木:

至此,你就为新硬件写完驱动了。

导出驱动库

你可以将驱动库分发给更多用户。 右键点击驱动库,导出为 ubl 文件,把这个文件发给需要的人即可。

如果你获得一个 ubl 文件,想要导入它,只需要将文件直接拖到 IDE 里即可。

更多分发方法

通常你不需要直接分发积木库。如果你的项目中使用到新的驱动库,当你分享你的项目时,驱动库会一并存在于项目文件(udp)和项目 URL 里。

如果你想让驱动库内置在 MicroBlocks 平台里,你可以将它提交给 MicroBlocks 官方仓库(确保你的驱动库是采用英文写的,这样全球用户才能使用它)。

如果你的驱动库,采用中文来写,只打算给中文社区使用,欢迎提交到 中文社区仓库

继续学习

如果你想学习更多关于编写驱动库的知识,查看 MicroBlocks 平台内置的驱动库是个好办法。目前已经有很多驱动库内置在 MicroBlocks 里

右键感兴趣的积木,点击``,就可以学习它是怎么做的了:

有些内置的驱动库是我提交的(也列出了它们使用的硬件通信协议):

  • AI/AILens
    • I2C
  • Kits and Boards/哪吒扩展板
    • I2C
  • Kits and Boards/悟空扩展板
    • I2C
  • Network/MQTT
  • Other/Joystick_bit (本文例子的完整版)
    • 数字信号/模拟信号
  • Robots/酷比特小车
    • I2C
  • Robots/Sphero-RVR
    • UART

我对这几个库比较熟悉,如果你在阅读这些积木库的过程中遇到什么疑惑,欢迎与我讨论。

我的博客文章里也记录了一些编写驱动库的经验, 供大家参考。

FAQ

目前 IDE 支持哪些硬件通信协议

  • 数字/模拟信号
  • I2C
  • UART
  • SPI

这些硬件通信协议足以涵盖主流的绝大多数传感器/执行器。

如果你的新设备,不是采用这些硬件通信协议,那么你可能无法在 IDE 里接入它,如果你不知如何将你的新设备接入到 MicroBlocks,提一个 issue吧,MicroBlocks 团队会给你合适的指引。

如何让 MicroBlocks 支持新的编程主板

MicroBlocks 目前支持 这些主板

如果你想让 MicroBlocks 支持新的编程主板或芯片模组 ,需要在在虚拟机(VM)层面工作。

参考