← Resources Skills Arena · How to Run It

Facilitator guide · Velocity Arena

How to Run Skills Arena

Everything students need to get their bot driving on the mat: load the code, enter their stats, calibrate the drive, and run Challenge 1. Watch the video first, then follow the steps.

Watch Video walkthrough — do this first

If the video doesn't load here, open it directly: Open the walkthrough video →

Part 1 Set up MakeCode — once per team, per project

  1. Set up the field Velocity Arena mat on a flat, hard surface. You need the Cutebot Pro, a micro:bit, the squeaky ball, and the rubber ball.
  2. Open MakeCode, make a new project Go to makecode.microbit.org → New Project → name it SkillsArena.
  3. Add the Cutebot Pro extension Click Extensions in the toolbox (or gear ⚙ → Extensions), search cutebot, click the Cutebot Pro card. Only needed once per project — the code will not work without it.
  4. Switch to JavaScript Click the JavaScript slider at the top (next to "Blocks"). This is text mode — the students type code, not blocks.
  5. Delete the default code Click in the editor, press Ctrl+A (Mac: ⌘A), then Delete.
  6. Paste the starter code On the Skills Arena lesson page, click Copy Template, then paste into MakeCode with Ctrl+V (Mac: ⌘V). All four stats will read 0 — that's expected.

Part 2 The two places students edit

  1. Enter team stats — lines 55–58 Find STUDENT ZONE A near the top. Replace each 0:
    let SPEED = ? · let POWER = ? · let ENDURANCE = ? · let TURNING = ?
    Rules: every stat at least 1, POWER ≤ 10, and the four must add to exactly 20.
  2. Find deadStraight() — the Challenge 1 functionScroll down to Challenge 1 — DEAD STRAIGHT (around line 207). The body is empty except a hint. This is where students write their driving code.
  3. Type drive(1) inside itReplace // YOUR CODE HERE with drive(1). This is the calibration run — one square, to check the bot's start-up.
  4. Download to the micro:bitClick Download and follow the prompts to copy the file onto the micro:bit. The LEDs scroll the motor/charge power, then show 1 — ready.
  5. Test it: press APut the bot on the mat at the start square. Press A. It should drive exactly one grid square and stop.
Re-flash after every change. Editing the code does nothing until they press Download again. Changed stats especially — they only take effect after a fresh flash. This is the #1 thing that confuses students.

Part 3 Calibrate, then solve Challenge 1

Important: drive(1) is not the answer to Challenge 1 — it's the calibration step. Challenge 1 starts at (1, 0) and the target is (7, 0), so the real answer is drive(6). Calibrate first, then solve.
  1. Tune the start-up with drive(1)Run it and watch. Stops short of one square → increase startupMs (line 89) by +20. Overshoots → −20. Re-download and re-test until one square is clean. Expect a value around 80–140.
  2. Tune the distance with drive(6)Change the call to drive(6). Short → increase unitMs (line 88) by +20. Overshoots → −20. Expect around 590–620.
  3. Check it holdsTry drive(4) and drive(2). If the tuning is right they land without any further adjustment. Then set it back to drive(6) — Challenge 1 solved.
  4. Move onPress B to step to Challenge 2 and keep going. The same tuned values carry through every challenge.

Buttons What the micro:bit buttons do

ButtonWhat it does
BCycles the challenge number 1 → 2 → 3 … → 10 → 1. The number shows on the LEDs so you know which one is selected.
ARuns the selected challenge. An arrow flashes, the bot moves, then a ✓ appears when it finishes.
A + BEmergency stop — kills the motors instantly, at any time. Teach this before the first run.
Teach A + B first. Before any bot touches the mat, have every student press A + B once so they know how to stop a runaway bot. It works at any moment, mid-run.

If stuck Quick fixes

SymptomFix
Code won't compile / CutebotPro is underlined redThe Cutebot Pro extension isn't added. Gear ⚙ → Extensions → search cutebot → add it.
Bot does nothing when A is pressedThe challenge function is still empty, or they didn't re-download after editing. Check deadStraight() has a drive() call, then Download again.
Changed the stats but nothing changedThey didn't re-flash. Press Download again.
LEDs never show a numberThe flash didn't complete. Re-copy the file to the micro:bit.
Stats rejected / bot behaves oddlyThe four stats must total exactly 20, each at least 1, POWER no higher than 10.

Answer key All 10 challenge solutions — collapsed; open only what you need

Teacher copy — don't project this. These are the reference solutions from skillsCode-SOLUTION.ts. Several challenges have more than one valid route: if a student's code lands the bot correctly, it's right, even if it doesn't match here. Use these to unstick a stuck team, not to grade.
▸Challenge 1 — Dead Straight(1,0) → (7,0), facing east
function deadStraight(): void {
    drive(6)
}
▸Challenge 2 — Right Angle(1,0) → (6,3), facing south
function rightAngle(): void {
    drive(3)      // south: (1,0) → (1,3)
    turnRight()   // south → east
    drive(5)      // east:  (1,3) → (6,3)
}
▸Challenge 3 — Straight Shot(6,2) facing west · ball (4,2) → left goal
function straightShot(): void {
    drive(2)   // west: (6,2) → (4,2), contacting ball
    kick()     // blast west toward left goal
}
▸Challenge 4 — Corner Kick: Left(3,0) facing south · ball (1,2) → left goal
function cornerKickLeft(): void {
    drive(2)     // south: (3,0) → (3,2)
    turnLeft()   // south → west
    drive(2)     // west:  (3,2) → (1,2), contacting ball
    kick()       // blast west into left goal
}
▸Challenge 5 — Corner Kick: Right(4,0) facing south · ball (6,2) → right goal
function cornerKickRight(): void {
    drive(2)      // south: (4,0) → (4,2)
    turnRight()   // south → east
    drive(2)      // east:  (4,2) → (6,2), contacting ball
    kick()        // blast east into right goal
}
▸Challenge 6 — The Lawnmower(0,0) facing south · sweep all 4 rows
function lawnmower(): void {
    drive(4)      // (0,0) → (0,4)   facing south
    turnRight()   // south → east

    drive(8)      // (0,4) → (8,4)   facing east
    turnRight()   // east → north

    drive(1)      // (8,4) → (8,3)   facing north
    turnRight()   // north → west

    drive(8)      // (8,3) → (0,3)   facing west
    turnLeft()    // west → north

    drive(1)      // (0,3) → (0,2)   facing north
    turnLeft()    // north → east

    drive(8)      // (0,2) → (8,2)   facing east
    turnRight()   // east → north

    drive(1)      // (8,2) → (8,1)   facing north
    turnRight()   // north → west

    drive(8)      // (8,1) → (0,1)   facing west
    // 8 segments, 7 turns, all 4 rows covered
}
▸Challenge 7 — Two-Ball Combo(4,0) · ball A (2,2)→left, ball B (6,2)→right
// One valid route (Path A — Ball A first).
// Kicking Ball B first is equally correct.
function twoBallCombo(): void {
    drive(2)       // south: (4,0) → (4,2)
    turnLeft()     // south → west
    drive(2)       // west: (4,2) → (2,2), contacts Ball A
    kick()         // Ball A fires west → left goal

    turnRight()    // west → south
    turnRight()    // south → east
    drive(4)       // east: (2,2) → (6,2), contacts Ball B
    kick()         // Ball B fires east → right goal
}
▸Challenge 8 — Power Control Lab(3,2) facing west · ball (2,2)
function powerControlLab(): void {
    drive(1)   // west: (3,2) → (2,2), contacting the ball
    kick()     // fires west at chargePower = POWER²
}
▸Challenge 9 — Precision Parking(0,0) facing east · park (5,3) facing west
function precisionParking(): void {
    drive(5)     // east:  (0,0) → (5,0)
    turnLeft()   // east → south
    drive(3)     // south: (5,0) → (5,3)  [inside box]
    turnLeft()   // south → west ✓ [facing west, inside box]
}
▸Challenge 10 — Boss Level(4,0) · cone (4,1) · ball (4,2) → right goal · park (1,0)
function bossLevel(): void {
    // Phase 1: detour left around cone at (4,1)
    turnLeft()    // south → west
    drive(1)      // west: (4,0) → (3,0)
    turnRight()   // west → south
    drive(2)      // south: (3,0) → (3,2)

    // Phase 2: reach ball at (4,2)
    turnRight()   // south → east
    drive(1)      // east: (3,2) → (4,2) [contacts ball]

    // Phase 3: kick into right goal
    kick()        // fires east → right goal (x = 7–8)

    // Phase 4: drive to parking zone
    turnRight()   // east → north
    drive(2)      // north: (4,2) → (4,0)
    turnRight()   // north → west
    drive(3)      // west: (4,0) → (1,0) [parking zone x = 0–1 ✓]
}
Turn reference: turnRight() south→east→north→west→south · turnLeft() south→west→north→east→south.
Velocity Arena · NYC FIRST — Skills Arena facilitator guide. Full student-facing detail lives on the Skills Arena lesson page.