Solenoid Code Does Not Work!

We are using 12volt solenoids hooked up through the solenod break out. Everything in the code so far works besides the solenoids. The lights on the module don’t light up either. The solenoids work and the pistons fire when the buttons are pressed manually.

#include “WPILib.h”

/**

  • This is a demo program showing the use of the RobotBase class.
  • The SimpleRobot class is the base of a robot application that will automatically call your
  • Autonomous and OperatorControl methods at the right time as controlled by the switches on
  • the driver station or the field controls.
    */
    class MyCode : public SimpleRobot
    {
    RobotDrive *myRobot; // robot drive system pointer
    Joystick *stick; // arcade drive joystick pointer
    DriverStation *ds; // driver station object
    Solenoid *s1;
    Solenoid *s2;
    Solenoid *s3;
    Solenoid *s4;
    Solenoid *s5;
    Solenoid *s6;
    Compressor *c;
    bool btn1state;
    bool btn2state;
    bool btn6state;
    bool btn7state;
    bool quickReleaseState;
    bool resetPistonState;

public:
/**
*
*

  • Constructor for this robot subclass.

  • Create an instance of a RobotDrive with left and right motors plugged into PWM

  • ports 1 and 2 on the first digital module.
    */
    MyCode(void)
    {
    ds = DriverStation::GetInstance();
    myRobot = new RobotDrive(1, 2); // create robot drive base
    stick = new Joystick(1); // create the joystick
    s1 = new Solenoid(1); // allocate the Solenoid objects
    s2 = new Solenoid(1);
    s3 = new Solenoid(1);
    s4 = new Solenoid(1);
    s5 = new Solenoid(1);
    s6 = new Solenoid(1);
    c = new Compressor(1,1);
    c->Start();

    GetWatchdog().SetExpiration(5.0);
    //AxisCamera &myCamera = AxisCamera::getInstance();

}

/**

  • Drive left & right motors for 2 seconds, enabled by a jumper (jumper

  • must be in for autonomous to operate).
    */
    void Autonomous(void)
    {
    GetWatchdog().SetEnabled(false);

     for (int j = 0; j<3; j++)
     {
    

// myRobot->Drive(0.5, 0.0); // drive forwards half speed
s1->Set(true); //activate quick release retract
Wait(1.0);
s1->Set(false); //for 2 seconds
s3->Set(true); //activate reset piston extend
Wait(1.0);
s3->Set(false);
s2->Set(true); //activate quick release piston extend
Wait(1.0);
s2->Set(false);
s4->Set(true); //activate reset piston retract
Wait(1.0);
s4->Set(false);
}
myRobot->Drive(0.0, 0.0); // stop robot

  GetWatchdog().SetEnabled(true);

}

/**

  • Runs the motors under driver control with either tank or arcade steering selected

  • by a jumper in DS Digin 0. Also an arm will operate based on a joystick Y-axis.
    */
    void OperatorControl(void)
    {
    btn1state = 0;
    btn2state = 0;
    btn6state = 0;
    btn7state = 0;
    quickReleaseState = 1; //quick release piston is extended
    resetPistonState = 0; //reset pistion is retracted

    while (IsOperatorControl())
    {
    GetWatchdog().Feed();

     	myRobot->ArcadeDrive(stick);	 // drive with arcade style
     	
     if (stick->GetRawButton(1) && !btn1state) //button is pressed but not being held
     {
     	btn1state = 1;						//button is being pressed
     	s1->Set(true);					//activate quick release retract
     	Wait(1.0);							//for 2 seconds
     	s1->Set(false);					//reset state
     	s1->Set(true);					//activate reset piston extend
     	Wait(1.0);
     	s3->Set(false);					//restet state
     	s2->Set(true);					//activate quick release piston extend
     	Wait(1.0);
     	s2->Set(false);					//reset state
     	s4->Set(true);					//activate reset piston retract
     	Wait(1.0);
     	s4->Set(false);					//reset state
     	
     }
     
     else if(!stick->GetRawButton(1) && btn1state) //button is not being pressed
     {
     	btn1state = 0;						//reset state
     }
     
     if (stick->GetRawButton(6) && !btn6state)
     {
     	btn6state = 1;
     	
     	if (quickReleaseState)
     	{
     		s2->Set(false);
     		s1->Set(true);					//activate quick release retract
     		quickReleaseState = 0;				//quick release piston is retracted
     	}
     	
     	else
     	{
     		s1->Set(false);
     		s2->Set(true);					//activate quick release extend
     		quickReleaseState = 1;				//quick release piston is extended
     	}
     	
     }
     else if(!stick->GetRawButton(6) && btn6state) //button is not being pressed
     {
     	btn6state = 0;						//reset state
     }
     	
     if (stick->GetRawButton(7) && !btn7state)
     {
     	btn7state = 1;
     	
     	if (!resetPistonState)
     	{
     		s4->Set(false);
     		s3->Set(true);					//activate reset extend
     		resetPistonState = 1;				//reset piston is extended
     	}
     	
     	else
     	{
     		s3->Set(false);
     		s4->Set(true);					//activate reset retract
     		resetPistonState = 0;				//reset piston is retracted
     	}
     	
     }
     else if(!stick->GetRawButton(7) && btn7state) //button is not being pressed
     {
     	btn7state = 0;						//reset state
     }
    

    }
    }
    };

START_ROBOT_CLASS(MyCode);

What is wrong with my code? Please help me!

You posted long code without indentation. Use the “#” button the next time. I didn’t look through the entire code because of the readability but for the first mistake, you were creating six solenoids on the same DO channel (channel 1)???

well, thats embarrasing… sorry

also, thanks for the tip on posting code
Edit: if i repost the code with proper format would you mind giving it a look over for any other obvious mistakes?

I suppose that also explains the error:

Fatal error “Attempting to reuse an allocated resource” in Allocate() in C:/WindRiver/workspace/WPLib/Resource.cpp at line 76

that I was getting in the diagnostics tab

Yep.

My code with formatting preserved:

#include "WPILib.h"

/**
 * This is a demo program showing the use of the RobotBase class.
 * The SimpleRobot class is the base of a robot application that will automatically call your
 * Autonomous and OperatorControl methods at the right time as controlled by the switches on
 * the driver station or the field controls.
 */
class MyCode : public SimpleRobot
{
	RobotDrive *myRobot;			// robot drive system pointer
	Joystick *stick;				// arcade drive joystick pointer
	DriverStation *ds;				// driver station object
	Solenoid *s1;
	Solenoid *s2;
	Solenoid *s3;
	Solenoid *s4;
	Solenoid *s5;
	Solenoid *s6;
	Compressor *c;
	bool btn1state;
	bool btn2state;
	bool btn6state;
	bool btn7state;
	bool quickReleaseState;
	bool resetPistonState;


public:
	/**
	 * 
	 * 
	 * Constructor for this robot subclass.
	 * Create an instance of a RobotDrive with left and right motors plugged into PWM
	 * ports 1 and 2 on the first digital module.
	 */
	MyCode(void)
	{
		ds = DriverStation::GetInstance();
		myRobot = new RobotDrive(1, 2);			// create robot drive base
		stick = new Joystick(1);				// create the joystick
		s1 = new Solenoid(1);					// allocate the Solenoid objects
		s2 = new Solenoid(2);
		s3 = new Solenoid(3);
		s4 = new Solenoid(4);
		s5 = new Solenoid(5);
		s6 = new Solenoid(6);
		c = new Compressor(1,1);
		c->Start();
		
		GetWatchdog().SetExpiration(5.0);
		//AxisCamera &myCamera = AxisCamera::getInstance();
		
	}

	/**
	 * Drive left & right motors for 2 seconds, enabled by a jumper (jumper
	 * must be in for autonomous to operate).
	 */
	void Autonomous(void)
	{
		GetWatchdog().SetEnabled(false);
		
			for (int j = 0; j<3; j++)
			{
//			myRobot->Drive(0.5, 0.0);			// drive forwards half speed
			s1->Set(true);					//activate quick release retract
			Wait(1.0);
			s1->Set(false);					//for 2 seconds
			s3->Set(true);					//activate reset piston extend
			Wait(1.0);
			s3->Set(false);
			s2->Set(true);					//activate quick release piston extend
			Wait(1.0);
			s2->Set(false);
			s4->Set(true);					//activate reset piston retract
			Wait(1.0);
			s4->Set(false);
			}
			myRobot->Drive(0.0, 0.0);			// stop robot
			
		GetWatchdog().SetEnabled(true);
	}

	/**
	 * Runs the motors under driver control with either tank or arcade steering selected
	 * by a jumper in DS Digin 0. Also an arm will operate based on a joystick Y-axis. 
	 */
	void OperatorControl(void)
	{
		btn1state = 0;
		btn2state = 0;
		btn6state = 0;
		btn7state = 0;
		quickReleaseState = 1; 					//quick release piston is extended
		resetPistonState = 0;					//reset pistion is retracted

	
		while (IsOperatorControl())
		{
			GetWatchdog().Feed();
			
				myRobot->ArcadeDrive(stick);	 // drive with arcade style
				
			if (stick->GetRawButton(1) && !btn1state) //button is pressed but not being held
			{
				btn1state = 1;						//button is being pressed
				s1->Set(true);					//activate quick release retract
				Wait(1.0);							//for 2 seconds
				s1->Set(false);					//reset state
				s1->Set(true);					//activate reset piston extend
				Wait(1.0);
				s3->Set(false);					//restet state
				s2->Set(true);					//activate quick release piston extend
				Wait(1.0);
				s2->Set(false);					//reset state
				s4->Set(true);					//activate reset piston retract
				Wait(1.0);
				s4->Set(false);					//reset state
				
			}
			
			else if(!stick->GetRawButton(1) && btn1state) //button is not being pressed
			{
				btn1state = 0;						//reset state
			}
			
			if (stick->GetRawButton(6) && !btn6state)
			{
				btn6state = 1;
				
				if (quickReleaseState)
				{
					s2->Set(false);
					s1->Set(true);					//activate quick release retract
					quickReleaseState = 0;				//quick release piston is retracted
				}
				
				else
				{
					s1->Set(false);
					s2->Set(true);					//activate quick release extend
					quickReleaseState = 1;				//quick release piston is extended
				}
				
			}
			else if(!stick->GetRawButton(6) && btn6state) //button is not being pressed
			{
				btn6state = 0;						//reset state
			}
				
			if (stick->GetRawButton(7) && !btn7state)
			{
				btn7state = 1;
				
				if (!resetPistonState)
				{
					s4->Set(false);
					s3->Set(true);					//activate reset extend
					resetPistonState = 1;				//reset piston is extended
				}
				
				else
				{
					s3->Set(false);
					s4->Set(true);					//activate reset retract
					resetPistonState = 0;				//reset piston is retracted
				}
				
			}
			else if(!stick->GetRawButton(7) && btn7state) //button is not being pressed
			{
				btn7state = 0;						//reset state
			}
			

		}
	}
};

START_ROBOT_CLASS(MyCode);

thanks for any and all help

Assuming your code is reflecting the connection of channels accurately, the code looks find. However, without knowing what the solenoid configurations are, I would guess there is one more mistake.


			if (stick->GetRawButton(1) && !btn1state) //button is pressed but not being held
			{
				btn1state = 1;						//button is being pressed
				s1->Set(true);					//activate quick release retract
				Wait(1.0);							//for 2 seconds
				s1->Set(false);					//reset state
				s1->Set(true); <<< Should this be s3???					//activate reset piston extend
				Wait(1.0);
				s3->Set(false);					//restet state
				s2->Set(true);					//activate quick release piston extend
				Wait(1.0);
				s2->Set(false);					//reset state
				s4->Set(true);					//activate reset piston retract
				Wait(1.0);
				s4->Set(false);					//reset state
				
			}

ooh, nice catch, thank you.
Gah still 12hours till i can test my code again!

also, one of the simplest ways to mess up that pneumatics board is double checking that it’s in slot 8 on the CRIO and using the constructor that specifies slot as well as channel, for code clarity mostly.