前言

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

使用场景

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

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

开始使用

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

固件更新

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

确保 MicroBlocks 版本 不低于 v1.2.51

如果你的版本低于 v1.2.51 , 需清除浏览器缓存:

  • 在 Windows 下: 按住 Ctrl 键和 Shift 键并按 R 键。
  • 在 MacOS 下: 按住 command 键和 Shift 并按 R 键。

如果你正确刷入了最新固件, 应该看到固件版本 不低于 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 下没有这个问题, 目前还不清楚解决方案。

参考