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.

100%
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);
}