Arduino Leonardo/Micro As Game Controller/Joystick




IMPORTANT NOTE: This article is for Arduino IDE version 1.6.6 (or above). To add a USB Game Controller to an Arduino Leonardo or Micro using Arduino IDE version 1.6.5 (or below) see the following Instructable: Add USB Game Controller to Arduino Leonardo/Micro.

Out of the box the Arduino Leonardo and the Arduino Micro appear to the host computer as a generic keyboard and mouse. This article discusses how the Arduino Leonardo and the Arduino Micro can also appear as a generic Game Controller or Joystick. This project will only work with Arduino products based on the ATmega32u4 microcontroller (i.e. the Arduino Leonardo and the Arduino Micro). It will not work with the Arduino UNO, because it is based on the ATmega328 microcontroller.

The Arduino Joystick Library (a.k.a. Game Controller library) used in the Instructable provides the following:

  • X, Y, and Z axis
  • 32 buttons
  • X, Y, and Z axis rotation
  • Rudder
  • Throttle
  • 2 Point of View Hat Switches

Step 1: Installing the Library

The latest version of the Arduino library that allows the Arduino Leonardo and Micro to appear as a Game Controller can be downloaded from the following GitHub repository:

This GitHub repository actually contains three different versions of the Arduino Joystick Library:

  • Joystick - Causes the Arduino to appear as single Game Controller
  • Joystick2 - Causes the Arduino to appear as two, simple Game Controllers
  • Joystick3 - Causes the Arduino to appear as three, simple Game Controllers

Copy the Joystick (and/or Joystick2 and/or Joystick3) folder from GitHub to the Arduino Libraries folder (typically located at %userprofile%\Documents\Arduino\libraries). The library (or libraries) should now appear in the Arduino IDE list of libraries.

Step 2: Running the Test Sketch

Included in the library is a test sketch, called UsbJoystickTest.ino (or UsbJoystick2Test.ino or UsbJoystick3Test.ino). This sketch should be loaded, compiled, and uploaded to the Arduino Leonardo or Micro using the Arduino IDE (version 1.6.6 or above).

The following steps are for Windows 7. If you have a different version of Windows or a different operating system, these steps may differ.

Step 3: Windows Control Panel - Hardware and Sound

Go to the Windows Control Panel and select “Hardware and Sound”.

Step 4: Devices and Printers

Then select “Devices and Printers”.

Step 5: Arduino Settings

  1. The Arduino Micro or Arduino Leonardo should appear in the list of devices.
  2. Right mouse click on the Arduino Leonardo or Arduino Micro to display the settings menu.
  3. Select “Game controller settings” to get to the “Game Controllers” dialog.

Step 6: Game Controller Settings

The Arduino Leonardo or Micro should appear in the list of installed game controllers. Select the Arduino Leonardo or Micro and click the Properties button to display the game controller test dialog.

Step 7: Test Using Game Controller Settings

While this dialog has focus, ground pin A0 on the Arduino to activate the test script. The test script will test the game controller functionality in the following order:

  • 32 buttons
  • throttle and rudder
  • X and Y Axis
  • Z Axis
  • 2 Hat Switches
  • X and Y Axis Rotation

Step 8: Another Simple Test

Once you have verified the Arduino Leonardo or Micro is working as a Game Controller, you can start creating your own Game Controller projects. The attached Arduino sketch file is a simple example that reads digital pins 9, 10, 11, and 12 and maps them to buttons 1, 2, 3, and 4 on the Game Controller.

Step 9: Joystick Library API

Now that the Joystick library is available to the Arduino IDE, an Arduino Leonardo or Arduino Micro can be used for custom game controller projects. The following describes the complete Arduino Joystick Library API.

Joystick.begin(bool initAutoSendState)

Starts emulating a game controller connected to a computer. By default all methods update the game controller state immediately. If initAutoSendState is set to false, the Joystick.sendState method must be called to update the game controller state.


Stops the game controller emulation to a connected computer.

Joystick.setXAxis(byte value)

Sets the X axis value. Range -127 to 127 (0 is center).

Joystick.setYAxis(byte value)

Sets the Y axis value. Range -127 to 127 (0 is center).

Joystick.setZAxis(byte value)

Sets the Z axis value. Range -127 to 127 (0 is center).

Joystick.setXAxisRotation(int value)

Sets the X axis rotation value. Range 0° to 360°.

Joystick.setyAxisRotation(int value)

Sets the Y axis rotation value. Range 0° to 360°.

Joystick.setZAxisRotation(int value)

Sets the Z axis rotation value. Range 0° to 360°.

Joystick.setButton(byte button, byte value)

Sets the state (0 or 1) of the specified button (0 - 31). The button is the 0-based button number (i.e. button #1 is 0, button #2 is 1, etc.). The value is 1 if the button is pressed and 0 if the button is released.

Joystick.pressButton(byte button)

Press the indicated button (0 - 31). The button is the 0-based button number (i.e. button #1 is 0, button #2 is 1, etc.).

Joystick.releaseButton(byte button)

Release the indicated button (0 - 31). The button is the 0-based button number (i.e. button #1 is 0, button #2 is 1, etc.).

Joystick.setThrottle(byte value)

Sets the throttle value. Range 0 to 255.

Joystick.setRudder(byte value)

Sets the rudder value. Range 0 to 255.

Joystick.setHatSwitch(byte hatSwitch, int value)

Sets the value of the specified hat switch. The hatSwitch is 0-based (i.e. hat switch #1 is 0 and hat switch #2 is 1). The value is from 0° to 360°, but in 45° increments. Any value less than 45° will be rounded down (i.e. 44° is rounded down to 0°, 89° is rounded down to 45°, etc.). Set the value to -1 to release the hat switch.


Sends the updated joystick state to the host computer. Only needs to be called if AutoSendState is false (see Joystick.begin for more details).

Step 10: Additional Information

Additional information about this Arduino Joystick Library can be found on the following websites:

Arduino Joystick Library -

GitHub [MHeironimus/ArduinoJoystickLibrary] -

Tech Contest

Participated in the
Tech Contest



    • Growing Beyond Earth Maker Contest

      Growing Beyond Earth Maker Contest
    • Planter Challenge

      Planter Challenge
    • Stone Concrete and Cement Contest

      Stone Concrete and Cement Contest

    192 Discussions


    1 year ago

    32button hardware mappings Leonardo schematic?

    2 replies

    Reply 6 days ago

    I just saw the comments.
    Thank you so much.
    Let's try. Thank you.


    5 months ago

    I would like to add an analogue signal from a steering potentiometer but I do not know how to do it you could help me

    1 reply

    Reply 3 months ago

    next to the axises you mean? That would require chaning the library a bit i quess...


    3 months ago

    I've edited the source files so that there are 4 joysticks with only buttons working (lightweight), I'm currently doing a project in which I make 4 wireless arcade controllers that will be send to a host node which creates 4 joysticks. The thing is that I wanted each controller recognized seperately and that I needed 16 buttons per controller. Your instructions helped a lot for this project. Thank you

    2 replies

    Tip 8 months ago

    I had broken ps joystick with 14 buttons, but my pro micro has 9 digital pin.
    This is how I use analog pin as digital button. I used example "JoystickButton.ino" in "JoystickButton" library.
    void setup() {
    void loop() {
    if (digitalRead(A0) == LOW) { Joystick.setButton(0, 0); } else { Joystick.setButton(0, 1);}

    Phisical button connect to VCC and A0

    Question 11 months ago on Step 10

    what code is required to enable or use a button matrix? which are the input pins for the matrix?

    Thanks in advance.


    Question 1 year ago on Step 10

    How id the Joystick hooked up to an Arduino Leonardo I can t get it to work I don't know which ports to plug the serial joystick into

    1 answer

    1 year ago

    Hello, i am very new to arduino and i am building a buttonbox based on this youtube tutorial :

    The only difference i want to use a analog joystick with it and i will use the Arduino micro instead of the pro micro.

    The parts i have is a analog joystick, 4 rotary encoders EC11, and 16 momentary push buttons.

    would anyone be so kind to take a look if my wiring diagram is correct??

    Also i could need some help with the sketch, i have zero knowledge how to do this. I can build a lot of stuf with my hands, but programming goes far beyond my knowledge unfortunately.

    If anyone would make a sketch for me i'd be very happy.......

    Thnx in advance!

    Buttonbox V3.0_bb.jpg
    1 reply

    Reply 1 year ago


    I am new as well. I am trying to do the same, but without the encoders. Did you manage to fix the code? If you can post it it will be so helpful.


    Frau Muster

    1 year ago

    Hello, I’m also using MHeironimous JoystickLibrary and got all my old "Gameport"-Joysticks working again at USB very successful using your tutorial. Many thanks!

    Now I’ve built another Arduino sketch using this library for my ProMicro to run it as Gamecontroller to control my flight simulator. Especially I want to use optical rotary encoders to simulate joystick buttons: each detent on the encoder should send a Joystick.pressButton(byte button).

    That works perfectly in the Serial Monitor and with LED flashes for each detent but as soon as I connect the ProMicro to my PC and choose Game Controller/Settings in Windows 10, not every „button press" is recognized in the Game Controller - sometimes only about one in two, sometimes only about one in more. That is not only when I’m rotating the encoder fast, it also appears by turning the encoder slowly detent by detent.

    Baud rate is 9600. Is it possible that the detent duration is too short? Or the pressButton rate is too high for the Game Controller? Don’t know how to solve the problem.

    Thank you in advance.

    1 reply
    MatthewHFrau Muster

    Reply 1 year ago

    How often are you sampling your optical rotary encoders? I would recommend doing it every 50ms (i.e. 200 times a second).

    You may need to disable (comment out) your serial communication (or increase your baud rate to 57600).

    Hope you can get it working,


    Question 1 year ago

    Hi! nice job, I try to build a joy with Arduino UNO, and have a problem with the calibration, when xplane run popup message appear saying "new usb joystick and need to calibrate.." allways :(. In this proyect the calibration data is stored? It would not work for me if the calibration can not be saved. Thanks!!!