Skip to content

Servo Presets

Johan Vandegriff edited this page Oct 19, 2016 · 5 revisions

The idea of servo presets is to replace "magic numbers" (numbers whose purpose is not obvious) with named servo positions. For example, instead of something 7.341, you can write ArmServoPresets.LEFT.

Another feature of the servo presets is that you can modify the preset values without changing the app and re-uploading to the phone.

The way these two features are implemented is that each servo has an enum of presets:

    //this stores all the possible values for the arm servo
    public enum ArmServoPresets {
        LEFT,
        MIDDLE,
        RIGHT
    }

and each RobotCfg has a list of servos, each of which has a hardware name (such as "armServo") and a list of presets determined from the enum (such as ArmServoPresets.values())

To actually enter the preset values, you need to make and run a ServoTuneOp:

/sample/v3/SampleServoTuneOp.java

package org.firstinspires.ftc.teamcode.sample.v3;

import com.qualcomm.robotcore.eventloop.opmode.TeleOp;

import ftc.evlib.hardware.config.RobotCfg;
import ftc.evlib.opmodes.AbstractServoTuneOp;

/**
 * This file was made by the electronVolts, FTC team 7393
 * Date Created: 10/18/16
 *
 * This opmode is very short since the superclass, AbstractServoTuneOp does most of the work. It
 * allows you to change your servo presets without changing the code and re-deploying it to the
 * phone. This means that you can swap out a servo and re-tune it without having to go into the
 * program and fix magic numbers. Note:  It only works if you use presets everywhere instead of
 * hardcoded values.
 *
 * How to use:
 * Select this opmode from the TeleOp menu and run it.
 * Use the dpad up and down to cycle through all the servos
 * Use the dpad left and right to move through the presets for that servo.
 * Press start to save the current preset of the current servo to the current value.
 *
 * The presets are saved in files that are retrieved when you run other opmodes to find the value of each preset.
 *
 */

@TeleOp(name="SampleServoTuneOp")
public class SampleServoTuneOp extends AbstractServoTuneOp {
    @Override
    protected RobotCfg createHardwareCfg() {
        //create a new SampleRobotConfig and return it.
        //the superclass will extract the servos and do the rest.
        return new SampleRobotCfg(hardwareMap);
    }
}

The details of how the servos are initialized are in the next step: Adding Servos to the Configuration