This Arduino Joystick tutorial will show you how to connect an 2 axis
joystick to using any two Arduino analogue inputs. The joystick has two potentiometers one for vertical movement and
one for horizontal movement.
All that happens is that you put 5V at one end of the potentiometer and 0V at the
other end of the potentiometer, and the wiper adopts a value in between these
voltages. Then all you do is read the analogue values using an Arduino using the Arduino adc.
You can buy an Arduino joystick module as shown below - these have
the power pins and two analogue outputs, but the also have a push
button pin that activates when you push the joystick down.
For this Arduino joystick the potentiometer values are 4.4kOhm, others are usually 10k Ohms.
This
picture shows the physical structure of the Arduino joystick - two
potentiometers to top and right with the control stick in the middle.
The following sketch does not require a library and just
reads and displays the values from analogue input A0 and A1. It also
displays the button push output.
const int VRyPin = A1;
const int SWPin = 5;
int VRx = 0; // value read from the horizontal pot
int VRy = 0; // value read from the vertical pot
int SW = 0; // value read from the switch
void setup() {
Serial.begin(9600);
pinMode(SWPin,INPUT_PULLUP);
}
void loop() {
VRx = analogRead(VRxPin);
VRy = analogRead(VRyPin);
SW = digitalRead(SWPin);
// print the results to the Serial Monitor:
Serial.print("VRrx = ");
Serial.print(VRx);
Serial.print("\tVRry = ");
Serial.print(VRy);
Serial.print("\tSW = ");
Serial.println(SW);
delay(200);
}
Horizontal | Vertical |
---|---|
VRrx = 523 VRry = 506 SW = 1 VRrx = 512 VRry = 506 SW = 1 VRrx = 420 VRry = 506 SW = 1 VRrx = 218 VRry = 506 SW = 1 VRrx = 60 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 0 VRry = 506 SW = 1 VRrx = 253 VRry = 506 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 524 VRry = 506 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 524 VRry = 506 SW = 1 VRrx = 524 VRry = 506 SW = 1 VRrx = 675 VRry = 506 SW = 1 VRrx = 911 VRry = 506 SW = 1 VRrx = 1023 VRry = 506 SW = 1 VRrx = 1023 VRry = 507 SW = 1 VRrx = 1022 VRry = 506 SW = 1 VRrx = 1023 VRry = 507 SW = 1 VRrx = 1023 VRry = 506 SW = 1 VRrx = 1023 VRry = 506 SW = 1 VRrx = 1022 VRry = 506 SW = 1 VRrx = 523 VRry = 506 SW = 1 |
VRrx = 524 VRry = 505 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 524 VRry = 505 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 524 VRry = 373 SW = 1 VRrx = 523 VRry = 176 SW = 1 VRrx = 523 VRry = 0 SW = 1 VRrx = 523 VRry = 0 SW = 1 VRrx = 524 VRry = 0 SW = 1 VRrx = 524 VRry = 0 SW = 1 VRrx = 524 VRry = 0 SW = 1 VRrx = 523 VRry = 0 SW = 1 VRrx = 524 VRry = 0 SW = 1 VRrx = 524 VRry = 181 SW = 1 VRrx = 524 VRry = 320 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 524 VRry = 506 SW = 1 VRrx = 523 VRry = 505 SW = 1 VRrx = 523 VRry = 505 SW = 1 VRrx = 523 VRry = 506 SW = 1 VRrx = 523 VRry = 522 SW = 1 VRrx = 523 VRry = 887 SW = 1 VRrx = 523 VRry = 1023 SW = 1 VRrx = 523 VRry = 1022 SW = 1 VRrx = 524 VRry = 1022 SW = 1 VRrx = 524 VRry = 1023 SW = 1 VRrx = 524 VRry = 1023 SW = 1 VRrx = 524 VRry = 1023 SW = 1 VRrx = 524 VRry = 506 SW = 1 |
The values show that the joystick returns to centre values are the
same i.e. they are consistent but the values can be very different for each potentiometer.
This library allows you to calibrate the Arduino Joystick and makes it easy to detect UP, DOWN,LEFT and RIGHT movements.
The parameters LOW HIGH and DIVITION determine how sensitive the code is to the values from the Arduino Joystick.
https://github.com/YuriiSalimov/AxisJoystick/blob/master/examples/SerialJoystick/SerialJoystick.ino
Download it from : Here
Commands in the library are:
singleRead()
multipleRead()
isPress()
isUp()
isDown()
isRight()
isLeft()
readVRx()
readVRy()
readSW()
calibrate(LOW, HIGH, DIVITION);
Instead of fiddling around with pins you can swap X and Y using:
XYReplacer(original) where original is the orignial object. Note include XYReplace.h - see example here.
/*
Joystick axes calibration
Reads a press of the calibrated joystick and displays information
in the default Serial.
https://github.com/YuriiSalimov/AxisJoystick
Created by Yurii Salimov, January, 2019.
Released into the public domain.
*/
#define VRX_PIN A1
#define VRY_PIN A2
#define LOW_RANGE 0
#define HIGH_RANGE 1023
#define RANGE_DIVITION 100
Joystick* joystic;
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
joystic = new AxisJoystick(SW_PIN, VRX_PIN, VRY_PIN);
joystic->calibrate(LOW_RANGE, HIGH_RANGE, RANGE_DIVITION);
}
// the loop function runs over and over again forever
void loop() {
Serial.print("| SingleRead: " + String(joystic->singleRead()));
Serial.print(" | MultipleRead: " + String(joystic->multipleRead()));
Serial.print(" | Press: " + String(joystic->isPress()));
Serial.print(" | Up: " + String(joystic->isUp()));
Serial.print(" | Down: " + String(joystic->isDown()));
Serial.print(" | Right: " + String(joystic->isRight()));
Serial.print(" | Left: " + String(joystic->isLeft()));
Serial.print(" | VRx: " + String(joystic->readVRx()));
Serial.print(" | VRy: " + String(joystic->readVRy()));
Serial.println(" | SW: " + String(joystic->readSW()) + " |");
}
Note If you want to map the output of the ADC to a different range of values then use the map function as follows:
outputValue = map(sensorValue, 0, 1023, 0, 255);
This will linearly map values with the minimum and maximum output:
0 maps to 0
and
1023 becomes 255.
Zero to 1023 becomes Zero to 255.
With the ADXL345 acellerometer you can detect up to 16g! You can also find out how to use it for tap detection and more.
HMC5883L - How make a digital compass, Find out the differences between the HMC5883L and the QMC5883L and whether they are compatible.
Easily use an ESP8266 with the Arduino IDE and program your first sketch into the ESP8266
The MCP4725 chip is a 12 bit DAC with memory that outputs voltage that you can use for many dfferent purposes. Find out what they are in this page.
PCF8591: A four input ADC with single DAC. How good is this 8 bit ADC, and should you use it in your next project?
Arduino Nano ISP: How to program an ATmega328P using an Arduino Nano as the ISP programmmer. One common problem: Programming a sketch into the chip without a reset control - solved here.
New! Comments
Have your say about what you just read! Leave me a comment in the box below.