Skip to content

Mini-Project 2: A Two-Stage Cascade Elevator

learnfrc.com
learnfrc.comAuthor
Veer Bajaj
Veer BajajMaintainer

A 2-stage cascade elevator that lifts a 12 lb carriage 36 in. We’ll size the drum, pick parts, and tune the gravity feedforward.

In a cascade elevator each stage is driven by the previous one, so the carriage moves N times the first-stage motion (N = number of moving stages). With 2 moving stages, the carriage moves 2x the rope drawn onto the drum. To get 36 in of carriage travel you must spool 18 in of rope per side.

Force to lift the carriage: F = m * g = 5.44 kg * 9.81 = 53.4 N (~12 lbf). With a 1.5 in diameter drum (r = 0.019 m), and the 2x cascade multiplier doubling the load felt at the drum, drum torque is roughly F * r * 2 ≈ 53.4 * 0.019 * 2 = 2.0 Nm.

Use two NEO Vortex motors (REV-21-1652, 3.6 Nm stall each) on a shared shaft through a MAXPlanetary 9:1 cartridge. Two motors at 9:1 give huge margin so the elevator accelerates fast and holds easily. Set each controller to a 40 A smart current limit; with two motors that’s an 80 A combined draw cap, which is sane against a 120 A main breaker budget.

Step 3 — Control with ElevatorFeedforward

Section titled “Step 3 — Control with ElevatorFeedforward”

Unlike an arm, gravity on an elevator is constant (no cosine term), so kG is a single voltage that holds the carriage at any height. Constructor order is (kS, kG, kV, kA).

private final ProfiledPIDController pid =
new ProfiledPIDController(2.0, 0.0, 0.0,
new TrapezoidProfile.Constraints(1.5, 4.0)); // m/s, m/s^2
private final ElevatorFeedforward ff =
new ElevatorFeedforward(0.0, 2.28, 3.07, 0.41); // kS, kG, kV, kA
@Override
public void periodic() {
double pos = drumEncoder.getDistanceMeters();
double pidV = pid.calculate(pos);
double ffV = ff.calculate(pid.getSetpoint().velocity);
leftMotor.setVoltage(pidV + ffV);
rightMotor.setVoltage(pidV + ffV); // follower
}

The gains kG=2.28, kV=3.07, kA=0.41, kP=2.0 are the exact worked values from WPILib’s vertical-elevator tuning tutorial (that tutorial omits kS for simplicity, so measure your own kS with SysId). Re-characterize all gains for your real elevator.

WPILib’s elevator tutorial sequence: set everything to 0, raise kG as high as possible without the elevator drifting upward, then kV to match the straight (constant-velocity) segments of the motion plot, then kA to match the curved (accelerating) segments, then kP until the actual position overshoots, then back off 20%.

Add a hard bottom limit switch and a software soft limit. Cascade elevators can pinch fingers and crash stages; always test under reduced velocity constraints (~0.3 m/s) first. Use a constant-force spring or surgical tubing to offload gravity so a code fault doesn’t slam the carriage down.

  • A 2-stage cascade elevator moves the carriage 2x the rope spooled; account for this multiplier in both travel and effective drum load.
  • Elevator gravity is constant, so ElevatorFeedforward’s kG is a single holding voltage with no cosine term; WPILib’s tutorial gives kG=2.28, kV=3.07, kA=0.41, kP=2.0 (and omits kS, so measure it).
  • Tune kG -> kV -> kA -> kP (back off 20% after overshoot), and always add a bottom limit switch plus reduced-velocity first tests.

This lesson was adapted from learnfrc.com.