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á.

Control remoto web

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

Control básico por difusión

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.

Último mensaje controla tareas

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"

Bloque personalizado sin parámetros

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.

Difusión llama una función sin parámetros

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:

Analizar mensaje call

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.

Encontrar el nombre de función

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
  1. Primero construye la acción que quieres usando bloques normales.
  2. Haz clic derecho sobre el bloque y copia o inspecciona el script.
  3. Encuentra el nombre real de la función.
  4. Registra el orden de los parámetros.
  5. 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ámetros desde 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.

CC-BY-SA

© por CoCube 2024-2026.
Many thanks to Professor José Manuel Ruiz Gutiérrez for helping with the translation!
Este trabajo tiene una licencia CC-BY-SA 4.0.