Joystick with Arduino

Joysticks can be very handy for many applications like retro gaming, robot or robot-arm control, remote controlling cars or drones.
The Analog Joystick is similar to two potentiometers connected together, one for the vertical movement (y-axis) and other for the horizontal movement (x-axis). The joystick also comes with a switch to trigger some event like to switch on / off a device. But the best thing is: using a joystick with the Arduino is extremely easy!

Required parts:
1 x Arduino Uno (or compatible)
1 x analog joystick like KY-023
5 x jumper cable male - female 

How it works

First of all, you have to understand that a joystick gives analog values in the form of a voltage as input to the Arduino. The Arduino uses an analog-to-digital converter (ADC) to generate a digital value from the analog voltage signal. Since the Arduino Uno has an ADC resolution of 10 bits, the values on each analog channel can vary from 0 to 1023.

As long as the joystick is in a neutral position, the values for the x and y axis should be around 500. If the stick is moved on x axis from one end to the other, the x values will change from 0 to 1023 and the same happens when moved along the y axis.

Wiring Diagram for Joystick

Arduino           KY-023
-----------------------
A0                 VRX
A1                 VRY
Pin 2              SW
5V                 +5V
GND                GND 

Software for Joystick - Control

/* Arduino Joystick Tutorial
 * displays the x-axis and y-axis values to the serial monitor
 * writes "button pressed" if the button gets pressed 
 * Stefan Hager 2022
 */

  
void setup() 
{
   Serial.begin(9600); 
   Serial.println("Joystick test program startet ...");
   pinMode(2, INPUT); // for the button
   digitalWrite(2, HIGH);  // set button pin to high -> signal is LOW when pressed
}

void loop() 
{
  int button = 1;
  int xPos = analogRead(A0);  // read analog input pin A0
  int yPos = analogRead(A1);  // read analog input pin A1
  button = digitalRead(2);// button is on pin 2
  Serial.print("X: ");
  Serial.print(xPos);
  Serial.print("      Y: ");
  Serial.println(yPos);
  // button pressed -> signal low
  if(button == 0)
  { 
    Serial.println("button pressed ...");
    digitalWrite(2, HIGH); // reset pin 2 to HIGH
  }   
  delay(500);
}

Running the Program

Start the program, move the joystcik and press the button. Look into the serial monitor of the Arduino IDE to see the resulting values.