Pneumatics Won't Fire: A Full Diagnostic Tree
Symptom
Section titled “Symptom”You command a piston and nothing moves. Pneumatics failures are almost always systematic; walk this tree top to bottom and do not skip steps.
1. CAN ID 0 (the #1 mistake)
Section titled “1. CAN ID 0 (the #1 mistake)”The power distribution device and the legacy CTRE PCM should be configured so the FRC libraries can find them. As FRC Zero’s troubleshooting guide states emphatically: the PDP and PCM should ALWAYS have the same CAN ID of 0 , because FRC libraries assume this. A wrong CAN ID makes a perfectly wired module invisible. (The REV Pneumatic Hub is addressed separately by its own CAN ID; match what your code expects.)
2. Is the robot actually enabled and the module told to run?
Section titled “2. Is the robot actually enabled and the module told to run?”-
Confirm the Robot Status Light shows enabled (Teleop/Test), not just connected.
-
The compressor must be enabled. With the modern WPILib API, closed-loop control is already running by default the moment you construct a
Solenoid/DoubleSolenoid— most teams never need to touch theCompressorclass at all. Only instantiate aCompressorobject if you want explicit status/telemetry or to pick a mode yourself withenableDigital(),enableAnalog(), orenableHybrid(); simply constructing theCompressorobject does not by itself start closed-loop control. -
Instantiate solenoids with the right module type:
// CTRE PCM Solenoid intake = new Solenoid(PneumaticsModuleType.CTREPCM, 1); // REV Pneumatic Hub DoubleSolenoid claw = new DoubleSolenoid( PneumaticsModuleType.REVPH, 0, 1);
Using the wrong PneumaticsModuleType is a silent no-op.
3. Power and fuses
Section titled “3. Power and fuses”The PCM/PH and VRM are powered from the power distribution device. Check the fuse/breaker feeding the module. A blown fuse = dead module.
4. Air pressure
Section titled “4. Air pressure”- High side should reach the system max (the legal ceiling is 120 PSI); the regulated low side typically reads ~60 PSI to the cylinders.
- If low side reads 0, the regulator is backwards or set to zero.
- If high side reads 0, a manual vent valve is open or the compressor isn’t charging.
5. Double-solenoid logic
Section titled “5. Double-solenoid logic”A double solenoid driven by two separate, conflicting commands will fire asynchronously or chatter. Drive it with a single set(kForward/kReverse) call and matching tubing lengths/fittings on both ports.
6. Leaks
Section titled “6. Leaks”If the compressor runs continuously and pressure won’t hold, you have a leak. Spray a small amount of soapy water on every fitting; bubbles reveal the leak. A stuck pressure switch can also run the compressor forever, check it.
7. Sticky faults
Section titled “7. Sticky faults”Clear PCM/PH sticky faults in Phoenix Tuner / REV Hardware Client self-test, then verify CAN wiring. Persistent faults after clearing point to a real wiring or firmware problem, update firmware.
The discipline
Section titled “The discipline”Change one thing, retest, then move on. The fastest pneumatics debuggers don’t guess; they walk the tree.
Key takeaways
Section titled “Key takeaways”- The single most common pneumatics bug is a wrong CAN ID, the PDP and legacy CTRE PCM should both be CAN ID 0.
- Enable the compressor in code (construct a Compressor / enableDigital()) and instantiate solenoids with the correct PneumaticsModuleType (CTREPCM vs REVPH).
- A continuously running compressor that won’t hold pressure means a leak (soapy-water test) or a stuck pressure switch.
This lesson was adapted from learnfrc.com.
