markruff icon

Arduino analog joystick

markruff | PRO | 01/19/16 10:06:20 AM UTC | 0 ⭐ | 579 👁️ | Never ⏰ | []
C++ |

1.95 KB

|

None

|

0 👍

/

0 👎

/*
 * Arduino reading analog joystick inputs and lighting
 * LEDs (up, down, left, right)
 * 
 * Using duinotech X&Y axis joystick module (xc-4422)
 * (ignoring digital switch for now)
 * 
 * LEDs light up with brightness relative to displacement
 * from neutral point. This is achieved with crude PWM 
 * (pulse wave modulation), where the LED is turned on and
 * off rapidly. Here the on time is xVal / DELAY_FACTOR, and
 * the off time is however long it takes to process the rest 
 * of the loop until the LED is turned back on (hence crude).
 * Keep in mind, having displacement in both axes results in
 * the delay of the on-phase in one axis contributing to the
 * off-phase in the other axis. This can lead to flickering.
 * 
 * A DELAY_FACTOR of 50 works well for me. An alternative
 * would be to use true PWM through pins 3, 5, 6, 9, 10 or 11.
 */
 
// Globals 
const int yAxis = A0;
const int xAxis = A1;
 
const int upLed = 7;
const int rightLed = 6;
const int downLed = 5;
const int leftLed = 4;
 
// Buffer to ignore around neutral point
const int BUFFER = 20;
 
// delay factor used for crude homebrew pulse wave modulation
const int DELAY_FACTOR = 50;
 
void setup() {
  pinMode(xAxis, INPUT);
  pinMode(yAxis, INPUT);
  pinMode(upLed, OUTPUT);
  pinMode(rightLed, OUTPUT);
  pinMode(downLed, OUTPUT);
  pinMode(leftLed, OUTPUT);
}
 
void loop() {
  int xVal = analogRead(xAxis) - 512;
  int yVal = analogRead(yAxis) - 512;
 
  if ( xVal > BUFFER ) {
    digitalWrite(leftLed,HIGH);
    delay((xVal-BUFFER)/50);
    digitalWrite(leftLed,LOW);
  }
  else if ( xVal < -BUFFER ) {
    digitalWrite(rightLed,HIGH);
    delay((BUFFER-xVal)/50);
    digitalWrite(rightLed,LOW);
  }
  if ( yVal > BUFFER ) {
    digitalWrite(upLed,HIGH);
    delay((yVal-BUFFER)/50);
    digitalWrite(upLed,LOW);
  }
  else if ( yVal < -BUFFER ) {
    digitalWrite(downLed,HIGH);
    delay((BUFFER-yVal)/50);
    digitalWrite(downLed,LOW);
  }
}

Comments