Pensamiento Computacional

Equivalencia entre Protobject y Microbit

Registro de observaciones sobre la equivalencia entre las implementaciones de Protobject y micro:bit para cada actividad: qué componentes se usan de cada lado y si hubo que ajustar algo para que ambas versiones funcionen igual.

Cada ficha describe una actividad, explica en qué se parecen (o en qué se tuvieron que arreglar) las dos versiones, y lista los componentes equivalentes de Protobject y de micro:bit lado a lado.
Verificación automática (pipeline PDG). Cada par de programas se compara con su grafo de dependencias normalizado «a menos del plumbing de plataforma»: se ignoran el color, los nombres de dispositivo, el eje x/y, las constantes numéricas y el orden entre sentencias independientes (el orden que sí importa —los efectos sobre la misma pantalla o el mismo sonido— se sigue teniendo en cuenta). Dos actividades son equivalentes si los grafos son isomorfos (GED = 0).

La equivalencia se diseña. Cuando el análisis encontró una diferencia, la pregunta no fue si la plataforma «lo permitía», sino cómo rediseñar la actividad para que las dos versiones volvieran a coincidir. Los dos últimos casos lo muestran bien: el gritómetro se cerró cambiando el medio de salida (de escribir un número a llenar la matriz de LEDs), y «No derrames el líquido» haciendo explícita en las dos plataformas la conversión del sensor que antes una hacía a mano y la otra por dentro.

Las 17 actividades son equivalentes.

Y esta vez con el resultado más limpio posible: las 17 dan isomorfismo con distancia de edición 0, es decir el mismo número de nodos y de aristas en los dos lados, no solo un parecido cercano. Además ya ninguna actividad usa bloques que existan en una sola plataforma: el vocabulario es enteramente común.

Actividades

02.1 Heart Beat 02.2 Xylophone 02.3 LED Xylophone 03.1 Music Visualizer 14.1 Ticklish Robot 16.1 Cookie Thief Alarm 16.2 Sunflower Alarm Clock 16.3 Bat in the Dark 16.4 Robot Activation Challenge 16.5 My Robot Friend Heart 16.6 Magic Birthday Candle 16.7 Don't Spill Liquid Game 17.1 Magic Clap Switch 17.2 Cinematic Power On 19.1 Digital Hot Potato 22.1 DJ Metronome 22.2 Scream Battle
02.1

Heart Beat

Los .ptj y .hex utilizan directamente los mismos elementos para su funcionamiento, la estructura es exactamente igual y el funcionamiento también. Por lo tanto, son equivalentes.

PProtobject

  • DibujoLED (Para mostrar el corazón)
  • BateríaMusical (Para los latidos)

MMicrobit

  • Pantalla LED (Para mostrar el corazón)
  • Music (Para los latidos)
02.2

Xylophone

La estructura y funcionamiento son los mismos, la única diferencia es que en protobject se debe escalar con un valor distinto la inclinación para obtener el sonido de la nota musical, lo cual no es un problema.

PProtobject

  • TecladoMusical (Para hacer sonar las notas musicales)
  • Inclinación (Para detectar la inclinación del dispositivo)

MMicrobit

  • Music (Utilizando ring tone para el sonido)
  • Acceleration (El movimiento de la placa)
02.3

LED Xylophone

Ocurre lo mismo que con Xylophone, donde nuevamente la estructura y funcionamiento es exactamente igual (la única diferencia es que en celular, la actividad está hecha para que este sea utilizado en horizontal, pero las coordenadas utilizadas es en base a la posición vertical del teléfono, al final esto no da problemas ya que funciona de igual forma que en microbit al utilizarlo en horizontal), también se escalan de manera distinta ciertos valores, pero como mencioné, es necesario ya que cada sistema es distinto.

PProtobject

  • TecladoMusical (Para hacer sonar las notas musicales)
  • Inclinación (Para detectar la inclinación del dispositivo)
  • DibujoLED (Para mostrar la posición del led respecto a la inclinación)

MMicrobit

  • Music (Utilizando ring tone para el sonido)
  • Acceleration (El movimiento de la placa)
  • Pantalla LED (También para mostrar la posición del led respecto a la inclinación de la placa)
03.1

Music Visualizer

Cambiamos la actividad en ambos proyectos para que la luz se muestre desde abajo hacia arriba según el ruido, esto arregló el error del "+ 1" que había mencionado anteriormente, para que funcione bien, utilizamos "limitar entre" en ambos proyectos, además de que quedó equivalente.

Recordar: (Quedó arreglado, pero lo comento de igual forma) para que no difiera la equivalencia, es importante ver la posibilidad de que los leds empiecen a contar desde el 0 hasta el 6, parecido a microbit, de esta forma no tendremos que agregar el "+ 1".

PProtobject

  • DibujoLED (Para mostrar la posición del led respecto al ruido)
  • NivelRuido (Para recibir el ruido como entrada)

MMicrobit

  • Pantalla LED (Se utilizan para exactamente lo mismo)
  • SoundLevel
14.1

Ticklish Robot

Quitamos el bloque de "cambiar color de fondo" ya que es redundante y sin él sigue funcionando de la misma forma, con esto, ya son equivalentes lógica y funcionalmente, la única diferencia es que se utilizan distintos sonidos, lo cual no afecta.

PProtobject

  • NivelRuido (Para detectar aumento de ruido repentino)
  • DibujoLED (Para animar la cara al aumentar el ruido)
  • ReproductorSonido (Para reproducir un sonido al aumentar el ruido)

MMicrobit

  • Input de sonido (Para el nivel de ruido)
  • Pantalla LED (Como el dibujo led)
  • Music (Como reproductor de sonido)
16.1

Cookie Thief Alarm

Realizamos cambios en la actividad de protobject, donde quitamos el bloque "al iniciar el programa", ya que no afectaba en nada a la funcionalidad y era redundante, con esto fuera, ahora son equivalentes.

PProtobject

  • Inclinación (Para detectar si se abrió la caja)
  • DibujoLED (Para mostrar la cara de alerta al abrir la caja)
  • ReproductorSonido (Para hacer sonar la alarma)

MMicrobit

  • Acceleration (Equivalente a inclinación en este contexto)
  • Pantalla Led (equivalente a DibujoLed)
  • Music (Como reproductor de sonido)
16.2

Sunflower Alarm Clock

Quitamos los bloques "al iniciar el programa" en ambos proyectos, mientras que en microbit para borrar la pantalla utilizamos "clear screen" tal y como en Protobject, por lo que quedó equivalente, solo se diferencian en que en protobject se detecta la luz desde la cámara trasera (al usar un teléfono celular), a diferencia de microbit, que con la placa se detecta desde arriba, a pesar de ello, no causa problemas ya que funciona de la misma manera.

PProtobject

  • IntensidadLuz (Para detectar nivel de luz)
  • ReproductorSonido (Para colocar música al superar nivel de luz)
  • DibujoLED (Para mostrar girasol al haber luz)

MMicrobit

  • LightLevel (Se utiliza igual que IntensidadLuz)
  • Music (Como reproductor sonido)
  • Pantalla LED (Mismo uso que DibujoLED)
16.3

Bat in the Dark

Ya arreglado el comentario de GED 1, ahora es equivalente.

GED 0Equivalentes ✓

Verificado con el pipeline: los dos grafos son isomorfos (GED 0, 12 nodos por lado).

Componentes: se utilizan los mismos que en la actividad anterior, pero sin Music y ReproductorSonido.

16.4

Robot Activation Challenge

(Comentario GED 3 ya resuelto, son equivalentes). La actividad en protobject era distinta a la de microbit, por lo que me aseguré de hacer que ambas tengan la misma estructura, lógica y funcionamiento, de modo que ahora sí son equivalentes. Se utilizan distintos valores máximos de energía para la activación dados los tamaños de las pantallas leds de cada dispositivo, pero no afecta.

GED 0Equivalentes ✓

Verificado con el pipeline: los dos grafos son isomorfos (GED 0, 15 nodos por lado).

PProtobject

  • BotónTáctil (Para aumentar energía)
  • ReproductorSonido (Para colocar música al activar el robot)
  • DibujoLED (Para mostrar cara del robot al activar)

MMicrobit

  • Botón del logo (Como botón táctil)
  • Music (como reproductor de sonido)
  • Pantalla led (como el dibujo led)
16.5

My Robot Friend Heart

Arreglo del comentario GED 18: Cambiado el orden de asignaciones de latidos en microbit para que sean equivalentes. Arreglo del comentario GED 19: En realidad microbit no utiliza el tocar el logotipo como activador, fue una confusión de la IA, lo que hace es detectar la inclinación del logotipo para realizar las acciones, tal y como en protobject, lo único que cambié aquí fue hacer que ahora se detecta puramente la inclinación del logotipo y no de la pantalla para que sea más consistente, esto debería arreglarlo.

GED 0Equivalentes ✓ — y con el orden ya alineado

Isomorfos (17 nodos y 25 aristas por lado). Los tres bloques asignan latidoGrande antes que latidoPequeño en las dos plataformas.

PProtobject

  • DibujoLED (Para mostrar latidos)
  • BateriaMusical (Para hacer sonar los latidos en base a la inclinación)
  • Inclinacion (Input para determinar la velocidad de latidos)

MMicrobit

  • PantallaLED utilizada tal cual como dibujo led
  • Music utilizado como la bateria musical de protobject
  • Orientación del logo y de la pantalla como inclinación de protobject
16.6

Magic Birthday Candle

Arreglado el comentario de GED 1, ya son equivalentes.

GED 0Equivalentes ✓

Verificado con el pipeline: los dos grafos son isomorfos (GED 0, 13 nodos por lado).

PProtobject

  • DibujoLED (para mostrar la vela)
  • NivelRuido (Para Apagar/Encender la vela)

MMicrobit

  • Pantalla LED (para lo mismo que dibujoled)
  • Ruido Fuerte como input (misma función que nivel ruido)
16.7

Don't Spill Liquid Game

Arreglo final: Cambié la actividad para ambas plataformas, ahora no se hace el escalado solo en una plataforma, además de que no se usa el bloque limitar, sino que las inclinaciones se calculan utilizando una fórmula simple, que suma la inclinación actual + maximo valor de inclinacion, ese resultado lo multiplica por la cantidad de leds por columna, y por último se divide todo y finalmente se aproxima hacia el entero más cercano hacia arriba para escalarlo a la pantalla LED, esto se hace de distintas formas en ambos proyectos, en protobject en el eje X hay que sumarle un número negativo y multiplicarlo por un negativo para que la dirección funcione correctamente, ya que estamos utilizando el dispositivo en otra orientación, por lo que es aceptable. Arreglo GED 108: En ambas actividades cree otro bucle "repetir para siempre", donde a cada instante se setean las variables inclinacionX e inclinacionY, la diferencia cae en que en protobject, como la inclinación se calcula con el celular en vertical, se deben invertir los ejes (inclinacionX = inclinacionY y viceversa) ya que la actividad está pensada para realizarse con el teléfono acostado en horizontal, con la pantalla hacia arriba, esto no pasa en microbit dado que la placa ya se utiliza de esta forma, esa es la única diferencia, la cual es necesaria (por eso antes se invertía el eje X). Además de esto, en microbit también coloqué el bloque constrain. Es un poco distinto en funcionalidad. La nota en protobject se mantiene, mientras que en microbit se toca por cada segundo. Además de eso, la lógica de las LEDs es distinta en protobject ya que actualmente usa colores para mostrar los rangos y toca ruido todo el rato (distintos para diferenciar si el líquido está dentro de los parámetros), mientras que microbit no cambia de color (por razones obvias) y solo toca ruido al salirse de los parámetros. Además de esto, quitamos el bloque "establecer color de fondo" de protobject ya que era redundante y no se utiliza en microbit, junto con cambiar el bloque "dibujar pantalla con color" por un "clear screen".

GED 0Equivalentes ✓ — y la pregunta del redondeo queda cerrada

El rediseño funcionó del todo: las dos versiones tienen ahora los mismos 37 nodos y las mismas 54 aristas, con la misma cadena sensor → + → × → ÷ → redondeo una vez por eje, un solo para siempre con las tres etapas (medir → decidir → mostrar) y las mismas variables intermedias con los mismos nombres. Desapareció el serial escribir de depuración, el bloque suelto restringir y el establecer color de fondo. La inversión de ejes en Protobject está explicada arriba y es correcta.

Sobre la pregunta del redondeo que aparecía aquí: se retira, y el error era nuestro, no del código. Decíamos que micro:bit redondeaba al entero más cercano y Protobject hacia arriba. Al ir a revisar el archivo original resultó que las dos plataformas redondean hacia arriba — micro:bit usa Math.ceil y Protobject redondear al alza — y ya lo hacían antes de estos cambios. Lo que falló fue nuestro programa que lee los bloques: no miraba qué tipo de redondeo era y escribía siempre «redondeo». Ya está arreglado. No había nada que investigar: el código estaba bien.

PProtobject

  • Inclinación (Para verificar si está nivelado el dispositivo o no)
  • DibujoLED (Para mostrar la dirección del nivel)
  • TecladoMusical (Para indicar qué tan desnivelado está el dispositivo)

MMicrobit

  • Acceleration como Inclinación, termina funcionando de la misma forma
  • Pantalla Led para mostrar la dirección del nivel tal y como dibujo led
  • Music para lo mismo que teclado musical
17.1

Magic Clap Switch

Quitamos el bloque "establecer color de fondo a negro" en protobject, dado que en microbit esto no se realiza. Además, cambiamos el bloque de "mostrar LEDs (vacíos)" en microbit por un "clear screen" como en protobject, de esta forma queda equivalente, aunque en principio se ve de color blanco.

PProtobject

  • NivelRuido (Para detectar aumento repentino y hacer switch de la luz)
  • DibujoLED (Para mostrar la luz)

MMicrobit

  • Ruido fuerte como input para lo mismo que NivelRuido
  • Pantalla LED Con la misma función que DibujoLED
17.2

Cinematic Power On

Quitamos los bloques de "borrar dibujo en LED" y "establecer color de fondo" en el bloque "al iniciar el programa" de protobject ya que microbit no los usa, aunque es por esto que al principio la pantalla queda blanca como en la actividad anterior, además, en protobject para apagar la luz gradualmente, se contaba al revés, o sea, de 7 a 1, mientras que en microbit, se contaba de la misma forma que en el bucle anterior, por esto, decidí hacer que en protobject se cuente desde 1 a 7 igual que en el primer bucle, y que de esa forma los bucles queden exactamente iguales. En cuanto a lo demás, no hay diferencias.

Componentes: se utilizan los mismos que en la actividad anterior.

19.1

Digital Hot Potato

Arreglado el comentario de GED 7: Cambié el orden de las operaciones en microbit para que sean iguales que en protobject, además a ambos les añadí un "parar todos los sonidos" antes de reproducir el sonido de derrota, ya que microbit lo necesita para no sobreponer sonidos, además, añadí en microbit el tiempo de espera antes de la finalización.

GED 0Equivalentes ✓ — resuelto el orden del final

Isomorfos (16 nodos y 34 aristas por lado). Se alinearon los dos lados: ambos cierran con detener sonidoreproducirpausa 4 sdetener sonido.

PProtobject

  • ReproductorSonido (Para indicar cuándo se está en juego y cuándo se pierde)
  • BotónTáctil (Para iniciar nueva ronda)

MMicrobit

  • Music (para lo mismo que reproductor sonido)
  • Logo como input para funcionar como BotonTactil
22.1

DJ Metronome

Arreglo de GED 1: La fórmula del cálculo del intervalo en microbit ya fue arreglada. Arreglé la versión de microbit ya que no funcionaba (debido a que intervaloBeat no estaba definido) y por lo tanto, no era equivalente en funcionamiento ni lógica a protobject, ahora que lo arreglé, funcionan de la misma forma.

GED 0Equivalentes ✓ — y corregido el error de cálculo

Isomorfos (14 nodos por lado).

Además del empate, se corrigió el error de fórmula: micro:bit calculaba el intervalo como 600 + bpm (suma) y ahora usa 60000 ÷ bpm. Con la suma, subir el tempo alargaba el intervalo: el metrónomo no marcaba el tempo que indicaba.

PProtobject

  • Inclinación (Para calcular los bpm)
  • BateriaMusical (Para hacer el sonido de pulso)

MMicrobit

  • Acceleration para utilizarlo como inclinación como en protobject
  • Music como bateria musical
22.2

Scream Battle

Arreglo final para equivalencia: Se cambió totalmente la actividad, para que sea equivalente, en ambas plataformas se utiliza la pantalla led para visualizar el tiempo del grito, esto mediante el encendido progresivo de la matriz de leds mientras dure el grito. Arreglo de GED 11: La inicialización de pantalla de protobject es propia del sistema, por lo que es una diferencia necesaria, ya que no hay forma de mostrar los números igual que en microbit, además de esto, apliqué redondeo a ambos para que sean equivalentes. Arreglé la versión de protobject ya que no cargaba en el visualizador. A pesar de que microbit muestra los dígitos de forma distinta que protobject, son equivalentes ya que eso es algo que depende meramente del sistema y no del algoritmo (microbit muestra números en la pantalla LED y protobject en DibujarEscribir), además de eso, para que se asemeje más la forma de visualización del tiempo de microbit a protobject, hice que el tiempo no se pueda mostrar en decimales para que se vea de forma directa y no hayan saltos gigantezcos entre los números al tardar tanto en mostrar toda la animación. Con este arreglo, la actividad queda mucho más parecida en el lado funcional.

GED 0Equivalentes ✓ — resuelto cambiando el medio de salida

Isomorfos (20 nodos y 38 aristas por lado), y el camino fue el rediseño: en lugar de escribir un número en el display de texto —que obligaba a Protobject a establecer tamaño y limpiar, sin equivalente en micro:bit— las dos versiones llenan ahora la matriz de LEDs mientras dura el grito (mientras → dos ciclos contados → graficardibuja en x y) y la borran al terminar.

Con el cambio desaparecieron de golpe SetTextSize, ClearTextDisplay y ShowNumber, y con ellos el cálculo de segundos. Es un buen ejemplo de que mover el diseño resuelve lo que perseguir bloques uno a uno no resolvía.

PProtobject

  • NivelRuido (para detectar el ruido constante)
  • DibujoLED (para mostrar el tiempo del grito en la matriz)
  • ReproductorSonido (para dar feedback al usuario al momento de avanzar y terminar la partida)

MMicrobit

  • Ruido fuerte como input, hace lo mismo que NivelRuido
  • Pantalla Led para mostrar el tiempo del grito
  • Música para reproducir efectos al avanzar y terminar la partida.
Nota: "Equivalente" significa que la lógica, la estructura del programa y el comportamiento observable son los mismos entre Protobject y micro:bit, aunque cada plataforma use bloques o sensores distintos para lograrlo.