Documentation

ShillehTek Joystick Shield V1.A 2-axis analog Gamepad Controller Module for Arduino R3 | ShillehTek Product Manual
Documentation / ShillehTek Joystick Shield V1.A 2-axis analog Gamepad Controller Module for Arduino R3 | ShillehTek Product Manual

ShillehTek Joystick Shield V1.A 2-axis analog Gamepad Controller Module for Arduino R3 | ShillehTek Product Manual

Overview

The Joystick Shield V1.A is a plug-and-play gamepad shield that drops onto an Arduino UNO R3 (or any UNO-form-factor board) and adds two analog thumb-stick joysticks plus servo, sensor, and Bluetooth/nRF24 expansion headers. It's the perfect base for retro-style game controllers, RC robot remotes, drone transmitters, and any project that needs intuitive directional input.

Each joystick provides X/Y analog readings (0-1023 on a 10-bit ADC) plus a digital push-button when you press it down. The shield also breaks out a digital Servo header (D8-D11), an analog sensor row (A1, A5, 3.3V, 5V, GND), and pin headers for I2C, SPI, and serial expansion modules. Everything routes through standard Arduino UNO header pins so existing libraries just work.

At a Glance

Form Factor
Arduino UNO R3
Joysticks
2 (analog X/Y + button)
Operating Voltage
5V (from UNO)
Analog Range
0 - 1023 (10-bit)
Expansion
Servo / I2C / SPI / nRF24
Dimensions
65.1 × 53.8 mm

Specifications

Parameter Value
Compatible Board Arduino UNO R3 (and clones)
Operating Voltage 5V (taken from UNO 5V rail)
Logic Level 5V
Joystick Type Analog (potentiometer-based) with push-button
Joystick X Axis Left = A0, Right = A2
Joystick Y Axis Left = A1, Right = A3
Joystick Button Left = D8, Right = D9 (active LOW)
Servo Headers S/+/G on D5, D6, D9, D10, D11
Sensor Header 5V, 3.3V, GND, A1, A5, D8
Comm Headers I2C (SDA/SCL), SPI (MISO/MOSI/SCK/SS), TX/RX
Dimensions 65.1 mm × 53.8 mm

Pinout Diagram

Joystick Shield V1.A pinout showing two analog joysticks, servo S/+/G headers, sensor row, I2C, SPI, TX/RX, and Arduino UNO header pins

Wiring Guide

Mounting on the Arduino UNO

Power off your UNO, then press the shield down so its pins line up with the UNO's male headers. There's only one orientation that fits — gently rock it down evenly so no pins bend.

Shield Function UNO Pin
Left Joystick X A0
Left Joystick Y A1
Left Joystick Button D8
Right Joystick X A2
Right Joystick Y A3
Right Joystick Button D9
Power 5V (from USB or barrel jack)
Tip: Idle/centered joysticks read around 512 (mid-scale of 1023). Use a deadband of ±30 around 512 to ignore tiny jitter when the stick is at rest.

Servo Header

The shield has 5 servo positions, each with three pins: Signal (S), 5V (+), GND (G). Just plug in any standard 9g hobby servo (SG90, MG90S, etc.) and call Servo.attach() in your sketch.

Position Signal Pin
Servo 1 D5
Servo 2 D6
Servo 3 D9
Servo 4 D10
Servo 5 D11
Warning: Powering more than 1-2 small servos from the UNO's 5V rail can brown out the Arduino. For 3+ servos, run them off a separate 5V supply with a shared GND.

Sensor / Module Header

The sensor strip exposes 5V, 3.3V, GND, A1, A5, D8 — enough to plug in an OLED, a BME280, or a soil moisture sensor without leaving the shield.

Header Pin UNO Pin / Use
3.3V 3.3V output
5V 5V output
GND Ground
A1 Shared with Left Joystick Y — pick one
A5 Free analog (also I2C SCL)
D8 Shared with Left Button

Code Examples

Arduino — Read Both Joysticks

joystick_shield.ino
// Joystick Shield V1.A - Read both joysticks
// Print X, Y, and button state for left and right sticks

const int LX = A0, LY = A1, LBTN = 8;
const int RX = A2, RY = A3, RBTN = 9;

void setup() {
  Serial.begin(9600);
  pinMode(LBTN, INPUT_PULLUP);
  pinMode(RBTN, INPUT_PULLUP);
}

void loop() {
  int lx = analogRead(LX), ly = analogRead(LY);
  int rx = analogRead(RX), ry = analogRead(RY);
  bool lpress = digitalRead(LBTN) == LOW;
  bool rpress = digitalRead(RBTN) == LOW;

  Serial.print("L: ("); Serial.print(lx); Serial.print(",");
  Serial.print(ly); Serial.print(") "); Serial.print(lpress ? "DOWN" : "up");
  Serial.print("   R: ("); Serial.print(rx); Serial.print(",");
  Serial.print(ry); Serial.print(") "); Serial.println(rpress ? "DOWN" : "up");

  delay(100);
}

Arduino — Drive a Servo with the Right Joystick

joystick_servo.ino
// Map right joystick X (0-1023) to servo angle (0-180)
// Plug servo into the D9 servo header

#include <Servo.h>
Servo srv;

const int RX = A2;
const int SERVO_PIN = 9;

void setup() {
  srv.attach(SERVO_PIN);
}

void loop() {
  int x = analogRead(RX);
  int angle = map(x, 0, 1023, 0, 180);
  srv.write(angle);
  delay(15);
}

Arduino — Deadband + 4-Direction Helper

joystick_directions.ino
// Convert raw joystick X/Y into discrete UP/DOWN/LEFT/RIGHT

const int LX = A0, LY = A1;
const int CENTER = 512, DEAD = 100;

const char* dirOf(int x, int y) {
  if (x < CENTER - DEAD) return "LEFT";
  if (x > CENTER + DEAD) return "RIGHT";
  if (y < CENTER - DEAD) return "UP";
  if (y > CENTER + DEAD) return "DOWN";
  return "CENTER";
}

void setup() { Serial.begin(9600); }

void loop() {
  Serial.println(dirOf(analogRead(LX), analogRead(LY)));
  delay(150);
}

Frequently Asked Questions

My joystick reads aren't centered at 512 — is it broken?
Cheap analog sticks rarely center perfectly. Read the resting value once at startup, store it as your "center", and subtract it from future reads. Combine with a deadband of ~30-50 to suppress jitter.
Can I use this with an Arduino Mega or Leonardo?
Yes — the headers are UNO R3 standard, so it physically fits Mega and Leonardo. The pin assignments stay the same (A0-A3 for joysticks, D8/D9 for buttons). Leonardo is especially fun because it can present itself as a USB HID gamepad.
How do I plug in an nRF24L01 transceiver?
The shield has a labeled NRF/Bluetooth header that breaks out SPI plus VCC/GND. Plug the nRF24 module in directly (mind orientation — the antenna should point off the board). Use the standard RF24 library and you've got a wireless gamepad.
What's the buzzer / vibration motor for?
Some V1.A boards include a small buzzer pad you can solder a piezo to for tactile feedback. Drive it with tone() on D2 (varies by board revision — check yours). Not all V1.A revisions populate this.
Why does my UNO reset when I move the joysticks?
Probably power dip if you have servos plugged into the servo header. Unplug the servos and confirm the joystick alone works. For multi-servo setups, use an external 5V supply.
Does it support Bluetooth?
Yes — the shield has a Bluetooth header pre-routed for HC-05 / HC-06 modules. Plug an HC-05 in, pair with your phone, and stream joystick coordinates as serial bytes for a wireless controller.