MiniCore Driving · Team 2367

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.

A robot on the wrong channel never appears at all — no error, no warning, just an empty list. This is the most common reason a robot seems dead. Check that 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:

  1. Pick your robot from the slot's Robot dropdown. It pairs the moment you choose it — there is no separate confirm button.
  2. 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.

Enable is not per-slot. It enables every robot the dongle can hear, including robots nobody has paired to a slot. If a robot is powered on and in range, it is live — so know what is on the table before you press it.

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.

The speed limit survives a page reload. A cap someone set for a demo last week is still there when you open the page today, and it is the answer to most "why is my robot so slow" questions. The Activity log says so at startup when a cap was restored — but check the slider first, before you go looking at your code.

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:

  1. Type a whole number between 1000 and 2000 in L or R. 1500 is the standard starting point; move it 20–30 at a time.
  2. Click Apply. Nothing is sent until you do, so a half-typed number cannot reach a robot.
  3. 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.

Neutral is the pulse sent on every stop, including the automatic one when a robot loses its radio link. A neutral set near 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.