Single Joystick Tank Drive

Hi all,

I’m programming for rookie team. I barely have any experience with Java or robotics for that matter.

My goal is to make the robot drive with a single joystick in differential “tank” drive.
Here’s the schematic that I found that would be ideal…

I’m using Iterative robot template.

Any help would be greatttly appreciated!


the only thing i can think of is you do something like this


that might work

What you are describing is similar to (or maybe identical) to arcade drive, which is already built in.

This would result in the robot going forward and backwards with the left stick y axis, but never turning.

I can’t find the related documentation/source (I’ll keep looking and revise my answer as necessary), but it’s probably not possible to do with the pre-made TankDrive class. And actually, I see more in common with the ArcadeDrive and your desired style than Tank.

I would say that you’ll either need to find some code a previous team wrote or extend Tank/ArcadeDrive (or just starting from scratch, it’ll end up being a combination of both, really). And take the ArcadeDrive code but set the two sets of motors depending on the combination of x,y values.

Try this:

// Xj,Yj are the joystick readings

L = -Yj+Xj;

R = -Yj-Xj;

max=abs(L); if(max<abs®) max=abs®;

if(max>1){L/=max; R/=max;}

send “L” to the left wheels and “R” to the right wheels


As far as I can tell from your description, you are describing Arcade drive exactly. It takes an x and y axis, and outputs to 2 or 4 motors similar to tank drive.

In other word, full left on the joystick would make the right side go full forward, and left side go full backwards. Full right would make right go full backward, and left go full forwards. And so on.

Some drivers find the following a bit more intuitive to drive:

if(Yj<=0){L=-Yj+Xj; R=-Yj-Xj;}

else {L= -Yj-Xj; R=-Yj+Xj;}

max=abs(L); if(max<abs®)max=abs®;

if(max>1){L/=max; R/=max;}

send “L” to the left wheels and “R” to the right wheels


Use the arcade drive method in Joystick. It will do EXACTLY what you want it to do.

Thanks for the responses!

I got it working with

m_robotDrive.arcadeDrive(m_driveStick.getY(), m_driveStick.getX());

It does everything as intended, but there’s something i’d like to change.

Right now it goes forward, back, turns on the spot and strafes forward perfectly.

But if trying to pull the joystick back-left, the left motor is working 100% backwards, which essentially moves the robot’s back to the right. If pulling back-right, the right motor is working 100% backwards, which moves the robot back to the left. Intuitively when trying to do that, you’d expect it to work like a car would, turning left would make the back go left…

I would like to change that so drivers could have it more intuitively.

I will post when/if I figure it out. Again, thanks everyone for taking the time.


That’s what this is supposed to do. Try it.


I was trying to work around that using

double m_y = m_driveStick.getY();
double m_x = m_driveStick.getX();
if (m_y >= 0) //the Y axis is inverted, so going forward is negative number
    m_x = 0-m_x; //inverting X value
m_robotDrive.arcadeDrive(m_y, m_x);

The problem I faced with that was that the joystick wasn’t giving me a perfect 0… I added a simple println statement to get the y values, and it ranged anywhere from -0.3 to 0.3…

Ether, it looks like your solution

if(Yj<=0){L=-Yj+Xj; R=-Yj-Xj;}

would have the same problem.

I tried something like if m_y >= -0.3, but it results in motors rapidly switching directions if starting slowly…

Another possible solution would be treating anything within .2 or so from the axis as 0… but it doesn’t seem like the best way of doing it either.

Thanks in advance,

Are you saying you got readings in the range -0.3 to 0.3 for Y when the joystick was in the null position?



Try a different joystick.


I believe you can also go into the windows control panel, find the Game Controllers adapter and use it to center the joystick (ie, the joystick reads 0,0 when centered).

It does say 0.0 at the beginning, but after driving it for a bit then letting go, it doesn’t always center perfectly.

Both of our joysticks do that :\

Clean the Mountain Dew out of them.


They’re clean outta the box ones… :’(

Maybe there’s an error in your software?

Try loading the default code that came with the LabVIEW installation and run it and see if it does the same thing.


After updating and running stuff again, joysticks center within 0.05 from center. Still not a perfect 0.

However, after playing around with various types of if statements, I’m starting to get the impression that the default way is the only way of making it operate smoothly.

If you look at the diagram clockwise, by default we get the “motor forward x3, motor off, motor backward x3, motor off” pattern… That way there is never a situation where the motor has to abruptly switch directions.

If swapping the reverse directions, we get “motor forward x3, motor backward x3, motor off, motor backward, motor off”. That way at some point there’s an abrupt change in motors from going backwards to forward. That is the issue I’ve been having and at this point I see no way of avoiding it.

If I’m wrong, please correct me.