Challenge 1
Clear a lane. Put a line of loose material across the mat and push all of it past a line your teacher names, in one run, without the tracks slipping. Choose your speed by testing rather than habit and say what you chose and why.
EV3 Robotics›Level 1 · Beginner›Lesson 33
Level 1 · Lesson 33 · EV3-L01-3360 minutes · Ages 9–16 · Model: Bulldozer
The Bulldozer: two Large Motors driving rubber tracks, with a wide blade across the front. It does not just travel — it shifts things.
Every robot you have driven so far has carried exactly one load: itself. It weighed the same at the start of the run as at the end, so once you found a speed that worked, it went on working.
A bulldozer is different. What it has to push changes from moment to moment — nothing at first, then a small pile, then a big one. The job gets harder as it goes, and at some point the machine will simply stop moving.
On every construction site and every palm-oil plantation road in the country. A bulldozer is the machine that turns uneven ground into flat ground, and it does it by shoving earth from where it is to where it should be.

Look at what it stands on. Not wheels — tracks, and they are the reason it works at all.
A wheel touches the ground in a patch about the size of your palm. A track touches it along its whole length, so the machine’s weight is spread over a much bigger area. Two things follow: it does not sink into soft ground, and it has far more grip.
Grip is the point. A bulldozer has an enormous engine, but an engine is no use if the tracks just spin. Everything the machine can push is limited by how hard it can hold onto the ground.
Put that same engine on wheels and the first serious pile of earth would stop it dead — not because it lacks power, but because the wheels would spin uselessly. You met exactly this on the Elastic Car in Lesson 14, where extra winding past a point just span the tyres.
A machine can only push as hard as it can grip. Power it cannot put through the ground is power wasted.
Until now, one speed setting worked for a whole program. From today, the right setting depends on what the robot is being asked to move.
| What the blade is pushing | What the motors have to give |
|---|---|
| Nothing — driving across a clear floor | Very little. Any speed works. |
| A light pile | More force. High speed starts to slip the tracks instead of moving the pile. |
| A heavy pile | All the force there is — and if that is not enough, the motors stall and the program hangs, exactly as on the Push-up Robot in Lesson 32. |
Three ideas you already have meet here for the first time. The Large Motor gives force rather than speed (Lesson 11). A measured motor block waits for a movement that may never finish (Lesson 27). And tracks provide the grip that lets the force reach the ground at all.
There is a rule that falls out of the three, and it is not obvious: for pushing, slower is stronger. A motor asked for less speed has more left over as force. So a bulldozer that will not shift a pile at 80 % will often shift it at 30 %.
When a machine will not move a load, turning the speed up is the wrong instinct. Turn it down.
The Large Motor is the bigger of the two EV3 motors. It turns more slowly than the Medium Motor but pushes far harder, which is why it drives wheels and lifts loads. If a mechanism struggles or stalls with a Medium Motor, this is usually the answer.
| Block | What it does |
|---|---|
[B v] run [clockwise v] for (3) [rotations v] :: motors | Turns the motor a measured amount, then stops. |
[B v] run [clockwise v] for (2) [seconds v] :: motors | Turns it for a length of time rather than a distance, then stops — however far the shaft actually got. |
[B v] set speed to (40) % :: motors | Sets how fast the next movement will be. |
[B v] start motor [clockwise v] :: motors | Starts it turning and carries straight on. |
Give both motors the same program and the same arm. With nothing on the arm the Medium Motor wins easily — which is why it is tempting to treat it as simply the better motor. Then the demo hangs a weight on both arms and runs it again.
and on the Large Motor, only the port changes
Turning the speed up would not rescue the Medium Motor here — a stalled motor needs more force, which means gearing it down or using the Large Motor.
That is the whole difference. The Medium Motor is quicker; the Large Motor is stronger. A motor that cannot produce enough force does not move slowly — it stops altogether and strains, which is the buzzing, going-nowhere failure almost every LEGO builder meets sooner or later.
Being stronger buys the Large Motor a bigger load, not an infinite one. Every winch runs out of cable and every lift reaches the top of its rails, and when a motor arrives at a limit it stalls: the shaft stops turning and the motor sits there straining.
That is a problem for the program, not just the mechanism. run for (3) rotations does not finish when three rotations’ worth of time has gone by — it finishes when the shaft has actually turned three times. A winch that reaches the top after two and a half will never report three, so the block waits, and every block after it is unreachable. Nothing crashes. The motor keeps pushing and the rest of the program simply never happens.
The third setting in that dropdown is the way out. for () seconds drives the motor for a duration and then stops regardless, so it always finishes and the program always moves on. Drive into a limit slowly, for a comfortably long time, and then call that position zero:
when program starts :: events hat [B v] set speed to (30) % :: motors [B v] run [counterclockwise v] for (3) [seconds v] :: motors [B v] reset degrees counted :: motors
The lift ends up against its own stop, the encoder is zeroed there, and every measured move afterwards starts from a place you know. The rule is the same for both motors: if the movement ends against something solid, run for seconds; if it ends somewhere in the middle, measure it. The Medium Motor module has the animation for it — see The Medium Motor, which is where this bites hardest, because a Medium Motor is usually the one doing the lifting.
The blocks are identical apart from the port letter, so swapping one motor for the other is a build change, not a programming change.
Real machines match the motor to the load. A lift uses a powerful, slow motor; the button panel beside it uses tiny ones. Choosing the wrong size is the most common reason a LEGO mechanism whines but does not move.
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.
Say this back before moving on: “For pushing, slower is stronger.”
| Part | What it is doing here |
|---|---|
| EV3 Intelligent Brick | Runs the program, and its weight is what presses the tracks into the floor. On this model the Brick is part of the grip. |
| Large Motor ×2 | Ports B and C, one per track. Force, not speed. |
| The tracks and the blade (no cable) | The tracks turn force into grip; the blade turns grip into work. |
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 track motor | B | B and C are the pair, and B is always left. |
| Right track motor | C | Sit behind the machine to decide which is which. |
| Sensors | none | The bulldozer cannot feel the pile. It finds out by stalling. |
Check your own build 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.
Stay in reach of the stop button. This machine is built to push against things, so it is the most likely of any model so far to end up stalled with both motors straining.
Five blocks: push out, reverse back. Start with the blade just touching the pile.
when program starts :: events hat set movement motors to [B v] and [C v] :: movement set movement speed to (35) % :: movement move [forward v] for (4) [rotations v] :: movement move [backward v] for (4) [rotations v] :: movement
Walk it in the order the Brick runs it:
What success looks like: the pile moves, the tracks keep gripping, and the bulldozer reverses cleanly out. Mark where the pile started and where it ended — that distance is your score for the rest of the lesson.
If the tracks spin and the pile does not move, do not raise the speed. Lower it. If it still will not go, your pile is heavier than this machine can shift, and knowing that limit is a result too.
One change at a time, and predict before each run. Measure how far the pile moves every time and write it down.
Step 5 separates the two things that look identical from outside. On paper the motors are turning and the machine is going nowhere: that is slipping. Against a heavy pile the motors are not turning at all: that is stalling. Watch the degree counters and you can tell them apart instantly.
Slipping is a grip problem. Stalling is a force problem. They need opposite fixes, so name which one you have before you change anything.

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.
Clear a lane. Put a line of loose material across the mat and push all of it past a line your teacher names, in one run, without the tracks slipping. Choose your speed by testing rather than habit and say what you chose and why.
Find the speed that shifts the most. Test at least four speeds against the same pile, three runs each, measuring how far the pile moves. Report all your numbers and the winner — and explain why the fastest setting was not it.
Find and name the limit. Increase the pile until the bulldozer can no longer move it, then work out whether you are slipping or stalling. Report which, with the evidence you used — the degree counters tell you, and they are the only thing that does.
Clear a site to a standard somebody else set. Your teacher will mark out an area on the mat with material scattered in it and a station to push it all to. Clear the area completely, in as few runs as you can, without ever stalling and without leaving material behind. Plan on paper before you drive. Where you push from decides how much you can move in one go, and a bulldozer that takes on too much at once achieves less than one that takes three careful bites. Two questions when you demonstrate it. How did you decide your speed, and what evidence did you use? And how would you know from the Brick alone whether a run had stalled or slipped?