Log in

View Full Version : Iterative Robot - Need Help!!!


hasin5
06-01-2014, 21:31
Hi,

This code is iterative robot template based.

If you can spot something that is wrong in the code below, please let me know so I can fix the error. Suggestions would also be nice. Will this code work for the following functions:

1. Mobility
2. Moving wheels through motors
3. Pneumatics -> Piston

Also, for function #3, I know I have two instances of the code. One is the relay version and the other is the solenoid version. Which one do I use?

Also, I'd appreciate it if anyone can look over the parameters to see if they are correct in the constructors.

Here is the code:

package edu.wpi.first.wpilibj.templates;
import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Jaguar;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.Relay;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.Solenoid;
import edu.wpi.first.wpilibj.Victor;

public class RobotTemplate extends IterativeRobot {

int joystickPort = 1;

int leftMotorChannel = 2;
int rightMotorChannel = 1;

int pressureSwitchChannel = 1;
//The GPIO channel that the pressure switch is attached to.
int compressorRelayChannel = 1;
//The relay channel that the compressor relay is attached to.

int relayModuleNumber = 1;
int relayChannelNumber = 2;

int victorOneChannel = 3;
int victorTwoChannel = 4;

RobotDrive theRobot = new RobotDrive(leftMotorChannel, rightMotorChannel);
Joystick driveStick = new Joystick(joystickPort);
Compressor mainCompressor = new Compressor(pressureSwitchChannel, compressorRelayChannel);
Relay spike = new Relay(relayModuleNumber, relayChannelNumber);
Victor wheelOne = new Victor(victorOneChannel);
Victor wheelTwo = new Victor(victorTwoChannel);

//if relay doesn't work - use this:
Solenoid pistonExtract = new Solenoid (1);
Solenoid pistonRetract = new Solenoid (2);

public void robotInit() {
mainCompressor.start();
}

public void autonomousPeriodic() {
// will fill later
}

public void teleopPeriodic() {

//variables expected to update periodically
double moveValue = driveStick.getAxis(Joystick.AxisType.kY);
double rotateValue = driveStick.getAxis(Joystick.AxisType.kX);

theRobot.arcadeDrive(moveValue, -rotateValue); //robot driving

double speed = 1.0; //adjustment back of joystick

if (driveStick.getTrigger()) { //shooter wheels
wheelOne.set(speed);
wheelTwo.set(speed);
}else{
wheelOne.set(0.0);
wheelTwo.set(0.0);
}

//one variation to work with piston
if (driveStick.getRawButton(3)) { //top-middle button
spike.setDirection(Relay.Direction.kForward);
} else if (driveStick.getRawButton(4)) {
spike.setDirection(Relay.Direction.kReverse);
}else{
spike.set(Relay.Value.kOff);
}

//which one to choose?

//second variation to work with piston
if (driveStick.getRawButton(5)) {
pistonExtract.set(true);
pistonRetract.set(false);
}else if (driveStick.getRawButton(6)) {
pistonRetract.set(false);
pistonExtract.set(true);
}else{
pistonExtract.set(false);
pistonExtract.set(false);
}

}

public void testPeriodic() {

}

}

Joe Ross
06-01-2014, 21:56
Also, for function #3, I know I have two instances of the code. One is the relay version and the other is the solenoid version. Which one do I use?

Either will work. It will depend on what the electrical team hooks it up to. The solenoid module can work with either 12v or 24v solenoids, while a spike relay will only work with 12v solenoids.

You could also use the DoubleSolenoid class, instead of two Solenoid objects.

I don't see anything obviously wrong with the code.

Ginto8
14-01-2014, 10:27
If you can spot something that is wrong in the code below, please let me know so I can fix the error. Suggestions would also be nice. Will this code work for the following functions:

Even someone with experience will not be able to answer this question perfectly. There are only 2 ways to guarantee that code will work: running it in a (very good) simulator, or running it on the robot. The former is not currently possible with Java, so you'll have to go with the latter. The more you test the code on the actual machine it must run on, the more bugs will become apparent and can be fixed. Your code will fail in some way at some point, so you should do your best to make sure that the failure happens during build season, instead of at a competition.

omalleyj
14-01-2014, 12:31
package edu.wpi.first.wpilibj.templates;
import edu.wpi.first.wpilibj.Compressor;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Jaguar;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.Relay;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.Solenoid;
import edu.wpi.first.wpilibj.Victor;

public class RobotTemplate extends IterativeRobot {

int joystickPort = 1;

int leftMotorChannel = 2;
int rightMotorChannel = 1;

int pressureSwitchChannel = 1;
//The GPIO channel that the pressure switch is attached to.
int compressorRelayChannel = 1;
//The relay channel that the compressor relay is attached to.

int relayModuleNumber = 1;
int relayChannelNumber = 2;

int victorOneChannel = 3;
int victorTwoChannel = 4;

Its not required, but its good practice to make 'variables' that you don't intend to vary as final. That way they can't be accidentally changed later. e.g.
final int victorOneChannel = 3;


RobotDrive theRobot = new RobotDrive(leftMotorChannel, rightMotorChannel);
Joystick driveStick = new Joystick(joystickPort);
Compressor mainCompressor = new Compressor(pressureSwitchChannel, compressorRelayChannel);
Relay spike = new Relay(relayModuleNumber, relayChannelNumber);
Victor wheelOne = new Victor(victorOneChannel);
Victor wheelTwo = new Victor(victorTwoChannel);

//if relay doesn't work - use this:
Solenoid pistonExtract = new Solenoid (1);
Solenoid pistonRetract = new Solenoid (2);

public void robotInit() {
mainCompressor.start();
}

You might want to put the initial state of your solenoids, relays, shooter motors, etc. in Init as well.


public void autonomousPeriodic() {
// will fill later
}

public void teleopPeriodic() {

//variables expected to update periodically
double moveValue = driveStick.getAxis(Joystick.AxisType.kY);
double rotateValue = driveStick.getAxis(Joystick.AxisType.kX);

theRobot.arcadeDrive(moveValue, -rotateValue); //robot driving

double speed = 1.0; //adjustment back of joystick

if (driveStick.getTrigger()) { //shooter wheels
wheelOne.set(speed);
wheelTwo.set(speed);
}else{
wheelOne.set(0.0);
wheelTwo.set(0.0);
}

Depending on how long your wheels take to get up to speed, and how much driving you do with them on, you may want to toggle the shooter wheel state rather than require the driver to hold it constantly while setting up a shot. (more a customer satisfaction issue than code issue :) )

//one variation to work with piston
if (driveStick.getRawButton(3)) { //top-middle button
spike.setDirection(Relay.Direction.kForward);
} else if (driveStick.getRawButton(4)) {
spike.setDirection(Relay.Direction.kReverse);
}else{
spike.set(Relay.Value.kOff);
}

Same here.

//which one to choose?

//second variation to work with piston
if (driveStick.getRawButton(5)) {
pistonExtract.set(true);
pistonRetract.set(false);
}else if (driveStick.getRawButton(6)) {
pistonRetract.set(false);
pistonExtract.set(true);
}else{
pistonExtract.set(false);
pistonExtract.set(false);
}

is the duplicate Extract a typo? I think the intent was setting Retract false in one of them.

}

public void testPeriodic() {

}

}


Consider using a separate operator joystick, so the driver won't have to worry about which buttons he's pressing while trying to evade defenders.

James Lightfoot
01-02-2014, 19:03
Hello all,

I am a rookie mentor w/ only one experienced programmer. He is learning Java. I am an EE for process controls & automation, but my programming is platform specific. I can read the existing Java code from last year's robot, but we are adding & changing things. I have a few quick questions
1) Where can I find who to use the "iterative Robot" class's methods?
2) Where can I see or program to map the physical I/O to things like Jaguars & ultrasonic sensors?
3) Can I use a relay output point to turn on a motor (w/ the 3 wire pig tail and the 2 power wires) or should I wire them to a PWM point and simply send it a full speed signal?
4) Is there an input that will work with the PWM output of an ultrasonic sensor (300 micro-seconds to 9999 micro-seconds) or do I have to use the voltage analog output from the sensor? ::ouch::

Ginto8
01-02-2014, 19:51
1) Where can I find who to use the "iterative Robot" class's methods?
robotInit() is called when the robot first boots. <mode>Init() is called at the beginning of the given mode, and <mode>Periodic() is called every time a data packet is received from the driver station (in practice, this is every 20ms, or 50 times per second). <mode> is one of teleop, autonomous, test, or disabled.

2) Where can I see or program to map the physical I/O to things like Jaguars & ultrasonic sensors?
Here (http://wpilib.screenstepslive.com/s/3120/m/7912), under "Actuators" and "Sensors".

3) Can I use a relay output point to turn on a motor (w/ the 3 wire pig tail and the 2 power wires) or should I wire them to a PWM point and simply send it a full speed signal?
While it is theoretically possible, I am not sure whether that would be legal. Sending the PWM signal from software is not difficult:
motor.set(Relay.Value.kForward) // relay
motor.set(1); // PWM

4) Is there an input that will work with the PWM output of an ultrasonic sensor (300 micro-seconds to 9999 micro-seconds) or do I have to use the voltage analog output from the sensor? ::ouch::
I don't know of any way to read a PWM signal from the cRIO. I would go with the analog signal if possible, as it's pretty simple to program:
AnalogChannel input = new AnalogChannel(<port>); // change <port> for your setup
input.getAverageVoltage(); // returns analog signal