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.
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.
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.
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.
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.
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".
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.
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.
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.
Ya arreglado el comentario de GED 1, ahora es equivalente.
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.
(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.
Verificado con el pipeline: los dos grafos son isomorfos (GED 0, 15 nodos por lado).
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.
Isomorfos (17 nodos y 25 aristas por lado). Los tres bloques asignan latidoGrande antes que latidoPequeño en las dos plataformas.
Arreglado el comentario de GED 1, ya son equivalentes.
Verificado con el pipeline: los dos grafos son isomorfos (GED 0, 13 nodos por lado).
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".
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.
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.
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.
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.
Isomorfos (16 nodos y 34 aristas por lado). Se alinearon los dos lados: ambos cierran con detener sonido → reproducir → pausa 4 s → detener sonido.
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.
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.
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.
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 → graficar ↔ dibuja 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.