将新设备引入 MicroBlocks
文章目录
前言
阅读本文的你可能有这样的需求:你刚在网上买了个新设备,颜色传感器、可编程书包或者 24 路舵机控制板之类的东西。 你在 MicroBlocks 内置的积木库里,怎么也没找到这个新设备的驱动库,可你又想使用 MicroBlocks 对新设备进行编程,怎么办呢?
别着急, 这篇文章正是为你写的。
怎么做
写驱动库很难吧?
为新设备写驱动库,听起来是一件吓人的事。在大多数硬件编程平台中,你需要进入 “底层” 去工作,这些平台会把用户界面打扮的漂漂亮亮,可等你一旦进入 “底层”,会发现它简直混乱得像你的卧室。
他们将材料一块块胡乱堆在一起,然后用石灰岩做外墙,使其外表光鲜 – Alan Kay 《软件: 艺术,工程,数学还是科学?》
当你在"底层"写驱动,你就不再能够使用之前学到的技能来编程,因为你现在可是在"底层"工作!今天的大多数图形化编程系统都如此,无论是 MakeCode、Scratch、node-red,还是 Mind+、慧编程、Kittenbot…
用户怎么看待这件事呢? 用户似乎应该抱怨这类平台的可扩展性很差,抱怨系统设计者没有能力打造更加一致的系统,抱怨他们根本没有理解终端用户编程的含义…
可用户通常被"底层"开发者教导说,那才是真正的编程。他们好像在说你之前用的东西只是糊弄小孩的玩意儿。这是今天计算机文化相当可悲的一面。 Bret Victor 在 The Future of Programming 里对所谓 “真正的编程” 这种无知和傲慢做了相当辛辣的讽刺。
可生长的系统
一个系统,如果希望随着时间的流逝,帮助用户成长,并且与用户一起成长,它应该认真对待可扩展性和可生长性,它应该支持终端用户轻松扩展它(Hypercard 是这类系统中的典范)。用户社区应该掌控这个系统,而不能指望工作在"底层"的开发者(他们就像垄断"识字"的"神职人员")。
MicroBlocks 正是这样可由用户轻松扩展的可生长系统。在架构设计时,它充分考虑了可生长性和可扩展性。
MicroBlocks 允许你在图形化环境构建驱动库!(另一个拥有强大扩展能力的图形化系统是伯克利的 Snap!)
你不需要进入"底层",在普通用户的编程界面里,就可直接构建新的驱动库,来驱动的新设备。
操作步骤
下面,我们进入操作环节。
具体而言,将新设备引入 MicroBlocks ,可分为以下三步:
- 弄清楚新设备使用的硬件通信协议。
- 在 IDE 创建自定义积木(通常是对通信协议的包装)。
- 将自定义积木移入新创建的库(根据需要分发它)。
接下来,让我们开始逐一讨论。
1. 弄清楚新设备使用的硬件通信协议
如果你购买的新设备有在线文档,通过查阅文档可以快速弄清通信协议。设备厂商通常会开放出主流平台的驱动(诸如 Arduino、MicroPython、JavaScript(MakeCode)), 只需要将这些驱动翻译到 MicroBlocks 中即可。顺便一提,Adafruit 开放了大量优秀的 Arduino/MicroPython 驱动库: Adafruit Github。
以恩孚科技的游戏手柄(Joystick:bit V2)为例。
通过查阅文档, 可以发现它简单使用了模拟信号和数字信号。它的 JavaScript(MakeCode) 驱动在这里
2. 在 IDE 创建自定义积木
弄懂了通信协议,我们就可以在 MicroBlocks IDE 创建自定义积木了。
先在设置中开启 显示高级积木
:
![](/post/img/show-adcanced-blocks.png)
从 文档 和 JavaScript 驱动 可以获知振动马达连接在 Pin 16
接口。
让我们创建一个自定义积木来控制震动马达。
首先点击 IDE 左侧的 我的积木
:
![](/post/img/my-blocks.png)
可以看到有两个选项:
- 新建命令积木(输出, 用于控制执行器)
- 新建报告积木(输入,用于从传感器获取数据)
控制震动马达属于第一种。
创建命令积木, 给积木库起一个名字,并且指定它接收的参数(默认为100),这和在 Scratch 中创建自制积木几乎一样。
![](/post/img/my-blocks-1.png)
接下来,让我们参考设备文档和驱动的说明,给积木赋予实际功能:
![](/post/img/my-blocks-2.png)
至此,我们就完成了第一个自定义积木,点击它就可以让你的游戏手柄震动!
在 MicroBlocks IDE 创建自定义积木的好处是,可以复用过去在 MicroBlocks 中的所有经验。也可使用 MicroBlocks 强大的实时调试能力!这带来极大效率提升,更重要的是,整个过程非常有趣,just for fun :-)
同样道理,你可以创建新的自定义积木,来驱动游戏手柄的其他功能。
3. 将自定义积木移入新的库
当你完成驱动新设备所需的自定义积木,可能会想如何分发这些积木给其他用户,就像分发一个软件库。
将自定义积木移入新的库即可。
首先让我们在 IDE 里创建一个新的库(确保你已经开启 显示高级积木
) :
![](/post/img/new-library-1.png)
我们给它起名叫 “Joystick”。
我们需要给这个新的库设置一些信息。
填写完库信息后,点击保存。
![](/post/img/new-library-2.png)
不同的颜色代表不同类型的设备,游戏手柄通常被视为一种传感器(输入设备),从用户那儿获取输入信息。当然它可能也有输出功能(诸如震动,但这不是它的主要功能)。所以我们选择紫色(输入)。
创建完 “Joystick” 库后,我们就可以把之前创建的自定义积木拖入库中:
![](/post/img/new-library-3.png)
完成后,在 “Joystick” 库里就能看到你的积木:
![](/post/img/new-library-4.png)
至此,你就为新硬件写完驱动了。
导出驱动库
你可以将驱动库分发给更多用户。 右键点击驱动库,导出为 ubl 文件,把这个文件发给需要的人即可。
![](/post/img/export-ubl.png)
如果你获得一个 ubl 文件,想要导入它,只需要将文件直接拖到 IDE 里即可。
![](/post/img/import-ubl.png)
更多分发方法
通常你不需要直接分发积木库。如果你的项目中使用到新的驱动库,当你分享你的项目时,驱动库会一并存在于项目文件(udp)和项目 URL 里。
如果你想让驱动库内置在 MicroBlocks 平台里,你可以将它提交给 MicroBlocks 官方仓库(确保你的驱动库是采用英文写的,这样全球用户才能使用它)。
如果你的驱动库,采用中文来写,只打算给中文社区使用,欢迎提交到 中文社区仓库。
继续学习
如果你想学习更多关于编写驱动库的知识,查看 MicroBlocks 平台内置的驱动库是个好办法。目前已经有很多驱动库内置在 MicroBlocks 里
![](/post/img/libraries-catelog.png)
右键感兴趣的积木,点击``,就可以学习它是怎么做的了:
![](/post/img/blocks-show-definition.png)
有些内置的驱动库是我提交的(也列出了它们使用的硬件通信协议):
- 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
![](/post/img/comm-catelog.png)
这些硬件通信协议足以涵盖主流的绝大多数传感器/执行器。
如果你的新设备,不是采用这些硬件通信协议,那么你可能无法在 IDE 里接入它,如果你不知如何将你的新设备接入到 MicroBlocks,提一个 issue吧,MicroBlocks 团队会给你合适的指引。
如何让 MicroBlocks 支持新的编程主板
MicroBlocks 目前支持 这些主板。
如果你想让 MicroBlocks 支持新的编程主板或芯片模组 ,需要在在虚拟机(VM)层面工作。
参考
文章作者 种瓜
上次更新 2022-12-02