Mini-Project 2: A Two-Stage Cascade Elevator
Build a cascade elevator: compute rigging ratio, size two motors with current limits, and write ElevatorFeedforward + motion profiling that holds position against gravity.
Sign in to track progress, earn XP, and save lessons.
The goal
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.
Step 1 — Rigging and travel
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.
Step 2 — Force and motor sizing
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
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.
Step 4 — Tuning order
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%.
Step 5 — Mechanical safety
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.
Key takeaways
- 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.
Lesson quiz
RequiredAnswer all 3 questions correctly to complete this lesson.
1.In a 2-stage cascade elevator, how far does the carriage travel relative to the rope spooled onto the first-stage drum?
2.Why does ElevatorFeedforward use a single kG holding voltage with no cosine term, unlike ArmFeedforward?
3.What gain-tuning order does WPILib's vertical-elevator tutorial recommend?
Answer every question to submit.