记录我在开发 MicroBlocks 过程中积累的知识和技巧。
主要分为三个部分:
创建新的 library , 是将新设备引入 MicroBlocks 最简单也最常见的方法。
无需进入系统的"下一层", 一切工作都可以通过拼搭积木来完成。
MicroBlocks wiki 对 MicroBlocks 虚拟机的解释:
MicroBlocks 代码由运行在微控制器板上的简单解释器或虚拟机(VM)执行。
如果我们需要为 MicroBlocks 引入新的原语(primitives), 就需要修改虚拟机相关的代码。如我们之前引入 MQTT 相关的原语。
MicroBlocks 虚拟机通过简单的串行协议与IDE或其他类型的软件(如Mozilla物联网网关)进行通信。
MicroBlocks 与其他编程语言的互操作 也是通过上述串行协议实现。
MicroBlocks IDE 里内置了官方维护的固件。通常情况你应该使用这些固件,它们经过了充分的测试。
如果你想使用一些实验阶段的功能, 需要自行编译固件, 或者使用预编译的固件。以下是我预编译的固件:
https://wwj718.github.io/post/img/esp32-ble-keyboard-20231118.binhttps://wwj718.github.io/post/img/esp32-espnow-20231201.binhttps://wwj718.github.io/post/img/esp32-bleclient-20240113.bin在线刷入固件:

你也可以自行编译固件
MicroBlocks VM 采用 C/C++ 编写。它基于 Arduino 平台, PlatformIO 是首选的构建工具。
platformio.ini 是项目的配置文件, 可以视为构建 VM 的起点。
以下是一些有用的 pio 命令。
[env:esp32]): pio run -e esp32pio run -e esp32 -t uploadpio pkg update -g -p espressif32 (编译esp32-s3时用到)以上操作也可以在 vscode 里做(安装 PlatformIO 插件)
MicroBlocks VM 采用 C/C++ 编写
当我们为 MicroBlocks VM 引入新功能时, 有时遇到一些棘手的 bug。 我们不知道引起 bug 的原因是新代码本身的问题,还是新代码与旧代码互相影响导致的, 又或者是 MicroBlocks 本身的问题…
我们有时渴望回退到一个安全的"环境", 它足够干净和简单, 用于单独测试新的代码。
新建一个 PlatformIO 项目可能是不错的选择。


The challenge is not building it but understanding it – Bret Victor 《Seeing Spaces》
有动态语言(Python, JavaScript)经验的开发者, 切换到编译型语言时, 通常渴望 REPL(Read-Eval-Print-Loop)。 在 REPL 中我们可以获得快速的反馈循环。
快速的反馈循环 通常能够把我带到心流中。我喜欢各种能够增强快速的反馈循环的工作流。
最近我喜欢的一个工作流是:

类似于 Python 的 print, JavaScript 有 console.log, C/C++ 一般使用 printf 输出调试信息。 MicroBlocks VM 中使用 sprintf。
sprintf 类似于 printf 函数,但它不是将输出发送到标准输出,而是格式化字符串并将其存储在一个字符串缓冲区中。
以下是它的典型用法:
|
|
printf 格式化字符串 的所有功能, 你都可以使用。
MicroBlocks 构建了一些辅助 debug 的函数
|
|
如果你使用浏览器 MicroBlocks连接板子,输出的信息可以在浏览器调试工具里查看。
ESP32-S3 内置 JTAG 调试接口
MicroBlocks 内置的字符串使用 char* (如 obj2str(args[0])), Arduino 生态里的许多库的字符串使用 std::string (如 NimBLE 库)。
经常需要在两者之间转化。 MicroBlocks 偏好在内部使用 C 风格的字符串。
|
|
比较两个字符串是否相等
|
|
动态性
|
|
|
|
MicroBlocks 虚拟机是有状态的。
MicroBlocks IDE 的停止按钮不会重置虚拟机。停止按钮会重置 MicroBlocks IDE 的所有变量。
这和 Scratch/Snap 虚拟机的行为是一致的。停止按钮 不会重置 Scratch/Snap 虚拟机。你可以做以下实验: 将角色拖拽到任意位置,点击停止按钮, 角色不会被重置到舞台中心。
要重置虚拟机, 只能重启微控制器。
以下代码展示了在虚拟机中维护状态。
|
|
|
|
常用的数据类型有:
|
|
|
|
|
|
|
|
Arduino 平台主要使用一种简化的 C++ 版本,它是标准 C++ 的一个子集。Arduino 的开发环境基于 Wiring 语言,这本身是基于 C/C++ 的 – ChatGPT
AVR 核心使用 GCC 7.3.0, 并默认配置为使用 gnu++11 标准 – Which C++ standard does the Arduino language support?
提醒: 只测试过 esp32-wroom-32 模组
使用 pio run -e esp32 编译出的固件(位置在.pio/build/esp32/firmware.bin), 无法使用 ESPWebTool, esptool 等工具烧录到板子, 因为它并不完整。
如果你想使用使用 MicroBlocks 之外的工具烧录它,需要先合并固件:
|
|
然后就可以使用其他工具烧录合并后的 merged-flash.bin 固件了。
基于 MicroBlocks 制作的产品, 可能会想要内置开机程序, 用户在不连接 MicroBlocks 编程平台时, 也有默认可用的程序.
参考 @yinxi 的解决方案
@曾祥潘 老师分别测试了 Arduino、MicroBlocks、MicroPython 翻转 rpi pico 引脚的速度, MicroBlocks 的速度大约是MicroPython的 3 倍左右。以下是测试结果:

MicroBlocks 可以在 4 us(微秒)(1000,000 us/250,000 Hz)里完成一次引脚切换循环。这使得它可以支持一些要求严苛的应用, 诸如接管任天堂 SNES 控制器(需要能够工作在 6us 时间尺度里)。
参考 @Bingo 的视频分享 利用 MicroBlocks 在掌控板中显示汉字
@Bingo 分享了生成字库的 16 进制字符串的 Python 脚本: HexStr.py (使用方法参考前边视频的这个片段)。 @Bingo 提醒也可以用 PCtoLCD 软件生成。
以上方法也可用于显示 emoji: HexStr_emoji.py, 至于 MicroBlocks 方面,复用 @Bingo 提交的 OLED 汉字库即可(已内置在最新中文版本里)。需要注意的是, 在 MicroBlocks 中尽量手动输入 emoji 字符, 复制粘贴可能会有问题。

MicroBlocks IDE 基于 GP Blocks 构建。 相关代码在这儿。 通常情况下, 很少需要修改 MicroBlocks IDE。
我们之前在这个视频里讨论 MicroBlocks IDE 相关话题。
GP Blocks 目前还没有做到 Squeak 那种程度的自支持(我之前在邮件中和John Maloney确认过)。MicroBlocks IDE 的开发过程依然在代码中进行, Morphic 环境主要用于探索和实验。
进入开发模式, 可以方便调试 morphic
./build.sh --dev
在 MacOS 下从浏览器 MicroBlocks 进入开发模式: shift + option + click
如果你想在 vscode 中阅读 gp 代码(MicroBlocks 项目文件 ubp 也是 gp 代码), 可以在 vscode 中搜索 gp-lang, 感谢 @Riven 的分享!
记录我在开发 MicroBlocks 过程中积累的知识和技巧。
主要分为三个部分:
创建新的 library , 是将新设备引入 MicroBlocks 最简单也最常见的方法。
无需进入系统的"下一层", 一切工作都可以通过拼搭积木来完成。
MicroBlocks wiki 对 MicroBlocks 虚拟机的解释:
MicroBlocks 代码由运行在微控制器板上的简单解释器或虚拟机(VM)执行。
如果我们需要为 MicroBlocks 引入新的原语(primitives), 就需要修改虚拟机相关的代码。如我们之前引入 MQTT 相关的原语。
MicroBlocks 虚拟机通过简单的串行协议与IDE或其他类型的软件(如Mozilla物联网网关)进行通信。
MicroBlocks 与其他编程语言的互操作 也是通过上述串行协议实现。
MicroBlocks IDE 里内置了官方维护的固件。通常情况你应该使用这些固件,它们经过了充分的测试。
如果你想使用一些实验阶段的功能, 需要自行编译固件, 或者使用预编译的固件。以下是我预编译的固件:
https://wwj718.github.io/post/img/esp32-ble-keyboard-20231118.binhttps://wwj718.github.io/post/img/esp32-espnow-20231201.binhttps://wwj718.github.io/post/img/esp32-bleclient-20240113.bin在线刷入固件:

你也可以自行编译固件
MicroBlocks VM 采用 C/C++ 编写。它基于 Arduino 平台, PlatformIO 是首选的构建工具。
platformio.ini 是项目的配置文件, 可以视为构建 VM 的起点。
以下是一些有用的 pio 命令。
[env:esp32]): pio run -e esp32pio run -e esp32 -t uploadpio pkg update -g -p espressif32 (编译esp32-s3时用到)以上操作也可以在 vscode 里做(安装 PlatformIO 插件)
MicroBlocks VM 采用 C/C++ 编写
当我们为 MicroBlocks VM 引入新功能时, 有时遇到一些棘手的 bug。 我们不知道引起 bug 的原因是新代码本身的问题,还是新代码与旧代码互相影响导致的, 又或者是 MicroBlocks 本身的问题…
我们有时渴望回退到一个安全的"环境", 它足够干净和简单, 用于单独测试新的代码。
新建一个 PlatformIO 项目可能是不错的选择。


The challenge is not building it but understanding it – Bret Victor 《Seeing Spaces》
有动态语言(Python, JavaScript)经验的开发者, 切换到编译型语言时, 通常渴望 REPL(Read-Eval-Print-Loop)。 在 REPL 中我们可以获得快速的反馈循环。
快速的反馈循环 通常能够把我带到心流中。我喜欢各种能够增强快速的反馈循环的工作流。
最近我喜欢的一个工作流是:

类似于 Python 的 print, JavaScript 有 console.log, C/C++ 一般使用 printf 输出调试信息。 MicroBlocks VM 中使用 sprintf。
sprintf 类似于 printf 函数,但它不是将输出发送到标准输出,而是格式化字符串并将其存储在一个字符串缓冲区中。
以下是它的典型用法:
|
|
printf 格式化字符串 的所有功能, 你都可以使用。
MicroBlocks 构建了一些辅助 debug 的函数
|
|
如果你使用浏览器 MicroBlocks连接板子,输出的信息可以在浏览器调试工具里查看。
ESP32-S3 内置 JTAG 调试接口
MicroBlocks 内置的字符串使用 char* (如 obj2str(args[0])), Arduino 生态里的许多库的字符串使用 std::string (如 NimBLE 库)。
经常需要在两者之间转化。 MicroBlocks 偏好在内部使用 C 风格的字符串。
|
|
比较两个字符串是否相等
|
|
动态性
|
|
|
|
MicroBlocks 虚拟机是有状态的。
MicroBlocks IDE 的停止按钮不会重置虚拟机。停止按钮会重置 MicroBlocks IDE 的所有变量。
这和 Scratch/Snap 虚拟机的行为是一致的。停止按钮 不会重置 Scratch/Snap 虚拟机。你可以做以下实验: 将角色拖拽到任意位置,点击停止按钮, 角色不会被重置到舞台中心。
要重置虚拟机, 只能重启微控制器。
以下代码展示了在虚拟机中维护状态。
|
|
|
|
常用的数据类型有:
|
|
|
|
|
|
|
|
Arduino 平台主要使用一种简化的 C++ 版本,它是标准 C++ 的一个子集。Arduino 的开发环境基于 Wiring 语言,这本身是基于 C/C++ 的 – ChatGPT
AVR 核心使用 GCC 7.3.0, 并默认配置为使用 gnu++11 标准 – Which C++ standard does the Arduino language support?
提醒: 只测试过 esp32-wroom-32 模组
使用 pio run -e esp32 编译出的固件(位置在.pio/build/esp32/firmware.bin), 无法使用 ESPWebTool, esptool 等工具烧录到板子, 因为它并不完整。
如果你想使用使用 MicroBlocks 之外的工具烧录它,需要先合并固件:
|
|
然后就可以使用其他工具烧录合并后的 merged-flash.bin 固件了。
基于 MicroBlocks 制作的产品, 可能会想要内置开机程序, 用户在不连接 MicroBlocks 编程平台时, 也有默认可用的程序.
参考 @yinxi 的解决方案
@曾祥潘 老师分别测试了 Arduino、MicroBlocks、MicroPython 翻转 rpi pico 引脚的速度, MicroBlocks 的速度大约是MicroPython的 3 倍左右。以下是测试结果:

MicroBlocks 可以在 4 us(微秒)(1000,000 us/250,000 Hz)里完成一次引脚切换循环。这使得它可以支持一些要求严苛的应用, 诸如接管任天堂 SNES 控制器(需要能够工作在 6us 时间尺度里)。
参考 @Bingo 的视频分享 利用 MicroBlocks 在掌控板中显示汉字
@Bingo 分享了生成字库的 16 进制字符串的 Python 脚本: HexStr.py (使用方法参考前边视频的这个片段)。 @Bingo 提醒也可以用 PCtoLCD 软件生成。
以上方法也可用于显示 emoji: HexStr_emoji.py, 至于 MicroBlocks 方面,复用 @Bingo 提交的 OLED 汉字库即可(已内置在最新中文版本里)。需要注意的是, 在 MicroBlocks 中尽量手动输入 emoji 字符, 复制粘贴可能会有问题。

MicroBlocks IDE 基于 GP Blocks 构建。 相关代码在这儿。 通常情况下, 很少需要修改 MicroBlocks IDE。
我们之前在这个视频里讨论 MicroBlocks IDE 相关话题。
GP Blocks 目前还没有做到 Squeak 那种程度的自支持(我之前在邮件中和John Maloney确认过)。MicroBlocks IDE 的开发过程依然在代码中进行, Morphic 环境主要用于探索和实验。
进入开发模式, 可以方便调试 morphic
./build.sh --dev
在 MacOS 下从浏览器 MicroBlocks 进入开发模式: shift + option + click
如果你想在 vscode 中阅读 gp 代码(MicroBlocks 项目文件 ubp 也是 gp 代码), 可以在 vscode 中搜索 gp-lang, 感谢 @Riven 的分享!