Not compressing

maybe im missing something but my compressor isn’t compressing when I enable. Here is my robot.java file:

// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

package frc.robot;

import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.PneumaticsModuleType;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.CommandScheduler;

/**
 * The VM is configured to automatically run this class, and to call the functions corresponding to
 * each mode, as described in the TimedRobot documentation. If you change the name of this class or
 * the package after creating this project, you must also update the build.gradle file in the
 * project.
 */
public class Robot extends TimedRobot {
  private Command m_autonomousCommand;

  private RobotContainer m_robotContainer;
  private Compressor compressor;
  ;

  /**
   * This function is run when the robot is first started up and should be used for any
   * initialization code.
   */
  @Override
  public void robotInit() {
    // Instantiate our RobotContainer.  This will perform all our button bindings, and put our
    // autonomous chooser on the dashboard.
    m_robotContainer = new RobotContainer();
    compressor = new Compressor(0, PneumaticsModuleType.CTREPCM);
  }

  /**
   * This function is called every robot packet, no matter the mode. Use this for items like
   * diagnostics that you want ran during disabled, autonomous, teleoperated and test.
   *
   * <p>This runs after the mode specific periodic functions, but before LiveWindow and
   * SmartDashboard integrated updating.
   */
  @Override
  public void robotPeriodic() {
    // Runs the Scheduler.  This is responsible for polling buttons, adding newly-scheduled
    // commands, running already-scheduled commands, removing finished or interrupted commands,
    // and running subsystem periodic() methods.  This must be called from the robot's periodic
    // block in order for anything in the Command-based framework to work.
    CommandScheduler.getInstance().run();
  }

  /** This function is called once each time the robot enters Disabled mode. */
  @Override
  public void disabledInit() {
  }

  @Override
  public void disabledPeriodic() {}

  /** This autonomous runs the autonomous command selected by your {@link RobotContainer} class. */
  @Override
  public void autonomousInit() {
    m_autonomousCommand = m_robotContainer.getAutonomousCommand();

    // schedule the autonomous command (example)
    if (m_autonomousCommand != null) {
      m_autonomousCommand.schedule();
    }
  }

  /** This function is called periodically during autonomous. */
  @Override
  public void autonomousPeriodic() {}

  @Override
  public void teleopInit() {
    // This makes sure that the autonomous stops running when
    // teleop starts running. If you want the autonomous to
    // continue until interrupted by another command, remove
    // this line or comment it out.
    if (m_autonomousCommand != null) {
      m_autonomousCommand.cancel();
    }
    compressor.enableDigital();
  }

  /** This function is called periodically during operator control. */
  @Override
  public void teleopPeriodic() {
  }

  @Override
  public void testInit() {
    // Cancels all running commands at the start of test mode.
    CommandScheduler.getInstance().cancelAll();
  }

  /** This function is called periodically during test mode. */
  @Override
  public void testPeriodic() {}
}

as this is just a test for our pneumatics, we only have one subsystem and command:

package frc.robot.subsystems;

import edu.wpi.first.wpilibj.DoubleSolenoid;

import edu.wpi.first.wpilibj.PneumaticsModuleType;

import edu.wpi.first.wpilibj.DoubleSolenoid.Value;

import edu.wpi.first.wpilibj2.command.SubsystemBase;

public class testPiston extends SubsystemBase {

    DoubleSolenoid solenoid = new DoubleSolenoid(PneumaticsModuleType.CTREPCM, 4, 5);

    public testPiston() {

    }

    public void setUp() {

        solenoid.set(Value.kForward);

    }

    public void setDown() {

        solenoid.set(Value.kReverse);

    }

}
package frc.robot.commands;

import java.util.function.BooleanSupplier;

import edu.wpi.first.wpilibj2.command.CommandBase;
import frc.robot.subsystems.testPiston;

public class enablePiston extends CommandBase {
    testPiston tPiston;
    BooleanSupplier aB;
    BooleanSupplier bB;

    public enablePiston(testPiston t, BooleanSupplier a, BooleanSupplier b) {
        tPiston = t;
        aB = a;
        bB = b;

        addRequirements(tPiston);
    }

    @Override
    public void initialize() {
    }
    
    @Override
    public void execute() {
        if (aB.getAsBoolean()) {
            tPiston.setUp();
        }

       if (bB.getAsBoolean()) {
            tPiston.setDown();
        }
    }
}

any help would be greatly appreciated!!!

Try using
compressor.setClosedLoopControl(state);
the variable “state” is a boolean and setting it to true will run the compressor; setting it to false will stop it.

The compressor code is enabled when you declare a solenoid. The initialize() method of enablePiston could use a tPiston=new TestPiston();

Likely some other initializations as well (lookin’ at aB and bB).

wait so I have to declare a solenoid and the compressor in the same place or does the solenoid start the compressor?

The pneumatics diagram on wpilib has the compressor wires switched as well. the compressor out wires are switched polarity.pneumatics-subsystem is that an error

Yes, that’s an error. Thanks for bringing it to our attention.

Here’s the link to the WPILib Compressor documentation:

from the docs (emphasis mine)

4 Likes

so I don’t need to create a compressor at all I just need a solenoid in the subsystem?

1 Like

Correct, it also works if you have DoubleSolenoids (instead of just single).

Just instantiating one of those should set your compressor’s closed-loop control in motion.

very cool thanks!! was this an update in the 2022 version of wpilib?

No, it’s been this way for a lot of years now. There are still a lot of teams that do it their own way trying to manage the closed-loop of the compressor on their own though, it’s a common thing to see here on CD over the years.

Is your compressor running now? You marked the documentation about the Compressor object being unnecessary as the solution. But since your code instantiated both a compressor and DoubleSolenoid object, it should already be started automatically.

I couldn’t find how either of those bits of code were actually called.

1 Like

sorry! I meant to click the like button :grimacing: :grimacing: :grimacing:

I havent been able to implement the code yet but I will try today!

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.