Log in

View Full Version : Pneumatics Programming


Team 4939
13-02-2015, 10:09
Hello,

I was just adding the pneumatics code required, and being the rookie I am :) , I came up with an error. The thing is that I used the code from http://wpilib.screenstepslive.com/s/3120/m/7912/l/85779-operating-a-compressor-for-pneumatics exactly(or so I think) and there seems to be an error. The error message is: Syntax error, insert "AssignmentOperator Expression" to complete Expression. I have posted the code below:

package org.usfirst.frc.team4939.robot;

import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.Solenoid;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;

/**
* The VM is configured to automatically run this class, and to call the
* functions corresponding to each mode, as described in the IterativeRobot
* documentation. If you change the name of this class or the package after
* creating this project, you must also update the manifest file in the resource
* directory.
*/
public class Robot extends IterativeRobot {
RobotDrive myRobot;
Joystick stick;
int autoLoopCounter;
Victor victor;
Compressor c;

/**
* This function is run when the robot is first started up and should be
* used for any initialization code.
*/
public void robotInit() {
myRobot = new RobotDrive(0,1,2,3);
stick = new Joystick(0);
victor = new Victor(4);
c = new Compressor(0);
c->SetClosedLoopControl(true); // THIS SEEMS TO BE THE PROBLEM
}

/**
* This function is run once each time the robot enters autonomous mode
*/
public void autonomousInit() {
autoLoopCounter = 0;
}

/**
* This function is called periodically during autonomous
*/
public void autonomousPeriodic() {
if(autoLoopCounter < 100) //Check if we've completed 100 loops (approximately 2 seconds)
{
myRobot.drive(-0.5, 0.0); // drive forwards half speed
autoLoopCounter++;
} else {
myRobot.drive(0.0, 0.0); // stop robot
}
}

/**
* This function is called once each time the robot enters tele-operated mode
*/
public void teleopInit(){
}

/**
* This function is called periodically during operator control
*/
public void teleopPeriodic() {
double rot = -stick.getX();
double speed = -stick.getY();
myRobot.arcadeDrive(speed,rot);
if(stick.getRawButton(3)){
victor.set(1);
}
else if(stick.getRawButton(2)){
victor.set(-1);
}
else{
victor.set(0);
}
ArmsDouble= new DoubleSolenoid(1, 2);
ArmsDouble= new DoubleSolenoid(1, 1, 2);
if(stick.getRawButton(4)){
ArmsDouble.set(DoubleSolenid.Value.kForward);

}
else if(stick.getRawButton(5)){
ArmsDouble.set(DoubleSolenoid.Value.kReverse);

}
}
/**
* This function is called periodically during test mode
*/
public void testPeriodic() {
LiveWindow.run();
}

}


Thanks to all in advance.

Oromus
13-02-2015, 10:29
Change this... c->SetClosedLoopControl(true); ...to this... c.setClosedLoopControl(true);
The "->" needs to be a "." and "Set" needs to become "set". That WPILib example is not showing the code in Java syntax. Also, for future reference, starting this year you don't have to create a Compressor object or do anything with it; if you make any pnuematics-related classes (i.e. Solenoids), the compressor turns on and regulates itself without any code needed. Also, that link appears to be a 2014 code example; you may want to look at 2015 code examples here (http://wpilib.screenstepslive.com/s/4485/m/13809) instead. Good luck with programming! :)

Ozuru
13-02-2015, 10:50
As Oromus said, that example is in C++. All you're doing is calling a function -- inside the Compressor object there is a function called setClosedLoopControl that takes a boolean as an argument. In Java, that would be articulated as...


c.setClosedLoopControl(true);


...while in C++ that would be:


c->SetClosedLoopControl(true);


They both do the same thing; they're just differences between languages. It's like comparing apples to oranges -- they both can achieve the same thing (making you less hungry) but the means of doing so is relatively different.

that was a horrible example imsosorry

Team 4939
13-02-2015, 15:20
As Oromus said, that example is in C++. All you're doing is calling a function -- inside the Compressor object there is a function called setClosedLoopControl that takes a boolean as an argument. In Java, that would be articulated as...


c.setClosedLoopControl(true);


...while in C++ that would be:


c->SetClosedLoopControl(true);


They both do the same thing; they're just differences between languages. It's like comparing apples to oranges -- they both can achieve the same thing (making you less hungry) but the means of doing so is relatively different.

that was a horrible example imsosorry

Change this... c->SetClosedLoopControl(true); ...to this... c.setClosedLoopControl(true);
The "->" needs to be a "." and "Set" needs to become "set". That WPILib example is not showing the code in Java syntax. Also, for future reference, starting this year you don't have to create a Compressor object or do anything with it; if you make any pnuematics-related classes (i.e. Solenoids), the compressor turns on and regulates itself without any code needed. Also, that link appears to be a 2014 code example; you may want to look at 2015 code examples here (http://wpilib.screenstepslive.com/s/4485/m/13809) instead. Good luck with programming! :)


Thank You, very much that seems to have fixed my problem.

Team 4939
13-02-2015, 15:22
package org.usfirst.frc.team4939.robot;

import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.DoubleSolenoid;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;

/**
* The VM is configured to automatically run this class, and to call the
* functions corresponding to each mode, as described in the IterativeRobot
* documentation. If you change the name of this class or the package after
* creating this project, you must also update the manifest file in the resource
* directory.
*/
public class Robot extends IterativeRobot {
RobotDrive myRobot;
Joystick stick;
int autoLoopCounter;
Victor victor;
Compressor c;

/**
* This function is run when the robot is first started up and should be
* used for any initialization code.
*/
public void robotInit() {
myRobot = new RobotDrive(0,1,2,3);
stick = new Joystick(0);
victor = new Victor(4);
}

/**
* This function is run once each time the robot enters autonomous mode
*/
public void autonomousInit() {
autoLoopCounter = 0;
}

/**
* This function is called periodically during autonomous
*/
public void autonomousPeriodic() {
if(autoLoopCounter < 100) //Check if we've completed 100 loops (approximately 2 seconds)
{
myRobot.drive(-0.5, 0.0); // drive forwards half speed
autoLoopCounter++;
} else {
myRobot.drive(0.0, 0.0); // stop robot
}
}

/**
* This function is called once each time the robot enters tele-operated mode
*/
public void teleopInit(){
}

/**
* This function is called periodically during operator control
*/
public void teleopPeriodic() {
double rot = -stick.getX();
double speed = -stick.getY();
myRobot.arcadeDrive(speed,rot);
if(stick.getRawButton(3)){
victor.set(1);
}
else if(stick.getRawButton(2)){
victor.set(-1);
}
else{
victor.set(0);
}
ArmsDouble= new DoubleSolenoid(1, 2); // THATS SEEMS TO BE THE PROBLEM
ArmsDouble= new DoubleSolenoid(1, 1, 2);// THAT SEEMS TO BE THE PROBLEM
if(stick.getRawButton(4)){
ArmsDouble.set(DoubleSolenoid.Value.kForward);

}
else if(stick.getRawButton(5)){
ArmsDouble.set(DoubleSolenoid.Value.kReverse);

}
}
/**
* This function is called periodically during test mode
*/
public void testPeriodic() {
LiveWindow.run();
}

}


I seem to have a different problem now.

The error code that shows up is: Multiple markers at this line
- DoubleSolenoid cannot be resolved
to a type
- ArmsDouble cannot be resolved to a
variable

Thank You

Rakusan2
13-02-2015, 15:34
package org.usfirst.frc.team4939.robot;

import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.DoubleSolenoid;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;

/**
* The VM is configured to automatically run this class, and to call the
* functions corresponding to each mode, as described in the IterativeRobot
* documentation. If you change the name of this class or the package after
* creating this project, you must also update the manifest file in the resource
* directory.
*/
public class Robot extends IterativeRobot {
RobotDrive myRobot;
Joystick stick;
int autoLoopCounter;
Victor victor;
Compressor c;

/**
* This function is run when the robot is first started up and should be
* used for any initialization code.
*/
public void robotInit() {
myRobot = new RobotDrive(0,1,2,3);
stick = new Joystick(0);
victor = new Victor(4);
}

/**
* This function is run once each time the robot enters autonomous mode
*/
public void autonomousInit() {
autoLoopCounter = 0;
}

/**
* This function is called periodically during autonomous
*/
public void autonomousPeriodic() {
if(autoLoopCounter < 100) //Check if we've completed 100 loops (approximately 2 seconds)
{
myRobot.drive(-0.5, 0.0); // drive forwards half speed
autoLoopCounter++;
} else {
myRobot.drive(0.0, 0.0); // stop robot
}
}

/**
* This function is called once each time the robot enters tele-operated mode
*/
public void teleopInit(){
}

/**
* This function is called periodically during operator control
*/
public void teleopPeriodic() {
double rot = -stick.getX();
double speed = -stick.getY();
myRobot.arcadeDrive(speed,rot);
if(stick.getRawButton(3)){
victor.set(1);
}
else if(stick.getRawButton(2)){
victor.set(-1);
}
else{
victor.set(0);
}
ArmsDouble= new DoubleSolenoid(1, 2); // THATS SEEMS TO BE THE PROBLEM
ArmsDouble= new DoubleSolenoid(1, 1, 2);// THAT SEEMS TO BE THE PROBLEM
if(stick.getRawButton(4)){
ArmsDouble.set(DoubleSolenoid.Value.kForward);

}
else if(stick.getRawButton(5)){
ArmsDouble.set(DoubleSolenoid.Value.kReverse);

}
}
/**
* This function is called periodically during test mode
*/
public void testPeriodic() {
LiveWindow.run();
}

}


I seem to have a different problem now.

The error code that shows up is: Multiple markers at this line
- DoubleSolenoid cannot be resolved
to a type
- ArmsDouble cannot be resolved to a
variable

Thank You

You need a declaration for ArmsDouble
DoubleSolenoid ArmsDouble;

also why are you initializing ArmsDouble twice?

Oromus
13-02-2015, 15:39
As Rakusan2 said, you need to declare ArmsDouble somewhere, i.e. "DoubleSolenoid ArmsDouble = new DoubleSolenoid(1, 2)". DoubleSolenoid not being able to resolved may be fixed by that as well.

Team 4939
13-02-2015, 15:42
You need a declaration for ArmsDouble
DoubleSolenoid ArmsDouble;

also why are you initializing ArmsDouble twice?

If I am using a Double Solenoid do I not need to initialize it twice for both the In and Out feature?

That's the impression this gave me: http://wpilib.screenstepslive.com/s/4485/m/13809/l/241866-operating-pneumatic-cylinders-solenoids

Rakusan2
13-02-2015, 15:46
If I am using a Double Solenoid do I not need to initialize it twice for both the In and Out feature?

That's the impression this gave me: http://wpilib.screenstepslive.com/s/4485/m/13809/l/241866-operating-pneumatic-cylinders-solenoids

No, a single declaration and initialization of DoubleSolenoid takes care of both solenoids

Oromus
13-02-2015, 15:46
That example was just showing the different ways you can initialize your DoubleSolenoid; you do one constructor or the other.

viggy96
15-02-2015, 00:38
DoubleSolenoid(in channel, out channel). Also, the compressor does not need to be instantiated. The compressor is on a closed loop controlled by the PCM. You just need to instantiate the DoubleSolenoid once, and and set the position on button values.