In Formula One, the car is configured around the driver — not the other way around. EZ Template and PROS give you the same tools. Every setting here directly changes how the robot feels in your driver's hands.
Every one of these settings changes how the robot responds to the same physical controller input. None of them require hardware changes — only code changes.
Before changing anything, sit with your driver and ask them directly. Their answers tell you exactly where to start.
| Driver Profile | Recommended Scheme | Reason |
|---|---|---|
| New to VRC, plays video games | Arcade Split — Standard | Matches the mental model from most games. Left stick = movement, right stick = camera/turn. |
| Experienced VRC driver | Tank | Gives the most precise independent side control. Skilled tank drivers can out-maneuver arcade drivers in tight spaces. |
| Robot with many mechanisms, needs free right hand | Single Arcade — Standard | Driving on left stick leaves the right thumb on face buttons for mechanism control without coordination penalty. |
| Driver with strong right-hand preference | Arcade Split — Flipped | Some drivers feel more precise with the dominant hand on the forward/back axis rather than turning. |
Curves are set in initialize(). For tank drive, one value sets both sticks. For arcade, the first value is the forward/back axis and the second is the turn axis.
This is the most powerful workflow for driver-focused tuning. With a MicroSD card installed in the Brain, the driver can adjust their own curve value live during practice — no re-uploading needed.
With SD card mode active, the driver uses controller buttons during practice to dial in their preference:
| Drive Type | Left/Right Buttons | Y / A Buttons |
|---|---|---|
| Tank | Left drive curve | Right drive curve |
| Left Split Arcade | Forward/back curve | Turn curve |
| Right Split Arcade | Turn curve | Forward/back curve |
| Single Arcade | Forward/back curve | Turn curve |
After each practice session, read the saved value from the Brain's SD card and hard-code it before competition — this ensures the curve is locked even if the SD card is removed or fails at an event.
opcontrol_joystick_practicemode_toggle(true) — this cuts drive power when joystick is maxed, training the driver to use the full range.Three modes control what happens to the motors when power is cut. Set this at the top of opcontrol() before the while loop.
| Mode | Behavior | Best For | Avoid When |
|---|---|---|---|
| Coast | Motors disengage — robot glides to a stop by friction | Fast driving, large robots, most VRC | Robot needs to hold exact position after stop |
| Brake | Motors resist motion — robot stops more crisply | When coast feels too loose, driver wants crispness | High-speed driving — can cause jerky deceleration |
| Hold | Motors actively hold current position — resists being pushed | Climbing, pushing games, goal interaction | Normal driving — feels unnatural and fights the driver |
Active brake is EZ Template's best-of-both-worlds option. When the joystick is released, a P-loop runs to hold the current position — but you tune exactly how aggressively it holds. kP 0 = coast. kP ~2 = gentle hold. kP 5+ = firm hold.
Every physical joystick has a small amount of drift — the stick reads a non-zero value when at rest. By default, this causes the robot to creep slowly. A deadband ignores inputs below a threshold value.
Two useful patterns: a training/precision mode that limits max speed by default, and a turbo button that unlocks full speed when held.
set_max_speed() anywhere and forget to reset it. Always reset to 127 at the start of your autonomous routines, or use set_max_speed(127) inside initialize() to ensure auton starts fresh.Every button on the V5 controller is accessible in PROS. Remap freely — there is no technical constraint on which button fires which mechanism.
A macro runs a sequence of actions automatically when a button is pressed. The driver initiates it with one press and the robot handles the rest. This is the single highest-leverage code technique for driver efficiency.
Use a rising-edge check — the macro fires once on the press, not repeatedly while held:
pros::delay() block the entire opcontrol loop while they run — the driver cannot drive during a blocking macro. For complex macros, use a pros::Task to run them in the background so the driver keeps control of the drivetrain. See the advanced pattern below.This pattern runs the macro in a separate thread — the driver keeps full drive control while the macro executes independently.
The V5 controller has 12 buttons. By default, pressing any face button (A, B, X, Y) requires lifting the right thumb off the right joystick. Pressing L1/L2/R1/R2 requires the index fingers that are already on the bumpers — but the driver cannot simultaneously hold both bumpers and both joysticks at full deflection without awkward hand geometry.
A scuff adds 2–4 paddles on the back and underside of the controller. Each paddle presses one specific button through a mechanical linkage — the driver operates them with middle or ring fingers while their thumbs stay on the joysticks. The result: the driver can drive at full speed and operate mechanisms simultaneously with no coordination penalty.
The EZ Template creator (ssejrog / Jess) has released two free 3D printable scuff body designs on Printables.com specifically built for the VEX V5 controller. Both include a cutout for the EZ Mini Competition Switch — so your competition switch mounts directly to the controller and you never forget it at a match.
While not a scuff paddle, the EZ Mini Competition Switch (available at roboticsisez.com) is designed to mount directly into the EZ scuff body cutout. It attaches to the controller with a 6-inch ethernet cable and stays secure without the cable holding it. The practical benefit: you always have the competition switch on your controller. Teams that forget their competition switch cannot do a proper full-sequence test on match day — this eliminates that risk entirely.
Once scuffs are installed, the programmer assigns the paddles to the most frequently used buttons for that driver's style. Common configurations:
| Situation | Tank | Split Arcade |
|---|---|---|
| Driving perfectly straight | Harder — requires both sticks perfectly synchronized. Slight asymmetry causes drift. Curves help but do not eliminate it. | Easy — left stick straight up = straight drive. The code handles the synchronization. |
| Precise spot turns (180°) | Excellent — push one stick fully forward and one fully back. Maximum turning authority at any speed. | Good but slightly less direct. Right stick at full deflection while left stick is neutral turns in place. |
| Arcing turns (curved path) | Excellent — independently adjust each side. Any arc radius is achievable with fine independent stick pressure. | Good but constrained — the arc radius is coupled to both sticks together. Less independent control over each side. |
| Recovery from mechanical failure | Can compensate — if one motor overheats or a side loses power, driver can apply more to compensate with the other stick. | Limited compensation — arcade mixes both sides in code. Hardware failure causes unpredictable drift the driver cannot easily correct. |
| Learning curve for new drivers | Steep — driving straight requires coordination practice. Initial sessions feel frustrating. | Gentle — intuitive for anyone who has played video games. New drivers become functional much faster. |
| Operating mechanisms simultaneously | Both thumbs on joysticks always — face buttons require lifting a thumb. Scuffs solve this. | Single-stick arcade frees one thumb entirely for mechanisms without scuffs. |
| Defensive play (pushing, blocking) | Superior — independent side control allows quick direction reversals and precise positioning for contact. | Adequate but the abstraction layer can feel slow during rapid directional changes under pressure. |
| Concern | Tank | Split Arcade |
|---|---|---|
| EZ Template implementation | One line: chassis.opcontrol_tank() |
One line: chassis.opcontrol_arcade_standard(ez::SPLIT) |
| Joystick curve application | One curve value applies to both sticks symmetrically | Two independent curve values — one for forward, one for turn axis. More tuning flexibility. |
| Custom deadband | Apply to left Y and right Y independently | Apply to left Y (forward) and right X (turn) — axes are different directions |
| Straight-line code assist | Can write a "snap to straight" assist: if sticks are within 5 units of each other, average them. Reduces drift significantly. | Not needed — arcade drives straight naturally when left stick is pushed vertically. |
| Custom arc controls | Not needed — driver handles arc directly with independent sticks | Can add turn rate scaling — reduce how aggressively the turn axis responds at high forward speed |
| Scuff mapping complexity | Slightly simpler — both thumbs committed to sticks, scuffs replace face buttons cleanly | Single arcade frees one thumb, reducing scuff need for mechanisms (drive frees the hand naturally) |
This optional code assist helps tank drivers drive straight by detecting when both sticks are nearly identical and averaging them. It is the programmer helping the driver, not replacing them.