Buggy Battle

Design, build and program a micro:bit buggy. Three events, one champion team.

🚀 Speed Sprint 🏁 Manoeuvre Course 🥊 Sumo Arena

The Project

Each team builds a remote-controlled buggy: two micro:bits (one on the buggy, one as a radio remote), a Kitronik motor driver board, and two motors plus a caster ball — or four motors for tank drive. You then enter your buggy into all three events.

📦 What you'll get

  • 2 × BBC micro:bit v2
  • 1 × Kitronik motor driver board (5620 or 5641)
  • 2 or 4 × geared DC motors with wheels
  • 1 × caster / bearing ball (if 2-motor)
  • 3×AA battery holder for the buggy
  • 2×AA battery pack for the remote
  • Chassis material: laser-cut acrylic, 3D print or cardboard

🎯 What you'll learn

  • H-bridge motor control & PWM speed
  • Radio communication between micro:bits
  • Differential-drive steering maths
  • Mechanical design: weight, traction, wheelbase
  • Iterative testing and debugging
  • Teamwork: pilot & engineer roles

📅 Timeline (8 weeks)

  • Wk 1–2 Wiring + first drive (Stage 1)
  • Wk 3–4 Full remote control (Stage 2–3)
  • Wk 5–6 Chassis tuning & event practice
  • Wk 7 Time trials
  • Wk 8 Buggy Battle Finals

The Three Events

Every team competes in all three. Points are added across events — consistency wins.

🚀

Speed Sprint

Fastest run down a 5 m straight track.

Course

  • 5 m straight, 60 cm wide lane
  • Marked start & finish lines

Win condition

  • Lowest time wins. Two attempts; best counts.
  • Touching the wall = +1 s penalty per touch.

Engineering tips

  • Maximise PWM (use 1023).
  • Keep weight low & centred between drive wheels.
  • Match left/right motor speed with a trim variable if it pulls.
🏁

Manoeuvre Course

Slalom round cones, through a gate, return to base.

Course

  • 4 cones (slalom)
  • 1 narrow gate (40 cm wide)
  • 180° turn at the far end

Win condition

  • Lowest time, fewest cones knocked.
  • Each cone hit = +3 s. Missed gate = +5 s.

Engineering tips

  • Lower PWM for fine control (try 600–800).
  • Short wheelbase = tighter turns.
  • Practise spot turns vs. arc turns — both are useful.
🥊

Sumo Arena

Push your opponent out of the ring. Last buggy in wins.

Arena

  • Circular ring, 1.2 m diameter, raised 5 cm
  • Black ring with white border

Win condition

  • Knockout bracket. Best of 3 rounds per match.
  • Round ends when any wheel leaves the ring.
  • 30 s timeout = double knockout, replay.

Engineering tips

  • Add weight (within 500 g limit).
  • Low front wedge / scoop helps lift opponents.
  • 4-motor drive gives more pushing force.
  • Grippy tyres beat hard plastic on the arena surface.

The Build

Two micro:bits. One on the buggy, one in your hand. They talk over radio.

🛠 Step-by-step assembly guide →

System overview

  REMOTE (handheld)                            BUGGY
  ┌───────────────────┐                        ┌─────────────────────────┐
  │   ┌───────────┐   │      📡  radio         │   ┌─────────────────┐   │
  │   │ micro:bit │───┼──────────────────────► │   │    micro:bit    │   │
  │   │  sender   │   │     same group N       │   │    receiver     │   │
  │   └─────┬─────┘   │                        │   └────────┬────────┘   │
  │     ┌───┴───┐     │                        │   ┌────────┴────────┐   │
  │     │ 2×AA  │     │                        │   │  Kitronik 5620  │   │
  │     │ pack  │     │                        │   │ motor driver    │   │
  │     └───────┘     │                        │   └─┬─────────────┬─┘   │
  │                   │                        │   ┌─┴───┐     ┌───┴─┐   │
  │  Inputs:          │                        │   │LEFT │     │RIGHT│   │
  │   • A → left      │                        │   │motor│     │motor│   │
  │   • B → right     │                        │   └─────┘     └─────┘   │
  │   • A+B → forward │                        │   + caster / bearing    │
  │   • none → stop   │                        │   + 3×AA on board BAT   │
  └───────────────────┘                        └─────────────────────────┘

⚡ Power

Buggy: 3×AA into the Kitronik board's battery terminal — this powers the motors and the micro:bit through the edge connector.

Remote: standard 2×AA pack into the micro:bit's JST connector.

Never plug a JST battery into a micro:bit that is already slotted into a powered motor board.

🔧 Motors

Each motor has two wires. They control direction by polarity — if the motor spins the wrong way, just swap the two wires. No code change needed.

Connect the left motor to the Motor 1 terminal, the right motor to Motor 2.

📡 Radio group

Both micro:bits must use the same radio.set_group(N). Pick a unique N per team (1–255) so you don't drive each other's buggies.

Pin a sticky note on each buggy with its team number = group number.

Wiring — Kitronik 5620

The buggy micro:bit slots into the edge connector on the motor driver board. The board exposes two motor terminals.

Top view

       ┌──────────────────┐
       │  L●            ●R│  ← drive wheels (rear)
       │                  │
       │   [3×AA pack]    │
       │   [Kitronik 5620]│
       │   [micro:bit]    │
       │                  │
       │        ◯         │  ← caster / bearing ball (front)
       └──────────────────┘

Pin map

OutputPin A (forward)Pin B (reverse)
Motor 1 (left)P8P12
Motor 2 (right)P0P16

One pin HIGH = motor turns one way. The other pin HIGH = motor turns the other way. Both LOW = stopped. Use write_analog(0–1023) for PWM speed control.

Programming Scaffold

Four stages from "first drive" to "tilt steering". Use MakeCode blocks or MicroPython — same logic.

1

Hello, Buggy

Goal: Press button A on the remote — buggy drives forward for 1 second, then stops.

Concepts: radio.send, radio.receive, motor on/off.

2

Full Remote Control

Goal: A = left, B = right, A+B = forward, no button = stop.

Concepts: polling buttons, multiple commands, default-stop logic.

// REMOTE (sender)
on start
  radio set group 1

forever
  if (button A is pressed) AND (button B is pressed)
    radio send string "F"
  else if button A is pressed
    radio send string "L"
  else if button B is pressed
    radio send string "R"
  else
    radio send string "S"
  pause 100 ms

// BUGGY (receiver)  -- requires the "kitronik-motor-driver" extension
on start
  radio set group 1

on radio received receivedString
  if receivedString = "F"
    Motors: motor 1 forward at 100
    Motors: motor 2 forward at 100
  else if receivedString = "L"
    Motors: motor 1 reverse at 80
    Motors: motor 2 forward at 80
  else if receivedString = "R"
    Motors: motor 1 forward at 80
    Motors: motor 2 reverse at 80
  else
    Motors: motor 1 off
    Motors: motor 2 off
# remote.py  --  the handheld micro:bit
from microbit import *
import radio

radio.config(group=1)
radio.on()

last = ""
while True:
    if button_a.is_pressed() and button_b.is_pressed():
        cmd = "F"
    elif button_a.is_pressed():
        cmd = "L"
    elif button_b.is_pressed():
        cmd = "R"
    else:
        cmd = "S"

    if cmd != last:          # only send on change -> less radio traffic
        radio.send(cmd)
        last = cmd
    sleep(50)
# buggy.py  --  the micro:bit on the motor board
from microbit import *
import radio

radio.config(group=1)
radio.on()

# Kitronik 5620 motor pins
M1F, M1R = pin8, pin12    # left motor:  forward, reverse
M2F, M2R = pin0, pin16    # right motor: forward, reverse
SPEED = 1023              # 0-1023 (PWM). Lower = slower.

def drive(lf, lr, rf, rr):
    M1F.write_analog(lf); M1R.write_analog(lr)
    M2F.write_analog(rf); M2R.write_analog(rr)

def stop():    drive(0, 0, 0, 0)
def forward(): drive(SPEED, 0, SPEED, 0)
def left():    drive(0, SPEED, SPEED, 0)
def right():   drive(SPEED, 0, 0, SPEED)

stop()
while True:
    msg = radio.receive()
    if   msg == "F": forward()
    elif msg == "L": left()
    elif msg == "R": right()
    elif msg == "S": stop()
    sleep(20)
3

Tilt Steering

Goal: Hold the remote like a steering wheel. Tilt forward = drive, tilt left/right = turn.

Concepts: accelerometer, mapping ranges, dead zones.

# remote.py  --  Stage 3 (tilt)
from microbit import *
import radio

radio.config(group=1)
radio.on()

last = ""
while True:
    x = accelerometer.get_x()      # -1024 (left) .. +1024 (right)
    y = accelerometer.get_y()      # -1024 (forward) .. +1024 (back)

    if abs(x) < 200 and abs(y) < 200:
        cmd = "S"                  # dead zone -- otherwise it never stops
    elif y < -300:
        cmd = "F"
    elif x < -300:
        cmd = "L"
    elif x > 300:
        cmd = "R"
    else:
        cmd = "S"

    if cmd != last:
        radio.send(cmd)
        last = cmd
    sleep(50)
4

Combat Mode

Goal: Add features for the sumo event — horn (buzzer), headlights, and a "boost" turbo button.

Concepts: additional commands, output devices, variable speed.

  • Boost: press logo / shake to send "B" → buggy uses higher PWM for 1 second.
  • Horn: on receiver play a tone via music.pitch() on a free pin.
  • Headlights: use the micro:bit display: scroll ↑ arrows when driving forward.
  • Reverse: add a "V" command (e.g. shake), needed when sumo opponents wedge in.

Rules & Scoring

Same scoring across the three events. Top finishers earn ranking points; total points across all events crowns the overall champion.

📊 Ranking points

Each event awards points by finishing position:

  • 1st — 10 pts
  • 2nd — 7 pts
  • 3rd — 5 pts
  • 4th — 3 pts
  • Finisher — 1 pt

Overall champion = highest total across all three events.

📐 Buggy specs

  • Max footprint: 20 × 20 cm
  • Max weight: 500 g (incl. battery)
  • Power: micro:bit + Kitronik board only (no separate ESCs)
  • Wireless control via radio only (no Bluetooth, no Wi-Fi)
  • Decorations encouraged — team livery counts!

🚫 Disqualifications

  • Sharp blades, spinning weapons or flames
  • Liquids, oils, sticky tape on tyres for sumo
  • Untethered projectiles
  • Driving outside your designated radio group
  • Buggy still moving when judge calls "STOP"

Safety

Robotics is hands-on and physical — respect the kit and each other.

⚠ Disconnect before wiring

Always remove the battery pack before changing wiring. Shorts can damage the motor board permanently.

🔥 Motor heat

Stalled motors get hot quickly. If your buggy is stuck against a wall, stop it and reposition.

👀 Eye safety

Wear safety glasses when drilling chassis material or using the laser cutter.

🧾 Battery care

Use fresh, matched AA cells. Never mix old and new. Remove batteries when storing the buggy.

👑 Marshal authority

The event marshal can call STOP at any moment. All teams must immediately disable transmission.

🎯 Spectators clear

Buggies stay in the ring or on the course. Clear a 1 m exclusion zone around the arena.