Mini-Project 2: A Two-Stage Cascade Elevator
The goal
Section titled “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
Section titled “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
Section titled “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
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^2private final ElevatorFeedforward ff = new ElevatorFeedforward(0.0, 2.28, 3.07, 0.41); // kS, kG, kV, kA
@Overridepublic 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
Section titled “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
Section titled “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
Section titled “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.
This lesson was adapted from learnfrc.com.
