d1d2e2100bdeb123d2c2918844a246c96e0622d9
[3501/stronghold-2016] / src / org / usfirst / frc / team3501 / robot / subsystems / DriveTrain.java
1 package org.usfirst.frc.team3501.robot.subsystems;
2
3 import org.usfirst.frc.team3501.robot.Constants;
4 import org.usfirst.frc.team3501.robot.Lidar;
5
6 import edu.wpi.first.wpilibj.AnalogInput;
7 import edu.wpi.first.wpilibj.CANTalon;
8 import edu.wpi.first.wpilibj.CounterBase.EncodingType;
9 import edu.wpi.first.wpilibj.Encoder;
10 import edu.wpi.first.wpilibj.I2C;
11 import edu.wpi.first.wpilibj.PIDController;
12 import edu.wpi.first.wpilibj.command.Subsystem;
13
14 public class DriveTrain extends Subsystem {
15 // Drivetrain related objects
16 private Encoder leftEncoder, rightEncoder;
17 public static Lidar leftLidar;
18 public static Lidar rightLidar;
19 private CANTalon frontLeft, frontRight, rearLeft, rearRight;
20 private PIDController frontLeftC, frontRightC, rearLeftC, rearRightC;
21 // Drivetrain specific constants that relate to the inches per pulse value for
22 // the encoders
23 private final static double WHEEL_DIAMETER = 6.0; // in inches
24 private final static double PULSES_PER_ROTATION = 256; // in pulses
25 private final static double OUTPUT_SPROCKET_DIAMETER = 2.0; // in inches
26 private final static double WHEEL_SPROCKET_DIAMETER = 3.5; // in inches
27 public final static double INCHES_PER_PULSE = (((Math.PI)
28 * OUTPUT_SPROCKET_DIAMETER / PULSES_PER_ROTATION)
29 / WHEEL_SPROCKET_DIAMETER) * WHEEL_DIAMETER;
30 // Drivetrain specific constants that relate to the PID controllers
31 private final static double Kp = 1.0, Ki = 0.0,
32 Kd = 0.0 * (OUTPUT_SPROCKET_DIAMETER / PULSES_PER_ROTATION)
33 / (WHEEL_SPROCKET_DIAMETER) * WHEEL_DIAMETER;
34
35 public AnalogInput channel;
36
37 public DriveTrain() {
38 frontLeft = new CANTalon(Constants.DriveTrain.FRONT_LEFT);
39 frontRight = new CANTalon(Constants.DriveTrain.FRONT_RIGHT);
40 rearLeft = new CANTalon(Constants.DriveTrain.REAR_LEFT);
41 rearRight = new CANTalon(Constants.DriveTrain.REAR_RIGHT);
42
43 leftLidar = new Lidar(I2C.Port.kOnboard);
44 rightLidar = new Lidar(I2C.Port.kOnboard); // TODO: find port for second
45 // lidar
46 leftEncoder = new Encoder(Constants.DriveTrain.ENCODER_LEFT_A,
47 Constants.DriveTrain.ENCODER_LEFT_B, false, EncodingType.k4X);
48 rightEncoder = new Encoder(Constants.DriveTrain.ENCODER_RIGHT_A,
49 Constants.DriveTrain.ENCODER_RIGHT_B, false, EncodingType.k4X);
50 leftEncoder.setDistancePerPulse(Constants.DriveTrain.INCHES_PER_PULSE);
51 rightEncoder.setDistancePerPulse(Constants.DriveTrain.INCHES_PER_PULSE);
52 leftEncoder.setDistancePerPulse(INCHES_PER_PULSE);
53 rightEncoder.setDistancePerPulse(INCHES_PER_PULSE);
54
55 }
56
57 @Override
58 protected void initDefaultCommand() {
59 }
60
61 public void resetEncoders() {
62 leftEncoder.reset();
63 rightEncoder.reset();
64 }
65
66 public double getLeftLidarDistance() {
67 return leftLidar.pidGet();
68 }
69
70 public double getRightLidarDistance() {
71 return rightLidar.pidGet();
72 }
73
74 public double getRightSpeed() {
75 return rightEncoder.getRate(); // in inches per second
76 }
77
78 public double getLeftSpeed() {
79 return leftEncoder.getRate(); // in inches per second
80 }
81
82 public double getSpeed() {
83 return (getLeftSpeed() + getRightSpeed()) / 2.0; // in inches per second
84 }
85
86 public double getRightDistance() {
87 return rightEncoder.getDistance(); // in inches
88 }
89
90 public double getLeftDistance() {
91 return leftEncoder.getDistance(); // in inches
92 }
93
94 public double getDistance() {
95 return (getRightDistance() + getLeftDistance()) / 2.0; // in inches
96 }
97
98 public void stop() {
99 setMotorSpeeds(0, 0);
100 }
101
102 public void setMotorSpeeds(double leftSpeed, double rightSpeed) {
103 // speed passed to right motor is negative because right motor rotates in
104 // opposite direction
105 this.frontLeft.set(leftSpeed);
106 this.frontRight.set(-rightSpeed);
107 this.rearLeft.set(leftSpeed);
108 this.rearRight.set(-rightSpeed);
109 }
110 }