Facilitator guide · Velocity 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.
makecode.microbit.org → New Project → name it SkillsArena.cutebot, click the Cutebot Pro card. Only needed once per project — the code will not work without it.Ctrl+A (Mac: ⌘A), then Delete.Ctrl+V (Mac: ⌘V). All four stats will read 0 — that's expected.0:let SPEED = ? · let POWER = ? · let ENDURANCE = ? · let TURNING = ?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.drive(1) inside itReplace // YOUR CODE HERE with drive(1). This is the calibration run — one square, to check the bot's start-up.1 — ready.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.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.drive(6)Change the call to drive(6). Short → increase unitMs (line 88) by +20. Overshoots → −20. Expect around 590–620.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.| Button | What it does |
|---|---|
| B | Cycles the challenge number 1 → 2 → 3 … → 10 → 1. The number shows on the LEDs so you know which one is selected. |
| A | Runs the selected challenge. An arrow flashes, the bot moves, then a ✓ appears when it finishes. |
| A + B | Emergency stop — kills the motors instantly, at any time. Teach this before the first run. |
| Symptom | Fix |
|---|---|
Code won't compile / CutebotPro is underlined red | The Cutebot Pro extension isn't added. Gear ⚙ → Extensions → search cutebot → add it. |
| Bot does nothing when A is pressed | The 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 changed | They didn't re-flash. Press Download again. |
| LEDs never show a number | The flash didn't complete. Re-copy the file to the micro:bit. |
| Stats rejected / bot behaves oddly | The four stats must total exactly 20, each at least 1, POWER no higher than 10. |
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.function deadStraight(): void {
drive(6)
}function rightAngle(): void {
drive(3) // south: (1,0) → (1,3)
turnRight() // south → east
drive(5) // east: (1,3) → (6,3)
}function straightShot(): void {
drive(2) // west: (6,2) → (4,2), contacting ball
kick() // blast west toward 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
}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
}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
}// 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
}function powerControlLab(): void {
drive(1) // west: (3,2) → (2,2), contacting the ball
kick() // fires west at chargePower = POWER²
}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]
}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 ✓]
}turnRight() south→east→north→west→south · turnLeft() south→west→north→east→south.