Llamadas avanzadas de programa en MicroBlocks: controlar CoCube con mensajes de difusión
En MicroBlocks, una difusión no es solo "enviar un mensaje". Puede despertar scripts, transmitir comandos, llamar bloques personalizados e incluso funcionar como una llamada remota a una función, permitiendo que una página web o un programa anfitrión en Python controle tareas de CoCube.
Este tutorial empieza con el mecanismo básico de difusión y avanza poco a poco hacia:
- Enviar mensajes de difusión a CoCube por BLE desde una página web.
- Leer el contenido de una difusión con último mensaje.
- Llamar bloques personalizados sin parámetros mediante difusiones.
- Llamar bloques personalizados con parámetros usando el formato
call,nombre de función,lista de parámetros. - Encontrar el nombre de función y la lista de parámetros de bloques existentes, y llamarlos mediante difusiones.
- Extender el mismo mecanismo de mensajes a programas anfitriones en Python, y más adelante a MQTT, UDP y otros métodos de comunicación.
1. Mecanismo de difusión: controlar CoCube desde una página web
Primero abre el control remoto web:
https://microblocks.fun/rfp/remote.html
Esta página web puede conectarse por BLE a un CoCube que ejecuta MicroBlocks y enviar mensajes de difusión. Después de conectarse, escribe un mensaje en una caja de texto y haz clic en Send. El script correspondiente de cuando recibo en CoCube se activará.

La forma más simple es hacer que diferentes mensajes de difusión correspondan a diferentes tareas.

Por ejemplo:
recibir forward -> avanzar
recibir backward -> retroceder
recibir left -> girar a la izquierda
recibir right -> girar a la derecha
recibir smile -> mostrar una sonrisa y reproducir tonos
Esta forma es adecuada para empezar a entender las difusiones. La página web no envía datos complejos; envía nombres de tareas. El programa de CoCube prepara de antemano los scripts de esas tareas. Cuando llega una difusión, se ejecuta la tarea correspondiente.
Prueba a enviar estos mensajes desde la página web:
forward
backward
left
right
smile
Observa si CoCube realiza las acciones correspondientes.
Hay que prestar atención a un detalle: el texto del mensaje de difusión debe coincidir con el texto del bloque cuando recibo. Si la página web envía forward, el programa debe tener un script cuando recibo forward.
2. Último mensaje: leer el contenido de la difusión
En la sección anterior, cada mensaje tenía su propio script de cuando recibo. Si hay muchos mensajes, el programa puede quedar demasiado disperso.
MicroBlocks tiene un bloque muy importante llamado último mensaje. Este bloque lee el contenido de la difusión recibida más recientemente.
Podemos escribir un solo script receptor: primero leer último mensaje, y luego poner el mensaje dentro de condiciones if / else if para decidir qué tarea debe ejecutar el robot.

El programa significa:
cuando se recibe cualquier difusión
guardar "último mensaje" en la variable msg
limpiar la pantalla TFT
escribir msg en la pantalla TFT
si msg = forward, avanzar
si no, si msg = backward, retroceder
si no, si msg = left, girar a la izquierda
si no, si msg = right, girar a la derecha
si no, si msg = smile, mostrar una sonrisa y reproducir tonos
Ahora envía desde la página web:
forward
backward
left
right
smile
CoCube primero mostrará el mensaje recibido en la pantalla y luego ejecutará la acción correspondiente según el contenido de msg.
La idea principal de esta sección es:
El propio mensaje de difusión puede ser leído y usado por el programa.
Con último mensaje, el programa no necesita un script separado de cuando recibo xxx para cada mensaje. Todos los mensajes pueden entrar por el mismo receptor, y luego una estructura if los distribuye a diferentes tareas:
si msg = forward, avanzar
si msg = backward, retroceder
si msg = left, girar a la izquierda
si msg = right, girar a la derecha
Así la estructura del programa queda más clara.
3. Llamar una función personalizada sin parámetros mediante una difusión
En MicroBlocks podemos definir nuestros propios bloques. Por ejemplo, definimos myBlock:
myBlock:
mostrar "corazón"
esperar 500 milisegundos
mostrar "corazón pequeño"

Normalmente, para llamar este bloque personalizado, basta con arrastrar el bloque myBlock y ejecutarlo.
Otra posibilidad es añadir la biblioteca de llamada de funciones (Añadir biblioteca - Otros - Llamar función) y llamar la función por su nombre.
Lo que quizá no sea tan evidente es que un mensaje de difusión directo también puede funcionar como una llamada a una función con el mismo nombre.

En este momento, el botón myBlock del control remoto web funciona como un botón remoto. La página web envía myBlock, CoCube lo recibe y ejecuta la tarea con el mismo nombre.
Este método es adecuado para tareas sin parámetros, por ejemplo:
smile
blink
beep
dance
reset
Usar mensajes de difusión para "llamar funciones" es muy directo y ligero.
4. Llamar una función personalizada con parámetros mediante una difusión
Si una función necesita parámetros, no basta con difundir myBlock.
Por ejemplo, supongamos que definimos un bloque personalizado con un parámetro:
myBlock2 time
Este bloque puede usar el parámetro time para decidir cuánto tiempo esperar.
Para llamarlo mediante una difusión, podemos acordar un formato de mensaje:
call,nombre de función,parámetro
Por ejemplo:
call,myBlock2,100
Este mensaje significa:
llamar myBlock2 con el parámetro 100
Después de recibir la difusión, el programa debe analizar primero último mensaje:

La idea de análisis es:
recibir cualquier difusión
msg = último mensaje
si los primeros 4 caracteres de msg son call
dividir msg por comas
el elemento 2 es el nombre de la función
desde el elemento 3 empieza la lista de parámetros
llamar nombre de función con la lista de parámetros
Para call,myBlock2,100:
después de dividir:
elemento 1: call
elemento 2: myBlock2
elemento 3: 100
Entonces el programa ejecutará:
llamar myBlock2 con el parámetro 100
La ventaja de este formato es que la página web solo necesita enviar diferentes cadenas de texto para llamar diferentes funciones y pasar diferentes parámetros.
Prueba:
call,myBlock2,100
call,myBlock2,500
call,myBlock2,1000
Observa si cambia el tiempo de espera.
Si una función tiene varios parámetros, se pueden seguir colocando después del nombre de la función:
call,nombre de función,parámetro1,parámetro2,parámetro3
Por ejemplo:
call,setColor,255,0,0
call,moveTo,100,80,40
call,playTone,c,1,200
Esto ya se parece mucho a un pequeño sistema de comandos.
5. Llamar funciones existentes
No solo los bloques personalizados se pueden llamar de esta forma. Muchos bloques existentes de MicroBlocks también pueden llamarse por nombre de función.
La pregunta clave es: ¿cómo sabemos el nombre real de la función y la lista de parámetros de un bloque?
En MicroBlocks, haz clic derecho sobre un bloque y elige copiar al portapapeles.
Luego pégalo en un bloque de comentario o en otro lugar para ver el GP Script correspondiente.

Por ejemplo, al copiar el bloque de CoCube "avanzar durante 1000 milisegundos", se puede ver algo parecido a:
'CoCube move for msecs' 'cocube;forward' 40 1000
Esto indica que el nombre real de la función es:
CoCube move for msecs
Los parámetros son:
cocube;forward
40
1000
Por eso podemos enviar esta difusión:
call,CoCube move for msecs,cocube;forward,40,1000
Otro ejemplo: el bloque que muestra una imagen de sonrisa puede revelar un nombre de función como:
led_displayImage
Si el parámetro es happy, podemos enviar:
call,led_displayImage,happy
También puedes preparar estos comandos en el control remoto web y probar a enviarlos:
call,myBlock2,100
call,led_displayImage,happy
Sugerencias para revisar nombres de funciones
- Primero construye la acción que quieres usando bloques normales.
- Haz clic derecho sobre el bloque y copia o inspecciona el script.
- Encuentra el nombre real de la función.
- Registra el orden de los parámetros.
- Prueba la llamada con el formato
call,nombre de función,lista de parámetros.
Para CoCube, esto es especialmente útil para control remoto, por ejemplo:
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
Si una llamada falla, revisa primero tres cosas:
¿El nombre de la función es exactamente correcto?
¿La cantidad de parámetros es correcta?
¿El orden de los parámetros es correcto?
6. No solo páginas web: un programa anfitrión en Python también puede enviar mensajes
Los ejemplos anteriores usan una página web para enviar mensajes de difusión porque es directa y fácil de demostrar.
Pero este mecanismo no está limitado a la página web. Siempre que algo pueda enviar las mismas cadenas de difusión a MicroBlocks, puede controlar CoCube.
Por ejemplo, podemos usar un programa anfitrión en Python:
https://github.com/wwj718/microblocksmessaginglibrary
Esta biblioteca permite que programas en Python se comuniquen mediante mensajes con dispositivos que ejecutan MicroBlocks. En otras palabras, todo lo que se envía al hacer clic en Send en la página web también puede enviarse desde Python.
Los comandos de la página web pueden trasladarse a Python:
forward
backward
left
right
smile
myBlock
call,myBlock2,100
call,CoCube move for msecs,cocube;forward,40,1000
call,CoCube wheels stop
Así se pueden crear sistemas de control más avanzados, por ejemplo:
- Controlar CoCube con las flechas del teclado.
- Hacer que Python envíe automáticamente una secuencia de comandos de acción.
- Usar una cámara para reconocer resultados y luego enviar comandos de control.
- Coordinar varios robots CoCube.
- Enviar comandos
call,nombre de función,lista de parámetrosdesde una interfaz de computadora.
La página web es adecuada para demostraciones en clase, mientras que Python es mejor para proyectos completos. La idea central en ambos casos es la misma:
escribir tareas como mensajes de difusión;
hacer que el programa de MicroBlocks analice los mensajes;
luego llamar las funciones correspondientes.
7. No solo BLE: la misma idea también sirve para otros sistemas de mensajes
En este tutorial usamos principalmente mensajes de difusión por BLE para llamar tareas. El control remoto web y el programa anfitrión en Python envían cadenas como estas:
forward
smile
call,myBlock2,100
call,CoCube move for msecs,cocube;forward,40,1000
Pero lo más importante no es BLE en sí. Lo importante es la idea de diseño de "mensajes que activan tareas":
un sistema externo envía un mensaje
el programa de MicroBlocks recibe el mensaje
lee el contenido del mensaje
analiza el comando y los parámetros
llama la tarea o función correspondiente
Por eso, aunque en el futuro el mensaje no venga de BLE, podemos usar una estructura parecida. Por ejemplo:
- Mensajes MQTT: una computadora, página web o servidor publica un mensaje de control, y CoCube ejecuta la tarea después de recibirlo.
- Mensajes UDP: dispositivos de la red local envían mensajes cortos directamente, y el robot los analiza y ejecuta.
- Control web por WiFi: los botones de una página web envían comandos, y el programa de MicroBlocks llama funciones según esos comandos.
- Mensajes ESP-NOW: varios robots se envían comandos entre sí para control cooperativo.
En otras palabras, BLE es solo la entrada de comunicación usada en esta lección. Lo que realmente se puede reutilizar es:
describir tareas con cadenas de texto;
leer tareas con último mensaje;
distribuir tareas con el mecanismo call;
extender tareas con nombres de función y listas de parámetros.
Las implementaciones concretas de MQTT, UDP y otros métodos se presentarán en tutoriales posteriores.