Challenge 1
Drive the length of the table and back using only equal speed pairs, finishing within a hand's width of the start.
EV3 Robotics›Level 2 · Intermediate›Lesson 20
Level 2 · Lesson 20 · EV3-L02-2060 minutes · Ages 9–16 · Model: Racecar
The Racecar: two Large Motors driving the rear wheels, a small free-rolling wheel at the front, and a wedge-shaped body with a wing at the back.
Look closely at the front wheel. It does not steer. There is no steering rack, no servo, nothing to point it. It simply rolls wherever it is dragged.
So how does this car go round a corner? By driving one rear wheel faster than the other — and by the end of the lesson you will be setting those two speeds yourself, one number each.
A Formula 1 car takes a corner at Sepang at over 200 km/h. Its front wheels do steer — but that is not the whole story of how it gets round.

Here is the fact the whole lesson turns on. On a bend, the outside wheel travels further than the inside wheel. They go round the same corner in the same time, along circles of different sizes — so they cannot be turning at the same rate.
That is why every real car has a differential: a gearbox between the driven wheels whose only job is to let them turn at different speeds while both still push. Invented in the 1820s, and still under every car on the Federal Highway today.
Lock two driven wheels to one rigid axle and the car cannot corner honestly. One wheel has to scrub — skid sideways — for the whole bend. You can hear it in a supermarket trolley with a stiff caster, and you can feel it in a go-kart, which has no differential and hops its inside rear wheel off the ground through every turn.
A turn is a speed difference. It has never been anything else.
In Lesson 11 you steered with a single number: 0 for straight, 100 to spin. Today you set the two motor speeds directly, and watch what steering was doing all along.
move for (2) [rotations v] at (50) (50) % speed :: movement move for (2) [rotations v] at (50) (25) % speed :: movement move for (2) [rotations v] at (50) (-50) % speed :: movement
The first number is the left motor, the second is the right — in the order set by set movement motors to [B v] and [C v]. Get that block wrong and every turn in your program mirrors.
| Left | Right | What the car does |
|---|---|---|
| 50 | 50 | Straight ahead. Equal speeds, equal distance. |
| 50 | 25 | A wide curve to the right. The left wheel covers more ground, so the car swings away from it. |
| 50 | 0 | Pivots around the stopped right wheel — the tightest turn that still moves forward. |
| 50 | −50 | Spins on the spot. The wheels fight each other and the car goes nowhere. |
The rule to hold on to: the car always turns away from the faster wheel. If the left is quicker, it goes right. Say it out loud once and you will never have to work it out again.
Because most of the time you want to say what the car should do, not what each motor should do. Steering is the friendlier block and you should keep using it.
The pair is for when you want a curve that steering makes awkward, when you need one wheel exactly stopped, or — most usefully — when one motor is mounted differently from the other and you have to compensate for it.
A driving base has two Large Motors, one per wheel. You could drive them with two separate motor blocks — but they would never start at quite the same instant, and the robot would curve away. EV3 has a separate family of Movement blocks that treat the pair as a single driving base.
| Block | What it does |
|---|---|
set movement motors to [B v] and [C v] :: movement | Tells the Movement blocks which two ports are the driving wheels. Put it at the top of the program, before any movement. |
move [forward v] for (2) [rotations v] :: movement | Drives both wheels together, so the robot travels in a straight line. |
move for (1) [rotations v] at (75) (25) % speed :: movement | Drives the two wheels at different speeds, which makes the robot curve. |
set movement speed to (50) % :: movement | Sets how fast the driving base travels from now on. |
set movement motors to [B] and [C] is the block that decides which two motors every Movement block after it will drive. It does not look at the robot. It drives the two ports you name, whether or not there is a motor in them — so those two letters have to be the two sockets the cables are actually in.
This is the single commonest reason a driving base does nothing, and it is invisible in the program: every block is spelled correctly and the robot still will not go.
the same program on both robots
The yellow outline marks the two ports the block is driving. A robot only goes straight when both of them have a motor in them.
Both robots run the identical program. The left one has its motors in B and C, so both named ports have a motor and the robot drives straight. The right one is plugged into A and B: the block drives B, finds nothing in C, and never mentions the motor in A at all — so one wheel turns, one wheel sits there, and the robot swings round the dead one instead of driving.
If neither named port has a motor in it — cables in A and D, say, with the block still set to B and C — the robot does not move at all. The program runs happily to the end and the Brick reports nothing wrong, because as far as it is concerned it did exactly what it was told.
So before you look for a bug in the program, look at the cables: read the port letters off the Brick, then make the block say those two. B and C are only the usual choice, not a rule — if your build has the driving motors in A and D, set the block to A and D and everything works.
Everything a driving base can do comes from those two speed numbers. Try each button below and watch the trail the robot leaves.
The path is worked out from the two wheel speeds in the block, not drawn by hand — so changing the preset changes the numbers and the shape together.
Notice there is no steering block anywhere in that program, and no steering part anywhere on the robot. The turn is made entirely by driving the two wheels different amounts.
when program starts :: events hat set movement motors to [B v] and [C v] :: movement move [forward v] for (2) [rotations v] :: movement move for (1) [rotations v] at (50) (-50) % speed :: movement
“Move forward 2 rotations” says nothing about the floor — it says how many times the wheels go round. How far the robot actually travels depends on how big the wheels are, and once round a standard EV3 driving wheel is about 17.5 cm.
Before doing any sums, get a feel for it. Drag the robot along and watch both scales at once — rotations on top, centimetres underneath, the same line. Land on the half marks: there is a number between 1 and 2, and it is 1.5.
Drag the robot, or use the arrow keys — it moves in half rotations. Rotations above the line, centimetres below.
1.5 — a half rotation past 1. Half a turn of the wheels is 8.75 cm, so halves matter.
35 ÷ 17.5 = 2. That is a number you can type straight into the block.
set movement motors to [B v] and [C v] :: movement set movement speed to (30) % :: movement move [forward v] for (2) [rotations v] :: movement
Steering at right 100 or left 100 drives the two wheels in opposite directions, so the base stops travelling and pivots where it stands. The angle it sweeps is a simple doubling of the rotations:
Half a rotation is the one worth remembering: a square corner, 90°.
| Rotations | The robot turns |
|---|---|
| 0.25 | 45° — half a corner |
| 0.5 | 90° — a square corner |
| 1 | 180° — turn round and face back |
| 2 | 360° — all the way round |
The one to memorise is 0.5 rotations = 90°. Everything else follows from doubling or halving it.
set movement speed to (20) % :: movement move [right: 100] for (0.5) [rotations v] :: movement
Turn slowly. The wheels on a driving base are big and the robot carries a lot of weight, so at full speed it keeps going after the motors stop and lands past the angle you asked for. Somewhere between 15% and 30% speed is where turns become repeatable. A turn that overshoots is almost always a turn taken too fast, not a wrong number.
These figures belong to your robot. The distance depends on the wheels and the angle depends on how far apart they are, so a wider base needs a different number for 90°. Test it, measure what actually happened, and adjust — the same discipline as the Gyro Sensor tolerance.
Every wheeled vehicle steers this way — a tank, a digger, an office chair with two driven castors. Cars use a steering rack instead, but a robot that turns by driving its wheels at different speeds needs no steering mechanism at all.
Two numbers, left then right. The car turns away from the faster one.
Speed is set separately from movement. You tell the motor how fast it should go, and then you tell it to go — two blocks, in that order.
| Block | What it does |
|---|---|
[A v] set speed to (25) % :: motors | Sets the speed for this motor from now on. Nothing moves — it only changes what the next movement will do. |
[A v] run [clockwise v] for (2) [rotations v] :: motors | Now moves, at whatever speed was last set. |
when program starts :: events hat [A v] set speed to (25) % :: motors [A v] run [clockwise v] for (2) [rotations v] :: motors
Swap those two blocks round and the program still contains a speed of 25 % — it just never gets used. Both shafts below are asked for exactly 2 rotations; watch how long each one takes.
speed first — works
speed last — does nothing
Both shafts turn exactly 2 rotations. Only the time they take is different — and the right-hand program never gets the slow movement it was written to have.
The right-hand movement is over before the left is a third of the way round, because it ran at the default speed. Its set speed to () block does run — you can see it light up — but by then the movement it was meant to slow down has already happened. A speed block only ever affects the movements after it. This catches people out constantly.
A high speed is not a better program. Slow movements are gentler on the gears, easier to watch and debug, and look more like the real machine — a barrier that snaps up in a fraction of a second reads as broken rather than fast.
Look at your car. How many electronic parts does it have? Fewer than you might guess for something this fast.
| Part | What it is doing here |
|---|---|
| EV3 Intelligent Brick | Sits low and central. It is also most of the car’s weight, which is why the model puts it between the axles. |
| Large Motor ×2 — the rear wheels | Large, not Medium: these carry the whole car. Each drives one wheel, which is what makes independent speeds possible at all. |
| The small front wheel (not electronic) | Free-rolling and unsteered. It goes where the back end sends it. Smaller than the rear wheels, so the nose sits low. |
| The rear wing (not electronic) | On a real car it presses the tyres into the road. On yours it is weight over the driven wheels — which does the same job for the same reason. |
No sensors at all. Every turn this car makes is a number you chose, run open-loop — nothing checks whether it worked. That is exactly why Lesson 37’s Gyro turns will feel like such a relief.
Sensors go in ports 1, 2, 3, 4. Motors go in ports A, B, C, D. They are not interchangeable, and nothing will tell you politely if you swap them.
| Part | Port | Why this one |
|---|---|---|
| Left rear wheel (Large) | B | B and C are the pair. The Movement blocks assume them, and B is the left-hand number in today’s block. |
| Right rear wheel (Large) | C | The right-hand number. Swap these two and every turn mirrors. |
“Left” means the car’s left, not yours. Sit behind the car, facing the way it drives, and decide from there. Half the mirrored turns in this lesson come from a student standing in front of the model.
Check your own wiring now:
Two routes, and either is fine. USB is the reliable one and the one to fall back on when a room’s Bluetooth is busy; Bluetooth leaves the robot free to move, which some models need.
Do these in order. Naming the Brick after you go looking for it in the list is how groups end up driving each other’s robots.
EV3 until somebody changes it.EV3.The two failures, every class, every time. The Brick has gone to sleep while you were building — press the centre button to wake it. Or you have paired with the group at the next table, which is why the name matters.
The long version, including Port View and how to read the port tiles, is in the Brick & Bluetooth guide.
Bluetooth, and this time it is not optional. This car drives away from you at speed. A USB cable becomes a tether that either steers the car or leaves the desk with it.
Stuck? The long version, with a photograph of every screen, is in the Brick & Bluetooth guide.
One lap of an oval: down the straight, round the bend, back down the other straight, round again.
when program starts :: events hat set movement motors to [B v] and [C v] :: movement clear display :: display write [LAP 1] at line (1) :: display play beep (72) for (0.2) seconds :: sound repeat (2) move for (3) [rotations v] at (60) (60) % speed :: movement move for (2) [rotations v] at (60) (20) % speed :: movement end stop moving :: movement play sound [Communication / Goodbye v] until done :: sound
set movement motors first. It sets which motor is the left-hand number. Everything after it depends on it, and it costs one block to be certain.repeat (2) makes the oval. Two straights and two bends. If your bends are not half-circles, the car will not come back to where it started.What success looks like: the car runs a rounded rectangle and finishes roughly where it began, pointing roughly the way it started. Roughly is the honest word here — and Lesson 37 is where you stop accepting it.
If the car turns left instead of right, your B and C are swapped. Fix the cables, not the numbers — otherwise every program you write from now on is wrong in the same hidden way.
One change at a time, and predict before each run. Mark the car’s starting spot with tape so you can see how close it gets back.
Steps 4 and 5 are the point of the lesson, and they are not really about the block. Nothing in this program checks whether the car went where you meant. It commands the wheels and hopes. That is called running open-loop, and every model you build up to Lesson 36 does it.
A program that commands motors is not a program that produces a journey. The floor gets a vote.
Build the model before you read any further. Everything after this is about making it do something, and none of it will make much sense with nothing on the table in front of you.
Use the viewer's own controls to zoom and turn pages. Fullscreen makes it big enough to build from.
Check the finished build against the picture before you switch anything on. A motor mounted the wrong way round is far easier to spot now than it is to debug later, when it looks like a program fault.
This model drives, so its challenges are run on a mat. Mats differ between branches — check you are looking at the one in your room.

WRO 2026 RoboMission Elementary — Robot Rockstars · official WRO game mat, 2362 × 1143 mm
The challenges name these places rather than distances, so the same challenge works on any mat:
Work through the challenges in order — each is harder than the last. The mission comes after all three, and it is meant to make you plan before you build.
Drive the length of the table and back using only equal speed pairs, finishing within a hand's width of the start.
Drive a figure of eight — one loop turning left, one turning right — using only the two-speed block. One of your numbers will have to be negative.
Find the tightest circle the car can drive while still moving forward, and the widest circle that still closes on itself. Record both speed pairs.
Mark out a slalom course of obstacles the car must pass on alternating sides. Work out the whole route as a written list of speed pairs and rotation counts BEFORE you drive it, then run it once. You may not tune between the plan and the run — planning it blind is the challenge.
