Hi!
I require your help regarding a problem I’m encountering.
The robot I am using is the 10011 NEXUS 4WD Mecanum from the Robot Kit. I’ve downloaded the relevant codes from the website concerned:
I’m unable to manipulate the speeds on my robot. The speed can be changed directly at the analog pins at the runPWM function. So, the hardware and the motors do work properly.
We think we have narrowed down the problem to the PID section of the Motor.cpp code. The following are the 2 different PIDRegulate codes that we’ve found online, but none of them allow speed changes.
Code 1:
bool Motor::PIDRegulate(bool doRegulate) {
debug();
if(PIDGetStatus()==false) return false;
if(getPinIRQB()!=PIN_UNDEFINED && getDesiredDir()!=getCurrDir()) {
speedRPMInput=-SPEEDPPS2SPEEDRPM(isr->speedPPS);
} else {
speedRPMInput=SPEEDPPS2SPEEDRPM(isr->speedPPS);
}
PID::Compute();
if(doRegulate && PID::JustCalculated()) {
speed2DutyCycle+=speedRPMOutput;
if(speed2DutyCycle>=MAX_SPEEDRPM) speed2DutyCycle=MAX_SPEEDRPM;
else if(speed2DutyCycle<=-MAX_SPEEDRPM) speed2DutyCycle=-MAX_SPEEDRPM;
if(speed2DutyCycle>=0) {
runPWM(map(speed2DutyCycle,0,MAX_SPEEDRPM,0,MAX_PWM),getDesiredDir(),false);
//runPWM(map(speed2DutyCycle,0,MAX_SPEEDRPM,0,speedPWM),getDesiredDir(),false);
} else {
runPWM(map(abs(speed2DutyCycle),0,MAX_SPEEDRPM,0,MAX_PWM),!getDesiredDir(),false);
//runPWM(map(speed2DutyCycle,0,MAX_SPEEDRPM,0,speedPWM),!getDesiredDir(),false);
}
return true;
}
return false;
}
Code 2:
bool Motor::PIDRegulate(bool doRegulate) {
debug();
if(PIDGetStatus()==false) return false;
if(getPinIRQB()!=PIN_UNDEFINED && getDesiredDir()!=getCurrDir()) {
speedRPMInput=-SPEEDPPS2SPEEDRPM(isr->speedPPS);
} else {
speedRPMInput=SPEEDPPS2SPEEDRPM(isr->speedPPS);
}
PID::Compute();
if(doRegulate && PID::JustCalculated()) {
speed2DutyCycle+=speedRPMOutput;
if(speed2DutyCycle>=MAX_SPEEDRPM) speed2DutyCycle=MAX_SPEEDRPM;
else if(speed2DutyCycle<=-MAX_SPEEDRPM) speed2DutyCycle=-MAX_SPEEDRPM;
if(speed2DutyCycle>=0) {
runPWM(float(speed2DutyCycle)/MAX_SPEEDRPM*MAX_PWM,getDesiredDir(),false);
} else {
runPWM(float(abs(speed2DutyCycle))/MAX_SPEEDRPM*MAX_PWM,!getDesiredDir(),false);
}
return true;
}
return false;
}
Would you be able to assist with the issues that we’re are facing?
Thank you so much in advance for your help!