MakeCode Blocks · Guía para Principiantes

Programa de Prueba de
Speed & Endurance

Aprende cómo este programa MakeCode prueba la potencia del motor de tu robot y registra cómo la velocidad cambia a lo largo de un partido simulado.

Abrir en MakeCode

¿Qué hace este programa?

Este programa ejecuta una prueba de conducción corta para medir qué tan rápido se mueve tu robot según dos estadísticas que eliges: SPEED y ENDURANCE. También simula cómo cambia la potencia del motor a medida que avanza un partido — para que puedas sentir cómo es conducir al inicio vs. al final de un juego.

Mientras conduce, vigila constantemente los sensores de la pista y reacciona si tu robot llega al borde. Piénsalo como un bucle de prueba más inteligente: no solo "ve rápido," sino "ve rápido como lo haría un robot en un partido real."

⚠️
Antes de ejecutar: Encuentra las líneas SPEED = 0 y ENDURANCE = 0 en el bloque on start y cónfiguralas con los valores reales de las estadísticas de tu personaje. Si las dejas en cero, el robot no se moverá.

Tres botones. Eso es todo.

Todo el programa se controla con los botones del micro:bit. Esto es lo que hace cada uno:

A

Ejecutar la Prueba

Calcula la potencia a partir de tus estadísticas, luego conduce recto durante la duración de la prueba. Observa la ralentización según la configuración de tiempo del partido.

B

Configurar Tiempo del Partido

Cicla entre 0 → 60 → 120 → 180 segundos. Configura esto antes de presionar A para simular cuán cansado está el robot en ese punto.

A+B

Parada de Emergencia

Corta todos los motores de inmediato. Úsalo si tu robot se dirige a un lugar donde no debería. Muestra una ✕ en la pantalla LED.

¿Cómo funciona cada sección?

on start — Configuración de Variables
Cargando bloques desde MakeCode…
let TEST_DURATION_MS = 5000
let BORDER_CHECK_MS = 60
let BORDER_PIVOT_MS = 400
let BORDER_PIVOT_POWER = 50
let BACKUP_MS = 600
let BORDER_THRESHOLD = 200
let SPEED = 0
let ENDURANCE = 0
          

Este bloque se ejecuta una vez en el momento en que el micro:bit se enciende. Llena todas las configuraciones que necesita tu programa antes de que se presione cualquier botón. Piénsalo como escribir valores en una hoja de configuración.

1
TEST_DURATION_MS = 5000 — Cada ejecución de prueba dura 5.000 milisegundos (5 segundos). Puedes cambiar este número para hacer las pruebas más largas o cortas.
2
BORDER_CHECK_MS = 60 — Mientras conduce, el robot verifica sus sensores cada 60ms. Cuanto menor sea este número, más rápido reacciona al borde.
3
SPEED = 0 y ENDURANCE = 0 — Estos son para que tú los llenes. Reemplaza los ceros con los valores de estadísticas de tu personaje antes de subir al micro:bit.
on button A pressed — Ejecutar la Prueba
Cargando bloques desde MakeCode…
let running = false
let testStart = 0
let BORDER_CHECK_MS = 0
let borderSide = 0
function computeStats() {}
function checkBorder() { return 0 }
function handleBorder() {}
input.onButtonPressed(Button.A, function () {
    computeStats()
    running = true
    testStart = input.runningTime()
    basic.pause(BORDER_CHECK_MS)
    while (running) {
        borderSide = checkBorder()
        if (borderSide > 0) {
            handleBorder()
        }
        basic.pause(BORDER_CHECK_MS)
    }
    running = false
    basic.showString("DONE")
    basic.pause(500)
    basic.clearScreen()
})
          

Presionar A ejecuta la secuencia completa de prueba. Los pasos ocurren en orden, de arriba hacia abajo:

1
llamar a computeStats — calcula la potencia del motor del robot según SPEED, ENDURANCE y el tiempo simulado actual del partido. Se ejecuta antes de que los motores se enciendan.
2
running = true y registra el tiempo de inicio — esto "enciende" el bucle de abajo e inicia el reloj.
3
Ambas ruedas se configuran a currentPower — potencia igual izquierda y derecha significa que el robot conduce recto sin girar.
4
bucle while — sigue ejecutándose hasta que se acabe el tiempo. Cada 60ms verifica: ¿algún sensor tocó el borde? Si es sí, llama a handleBorder para recuperarse, luego retoma la conducción.
5
Cuando el tiempo expire: detiene todas las ruedas, muestra "DONE" en pantalla, luego la borra.
on button B pressed — Configurar Tiempo del Partido
Cargando bloques desde MakeCode…
let simulatedMatchTime = 0
input.onButtonPressed(Button.B, function () {
    if (simulatedMatchTime == 0) {
        simulatedMatchTime = 60
        basic.showLeds(`
            # . . . .
            # . . . .
            # . . . .
            # . . . .
            # . . . .
            `)
    } else if (simulatedMatchTime == 60) {
        simulatedMatchTime = 120
        basic.showLeds(`
            # # . . .
            # # . . .
            # # . . .
            # # . . .
            # # . . .
            `)
    } else if (simulatedMatchTime == 120) {
        simulatedMatchTime = 180
        basic.showLeds(`
            # # # . .
            # # # . .
            # # # . .
            # # # . .
            # # # . .
            `)
    } else {
        simulatedMatchTime = 0
        basic.showLeds(`
            . . . . .
            . . . . .
            . . # . .
            . . . . .
            . . . . .
            `)
    }
    basic.pause(500)
    basic.clearScreen()
})
          

Cada pulsación de B cicla simulatedMatchTime entre cuatro valores: 0 → 60 → 120 → 180 → 0. La pantalla LED te muestra exactamente dónde estás en el ciclo para que siempre sepas tu configuración.

0s · inicio
60s · 1 min
120s · 2 min
180s · final
✅
Usa el Botón B antes del Botón A. Configura primero el tiempo del partido, luego presiona A para ejecutar la prueba en ese punto. Compara 0s vs. 180s para sentir la diferencia que hace ENDURANCE.
on button A+B pressed — Parada de Emergencia
Cargando bloques desde MakeCode…
let running = false
input.onButtonPressed(Button.AB, function () {
    running = false
    basic.showLeds(`
        # . . . #
        . # . # .
        . . # . .
        . # . # .
        # . . . #
        `)
    basic.pause(500)
    basic.clearScreen()
})
          

Mantén A y B al mismo tiempo. El programa corta la potencia y sale del bucle de inmediato — sin ralentización gradual. Suceden tres cosas:

1
running = false — esto sale del bucle while de conducción en la próxima verificación (dentro de 60ms).
2
Ambos motores se detienen de inmediato — sin reducción gradual, corte instantáneo a cero potencia.
3
La pantalla LED muestra un patrón ✕ para que sepas que la parada fue confirmada.
function computeStats — Calcular la Potencia
Cargando bloques desde MakeCode…
let SPEED = 0
let ENDURANCE = 0
let simulatedMatchTime = 0
let basePower = 0
let DECAY_RATE = 0
let endurancePercent = 0
let enduranceFactor = 0
let currentPower = 0
function computeStats () {
    basePower = SPEED * 100 / 20
    DECAY_RATE = 20 - ENDURANCE
    endurancePercent = 100 - DECAY_RATE * simulatedMatchTime / 40
    endurancePercent = Math.max(endurancePercent, 20)
    enduranceFactor = endurancePercent / 100
    currentPower = Math.round(basePower * enduranceFactor)
    currentPower = Math.max(currentPower, Math.max(Math.round(basePower * 0.2), 10))
}
          

Esta función se llama cada vez que presionas A. Ejecuta los cálculos para determinar qué potencia del motor usar ahora, según tus estadísticas y dónde estás en el partido.

basePower = SPEED × 100 ÷ 20 ← convierte tu estadística en un % del motor
DECAY_RATE = 20 − ENDURANCE ← menor endurance = decaimiento más rápido
endurancePercent = 100 − (DECAY_RATE × matchTime ÷ 40) ← disminuye con el tiempo
currentPower = basePower × enduranceFactor ← número final enviado a los motores
🧮
En palabras simples: SPEED establece qué tan fuertes arrancan los motores. ENDURANCE controla qué tan lentamente se desvanece esa fuerza. Endurance alto = la potencia se mantiene alta durante todo el partido. Endurance bajo = ralentización notoria al final. El robot nunca puede bajar del 20% de potencia — ese es un piso de seguridad incorporado en la matemática.
function checkBorder — Leer los Sensores
Cargando bloques desde MakeCode…
let sensor1State = 0
let sensor2State = 0
let sensor3State = 0
let sensor4State = 0
let BORDER_THRESHOLD = 0
function checkBorder () {
    if (sensor1State > BORDER_THRESHOLD) {
        return 1
    } else if (sensor4State > BORDER_THRESHOLD) {
        return 2
    } else if (sensor2State > BORDER_THRESHOLD || sensor3State > BORDER_THRESHOLD) {
        return 3
    }
    return 0
}
          

Tu Cutebot Pro tiene cuatro sensores de seguimiento de línea en su parte inferior. Esta función lee los cuatro y devuelve un número que le dice al bucle principal de qué dirección viene el problema. El borde blanco refleja más luz — eso es lo que el sensor "ve".

↑ Frente del robot
S1left
S2mid
S3mid
S4right
CUERPO DEL ROBOT
↓ Parte trasera del robot
S1 activa → devuelve 1 (peligro izquierda)
S4 activa → devuelve 2 (peligro derecha)
S2 o S3 → devuelve 3 (directo)
Todo despejado → devuelve 0
function handleBorder — Recuperarse del Borde
Cargando bloques desde MakeCode…
let BACKUP_MS = 0
let BORDER_PIVOT_MS = 0
let borderSide = 0
let recheck = 0
function checkBorder() { return 0 }
function handleBorder () {
    basic.pause(50)
    basic.pause(BACKUP_MS)
    basic.pause(100)
    if (borderSide == 1) {
        basic.pause(BORDER_PIVOT_MS + Math.randomRange(-80, 80))
    } else if (borderSide == 2) {
        basic.pause(BORDER_PIVOT_MS + Math.randomRange(-80, 80))
    } else {
        basic.pause(BACKUP_MS + 300)
        basic.pause(100)
        basic.pause(BORDER_PIVOT_MS * 2)
    }
    basic.pause(100)
    recheck = checkBorder()
    if (recheck > 0) {
        basic.pause(BACKUP_MS)
        basic.pause(100)
        basic.pause(BORDER_PIVOT_MS)
        basic.pause(100)
    }
}
          

Cuando un sensor detecta el borde, esta función toma el control para dirigir el robot de regreso al ring. El movimiento exacto depende de cuál sensor se activó.

1
Detener y retroceder — todos los motores se cortan, luego retroceden durante BACKUP_MS (600ms) para crear espacio para un giro.
2
Girar según borderSide:
1 (peligro izquierda) → girar a la derecha — una rueda adelante, una atrás
2 (peligro derecha) → girar a la izquierda
3 (directo) → retroceder extra, luego hacer un giro más amplio
3
Reverificar — llama a checkBorder de nuevo. Si aún está en blanco, hace un retroceso y giro más antes de retomar la conducción normal.
🎲
¿Por qué el rango aleatorio? Math.randomRange(-80, 80) agrega una pequeña variación aleatoria a cada tiempo de giro. Esto evita que el robot quede atrapado en el mismo bucle exacto si toca el mismo lugar dos veces.

¿Qué significa cada variable?

Dorado = tú lo configuras antes de subir. Cian = el programa lo calcula automáticamente. Púrpura = una constante fija que controla el comportamiento.

SPEED Tú configuras
Estadística de velocidad de tu personajeEstablece la potencia base del motor. SPEED mayor = base más rápida. Se usa para calcular basePower.
ENDURANCE Tú configuras
Estadística de resistencia de tu personajeControla qué tan lentamente se desvanece la velocidad a lo largo de un partido. Mayor = curva más plana. Menor = caída notoria al final.
TEST_DURATION_MS Constante
Cuánto dura cada ejecución de prueba (milisegundos)Predeterminado 5000 (5 segundos). Auéntalo si quieres más tiempo para observar las reacciones al borde.
simulatedMatchTime Auto
Tiempo "simulado en el partido" para pruebasSe configura con el Botón B. 0 = inicio del partido, 180 = cerca del final. No es un reloj real en funcionamiento.
currentPower Auto
Potencia real del motor enviada a las ruedas (0–100)Calculado nuevamente cada vez que presionas A. Este es el número que va directamente a ambos motores.
basePower Auto
Potencia bruta antes de aplicar el decaimiento de enduranceDerivado de SPEED. Representa a qué velocidad correría el robot con endurance perfecto.
endurancePercent Auto
Cuánto de la potencia base queda en este puntoVa de 100% (potencia plena) hasta un mínimo de 20%. Cae más rápido con ENDURANCE bajo.
BORDER_THRESHOLD Constante
Umbral de brillo para detección del bordeConfigurado en 200. Las lecturas del sensor por encima de este valor se tratan como "borde blanco detectado".
BORDER_PIVOT_POWER Constante
Potencia del motor durante los giros de recuperación del bordeConfigurado en 50 (50%). Menor = giros más suaves. Mayor = giros más cerrados.
BACKUP_MS Constante
Cuánto tiempo el robot retrocede al tocar el bordePredeterminado 600ms — espacio suficiente para girar sin volver a caerse de inmediato.

Viendo el decaimiento de velocidad en acción

Así se ve currentPower para un robot con SPEED = 10, ENDURANCE = 5 en diferentes momentos del partido. ENDURANCE bajo = caída pronunciada. ENDURANCE alto = línea plana.

Potencia del motor en cada punto del partido · SPEED 10 · ENDURANCE 5

0s · inicio
50%
60s · 1 min
38%
120s · 2 min
25%
180s · final
20%

Este robot llega al piso del 20% de potencia antes de que termine el partido. Invierte más en ENDURANCE para aplanar esta curva.

🎯
Verificación estratégica: Compara 0s vs. 180s para observar el decaimiento. Anota lo que ves — pero reserva tu juicio. Si más ENDURANCE realmente cambia tu puntaje del partido es una pregunta que la Temporada 1 está diseñada para responder.

Consejos para usar este programa

01

Configura tus estadísticas primero

Encuentra las líneas SPEED = 0 y ENDURANCE = 0 en on start. Escribe los valores reales de tu personaje antes de subir al micro:bit.

02

Prueba los 4 momentos de tiempo

Ejecuta a 0s, 60s, 120s y 180s. Observa si el robot se siente diferente. Si no, tu ENDURANCE es fuerte. Si arrastra a 180s, es bajo.

03

Ajusta TEST_DURATION_MS

5 segundos es rápido. Prueba 10000 (10s) para ver más reacciones al borde — especialmente útil si quieres observar la lógica de recuperación trabajar varias veces.

04

Ten A+B a mano

Si el robot empieza a dirigirse a un lugar malo, presiona A+B de inmediato. Siempre es seguro hacer una parada de emergencia y volver a empezar desde el inicio.

05

Compara diferentes configuraciones

Prueba SPEED alto / ENDURANCE bajo vs. SPEED bajo / ENDURANCE alto. Ejecuta ambos a 180s. Los resultados podrían sorprenderte.

06

Lee la pantalla LED

Una columna de LEDs = 60s. Dos columnas = 120s. Tres = 180s. Úsalo como una verificación visual rápida antes de presionar A para siempre saber tu configuración actual.