|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
DigitalInput.Get() always returns zero
...well, almost always.
I'm using the IterativeRobot template and polling a DigitalInput within the AutonomousPeriodic() function. I have a NO switch wired between GND and SIG on sidecar digital input #1. The very first time through the loop, the call to Get() returns the correct value corresponding to the switch state. Every time after that, it always returns zero, regardless of the state of the switch. What is my issue, hardware or software? |
|
#2
|
|||||
|
|||||
|
Re: DigitalInput.Get() always returns zero
Without seeing either your hardware or your software, it's impossible to say where your problem lies.
|
|
#3
|
|||
|
|||
|
Re: DigitalInput.Get() always returns zero
Does this help? The problem is in the DriveWheel::calibrate() method.
DriveWheel.h Code:
#ifndef DRIVEWHEEL_H
#define DRIVEWHEEL_H
#include "WPILib.h"
class DriveWheel
{
CANJaguar driveMotor;
CANJaguar steerMotor;
DigitalInput limitSw;
bool calibrated;
public:
DriveWheel(UINT8 driveID, UINT8 steerID, UINT8 limitID)
: driveMotor(driveID, CANJaguar::kPercentVbus),
steerMotor(steerID, CANJaguar::kPosition),
limitSw(limitID),
calibrated(false)
{
}
void init();
void calibrate(int clock);
void setValues(double drive, double rotation);
};
#endif
Code:
#include "DriveWheel.h"
#define LIMIT_ACTIVE 0
void DriveWheel::calibrate(int clock)
{
int limit = limitSw.Get();
printf("limit %d\n", limit);
if (clock == 0)
{
printf("start calibrate\n");
if (limit == LIMIT_ACTIVE)
{
calibrated = true;
}
else
{
steerMotor.ChangeControlMode(CANJaguar::kPercentVbus);
steerMotor.EnableControl(0);
steerMotor.Set(0.1);
}
}
else if (!calibrated)
{
if (limit == LIMIT_ACTIVE)
{
steerMotor.Set(0);
calibrated = true;
init();
}
}
}
void DriveWheel::init()
{
steerMotor.ChangeControlMode(CANJaguar::kPosition);
steerMotor.SetPID(2000, 0.1, 0);
steerMotor.SetPositionReference(CANJaguar::kPosRef_QuadEncoder);
steerMotor.ConfigEncoderCodesPerRev(250);
steerMotor.EnableControl();
}
void DriveWheel::setValues(double drive, double rotation)
{
driveMotor.Set(drive);
steerMotor.Set(rotation);
}
|
|
#4
|
|||
|
|||
|
Re: DigitalInput.Get() always returns zero
Problem solved.
Bad digital sidecar. (Ugh! Hardware!) |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|