MicroBlocks 无线编程(BLE)
文章目录
前言
近期, 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 库
JavaScript 客户端
准确地说这是一个示例, 而不是一个 JavaScript 客户端。
这个示例包含了 JavaScript 与无线编程固件双向通信所需的所有代码, 你可以将这些 JavaScript 代码用于任何地方:
- 制作小程序
- 制作网页遥控手柄
- 制作 Scratch/Snap! 客户端
- 与你的网页结合
- …
Snap! 客户端
还未上线, 但功能已完成。
MicroBlocks 客户端
MicroBlocks IDE 本身是一个客户端(基于浏览器的蓝牙 API)。
此外, 一个 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 下没有这个问题, 目前还不清楚解决方案。
参考
文章作者 种瓜
上次更新 2023-12-29