EasyC-FRC - Arcade driving help

Our team is using EasyC-FRC (currently ver this year. That’s okay. Hey – it’s easy. But I need to get some starting point, and I always get hung up on something simple at the beginning. And if I don’t know, how are my 20 programming kids going to know?

We have a 4-motor test robot, and we’re going to use arcade (single joystick) driving. All of the examples in the Help file show the Tank mode, but no details on Arcade.

I’ve got the infinite While(1) loop okay; the joystick input okay using JoyX = AnalogOIInput(~) and JoyY = AnalogOIInput(~); and finally the OItoPWM(~~~) to send the info to the 4 motors. We do some magic calcs [1] with JoyX and JoyY to optimize our motors, etc, then send them to OItoPWM() – how? Do we mix the X and Y somehow? How much goes to the left side motors and how much to the right side?

Or do we use the “Arcade - 4 motor” function block in the While loop instead, and be done with it?

Thanks for your help.


[1] Magic calcs are currently to reduce the speed of the robot – we have a small room to drive it.

First you need to be in L2 or PRO mode. On the toolbar at the top of the window you should see L1, L2, and PRO. Select the one you need.

Create a new competition project.

Open the Operator control function.

Under the RC Control section of the commands you should see a “Arcade - 4 Motor”. Add this to the Operator control function.

The options for this command are fairly simple.

EDIT: “Advanced” code i attached is fairly simple.

int LeftDrive, RightDrive;
unsigned char JoyY, JoyX;

JoyX = GetOIAinput(1,1);
JoyY = GetOIAinput(1,2);

LeftDrive = Limit(JoyX - JoyY + 127);
RightDrive = Limit(JoyX + JoyY -127);

// the mixing code above  produce values out of the 0-255 range.
// we must limit the values or we will get overloads and weird things.
LeftDrive = Limit(LeftDrive,0,255);
RightDrive = Limit(RightDrive,0,255);

//Assign motor values.
//Left motors
SetPWM(1, LeftDrive);
SetPWM(2, LeftDrive);

//Right motors
SetPWM(3, RightDrive);
SetPWM(4, RightDrive);

The limit function used above.

int Limit (int input, int min, int max)
  if (input < min)
    input = min;
  if (input > max)
    input = max;
  return input;

I have attached a program for you to look at.
If you need more help PM or e-mail me. :smiley:

EDIT: I have attached another file with custom arcade software. It may be easier to use your “Magic calcs” with this.

Arcade Simple.zip (1.07 KB)
Arcade Advanced.zip (1.76 KB)

Arcade Simple.zip (1.07 KB)
Arcade Advanced.zip (1.76 KB)

Thanks EHaskins – to think it’s as simple as:

LeftDrive = JoyX - JoyY + 127;
RightDrive = JoyX + JoyY - 127;

LeftDrive = Limit(LeftDrive,0,255);
RightDrive = Limit(RightDrive,0,255);

to mix the x and y axis numbers and get a motor speed.

Can’t wait to get to that robot now!


If you have any problems PM or e-mail me.