Driving the robot
The driver station is the page you drive from, and the page used at competition. It reads your gamepad and sends it to the robot. This walks through it in the order you will actually do it.
What you need first
- The dongle in a USB port on the driving laptop.
- A gamepad, wired or paired to that laptop.
- A robot powered on, with code on it that calls
bot.update()in its loop. - Chrome or Edge. Safari and Firefox cannot reach USB, so the driver station will not open in them.
Put the robot on blocks, or somewhere it can drive without hitting anything. The first thing you will do on this page is give it power to its wheels.
Step 1 — connect the dongle
Click Connect dongle and pick the MiniCore device from the list. You only do this once per browser: after that, every later visit reconnects on its own as soon as the page loads, and plugging the dongle back in reconnects it too.
The one exception is the Disconnect button. Press it and the page will not reconnect on its own again until you either click Connect or unplug and replug the dongle.
Once it is connected, the four readouts along the top mean:
| Readout | What it tells you |
|---|---|
| Dongle | Connected or Not connected. |
| Channel |
The Wi-Fi channel the dongle is using — normally 6. Your
robots must be on this same number or they will never appear.
|
| Packets out |
Gamepad updates leaving the dongle each second. Only a slot with
both a robot and a gamepad contributes, so this stays at
0 until you have paired something — that is not a fault.
|
| Robots seen | How many different robots the dongle can currently hear. |
Step 2 — find your robot
Powered-on robots appear in the Robots list on their own, usually within a second or two. Scan asks again, for when one was powered on before the dongle was plugged in.
channel= in your main.py matches the
Channel readout at the top of the page, then power-cycle the
robot.
If the channel matches and it still never shows up, check that the robot is
actually on, that its battery is charged, and that its
main.py reaches bot.update() — a robot stuck in an
error before that call never transmits. Robot code
will show you what it prints.
Step 3 — find your gamepad
A gamepad does not appear until you press a button or move a stick on it. That is a browser rule, not a bug — plugging it in is not enough.
Each row lights up while that pad is being touched. With several identical controllers on one laptop, that highlight is how you tell which row is the one in your hands.
Step 4 — pair a slot
There are four slots, so one laptop drives up to four robots. Each slot needs two things:
- Pick your robot from the slot's Robot dropdown. It pairs the moment you choose it — there is no separate confirm button.
- Pick your controller from the Gamepad dropdown.
Release unpairs the slot and frees the robot for another one.
The stick bars in the slot move as soon as a gamepad is assigned, even while everything is still disabled. Use that: it confirms you paired the robot you meant and that the right controller is in your hands, before any wheel can turn.
Step 5 — enable, and know how to stop
Enable all robots is the switch that lets motors move. The
band reads Disabled or Enabled, and the line under it
tells you how many robots are live.
Space or Esc stops everything. It works any time the page is in front of you, whether or not the button says Enabled, and you do not need to click anything first. Learn it before you drive: it is faster than finding the mouse.
The one place those keys do nothing is while your cursor is inside a text box or a dropdown — typing a number there should not stop the field. Click the page background first if you have been editing a value.
Nothing special is needed to get going again: press Enable all robots once more. Reloading the page or closing the tab also disables everything, so after a refresh you always have to enable again.
What a slot is telling you
Each slot shows a status word. Reading it is usually faster than guessing why a robot is not moving.
| Status | Means |
|---|---|
Empty |
No robot paired to this slot yet. |
Needs gamepad |
Robot paired, but no controller assigned — so nothing is being sent to it. Pick one from the Gamepad dropdown. |
Standby |
Robot and gamepad both set, everything healthy, waiting for you to enable. This is what a ready slot looks like. |
Enabling |
Enable has been sent and the robot has not confirmed yet. Normal for a moment; if it sticks here, the robot is hearing you only intermittently. |
Live |
Enabled and confirmed by the robot. It is following your gamepad. |
No heartbeat |
The robot has gone quiet — out of range, powered off, battery dead, or crashed. It stops its own motors when this happens. |
Still enabled |
This page thinks it is disabled but the robot reports itself enabled. Press Space. It clears in a few seconds on its own, because a robot that stops hearing "stay enabled" gives up by itself. |
Next to the status is the robot's battery, or battery n/a if that
robot has no sensor for it.
Speed limit
The Speed limit slider runs from 0.10 to
1.00 and caps every robot on the field at once —
it is not per-slot. It scales the same number your code passes to
drive_left_motor(): at 0.60, asking for
1.0 gets you 0.60, and anything already below that is
untouched. Robot code cannot raise it.
The value is sent when you let go of the slider, not while you drag it.
Trimming a wheel that creeps
If a wheel turns slowly while the sticks are centred, that motor's neutral is slightly off. The slot's Neutral µs boxes fix it live:
-
Type a whole number between 1000 and 2000 in
L or R.
1500is the standard starting point; move it 20–30 at a time. - Click Apply. Nothing is sent until you do, so a half-typed number cannot reach a robot.
-
Read the line under the boxes. It shows what the robot says it is
actually running, which is how you confirm your value landed. If it
ends in
· not saved, the robot has not written it to memory yet and a reset will lose it.
You can trim while robots are enabled — you have to be able to watch the wheel.
1000 or 2000 therefore makes "stopped" mean
near-full throttle in that direction. Keep the robot on blocks the first time
you apply an unfamiliar number, and watch the readout to confirm what landed.
A trim applied here is saved on the robot and
overrides its main.py from then on. That is the
single most confusing thing in this system, so it is worth reading
Programming the robot on it — that page also
covers how to clear a saved trim and hand control back to your code.
When something is wrong
| What you see | Where to look |
|---|---|
| Robot never appears in the list |
Channel mismatch first — compare channel= in your code
with the Channel readout. Then power and battery.
|
| Gamepad never appears | Press a button on it. Nothing shows up until you do. |
Radio send failing at the top |
The dongle cannot get anything out. Reseat it in its USB port; try another port. |
Slot stuck on Enabling |
The robot is only partly hearing you. Move it closer, and check its battery. |
| Robot moves the wrong way, or only one wheel turns | That is your code or your wiring, not this page. Programming the robot covers the sign flip that tank drive needs. |
| Robot is much slower than expected | The Speed limit slider. It persists between visits. |
The Activity log at the bottom right records everything the page did and every reply it got, newest last. When something does not add up, read it before changing anything — it usually already says what happened.
Next
Programming the robot covers writing the
main.py that decides what your robot does with everything this
page sends it.