1 Joystick Control

The FRC code for 1 joystick control is


  p1_x = 255 - p1_y;

  p1_y = 255 - pwm05;



  pwm13 = pwm14 = Limit_Mix(2000 + p1_y + p1_x - 127);

  pwm15 = pwm16 = Limit_Mix(2000 + p1_y - p1_x + 127);

how ever when i move the joystick left and right the robot goes forward and backwards

and when in move the joystick up and down the robot moves left and right

should is switch all the axises to the opposite or what

Thanks in advance

Barry Preston
STAG Robotics
Team #1997
Programming and Communications Officer

That code assumes that both motors (or sets of motors) move the robot in one direction when they are going forwards. In order to make it work for conventional systems, you need to reverse one of the sides. Simplest way to do that is subtract the value you assign to the PWM outputs from 254:


  p1_x = 255 - p1_y;

  p1_y = 255 - pwm05;



  pwm13 = pwm14 = 254 - Limit_Mix(2000 + p1_y + p1_x - 127);  // reverse this side

  pwm15 = pwm16 = Limit_Mix(2000 + p1_y - p1_x + 127);

It could be that one side of your motors need to be run backwards. In the standard toughbox, if both motors on both sides are run CCW then it will turn. If one is run CW and one CCW then it will go foward.

So I’m not sure how you have wired your motors, but this could be fixed in code or fixed by reversing the red and black leads on one side of your robot drive motors.

Actually you should subtract from 255 in this case. (if Limit_Mix returns you a 255, then pwm13=254-255=-1, but the -1 wraps over the unsigned char to 255, whereas if you subtract from 255, then you will correctly get 0) So, that line should read

pwm13 = pwm14 = 255 - Limit_Mix(2000 + p1_y + p1_x - 127);

See also this thread.

Hmmm… I never thought about putting the subtraction outside of the Limit_Mix() function. I had it inside:

   //Put modified joystick numbers into the four motors
   //The (256- ) part reverses one side's motors so no reverse wiring is needed!

   pwm13 = pwm14 = Limit_Mix(2000 +        p1_yNew  +        p1_xNew  - 127);
   pwm15 = pwm16 = Limit_Mix(2000 + (256 - p1_yNew) - (256 - p1_xNew) + 127);

You can also create a spreadsheet to check the range.

Reversing motors isn’t the only problem us programmers have to go thru. We loaded up code on our brand-spanking new robot that we’ve been testing on last year’s robot for the past – well, the past year, come to think of it. New robot goes all which-way crazy directions. (Didn’t help that one side’s motors weren’t working.) Shop says “programming error!” (Yeah, right!) Check wiring from last year to this year. Red-to-red, black-to-black. Everything checks out. Turns out (40 minutes later!) new robot has one less set of gears, so motor output to wheels is now opposite from last year. Shop says “oh yeah.” Sigh…

But this year we had our autonomous working (on last year’s robot) before they even built the robot! Woo-hoo! :cool:

Guys, usbcd36 has it right. The correct value is 254.

You explained that by using a pwm value of 255 as an example. However, valid pwm signals are in the range 0-254, with 127 being neutral.

256 is just plain wrong.

Of course, 254 is only the right value to subtract from in theory. With the Victor’s observed “neutral bias”, though, it might actually work better to choose 132 as the mirror point instead of 127, and subtract from 264 instead (making sure to limit the result to 254 after the subtraction).

ok… Forward goes foreward and backwards goes backwards… But left goes right and right goes left

You can fix this by swapping the pwms on the left side with those on the right. (either through code or switching the pwm cables). However this will make what is now the front, the back and the back is now the front. I think if you swap what’s inside the limit_mix function with the one below it, then it’ll fix it without changing what’s front or back.

Maybe post Your code?

Ouch! :slight_smile:

In my defense (meager as can be) I can only say I did put it inside the Limit_Mix() function, so that the function did keep the numbers in range. I’ll have to check my spreadsheet numbers again, and try the 132 center point.

This is easier.


left_motor = speed - turn_rate;
right_motor = speed + turn_rate;

Where speed and turn_rate are signed char’s (subtract 127 from a u-char) and left and right motor are limited to (-128,127).