Ok, I have here the simplest form of single joystick control. It by default assumes that the motor pins have pull down resistors, but if you don't have pull down resistors, then just uncomment the other lines.
/*
Simple motor control with square limit joystick
Y(1023)
|---------|
|---------|
X(0)|---512---|X(1023)
|---------|
|---------|
Y(0)
Left Motor Forward/Reverse = LMF/LMR
Right Motor Forward/Reverse = RMF/RMR
*/
const byte LMF = 3;
const byte LMR = 5;
const byte RMF = 6;
const byte RMR = 9;
const byte Xpot = A0;
const byte Ypot = A1;
volatile unsigned int X = 512, Y = 512; // pot values default 512 for center
unsigned int Xspeed = 0, Yspeed = 0; //motor speed default 0 for full stop
const int Xdeadzone = 5, Ydeadzone = 5; //amount of slack needed for pot values
void setup(){
pinMode(LMF, OUTPUT);
pinMode(LMR, OUTPUT);
pinMode(RMF, OUTPUT);
pinMode(RMR, OUTPUT);
Serial.begin(9600);
}
void loop()
{
X = analogRead(Xpot);
Y = analogRead(Ypot);
if (X >= (512 + Xdeadzone))//Forward
{
Xspeed = (X - 512) / 2; // 0 - 255
if(Y > (512 + Ydeadzone)) //Left
{
Yspeed = (Y - 512) / 2;
analogWrite(LMF, Xspeed - Yspeed); analogWrite(RMF, Xspeed);
//digitalWrite(LMR, LOW); digitalWrite(RMR, LOW);
}
else if (Y < (512 - Ydeadzone)) //Right
{
Yspeed = (512 - Y) / 2;
analogWrite(LMF, Xspeed); analogWrite(RMF, Xspeed - Yspeed);
//digitalWrite(LMR, LOW); digitalWrite(RMR, LOW);
}
else
{
analogWrite(LMF, Xspeed); analogWrite(RMF, Xspeed);
//digitalWrite(LMR, LOW); digitalWrite(RMR, LOW);
}
}
else if (X <= (512 - Xdeadzone))//Reverse
{
Xspeed = (512 - X) / 2;
if(Y > (512 + Ydeadzone)) //Left
{
Yspeed = (Y - 512) / 2;
//digitalWrite(LMF, LOW); digitalWrite(RMF, LOW);
analogWrite(LMR, Xspeed - Yspeed); analogWrite(RMR, Xspeed);
}
else if (Y < (512 - Ydeadzone)) //Right
{
Yspeed = (512 - Y) / 2;
//digitalWrite(LMF, LOW); digitalWrite(RMF, LOW);
analogWrite(LMR, Xspeed); analogWrite(RMR, Xspeed - Yspeed);
}
else
{
//digitalWrite(LMF, LOW); digitalWrite(RMF, LOW);
analogWrite(LMR, Xspeed); analogWrite(RMR, Xspeed);
}
}
else // X is between 512 +- deadzone
{
if(Y > (512 + Ydeadzone)) // zero point turn Left
{
digitalWrite(LMF, LOW); analogWrite(RMF, Yspeed);
//digitalWrite(LMR, LOW); digitalWrite(RMR, LOW);
}
else if(Y < (512 - Ydeadzone))// zero point turn Right
{
analogWrite(LMF, Yspeed); digitalWrite(RMF, LOW);
//digitalWrite(LMR, LOW); digitalWrite(RMR, LOW);
}
else
{ // Full stop
digitalWrite(LMF,LOW);
digitalWrite(RMF,LOW);
digitalWrite(LMR,LOW);
digitalWrite(RMR,LOW);
}
}
}