MicroBlocks 高级程序调用:用广播消息控制 CoCube

在 MicroBlocks 里,广播不只是“发一条消息”。它可以唤醒脚本、传递命令、调用自定义积木,甚至可以像“远程函数调用”一样,从网页或 Python 上位机控制 CoCube 执行任务。

本教程会从最基础的广播开始,一步步过渡到:

  • 用网页通过 BLE 给 CoCube 发送广播消息。
  • 用“最后消息”读取广播内容。
  • 用广播调用无参数的自定义积木。
  • call,函数名,参数列表 的格式调用带参数的自定义积木。
  • 查看已有积木的函数名和参数列表,并通过广播调用它们。
  • 把同样的消息机制扩展到 Python 上位机,以及之后的 MQTT、UDP 等通信方式。

1. 广播机制:从网页遥控 CoCube

先打开网页遥控器:

https://microblocks.fun/rfp/remote.html

这个网页可以通过 BLE 连接运行 MicroBlocks 的 CoCube,然后发送广播消息。连接成功后,在网页输入框中输入消息,再点击 Send,CoCube 端对应的“当收到”脚本就会被唤醒。

网页遥控器

最简单的写法是:不同的广播消息对应不同的任务。

基础广播控制

例如:

收到 forward  -> 向前移动
收到 backward -> 向后移动
收到 left     -> 向左旋转
收到 right    -> 向右旋转
收到 smile    -> 显示笑脸并播放提示音

这种写法很适合刚开始理解广播机制。网页发送的不是复杂数据,而是一个个“任务名字”。CoCube 端提前写好对应的任务脚本,收到哪个广播,就执行哪个任务。

可以在网页中依次发送:

forward
backward
left
right
smile

观察 CoCube 是否完成对应动作。

这里要注意:广播消息的文字必须和“当收到”积木里的文字一致。比如网页发送的是 forward,程序里就要有“当收到 forward”。

2. 最后消息:读取广播内容

上一节中,每一种消息都写一个“当收到”脚本。如果消息很多,程序会变得很散。

MicroBlocks 里有一个很重要的积木:最后消息。它可以读取刚刚收到的广播内容。

我们可以写一个统一的接收脚本:先读取 最后消息,再把消息放进 if / 否则如果 判断中,决定机器人要执行哪个任务。

最后消息驱动任务

这个程序的意思是:

当收到任意广播时
    把“最后消息”保存到变量 msg
    清空 TFT 屏幕
    在 TFT 屏幕上显示 msg
    如果 msg = forward,向前移动
    否则如果 msg = backward,向后移动
    否则如果 msg = left,向左旋转
    否则如果 msg = right,向右旋转
    否则如果 msg = smile,显示笑脸并播放提示音

现在通过网页发送:

forward
backward
left
right
smile

CoCube 会先把收到的消息显示到屏幕上,再根据 msg 的内容执行对应动作。

这一节的重点是理解一件事:

广播消息本身可以被程序读取和使用。

有了 最后消息,程序就不需要为每条消息都写一个单独的“当收到 xxx”脚本。所有消息可以先进入同一个入口,再由 if 判断分发到不同任务:

如果 msg = forward,向前移动
如果 msg = backward,向后移动
如果 msg = left,向左旋转
如果 msg = right,向右旋转

这样,所有消息都可以进入同一个“消息处理脚本”,程序结构会更清楚。

3. 广播调用自定义、无参数的函数

在 MicroBlocks 里,我们可以定义自己的积木。比如定义一个 myBlock

myBlock:
    显示“心”
    等待 500 毫秒
    显示“小心脏”

无参数自定义积木

平时调用这个自定义积木,可以直接把 myBlock 积木拖出来执行。

或者添加积木库调用方法(添加积木库-其他-调用方法),通过调用函数名的方式来调用函数。

你可能不知道的是,直接广播消息也能起到类似“调用同名函数”的效果。

广播调用无参数函数

这时候可以把网页遥控器里的 myBlock 按钮看成一个远程按钮。网页发送 myBlock,CoCube 收到后执行同名任务。

这种方式适合没有参数的任务,例如:

smile
blink
beep
dance
reset

通过广播消息实现“调用函数”的优点是非常直观、轻量。

4. 广播调用自定义、有参数的函数

如果函数需要参数,单纯广播 myBlock 就不够了。

例如我们定义了一个带参数的自定义积木:

myBlock2 time

它可以根据参数 time 决定等待时间。

如果想通过广播调用它,可以约定一种消息格式:

call,函数名,参数

例如:

call,myBlock2,100

这条消息可以理解为:

调用 myBlock2,参数是 100

程序接收到广播后,需要先解析 最后消息

解析 call 消息

解析思路如下:

收到任意广播
    msg = 最后消息

    如果 msg 的前 4 个字符是 call
        用逗号分割 msg
        第 2 项是函数名
        第 3 项开始是参数列表
        调用 函数名 参数 参数列表

call,myBlock2,100 为例:

分割后得到:

第 1 项:call
第 2 项:myBlock2
第 3 项:100

所以程序会执行:

调用 myBlock2 参数 100

这种格式的好处是:网页只需要发送不同的字符串,就可以调用不同函数,并且传入不同参数。

可以尝试:

call,myBlock2,100
call,myBlock2,500
call,myBlock2,1000

观察等待时间是否发生变化。

如果以后有多个参数,也可以继续放在后面:

call,函数名,参数1,参数2,参数3

例如:

call,setColor,255,0,0
call,moveTo,100,80,40
call,playTone,c,1,200

这已经很接近一个“小型命令系统”了。

5. 调用已有任意函数

不仅自定义积木可以这样调用,MicroBlocks 里很多已有积木也可以通过函数名调用。

关键问题是:怎样知道一个积木真正的函数名和参数列表?

可以在 MicroBlocks 中右键点击一个积木,然后选择“复制至剪贴板”。

然后再注释积木或者别的地方粘贴,就可以查看积木对应的 GP Script。

查看函数名

例如,CoCube 的“向前移动 1000 毫秒”积木,复制出来的脚本里可以看到类似内容:

'CoCube move for msecs' 'cocube;forward' 40 1000

这说明它真正调用的函数名是:

CoCube move for msecs

参数是:

cocube;forward
40
1000

所以就可以通过广播发送:

call,CoCube move for msecs,cocube;forward,40,1000

再比如,显示笑脸图像的积木可以看到类似函数名:

led_displayImage

如果参数是 happy,就可以发送:

call,led_displayImage,happy

网页遥控器里也可以提前写好这些命令,发送一下试试吧:

call,myBlock2,100
call,led_displayImage,happy
查看函数名时的建议
  1. 先用普通积木搭出你想要的动作。
  2. 右键这个积木,选择复制或查看脚本。
  3. 找到真正的函数名。
  4. 记录参数的顺序。
  5. call,函数名,参数列表 的格式测试广播调用。

对于 CoCube 机器人,这种方式特别适合做远程控制,例如:

call,CoCube move for msecs,cocube;forward,40,1000
call,CoCube move for msecs,cocube;backward,40,1000
call,CoCube rotate for msecs,cocube;left,30,1000
call,CoCube rotate for msecs,cocube;right,30,1000
call,CoCube wheels stop

如果某个函数调用失败,优先检查三件事:

函数名是否完全一致
参数数量是否正确
参数顺序是否正确

6. 不止网页:也可以用 Python 上位机发送消息

前面的例子使用网页发送广播消息,是因为它直观、方便演示。

但这套机制并不限制消息来源。只要能向 MicroBlocks 发送同样的广播字符串,就可以控制 CoCube。

例如,可以使用 Python 上位机:

https://github.com/wwj718/microblocksmessaginglibrary

这个库可以让 Python 程序和运行 MicroBlocks 的设备通过消息通信。也就是说,网页里点击 Send 发送的内容,Python 程序也可以发送。

可以把网页中的命令迁移到 Python:

forward
backward
left
right
smile
myBlock
call,myBlock2,100
call,CoCube move for msecs,cocube;forward,40,1000
call,CoCube wheels stop

这样就可以做出更复杂的上位机控制系统,例如:

  • 用键盘方向键控制 CoCube。
  • 用 Python 自动发送一串动作指令。
  • 用摄像头识别结果,再发送控制命令。
  • 用多个 CoCube 机器人组成队形。
  • 用电脑界面发送 call,函数名,参数列表 命令。

网页适合课堂演示,Python 适合做更完整的项目。两者背后的核心都是同一件事:

把任务写成广播消息;
让 MicroBlocks 程序解析消息;
再调用对应的函数。

7. 不只 BLE:同样的思路也适合其他消息系统

这一篇教程里,我们主要通过 BLE 广播消息实现任务调用。网页遥控器和 Python 上位机发送的都是类似这样的字符串:

forward
smile
call,myBlock2,100
call,CoCube move for msecs,cocube;forward,40,1000

但更重要的不是 BLE 本身,而是这套“消息驱动任务”的设计思路:

外部系统发送一条消息
MicroBlocks 程序接收消息
读取消息内容
解析命令和参数
调用对应任务或函数

因此,将来即使消息不是从 BLE 来的,也可以使用类似结构。例如:

  • MQTT 消息:电脑、网页或服务器发布一条控制消息,CoCube 接收后执行任务。
  • UDP 消息:局域网中的设备直接发送短消息,机器人收到后解析执行。
  • WiFi 网页控制:网页按钮发送命令,MicroBlocks 程序根据命令调用函数。
  • ESP-NOW 消息:多个机器人之间发送命令,实现协作控制。

也就是说,BLE 只是这节课使用的通信入口。真正可以复用的是:

用字符串描述任务;
用最后消息读取任务;
用 call 机制分发任务;
用函数名和参数列表扩展任务。

MQTT、UDP 等具体实现方式,会在之后的教程中继续介绍。

CC-BY-SA

© 来自 CoCube 2024-2026.

This work is licensed under a CC-BY-SA 4.0 license.