前言

近期, MicroBlocks 在无线编程(基于 BLE)方面取得了很好的进展。预计在最近的一两个版本里, 无线编程功能将进入官方固件。

使用场景

无线编程的一些典型使用场景包括:

  • 实时观测自由落体的运动数据曲线
  • 实时观测巡线小车的传感器数据
  • 支持移动端编程
    • 拿着 iPad 在教室里走动, 随时读取出故障的学生设备正在运行的代码
  • 集成到任何网页工具中, 诸如 Teachable Machine (@汤老师想到的好主意!)
  • 用于制作支持无线编程的玩具/STEM教具
    • 通过围绕 MicroBlocks 无线编程固件构建各种语言的客户端(Python, JavaScript, Snap!, Scratch…), 使得基于无线编程固件的产品, 有完整的生态支持, 产品开发团队将极大缩小在软件方面所需的工作。

开始使用

无线编程功能目前还没有进入默认固件。目前, 为了使用无线编程功能, 需要刷入特殊的固件, 整个过程都在 MicroBlocks 图形化环境中完成, 不用有心理负担。

固件更新

使用最新版 MicroBlocks IDE在线更新固件。

确保 MicroBlocks 版本 不低于 v1.2.51

如果你正确刷入了最新固件, 应该看到固件版本 不低于 v215

编程环境

以下两个版本的 MicroBlocks IDE 都支持无线编程。

多语言客户端

前边在无线编程的一些典型使用场景里提到

通过围绕 MicroBlocks 无线编程固件构建各种语言的客户端(Python, JavaScript, Snap!, Scratch…), 使得基于无线编程固件的产品, 有完整的生态支持, 产品开发团队将极大缩小在软件方面所需的工作。

以下是无线编程固件已经支持的一些客户端:

Scratch 客户端

CodeLab Scratch 添加了无线编程固件的客户端:

具体使用方式, 推荐 @Patch 老师 制作的视频教程: CodeLab 版 Scratch 无线连接Microblocks 硬件

@Patch老师在视频里还提到了一个非常酷的功能: 同一个浏览器的多个网页(诸如一个 Scratch 页面, 一个MicroBlocks IDE页面) 可以同时连到同一个 MicroBlocks 设备上, 这样一来, 我们就可以一边实时修改设备的客户端程序, 一边实时修改硬件设备内部的程序, 并实时看到在两者中流动的消息!

他在另一视频中很好地利用了这个特性: Scratch为硬件设计8bit角色

Python 客户端

使用 pip 安装这个 Python 库

microblocks_messaging_library

JavaScript 客户端

MicroBlocksBLE-client.html

准确地说这是一个示例, 而不是一个 JavaScript 客户端。

这个示例包含了 JavaScript 与无线编程固件双向通信所需的所有代码, 你可以将这些 JavaScript 代码用于任何地方:

  • 制作小程序
  • 制作网页遥控手柄
  • 制作 Scratch/Snap! 客户端
  • 与你的网页结合

Snap! 客户端

还未上线, 但功能已完成。

MicroBlocks 客户端

MicroBlocks IDE 本身是一个客户端(基于浏览器的蓝牙 API)。

此外, 一个 MicroBlocks 驱动的板子可以成为另一个板子的蓝牙客户端。

参考 MicroBlocks 蓝牙客户端库

微信小程序客户端

@汤老师的小程序客户端(可用于控制蓝牙小车):

@汤老师写了一篇文章记录想法的实现过程: MicroBlocks蓝牙微信小程序, 其中也分享了小程序的源代码。

性能测试

近期有几位用户对于 MicroBlocks 无线编程固件与客户端的通信速度感兴趣。 我对此进行了简单测试

MicroBlocks 发往客户端

实验: 从 MicroBlocks 发送 1000 条消息, 一共用时 654 ms。 客户端(Snap!) 一共用时 716 ms, 收到所有的消息。

在确保 100% 消息送达率的情况下, MicroBlocks 每秒钟可以发送大约 1400-1500 条消息!

由于 Snap! 实现在浏览器中, 性能相比于其他客户端并不算高, 预计其他的客户端都能达到相似水平。

客户端发往 MicroBlocks

以下所有客户端的消息成功率都是 100%。

Scratch 作为客户端, 速度大约 33 条/秒

Snap! 作为客户端, 速度大约 33 条/秒(需要移除广播积木里的已连接检测, 否则大约是20条/秒)

当在 Snap! 中启用加速模式, 速度大约可以达到 50 条/秒.

即使将消息字符串的长度超过 100 (实验中是101), 对结果也不会有什么影响

Python 作为客户端, 速度大约 178 条/秒。进一步提到速度, 可能会导致一些消息没有从 Python 发出。

Scratch 和 Snap! 有进一步提速的空间(Scratch 中做了最多33条/秒的限速), 但 33 条/秒的速度已经足以覆盖大多数应用场景了,即使是实时的陀螺仪数据流。


提醒, 如果你发现你实验中经常遗失数据, 那么很有可能你需要 buffer 。

在计算机科学中,数据缓冲区(或简称缓冲区(buffer))是用于临时存储数据的内存区域,当数据从一个地方移动到另一个地方时会使用 –wiki: Data buffer

不过放心, buffer 不是什么神奇的东西, 它只是你在操弄的变量(内存空间).

在收到消息的时候, 不要立刻执行消息对应的任务. 例如使用这些消息点亮显示屏, 这很费时间, 你会因此遗漏后续进入的消息。应该将它先存储在一个内存区域, 之后再慢慢处理它(究竟是快快处理还是慢慢处理,取决于你机器的性能), 通常而言, 将进入系统的消息添加到列表中是好的做法, MiroBlocks 和 Snap!/Scratch 的列表效率都极高 。这个临时存放消息的列表就叫 buffer。

然后再使用一个循环去处理这个列表里的消息。这样你就不会丢失消息了。

常见问题(FAQ)

官方 FAQ

参考 翻译版本

windows 上卡顿或掉线

有 windows 用户反馈对于比较大的程序, 会出现卡顿或掉线。 对于 windows 的优化还在进行中。

如何在移动端使用

  • iOS: 需要使用 Bluefy 浏览器
  • 安卓: 使用 Chrome 浏览器

移动端的支持还很初步, 已经支持拖动/拼搭积木和点击运行等基本功能。键盘输入功能还不支持。

MacOS 上无法发现设备

@yinxi 反馈过这样一个问题:

刷过 microbit:more 的板子(并且在MacOS连接过), 之后再刷无线编程固件, 这台 MacOS 的浏览器连接时无法扫描到设备。但其他电脑可以扫描到。

这是 MacOS 蓝牙的怪癖, 它会始终记住同一个蓝牙硬件之前的信息, 当它被刷了新服务, MacOS 记住的还是旧的信息, 以至于出现问题。windows 下没有这个问题, 目前还不清楚解决方案。

参考