Orientation Switch

I am trying to write a program that when p4_sw_aux1 = 1 the robots orientation changes so that when joy1_y is 254 full reverse and when joy1_y is 0 then full foward same will go for the X axis.
I wish to do this in the single joystick drive code and can not get it to work write. Plz can anyone give me an example of how this might work.
Thanks in advance

   CyberWolf_22,

Right after these lines:

**
drive_R = (((2000 + p1_y + p1_x - 127) Min 2000 Max 2254) - 2000)
drive_L = (((2000 + p1_y - p1_x + 127) Min 2000 Max 2254) - 2000)
**

Insert:

**
if p4_sw_aux1 = 1 then
    drive_R = 254 - drive_R
    drive_L = 254 - drive_L
endif
**

If you’re really planning on changing the orientation of the robot, forwards to backwards, you also have to swap the values of the PWM outputs, switching left for right, and vice versa, or else you’ll be sending signals meant for the left side of the robot to the right, and signals meant for the right to the left.

I did this operation last year, for our roller/claw robot, first by doing what gwross already pointed out, which is inverting the PWM value around 127, then by XORing the values with eachother to swap them, without going through a third temp variable.


PWM1 = PWM1 ^ PWM2
PWM2 = PWM1 ^ PWM2
PWM1 = PWM1 ^ PWM2

or


drive_L = drive_L ^ drive_R
drive_R = drive_L ^ drive_R
drive_L = drive_L ^ drive_R

It worked like a dream, and was fun to implement.

they easy way:


drive_L              var      byte
drive_R              var      byte
tempjoystick      var      byte


drive_R = (((2000 + p1_y + p1_x - 127) Min 2000 Max 2254) - 2000)
drive_L = (((2000 + p1_y - p1_x + 127) Min 2000 Max 2254) - 2000)
'single joystick drive code


if p4_sw_aux1 = 1 then
      tempdrive = drive_R
      drive_R = 254-drive_L
      drive_L = 254-tempjoystick
endif

Works like a charm. I used it last year on our robot.

Basically, you want to do the reverse code AFTER you figure out how fast you want each motor to go (assuming you’re doing a 2 motor drivetrain, tank-style). It may not be pretty, or efficient, but it’s guaranteed to work.

Not only do you have to reverse the drive speeds, but also you must remember to flip the left and right motor values, or you will find that the x-axis will be backwards.

*Originally posted by Jnadke *
they easy way:


drive_L              var      byte
drive_R              var      byte
tempjoystick      var      byte


drive_R = (((2000 + p1_y + p1_x - 127) Min 2000 Max 2254) - 2000)
drive_L = (((2000 + p1_y - p1_x + 127) Min 2000 Max 2254) - 2000)
'single joystick drive code


if p4_sw_aux1 = 1 then
      **tempdrive** = drive_R
      drive_R = 254-drive_L
      drive_L = 254-**tempjoystick**
endif

Your code is correct except for what is bolded. You are using two different Variables. Probably just an error when you typed it. Your code is similar to what I use on our robot.

drive_L = ((((2000 + p1_y - p1_x + 127) Min 2000 Max 2254) - 2000) * (1 - p1_sw_trig)) + (~(((2000 + p1_y - p1_x + 127) Min 2000 Max 2254) - 2000) * p1_sw_trig)
drive_R = ((((2000 + p1_y + p1_x - 127) Min 2000 Max 2254) - 2000) * (1 - p1_sw_trig)) + (~(((2000 + p1_y + p1_x - 127) Min 2000 Max 2254) - 2000) * p1_sw_trig)

If you want to avoid extra lines and extra variables you can do it this way. Its a bit long but we used it last year and it worked great.

*Originally posted by FotoPlasma *
you also have to swap the values of the PWM outputs, switching left for right, and vice versa

Thanks. I just remembered about that this morning. You saved me having to post it.:slight_smile: