Pensamiento Computacional · Protobject ↔ micro:bit

Propuestas de refactorización didáctica

Revisión de los 17 algoritmos, uno por uno, buscando escribirlos de forma más clara sin cambiar en nada lo que hacen. Se escribieron como propuestas; la franja de abajo dice cuáles se aplicaron después.

Cada actividad se revisó sobre el algoritmo escrito en el lenguaje de bloques común a las dos plataformas, no sobre el código real de cada una. Esa es la clave del método: si la reescritura se piensa en el vocabulario compartido, se puede aplicar igual en Protobject y en micro:bit, y la equivalencia se conserva por construcción en vez de tener que volver a demostrarse después.

Estado al 17 de agosto de 2026 — casi todas aplicadas

Este documento se escribió como un conjunto de propuestas. Desde entonces se aplicaron, y la verificación de equivalencia se volvió a correr sobre los archivos nuevos: las 17 actividades siguen siendo equivalentes, y con el resultado más limpio que ha dado la medición — las 17 con isomorfismo y distancia de edición 0, mismo número de nodos y de aristas en los dos lados. La refactorización no costó ni un punto de equivalencia, que es exactamente lo que el método pretendía garantizar por construcción.

Una corrección que nos toca a nosotros, no al código. La versión anterior de la revisión de equivalencia dejaba en la actividad 12 una «pregunta abierta» sobre el redondeo, diciendo que micro:bit redondeaba al entero más cercano y Protobject hacia arriba. Era falso: las dos redondean hacia arriba, y ya lo hacían antes. El fallo estaba en el programa que lee los bloques, que descartaba el campo que dice de qué tipo de redondeo se trata. Ya está corregido, y la pregunta se retiró.

§1 Las tres reglas de la revisión

Antes de mirar nada, el margen de maniobra quedó fijado. Buena parte de las propuestas que aquí no aparecen fueron descartadas por una de estas tres reglas, no por falta de ideas.

Solo la forma Lo que se ve y se oye tiene que quedar idéntico: los mismos píxeles, en el mismo orden, con las mismas pausas y los mismos sonidos. Una mejora que cambie el comportamiento —aunque sea para bien— no es una refactorización: es un rediseño, y esa es una decisión aparte.
La progresión manda Cada actividad solo puede usar construcciones ya introducidas en ella o antes. El condicional aparece en la 6ª, el si no en la 7ª, las variables en la 9ª, el ciclo contado en la 14ª, el mientras en la 15ª. Varias reescrituras obviamente mejores están prohibidas por esto, y se dejan anotadas para que no se vuelvan a proponer.
Solo vocabulario común Se pueden usar 34 de los 39 nodos de la ontología: los 5 restantes existen en una sola plataforma (ClearTextDisplay, NoiseToColour, SerialWrite, SetBackgroundColor, SetTextSize) y usarlos rompería la equivalencia.

§2 Resumen

De las 17, siete no necesitan ningún cambio — y eso es un resultado, no una omisión. De las diez restantes, seis se arreglan sin tocar un solo bloque ejecutable.

ActividadVeredictoQué cambia
1corazónsin cambiosOcho bloques son el mínimo para secuencia + ciclo infinito + ciclo anidado.
2xilófonosin cambiosTres bloques que muestran la cadena entrada → ajuste → salida de un vistazo.
3xilófono con LEDsformaInvertir los operandos de la suma: las dos salidas quedan con la misma gramática.
4visualizadorformaOrdenar las columnas de micro:bit para que el código siga el orden del dibujo.
5robot cosquillososin cambiosEl patrón de evento ya está en su forma canónica.
6alarma de galletasformaEncender y apagar en el mismo orden; tres rótulos en vez de un muro de texto.
7despertadorsin cambiosEs el ejemplo canónico del si … si no de toda la secuencia.
8murciélagosin cambiosLo que parecía repetición son cuatro dibujos distintos: una animación.
9desafío del robotsin cambiosLos comentarios llaman toques a la variable energia.
10corazón del robotformaLos nombres dicen tamaño y guardan milisegundos.
11vela de cumpleañosformaflama es un sustantivo haciendo de valor de verdad.
12no derramesreestructuraciónDos ciclos para siempre corriendo a la vez, y una carrera invisible.
13interruptor de aplausossin cambiosPropuesta descartada: era agregar un bloque que no hace nada (§4).
14encendido cinematográficoun bloque menosLos nombres de los dos contadores están intercambiados.
15papa explosivaformaEl único comentario está pegado a la línea equivocada.
16metrónomoun bloque con nombreLa idea central del programa es la única cosa sin nombre.
17batalla de gritosreestructuraciónDos ciclos contados que giran en vacío para simular una salida.
Sin cambios (7) Nombres, comentarios y orden (6) Un bloque menos, un bloque con nombre (2) Reestructuración (2) §4 Un criterio que hubo que decidir §5 Comentarios que no dicen la verdad §6 Texto ↔ código §7 Lo que la métrica no puede ver §8 El techo del lenguaje común

§3 Las propuestas, una por una

Sin cambios · 7 actividades

Estos programas ya están escritos en su forma mínima legible. Se documenta el porqué, para que la próxima revisión no vuelva a proponer lo mismo.

01 · corazon-forever-loop

El Llavero de Corazón Luminoso

Ocho bloques: una secuencia dentro de un ciclo infinito, con un ciclo anidado adentro. Es exactamente el mínimo para expresar las tres ideas que la actividad estrena. Poner las pausas en una variable haría el código más elegante para alguien que ya programa, y más opaco para quien lleva diez minutos.

02 · xilofono-inclinacion

El Xilófono Mágico Inclinable

Tres bloques en cadena lineal: leo cómo está inclinado → lo ajusto → suena → espero un poco. Es la primera vez que el programa recibe algo del mundo, y la forma deja ver la cadena completa entrada → transformación → salida de un vistazo, que es el objetivo declarado. Además estrena tres construcciones nuevas: es la carga máxima razonable para una sesión.

El +60 / +1000 es el concepto de la actividad y no está explicado en las dos plataformas: el comentario de micro:bit sí dice por qué se suma (la inclinación puede ser negativa y el teclado solo recibe positivos), el de Protobject solo declara el rango. Es un arreglo de comentario, no de algoritmo.
05 · robot-risa-simpatica-al-ruido

El Robot Cosquilloso

El patrón canónico de evento: preparar el estado de reposo → esperar → reaccionar → volver al reposo. Es la primera vez en la secuencia que hay dos bloques de nivel superior en vez de un solo repetir para siempre, y la forma hace visible ese concepto.

El cuerpo del ciclo de animación es letra por letra el mismo de la actividad 1. Eso es deliberado y conviene mantenerlo: los eventos se aprenden por contraste, así que si la animación no cambia, la única novedad que hay que procesar es la estructura de dos sombreros.

07 · despertador-por-la-manana

El Despertador de Girasol

Este programa funciona como el ejemplo de referencia del si … si no en toda la secuencia, y por eso el veredicto es tan firme. Las dos ramas son un espejo exacto: dos acciones cada una, en el mismo orden, con verbo y anti-verbo emparejados uno a uno.

si (nivel de luz > UMBRAL):        si no:
    reproducir melodía      ←→        detener todos los sonidos
    mostrar dibujo          ←→        borrar la pantalla

Un estudiante puede tapar una rama con el dedo y predecir la otra. Además la polaridad es la correcta: el caso interesante —el despertador sonando— está en la rama verdadera, no escondido en el si no, y la condición es afirmativa en vez de una negación.

Por qué no tocarlo. Cualquier retoque —una acción de más en una rama, un orden distinto— rompe el espejo y convierte el ejemplo canónico en un ejemplo con ruido, justo en la clase donde el concepto se estrena.
08 · luces-de-fiesta-al-oscurecer

El Vuelo del Murciélago Nocturno

A primera vista el cuerpo del si parece cuatro veces el mismo par de bloques, listo para plegarse con repetir 4 veces —que además está disponible desde la primera actividad—. No lo es: las cuatro imágenes son distintas. Es una animación de cuatro fotogramas, un destello que crece.

 . . . . .     . . . . .     # . # . #     . . . . .
 . . . . .     . # . # .     . # # # .     . . # . .
 . . # . .     . . # . .     # # # # #     . # # # .
 . . . . .     . # . # .     . # # # .     . . # . .
 . . . . .     . . . . .     # . # . #     . . . . .
    (A)           (B)           (C)           (D)

repetir 4 veces mostraría cuatro veces la misma chispa: parpadeo en vez de destello. Y no hay pliegue parcial posible, porque los fotogramas avanzan en vez de turnarse.

La lección sirve al revés. repetir N veces se usa cuando lo que se repite es idéntico; cuando cada paso es distinto, escribirlo paso a paso es lo correcto. Saber cuándo no usar un ciclo es parte de saber usarlo. Además, esta es la primera animación de más de dos fotogramas de la secuencia: verlos uno debajo del otro hace visible que una animación es una lista de imágenes en el tiempo.
La última pausa, después del cuarto dibujo, parece sobrar y no sobra: sin ella el cuarto fotograma dura casi cero, porque el ciclo vuelve de inmediato al primero.
09 · juego-toques

¡El Desafío de Activación del Robot!

La estructura ya separa los tres roles de una variable y los pone cada uno en su sitio: crear (= 0 al iniciar), modificar (+1 en el evento), comparar y mostrar (en el ciclo). No hay condiciones infladas, ni pasos fuera de orden, ni bloques muertos.

Lo que sí hay que arreglar son los comentarios, y es grave porque cae justo sobre el concepto que se enseña: la variable se llama energia, pero los comentarios dicen —verbatim, en las dos plataformas— «Inicia la variable "toques"…» y «Aumenta en 1 el valor de la variable "toques"». En la actividad donde se introduce la idea de que una variable es una caja con una etiqueta, la etiqueta tiene que ser una sola.

Un segundo comentario que falta: la barra crece porque los píxeles dibujados en vueltas anteriores siguen encendidos — cada vuelta dibuja una sola fila de 3 píxeles. Quien lee el código espera ver 3 píxeles, no una barra. No se puede resolver con la estructura sin un ciclo contado (14ª), así que conviene decirlo.
13 · luz-encendida-al-ruido

El Interruptor Mágico de Aplausos

El orden dentro del evento —primero invertir, después leer el valor nuevo— es el idioma estándar del interruptor y cualquier otro orden cambia el comportamiento. Las dos ramas son paralelas de verdad. La negación estado ← no estado expresa «cambia al contrario» en una sola línea, sin condicional auxiliar.

Propuesta evaluada y descartada. Se consideró agregar apagar la pantalla en al iniciar, para que el estado inicial quedara declarado del todo. Es un bloque que no hace nada: la pantalla ya arranca apagada en ambas plataformas. Se descarta por el criterio de §4. El estado inicial se documenta en un comentario, no con un bloque inerte.
Se evaluó también renombrar estado a algo como luzEncendida, que se leería solo. Se descarta: todo el andamiaje de la actividad está construido sobre esa palabra («variables de estado») y la actividad 14 reutiliza la misma variable. Solo tendría sentido como cambio conjunto.

Nombres, comentarios y orden · 6 actividades

Ni un bloque agregado, ni uno quitado. Cambia lo que el programa dice, no lo que hace. Son las propuestas de mejor relación entre lo que cuestan y lo que rinden.

03 · xilofono-inclinacion-con-nota-led

El Xilófono del Futuro (con LEDs)

El objetivo declarado es «una sola entrada, múltiples salidas», y depende de que se vea el paralelo entre las dos salidas. Hoy están escritas con dos gramáticas distintas: el píxel como centro + desviación, la nota como lectura + número.

Propuesta — un solo bloque tocado
repetir para siempre:
    borrar la pantalla                    // apaga el punto del ciclo anterior
    dibujar píxel en:
        eje móvil = CENTRO + redondear( leer inclinación ÷ K )
    tocar nota:
        altura    = BASE + leer inclinación     // antes: leer inclinación + BASE
    esperar 100 ms
Por qué mejora. Con la suma invertida, las dos líneas quedan con la misma gramática: valor de reposo + desviación que trae la inclinación. Eso hace legible de un vistazo la propiedad que la actividad quiere enseñar y que hoy hay que deducir: en reposo el punto está en el CENTRO y suena la nota BASE; la inclinación te aleja de ambos a la vez. Y convierte el ÷ K con su redondeo en la única diferencia entre las dos líneas, que es justo lo que la sección «La División Mágica» quiere que se note: la pantalla es chica y hay que escalar; el teclado no.
Se elige invertir la línea de la nota y no la del píxel porque las dos plataformas ya ponen la constante primero en el píxel: se unifica hacia la forma que ya existe. La suma es conmutativa, así que el resultado, el instante y el argumento entregado son los mismos.
04 · luci-discoteca-ruido

El Visualizador de Música

Las tres columnas se dibujan en el orden 2, 1, 3 en micro:bit y 3, 4, 5 en Protobject. Ninguno de los dos órdenes cambia lo que se ve —las tres columnas aparecen en la misma pasada—, pero el de micro:bit obliga a leer el código saltando.

Propuesta
micro:bit:  dibujar columna 2 1
            dibujar columna 1 2
            dibujar columna 3
Por qué mejora. El orden del código pasa a coincidir con el orden espacial del dibujo. Es la forma más barata de que el programa se pueda seguir con el dedo mientras se mira la pantalla.
06 · alarma-caja-galletas

¡Alarma: El Ladrón de Galletas!

El cuerpo del si se lee como una lista plana de cinco órdenes, cuando en realidad son tres momentos. Y hay una asimetría: Protobject enciende luz→sonido y apaga luz→sonido; micro:bit enciende sonido→luz pero apaga luz→sonido, así que la correspondencia se cruza.

Propuesta
repetir para siempre:                        // vigilar la caja sin parar
    si (inclinación de la tapa > umbral):    // ¿alguien levantó la tapa?

        // 1. ENCENDER la alarma
        dibujar el icono de alarma            ← en micro:bit pasa delante
        empezar el sonido de sirena

        // 2. DEJARLA sonando
        esperar 6 segundos

        // 3. APAGAR lo que encendimos, en el mismo orden
        borrar el dibujo de la pantalla
        detener el sonido
Por qué mejora. Convierte cinco órdenes en tres ideas, y hace visible el emparejamiento: con el mismo orden en las dos mitades, la primera acción de encender queda justo encima de la primera de apagar. Es un chequeo que se hace con el dedo — lo que enciendo arriba, lo apago abajo — y es el hábito que se va a necesitar en la actividad siguiente, cuando el si no obligue a pensar en pares de estados. Además la luz primero es lo que se verifica primero: en una sala con veinte celulares sonando, la comprobación real de «¿funcionó mi alarma?» es visual.
El bloque si —el concepto nuevo de la sesión— carga hoy un comentario de cinco líneas que explica qué es un condicional, y compite con el bloque justo cuando hay que mirar la condición. Esa explicación ya está, mejor redactada, en el material. Tres rótulos cortos la reemplazan.
El sonido se reproduce en segundo plano —no bloquea—, así que intercambiarlo con el dibujo solo altera cuál arranca unos milisegundos antes.
10 · corazon-variables-eventos

El Corazón de Mi Robot Amigo

Los nombres dicen el tamaño del dibujo y guardan una espera en milisegundos. latidoGrande y latidoPequeño suenan a «corazón grande» y «corazón chico»; nada en el nombre dice duración. La prueba de que confunden está en el propio comentario de micro:bit, que se contradice: dice que «la velocidad de latido aumentará» y explica que eso pasa porque «los tiempos son más largos».

Propuesta
al iniciar el programa:                       ← arriba: se lee primero
    // RITMO TRANQUILO: así arranca el corazón
    establecer pausaLarga a ⟨larga tranquila⟩    // espera entre latido y latido
    establecer pausaCorta a ⟨corta tranquila⟩    // espera de cada destello

repetir para siempre:
    // 1) EL GOLPE FUERTE
    mostrar corazón LLENO
    sonar golpe de latido
    pausa (ms) pausaLarga
    sonar golpe de latido                     // este toque anuncia el temblor

    // 2) EL TEMBLOR: 4 vueltas × 2 imágenes = 8 destellos
    repetir 4 veces:
        mostrar corazón HUECO
        pausa (ms) pausaCorta
        mostrar corazón CHICO
        pausa (ms) pausaCorta

cuando el dispositivo queda ⟨gesto TRANQUILO⟩:
    // los MISMOS dos números del bloque «al iniciar»
    ...
Por qué mejora. Las seis asignaciones son en realidad una tabla de 2 × 2 —dos ritmos × dos esperas— que hoy se ve como seis órdenes sueltas. Con los rótulos, el modelo mental pasa de «hay que acordarse de seis números» a «hay dos ritmos, cada uno con su espera larga y su espera corta». Y la regla queda comprobable a ojo: larga > corta siempre, y acelerar = achicar las dos.
Una trampa silenciosa que el orden hace visible. El bloque al iniciar y el gesto que «devuelve la calma» contienen exactamente los mismos dos números, y ese vínculo no está dicho en ninguna parte: quien cambie el ritmo de partida y no cambie también el gesto obtiene un programa que «vuelve» a un ritmo que nunca existió.
El programa se lee en el orden de su historia —aquí nace el valor → aquí se usa → aquí un gesto lo cambia mientras el ciclo sigue corriendo—, que es la idea nueva de esta actividad: un gesto puede cambiar lo que otro bloque está usando en ese mismo momento. En el lienzo eso ya se ve bien: al iniciar y los dos gestos están en la columna izquierda, uno debajo del otro, y el repetir para siempre a la derecha. No hay nada que reordenar.

Ojo con esto al revisar, porque induce a error: en el texto extraído el repetir para siempre aparece primero, y eso no dice nada sobre cómo se lee la pantalla — solo que ese bloque está unos píxeles más arriba. El orden del archivo no es el orden del lienzo. Ya pasó lo mismo en la 9ª. Si hay que juzgar la disposición, se mira el lienzo o las coordenadas, no la serialización.

11 · flama-vela-con-soplo

La Vela Mágica de Cumpleaños

flama es un sustantivo haciendo de valor de verdad, y cae justo sobre el concepto que la actividad enseña. si flama se lee «si llama»: no hay verbo, no se lee como una afirmación que puede ser verdadera o falsa. Y establecer flama a (no flama) —el bloque estrella de la actividad— se lee «establecer llama a no llama», que suena a contradicción.

Síntoma verificable: la ficha necesita un recuadro entero para descifrar qué significa (no flama), y lo explica caso por caso. Ese recuadro está gastando su energía en el nombre en vez de en el concepto. Hay además homonimia: la llama que se dibuja y flama que se recuerda son dos cosas distintas con el mismo nombre.

Propuesta
al iniciar el programa:
    establecer velaEncendida a verdadero            // la vela nace prendida

cuando se detecta un soplo:
    establecer velaEncendida a (no velaEncendida)   // el soplo da vuelta el estado

repetir para siempre:
    si velaEncendida:
        // fotograma 1: la llama tiembla hacia un lado
        dibujar la vela          // redibujar la vela borra la llama anterior
        encender el punto (columna al azar , fila de la llama)
        esperar 200 ms
        // fotograma 2: la llama vuelve al centro
        dibujar la vela          // otra vez: borra la llama del fotograma 1
        encender el punto (columna CENTRO , fila de la llama)
        esperar 200 ms
    sino:
        borrar la pantalla
Por qué mejora. El condicional pasa a leerse como una frase en voz alta: «si la vela está encendida, dibújala temblando; si no, deja la pantalla en negro». Y el interruptor deja de necesitar traducción: «la vela pasa a estar al revés de como estaba» es literalmente el objetivo declarado de la actividad. El recuadro de la ficha puede entonces enseñar la negación booleana en vez de descifrar un nombre.
El segundo «dibujar la vela» no dice para qué está. No está para dibujar la vela otra vez: está para borrar el punto de llama anterior. Presentado como una lista plana de seis acciones iguales, es el candidato clásico a que un estudiante lo elimine «para simplificar» — y entonces la llama deja rastro y la vela se ensancha. Los rótulos de fotograma lo protegen.
Costo. flama aparece unas diez veces en la ficha. El renombre obliga a tocarla, o el material queda incoherente. Roza además la decisión editorial abierta flama/llama: lo que se propone es cambiar la categoría gramatical (predicado en vez de sustantivo), no elegir entre las dos palabras — llamaEncendida funciona igual de bien.
15 · papas-caliente-juego

La Papa Explosiva Digital

El único comentario del programa está en el lugar equivocado. El texto «Temporizador con tiempo inicial aleatorio, valor entre 5 y 15» está enganchado al mientras, pero describe la línea de arriba. Resultado: el mientras —la construcción que esta actividad estrena— queda sin explicación, y la línea que sí es aleatoria queda sin anotar.

Propuesta
cuando el botón táctil es tocado:
  si listo:
    establecer listo a falso
        // cierra la puerta: mientras dure la ronda, tocar no hace nada
    establecer tiempoRestante a (entero aleatorio de 5 a 15)
        // Temporizador con tiempo inicial aleatorio, valor entre 5 y 15.
    reproducir sonido de suspenso (de fondo)
    repetir mientras (tiempoRestante > 0):
        // nadie sabe cuántas vueltas dará: sigue MIENTRAS quede tiempo
      añadir -1 a tiempoRestante
        // este bloque es el que hace que la condición llegue a ser falsa
      esperar 1 segundo
    ...
Por qué mejora. tiempo > 0 se puede leer de dos maneras opuestas —«el tiempo que llevo jugando» o «el tiempo que me queda»— y solo la segunda explica por qué hace falta un mientras. Con tiempoRestante > 0 la condición es la explicación. Y el contraste con repetir N veces, que es lo que esta actividad tiene que enseñar, queda anotado en las dos líneas donde el ojo se detiene: arriba «el número se sortea», abajo «por eso el ciclo pregunta en vez de contar».
pausado = verdadero significa «no hay nadie jugando», así que cada lectura de si pausado obliga a dar vuelta la frase mentalmente; y en al iniciar se «pausa» algo que nunca empezó. Con listo: «si está listo → ciérralo → juega → vuelve a dejarlo listo».
Costo. tiempo aparece 7 veces en la ficha y hay que tocarlas. pausado no aparece nunca: ese renombre es gratis.

Un bloque menos, un bloque con nombre · 2 actividades

14 · luz-encendida-ruido-animacion

El Encendido Cinematográfico

Los nombres de los dos contadores están intercambiados respecto a lo que recorren. La variable llamada filas se enchufa en la x (que es la columna) y la llamada columnas en la y. Como el ciclo interior es el que varía más rápido, y el interior mueve la x, la pantalla se llena renglón por renglón de arriba hacia abajo — pero el código, leído en voz alta, dice lo contrario: «para cada columna, para cada fila».

En la única lección cuyo objetivo declarado es qué recorre el ciclo de fuera y qué el de dentro, los nombres responden esa pregunta al revés.

Propuesta
si estado:
    // barrido de encendido: fila por fila, de arriba hacia abajo
    contar con fila desde 1 hasta 7:
        contar con columna desde 1 hasta 7:
            encender píxel   x = columna   y = fila
            esperar 10 ms
    encender píxel x = 1 y = 1          ← se elimina: no hace nada
sino:
    // el mismo barrido, pero apagando
    ...
El cableado no se toca. La variable de fuera sigue alimentando la y y la de dentro la x, exactamente como hoy: cambia el nombre, no la conexión. Arreglar los nombres es gratis; cambiar los ciclos para que el código haga lo que los nombres dicen cambiaría la animación, y eso está prohibido.
Por qué mejora. Hoy quien confía en el código predice franjas verticales, ve renglones horizontales, y no tiene manera de saber quién miente: se rompe el único ciclo de aprendizaje que sirve aquí —leer, predecir, mirar, confirmar—. Además x = columna, y = fila es la convención de siempre; aprenderla bien aquí no cuesta nada, y aprenderla al revés se paga en cada actividad con cuadrícula.
El píxel suelto tras el barrido no hace nada: vuelve a encender el primer píxel del barrido, encendido 25 (o 49) pausas antes y nunca apagado. Quitarlo deja las dos ramas idénticas salvo por la acción, y se ve la simetría en la que se apoya el concepto: es el mismo barrido al revés. Existe hoy en las dos plataformas, así que quitarlo de ambas mantiene el PDG simétrico.
16 · metronomo-con-inclinacion

El Metrónomo de DJ

La idea central del programa es lo único que no tiene nombre. El patrón que la ficha explica en prosa —«constantemente calculamos el tiempo que ha pasado»— existe en el código solo como una resta escondida dentro de una comparación. Todo lo demás (bpm, intervalo) sí está en una variable.

Propuesta
repetir para siempre:                     // Sin 'esperar': el ciclo mira el reloj miles de
                                          // veces por segundo y casi siempre no hace nada.
  establecer bpm a (inclinación en x + ajuste)
  establecer intervaloPulso a (60000 ÷ bpm) // 1 min = 60000 ms; cada pulso dura 60000 ÷ bpm
  establecer tiempoTranscurrido a (milisegundos − ultimoPulso)
  si (tiempoTranscurrido > intervaloPulso):
    sonar el pulso
    establecer ultimoPulso a milisegundos  // reinicia el cronómetro; sin esta línea
                                           // sonaría sin parar para siempre
Por qué mejora. Un patrón sin nombre no se puede recordar ni transferir, y el objetivo declarado es que el estudiante se lleve «¿ha pasado suficiente tiempo?». tiempoTranscurrido > intervaloPulso compara dos duraciones con nombre, en las mismas unidades, sin cálculo intermedio — y evita el error clásico de leer la comparación como si fuera entre instantes. El reloj no desaparece: aparece dos veces y ambas en una asignación, que es donde se lee con calma.
Punto crítico. La línea establecer ultimoPulso a milisegundos conserva su propia lectura del reloj. Colapsarla en una sola lectura al comienzo del ciclo —que ahorraría un bloque y se parece más al texto de la ficha— alteraría el tempo, porque en micro:bit el sonido bloquea y esa segunda lectura ocurre después. Se mantienen dos lecturas, en las mismas posiciones.
El único comentario del código está gastado en la línea menos importante y además es inexacto: habla de «tono» y «frecuencia» sobre un golpe de batería sin altura. Mientras tanto la fórmula, la comparación con el reloj y la actualización de ultimoPulso —que la ficha llama «el paso más importante»— no llevan ninguno.
Terminar de unificar los nombres. El .hex de micro:bit sigue diciendo ultimoBeat/intervaloBeat (spanglish), mientras Protobject ya usa ultimoPulso/intervaloPulso. La decisión ya estaba tomada; nunca llegó al firmware.

Reestructuración · 2 actividades

Los dos únicos casos donde la forma del programa pelea contra la idea que quiere enseñar.

12 · nivel-con-ruido

¡No Derrames el Líquido! — El Juego de Pulso

Dos ciclos para siempre corriendo a la vez. El programa se lee de arriba abajo y no se ejecuta de arriba abajo: los dos ciclos corren simultáneamente y se comunican por variables compartidas. Eso es concurrencia — un concepto que la progresión no ha enseñado, que la actividad no menciona, y que aquí no aporta nada. Nadie puede saber, leyendo el código, por qué son dos y no uno.

De regalo trae una carrera invisible: la condición se evalúa con una muestra del sensor y el punto puede dibujarse con otra posterior, así que en el instante justo se puede pintar un punto rojo dentro de la zona verde.

Propuesta
para siempre:

    # 1) medir: llevar la inclinación a una posición de LED
    xDesplazado ← leer inclinación x + DESPL
    ledX        ← redondear( (xDesplazado × NLEDS) ÷ RANGO )
    yDesplazado ← leer inclinación y + DESPL
    ledY        ← redondear( (yDesplazado × NLEDS) ÷ RANGO )

    # 2) decidir: ¿está centrado en cada eje?
    centradoX ← (ledX ≥ MIN) y (ledX ≤ MAX)
    centradoY ← (ledY ≥ MIN) y (ledY ≤ MAX)

    # 3) mostrar y avisar
    borrar la pantalla
    si (centradoX y centradoY):
        dibujar punto en (ledX, ledY)   [verde]
        si debeSonar:
            emitir sonido grave
            esperar 100 ms
            debeSonar ← falso
    si no:
        dibujar punto en (ledX, ledY)   [rojo]
        detener sonido
        esperar 100 ms
        emitir sonido agudo
        debeSonar ← verdadero
Por qué mejora. El programa vuelve a leerse en el orden en que ocurre —mido → decido → muestro— y el si pasa a ser el titular en vez de la letra chica. Hoy la condición es un monolito de tres y anidados con cuatro comparaciones dentro de la ranura; con si (centradoX y centradoY) se lee palabra por palabra la frase que la propia ficha enseña. La lección del operador y no se diluye: se reparte en tres líneas legibles en vez de una ilegible. Y la tabla de verdad se puede probar apuntando con el dedo — «mantengo el equilibrio izquierda-derecha pero me inclino adelante»: centradoX verdadero, centradoY falso.
Los nombres mienten. Después de la fórmula, inclinacionX ya no contiene una inclinación: contiene un número de LED. Por eso inclinacionX ≥ 3 se lee mal — parece hablar de grados y habla de columnas. Y sonidoFijo es el nombre menos útil de la idea más difícil: lo que significa es «todavía me falta tocar el pitido de acierto». Con debeSonar, el mecanismo de disparo único se explica solo: «si debe sonar, suena y ya no debe».
Lo que sí cambia. Fundir los ciclos hace que la condición y el punto usen siempre la misma muestra: desaparece la carrera. Es una corrección, no una regresión, pero es un cambio de comportamiento y por eso se declara en vez de esconderse.
Costo honesto. Pasa de 3 a 7 variables. Si parecen demasiadas, el orden para recortar es: primero xDesplazado/yDesplazado, después centradoX/centradoY. Fundir los ciclos y los dos renombres no cuestan ninguna variable y son lo que más rinde.
17 · gritometro-tiempo-gritos

La Batalla de Gritos

Hay un «salir del ciclo» disfrazado. Los dos ciclos contados prometen «recorre toda la pantalla», pero el programa nunca quiere recorrer toda la pantalla: quiere encender una casilla más mientras el grito siga. Como un ciclo contado no se puede interrumpir, la salida se simula con un si interior que deja el cuerpo vacío — y cuando el grito para, los ciclos siguen girando sin hacer nada. Control de flujo invisible: lo peor que se le puede pedir a alguien que recién aprende a leer bloques.

Encima, la misma condición está escrita dos veces (en el mientras y en el si interior, con el mismo número mágico duplicado), hay seis niveles de anidamiento, y la estructura no refleja la idea: «medir cuánto dura un grito» es repetir mientras dure una condición. El doble ciclo contado es un modismo de dibujar, no de medir.

Propuesta
repetir para siempre:
    si partidaEnCurso:

        // el gritómetro parte en la primera casilla
        fijar columna a ⟨primera⟩
        fijar fila    a ⟨primera⟩

        // mientras el grito siga, una casilla más cada medio segundo
        repetir mientras (nivel de sonido ≥ 5):
            encender el píxel (x = columna, y = fila)
            reproducir clip de avance
            esperar 500 ms

            // avanzar a la casilla siguiente
            añadir 1 a columna
            si columna > ⟨última⟩:
                fijar columna a ⟨primera⟩
                añadir 1 a fila
            si fila > ⟨última⟩:
                fijar fila a ⟨primera⟩

        // el grito terminó: resultado y reinicio
        reproducir clip final
        esperar 5 s
        detener el sonido
        borrar la pantalla
        partidaEnCurso ← falso
Por qué mejora. repetir mientras (nivel de sonido ≥ 5) se lee literalmente como el juego: mientras grites, sigue. Desaparece el ciclo que gira en vacío: cada vuelta es una casilla, verificable a ojo. Queda una sola copia del umbral, así que la pregunta «¿qué valor cambiarías?» tiene una sola respuesta. Y fila/columna se vuelven visibles como lo que son —la posición del gritómetro, memoria del juego— en vez de esconderse como índices de iteración. El avance con retorno de línea es además un patrón nombrable y transferible: sumo 1 a la columna; si me pasé del borde, vuelvo al principio y bajo una fila, que es el gesto de escribir en un cuaderno.
Costo honesto. La propuesta tiene más bloques (unos 12 contra 7 dentro del juego), pero dos niveles menos de anidamiento y cero control de flujo invisible. Es el intercambio correcto: cada bloque nuevo dice en voz alta algo que antes ocurría a escondidas.
La única diferencia detectable no es observable: hoy, cuando el grito para a mitad de pantalla, quedan iteraciones vacías antes de salir (microsegundos, sin dibujo ni sonido); en la propuesta se sale de inmediato. La propuesta conserva el retorno a la primera casilla cuando la pantalla se llena, solo para reproducir fielmente lo que hoy ocurre.
Esta reescritura además elimina el ciclo contado y no introduce nada nuevo: todo lo que usa ya se practicó antes. Es coherente con el objetivo declarado de la actividad, que es una máquina de estados, no un recorrido de matrices.

§4 Un criterio que hubo que decidir

Dos revisiones llegaron a conclusiones opuestas sobre el mismo tipo de bloque, y eso obligó a fijar una regla.

Los bloques que no hacen nada no van en el código

En la actividad 13 se propuso agregar apagar la pantalla en al iniciar, con el argumento de que el estado inicial quedaba declarado del todo — y justificando que era «puramente de forma» precisamente porque no tiene efecto: la pantalla ya arranca apagada.

En la actividad 14, en la misma revisión, se propuso quitar un encender píxel (1,1) muerto, con el argumento de que «una instrucción que no hace nada es lo peor que se puede dejar delante de alguien que está aprendiendo a predecir qué hace cada bloque».

No pueden valer las dos. El criterio adoptado es el segundo: un bloque inerte enseña que los bloques se ponen para contar algo, no para hacer algo — y eso es exactamente lo contrario de lo que hay que construir. El estado inicial se documenta en un comentario. La propuesta de la 13 queda descartada; la de la 14 se mantiene.

§5 Comentarios que no dicen la verdad

Apareció en siete actividades sin buscarlo, y siempre del mismo modo: el comentario no está donde está el aprendizaje. Un comentario que habla de otra línea enseña que los comentarios no hay que leerlos.

ActividadQué pasa
03 · xilófono LEDsDice «utilizando ejes x e y» cuando solo se calcula un eje. Arrastra un error de tipeo: «a una aceptable e una posición».
09 · desafío del robotLlama toques a la variable, que se llama energia. En las dos plataformas, y en la actividad donde se introduce el concepto de variable.
10 · corazón del robotSe autocontradice: «la velocidad aumentará» porque «los tiempos son más largos». Y el mismo texto encabeza los dos manejadores, que hacen cosas opuestas.
13 · interruptorCuatro erratas en el comentario de la negación, idénticas en ambas plataformas: «transoforma», «varibale», «faslo», «vardadero».
14 · encendidoLos comentarios sostienen la lectura equivocada de los ciclos. En micro:bit están duplicados literalmente en la rama sino, donde además afirman algo falso.
15 · papa explosivaEl único comentario describe la línea de arriba, no aquella a la que está pegado. La construcción que la actividad estrena queda sin explicar.
16 · metrónomoHabla de «tono» y «frecuencia» sobre un golpe de batería sin altura, y es el único comentario del programa.
Estas correcciones viven dentro de los bloques, así que hay que hacerlas a mano en Protobject y en MakeCode: no se pueden aplicar editando archivos del repositorio.

§6 Texto ↔ código

Desajustes entre lo que la ficha afirma y lo que el programa hace. No son parte de la refactorización — se listan porque salieron de ella.

ActividadDesajuste
02 · xilófonoLa ficha dice «¡usaremos el eje Y!» y luego pregunta «¿qué pasaría si leyera el eje X?» — una pregunta que el código de micro:bit ya tiene respondida, porque ahí lee x.
08 · murciélagoLa ficha habla del «vuelo» de un murciélago; los fotogramas son un destello que estalla (el propio comentario del código dice «una animación de una luz»). El fotograma C de micro:bit es además la misma imagen que la actividad 7 usa para el sol.
09 · desafío del robotEl texto dice «cargarla hasta 7», cierto solo en Protobject: en micro:bit se gana con 5 toques.
13 · interruptorLa ficha describe una inicialización que el código no hace («colorea con negro el dibujo LED»). Ojo: el bloque que describe sería además el equivocado — un relleno negro se mapea a DrawImage, no a ClearDisplay.
14 · encendidoLa ficha explica el barrido al revés, y la pregunta de reflexión —«¿qué cambiarías para que fuera de arriba hacia abajo?»— pide lo que el programa ya hace. Con los nombres corregidos, vuelve a ser contestable.
16 · metrónomoTres nombres distintos para la misma variable: ultimoPulso en la ficha, ultimoTiempo en la guía docente, ultimoLatido en la planificación — y ultimoBeat en el firmware.

Referencias cruzadas entre actividades

Cuatro fichas nombran explícitamente a otra actividad, lo que va contra la regla del proyecto de que la progresión está en el orden y no en las remisiones textuales:

§7 Lo que la métrica no puede ver

Diferencias entre las dos versiones que conviven con la equivalencia formal: el grafo las da por iguales, y sin embargo se ven o se oyen. No es un defecto de la pipeline — es la consecuencia de reglas que se eligieron a propósito (el color se ignora, las constantes no cuentan, DrawImage es agnóstico a qué imagen dibuja). Lo que muestran es que la dimensión algorítmica y la sensorial son separadas: el PDG certifica la primera, y la segunda necesita un ojo que mire el comportamiento.

ActividadDivergencia
01 · corazónPausa de 10 ms (micro:bit) contra 100 ms — y en MakeCode mostrar LEDs tiene su propio intervalo interno (~400 ms), así que esa pausa casi no influye y la animación va unas cuatro veces más lenta. Rompe la pregunta de reflexión «¿qué pasa si cambias las pausas?». Además el orden de los fotogramas está invertido: Protobject encoge de forma monótona, micro:bit salta.
05 · robot cosquillosoEn Protobject la cara de al iniciar es la misma que la del final, así que el robot «vuelve a la normalidad» como promete la ficha. En micro:bit son distintas: el estado de reposo cambia después del primer aplauso. Consecuencia visible: en Protobject la cara no se mueve durante los primeros 400 ms mientras el sonido ya arrancó.
08 · murciélagoEl 4.º fotograma es idéntico al 2.º en Protobject (pulso que crece y vuelve) y una forma nueva en micro:bit. El ciclo dura 400 ms contra 800 ms: el doble.
09 · desafío del robotCon energía 0, micro:bit calcula una fila fuera de la matriz: la barra tiene 4 niveles visibles contra los 7 de Protobject.
16 · metrónomoEn micro:bit el pulso se reproduce «hasta que termine»: bloquea el ciclo y el periodo real queda en intervalo + duración de la nota. Es decir, la versión micro:bit no respeta la fórmula — exactamente lo contrario de lo que la actividad enseña.
17 · batalla de gritosEl clip por píxel bloquea en MakeCode y no en Protobject, así que el gritómetro avanza a distinta velocidad. Y 25 LEDs contra 49: llenar la pantalla exige ~12,5 s contra ~24,5 s. La dificultad del juego no es la misma.
Dos notas de la ontología quedaron obsoletas y conviene corregirlas: ClearDisplay afirma que en despertador y flama la rama de apagado diverge («MakeCode usa mostrar LEDs en vez de borrar») — verificado contra la extracción vigente: en ambas la rama de apagado usa borrar la pantalla. Y OnTiltGestureEvent cita como «verificado verbatim» un Gesture.ScreenUp que ya no aparece: hoy el par es LogoUp/LogoDown.

§8 El techo del lenguaje común

Siete de las diecisiete revisiones, sin coordinarse, llegaron por su cuenta a la misma conclusión: la mejora correcta sería un procedimiento con nombre, y no existe.

En la 10 serviría para escribir el ritmo de partida una sola vez en vez de tres. En la 11, para nombrar «dibujar el fotograma con la llama en la columna X». En la 12 y la 14, para no duplicar la fórmula de escalado y el barrido. En la 15, para bajar tres niveles de sangría. En la 16, para ponerle nombre a «¿ya es hora de sonar?» — que es literalmente el patrón que la actividad enseña. En la 17, para separar el avance de la casilla del control del grito.

Pero no hay ningún nodo de definición ni de llamada a función en la ontología canónica, ni de listas. Y esto no es una restricción de la progresión —no es que lleguen más adelante—: no llegan nunca. Es el techo del vocabulario compartido por las dos plataformas.

Tiene una consecuencia didáctica que vale la pena decir en voz alta y no esconder: en varias actividades la duplicación es inevitable, y conviene tratarla como lo que es. «Esto se repite porque todavía no sabemos darle un nombre a un trozo de programa» es una frase honesta, y prepara el terreno para cuando ese nombre exista.

§9 Qué queda decidido y qué no

Este documento no modificó ningún archivo. Las propuestas de §3 son aplicables tal cual y conservan la equivalencia; lo de §6 y §7 son decisiones de diseño que no corresponde tomar aquí.

Aplicable directoLas 10 propuestas de §3, siempre que se apliquen en las dos plataformas a la vez. Aplicar un renombre o un reorden en un solo lado sí rompería la equivalencia.
Cuesta tocar las fichasLos renombres de la 11 (flama, ~10 apariciones), la 15 (tiempo, 7) y la 12 (inclinacionX/Y). El resto de renombres no aparece en el texto.
Solo a mano en el editorTodo lo de §5: los comentarios viven dentro de los bloques.
Decisión pendienteLas divergencias de §7 — sobre todo el pulso bloqueante del metrónomo, que contradice lo que la actividad enseña, y las dos caras de reposo distintas del robot cosquilloso.