Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   C/C++ (http://www.chiefdelphi.com/forums/forumdisplay.php?f=183)
-   -   Pneumatics code problems. (http://www.chiefdelphi.com/forums/showthread.php?t=154972)

charlier999 08-02-2017 20:40

Pneumatics code problems.
 
Recently, I have been dealing with newly written pneumatics code not actuating Cylinders for a gear holder and shifters.
This is what I am trying to do
PHP Code:

"A" button is pressed Cylinder extends > "A" button is pressed again Cylinder retracts 

I have tried to use a bool to act as a to swich between True and False when the cylinder extends or retracts, but that didn't do what I wanted above. Is there any other way of doing this.

Please ignore spelling mistakes in comments in code
If there is any other mistakes in the code that are not related to Pneumatics, feel free to say so.
Robot Code \/
Code:

#include <iostream>
#include <memory>
#include <string>
#include <IterativeRobot.h>
#include <LiveWindow/LiveWindow.h>
#include <SmartDashboard/SendableChooser.h>
#include <SmartDashboard/SmartDashboard.h>
#include "WPILib.h"
#include "CANTalon.h"

class Robot: public frc::IterativeRobot {
public:
//-------------------------------------------------------//
//    Other Decerations                                  //
//-------------------------------------------------------//
        bool shifter_varable = true;
        bool gear_enabled = false;
//-------------------------------------------------------//
//  Deceration of Objects                              //
//-------------------------------------------------------//
        Joystick *driver;
        Joystick *driverV2;
        Joystick *op;

        CANTalon *drive_right_a, *drive_right_b, *drive_left_a, *drive_left_b;
        CANTalon *intake;
        CANTalon *aggitater;
        CANTalon *shooter;
        CANTalon *climber;

        RobotDrive *drive_base;

        Compressor *compressor;

        DoubleSolenoid *gear;
        DoubleSolenoid *shifter;

        //WIP  \/
        //Encoder *shooter_encoder;

        Robot() {
//-------------------------------------------------------//
//    Asigning Objects to Componints and Electronics    //
//-------------------------------------------------------//
                driver = new Joystick(0);
                op = new Joystick(1);
                driverV2 = new Joystick(2);

                drive_right_a = new CANTalon(8);
                drive_right_b = new CANTalon(9);
                drive_left_a = new CANTalon(1);
                drive_left_b = new CANTalon(2);

                intake = new CANTalon(4);
                shooter = new CANTalon(7);
                climber = new CANTalon(6);
                aggitater = new CANTalon(3);

                drive_base = new RobotDrive(drive_right_a, drive_right_b, drive_left_a, drive_left_b);

                compressor = new Compressor(0);

                gear = new DoubleSolenoid(1, 3);
                shifter = new DoubleSolenoid(2, 4);
        }
        void RobotInit() {
//-------------------------------------------------------//
//                Robot vision Code                      //
//-------------------------------------------------------//
                auto cam = frc::CameraServer::GetInstance();
                cam->StartAutomaticCapture();
//-------------------------------------------------------//
//                Robot Compressor                      //
//-------------------------------------------------------//
                compressor->SetClosedLoopControl(true);
        }

        void AutonomousInit() override {}

        void AutonomousPeriodic() {
                drive_right_a->Set(1.0);
        }

        void TeleopInit() {}

        void TeleopPeriodic() {

                // drive train; (left joystick; y axis; left drive) (right joystick: y axis; right drive)
                drive_base->TankDrive(-driver->GetRawAxis(1), -driver->GetRawAxis(5));
//-------------------------------------------------------//
//                Drive Remote                          //
//-------------------------------------------------------//

                //shooter; left bumper
                if(driver->GetRawButton(5)) {
                        shooter->Set(0.60);
                }else{
                        shooter->Set(0.0);
                }

                //intake in; right trigger
                if (driver->GetRawButton(7)) {
                        intake->Set(-1.0);
                }else{
                        intake->Set(0.0);
                }

                //aggitator; "B" button
                if (driver->GetRawButton(3)){
                        aggitater->Set(1.0);
                }else{
                        aggitater->Set(0.0);
                }

                //shifters; "A" button
                if (driver->GetRawButton(2)){
                        if (shifter_varable==true){
                                shifter->Set(DoubleSolenoid::Value::kReverse);
                                shifter_varable = false;
                        }else{
                                shifter->Set(DoubleSolenoid::Value::kForward);
                                shifter_varable = true;
                        }
                }
                //Gear open close; "Y" button
                if (driver->GetRawButton(4)){
                        if (gear_enabled == true){
                                gear->Set(DoubleSolenoid::Value::kReverse);
                                gear_enabled = false;
                        }else{
                                gear->Set(DoubleSolenoid::Value::kForward);
                                gear_enabled = true;
                        }
                }
//-------------------------------------------------------//
//                        Operator Remote                      //
//-------------------------------------------------------//
                //climber up; right bumper; op
                if (op->GetRawAxis(1)){
                        climber->Set(1.0);
                }
        }
private:
};
START_ROBOT_CLASS(Robot);

Sorry for being a long post

Thx.

charlier999 08-02-2017 20:44

Re: Pneumatics code problems.
 
Pneumatics are run through a manifold.
If this ends up being some thing non related to programming, I will reply if it is.

Thx.

euhlmann 08-02-2017 23:06

Re: Pneumatics code problems.
 
Code:


bool wasAPressed = false;

// then in in teleopPeriodic...

if (driver->GetRawButton(2)) {
    if (!wasAPressed) {
        wasAPressed = true;
        shifter->Set(shifter->Get() == DoubleSolenoid::Value::kReverse ? DoubleSolenoid::Value::kForward : DoubleSolenoid::Value::kReverse);
    }
} else {
    wasAPressed = false;
}


charlier999 09-02-2017 17:25

Re: Pneumatics code problems.
 
Does the word "Value" in
DoubleSolenoid::Value::kReverse ?
represents the value in the Double Solenoid is pluged into the PCM or something else?
Thx.

charlier999 09-02-2017 17:53

Re: Pneumatics code problems.
 
Never mind what I said. I found out what it means
Quote:

Originally Posted by charlier999 (Post 1642703)
Does the word "Value" in
DoubleSolenoid::Value::kReverse ?
represents the value in the Double Solenoid is pluged into the PCM or something else?
Thx.

Thx.

charlier999 09-02-2017 22:01

Re: Pneumatics code problems.
 
Quote:

Originally Posted by euhlmann (Post 1642326)
Code:


bool wasAPressed = false;

// then in in teleopPeriodic...

if (driver->GetRawButton(2)) {
    if (!wasAPressed) {
        wasAPressed = true;
        shifter->Set(shifter->Get() == DoubleSolenoid::Value::kReverse ? DoubleSolenoid::Value::kForward : DoubleSolenoid::Value::kReverse);
    }
} else {
    wasAPressed = false;
}


The one problem with this code is that when i press the button longer than 1/50th of a second(50 cycles per second the rio reads the code), it hastily switches back and forth between on and off. Is there any way of fixing the problem or do i just need to have extremely fast fingers for that button.

Thx.

euhlmann 10-02-2017 01:18

Re: Pneumatics code problems.
 
Quote:

Originally Posted by charlier999 (Post 1642796)
The one problem with this code is that when i press the button longer than 1/50th of a second(50 cycles per second the rio reads the code), it hastily switches back and forth between on and off. Is there any way of fixing the problem or do i just need to have extremely fast fingers for that button.

Thx.

My code shouldn't do that. Notice how it sets a flag wasAPressed to make sure it doesn't continuously run shifting. Make sure wasAPressed is a member variable, not a local variable

charlier999 10-02-2017 18:23

Re: Pneumatics code problems.
 
Quote:

Originally Posted by euhlmann (Post 1642844)
My code shouldn't do that. Notice how it sets a flag wasAPressed to make sure it doesn't continuously run shifting. Make sure wasAPressed is a member variable, not a local variable

Code:

bool shifter_varable = true;

//later in teleopPeriodic

if (driver->GetRawButton(2)){
  if (!shifter_varable){
    shifter_varable = true;
    shifter->Set(shifter->Get() ==
DoubleSolenoid::Value::kReverse ?
DoubleSolenoid::Value::kForward :
DoubleSolenoid::Value::kReverse);

}else{
  shifter_varable = false;
  }
}

all tho i did the exact same thing except change the name of the wasAPressed to shifter_varable. It still does the exact same thing as before, going hyper-speed switching back and forth.

euhlmann 11-02-2017 01:10

Re: Pneumatics code problems.
 
Quote:

Originally Posted by charlier999 (Post 1643125)
all tho i did the exact same thing except change the name of the wasAPressed to shifter_varable. It still does the exact same thing as before, going hyper-speed switching back and forth.

Ok let me make it a bit more clear:

Code:

// File: Robot.cpp

class Robot: public IterativeRobot {
public:
    bool wasAPressed = false; // MEMBER VARIABLE. not local variable
   
    // robotInit, teleopInit, autonomousInit, autonomousPeriodic, etc

    void teleopPeriodic() {
        if (driver->GetRawButton(2)) {
            if (!wasAPressed) {
                wasAPressed = true;
                shifter->Set(shifter->Get() == DoubleSolenoid::Value::kReverse ? DoubleSolenoid::Value::kForward : DoubleSolenoid::Value::kReverse);
            }
        } else {
            wasAPressed = false;
        }
    }
}

Please read: http://www.cplusplus.com/doc/tutorial/classes/ ::rtm::


All times are GMT -5. The time now is 10:42.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi