TeleOp // Begin here
Start
Basic mecanum driving with clear joystick, motor-power, and safety lessons.
Visual source + comment guide
Explore the Blocks
The diagram stays close to FTC Blocks while the guide wraps every full student comment for easy reading.
Safety: Read and predict before running. Raise the wheels for the first motor test, keep one person ready to press STOP, and never rely on camera code as the only safety system.
Show generated JavaScript
This is what FTC Blocks generates for the Robot Controller. The visual Blocks above are the primary student source.
// IDENTIFIERS_USED=back_left_driveAsDcMotor,back_right_driveAsDcMotor,front_left_driveAsDcMotor,front_right_driveAsDcMotor,gamepad1
var forward2, strafe, turn, speed, denominator;
/**
* BASIC MECANUM TELEOP
*
* Left stick: drive forward/backward and strafe left/right.
* Right stick X: rotate.
* Hold the left bumper: slow mode.
*
* The loop repeats until STOP is pressed.
*/
function runOpMode() {
front_left_driveAsDcMotor.setDirection("REVERSE");
back_left_driveAsDcMotor.setDirection("REVERSE");
front_right_driveAsDcMotor.setDirection("FORWARD");
back_right_driveAsDcMotor.setDirection("REVERSE");
front_left_driveAsDcMotor.setZeroPowerBehavior("BRAKE");
front_right_driveAsDcMotor.setZeroPowerBehavior("BRAKE");
back_left_driveAsDcMotor.setZeroPowerBehavior("BRAKE");
back_right_driveAsDcMotor.setZeroPowerBehavior("BRAKE");
front_left_driveAsDcMotor.setMode("RUN_WITHOUT_ENCODER");
front_right_driveAsDcMotor.setMode("RUN_WITHOUT_ENCODER");
back_left_driveAsDcMotor.setMode("RUN_WITHOUT_ENCODER");
back_right_driveAsDcMotor.setMode("RUN_WITHOUT_ENCODER");
front_left_driveAsDcMotor.setPower(0);
front_right_driveAsDcMotor.setPower(0);
back_left_driveAsDcMotor.setPower(0);
back_right_driveAsDcMotor.setPower(0);
telemetry.addLine('READY - basic mecanum drive');
telemetry.update();
linearOpMode.waitForStart();
while (linearOpMode.opModeIsActive()) {
forward2 = -gamepad1.getLeftStickY();
strafe = gamepad1.getLeftStickX();
turn = gamepad1.getRightStickX();
speed = 1;
if (gamepad1.getLeftBumper()) {
speed = 0.35;
}
denominator = Math.abs(forward2) + Math.abs(strafe) + Math.abs(turn);
if (denominator < 1) {
denominator = 1;
}
front_left_driveAsDcMotor.setPower(speed * ((forward2 + strafe + turn) / denominator));
front_right_driveAsDcMotor.setPower(speed * (((forward2 - strafe) - turn) / denominator));
back_left_driveAsDcMotor.setPower(speed * (((forward2 - strafe) + turn) / denominator));
back_right_driveAsDcMotor.setPower(speed * (((forward2 + strafe) - turn) / denominator));
telemetry.addNumericData('Forward command', forward2);
telemetry.addNumericData('Strafe command', strafe);
telemetry.addNumericData('Rotate command', turn);
telemetry.addNumericData('Speed scale', speed);
telemetry.addNumericData('FL motor power', front_left_driveAsDcMotor.getPower());
telemetry.addNumericData('FR motor power', front_right_driveAsDcMotor.getPower());
telemetry.addNumericData('BL motor power', back_left_driveAsDcMotor.getPower());
telemetry.addNumericData('BR motor power', back_right_driveAsDcMotor.getPower());
telemetryAddTextData('Face buttons', ['A:',gamepad1.getA(),' B:',gamepad1.getB(),' X:',gamepad1.getX(),' Y:',gamepad1.getY()].join(''));
telemetryAddTextData('D-pad', ['U:',gamepad1.getDpadUp(),' D:',gamepad1.getDpadDown(),' L:',gamepad1.getDpadLeft(),' R:',gamepad1.getDpadRight()].join(''));
telemetryAddTextData('Other buttons', ['LB:',gamepad1.getLeftBumper(),' RB:',gamepad1.getRightBumper(),' Start:',gamepad1.getStart(),' Back:',gamepad1.getBack()].join(''));
telemetry.update();
}
front_left_driveAsDcMotor.setPower(0);
front_right_driveAsDcMotor.setPower(0);
back_left_driveAsDcMotor.setPower(0);
back_right_driveAsDcMotor.setPower(0);
}