Reverse Engineer Game Controller with custom PS2 Interface


I have an old Saitek Throttle Quadrant at hand and thought I might hack it to use with an Arduino.

The challenge is, it uses a PS2 connector and a custom one I think.
I found out so far, that it isn’t a standard PS2 connector, all Pins are in use.
I managed to find the power and ground connector, but there are still 4 pins left. I haven’t found any documentation so far and believe that there isn’t any publicly available.

I cut the cable and soldered the connections to a prototype board.
I’m not familiar with PS2 protocols or Serial protocols or whatever they are using.

Is there a way to reverse engineer the data which is sent by the throttle quadrant? And also doable for someone with little experience in that matter.




Not sure if this is still relevant to you, but I’m currently working on exactly the same thing. I’ve managed to reverse engineer the interface between the throttle and the yoke. I’ve attached my handwritten notes, maybe they are still of some use to you.

I have managed to turn the throttle into a standalone USB controller using an Arduino Leonardo. I’ll share the code once I’ve cleaned it up a bit.

I’ve cleaned up the code a bit. I’ve used Atmel Studio and directly flashed it to the Leonardo via SPI. Unfortunately, I wasn’t able to make it work using the Arduino IDE, I assume that it has something to do with the Arduino bootloader. (11.6 KB)

1 Like

Hey aviator7, I’ve just picked up an old ps2 Saitek throttle as well with exactly the same intention. Was trying to reverse engineer it as I don’t have a Saitek yoke to plug it into. Haven’t gotten very far except as much as identifying the Vcc and ground pins on the ps2 connector, as in Christophe’s original post. I’m still a newbie with arduino too, but hoping to use either an uno or Leonardo / pro micro to connect up the three axis and the 3/6 buttons. ( I’ve used Leo Bodnar bu0836a before on other joystick mods but arduino is so much cheaper

Downloaded the code and think I can connect the following to my Leonardo 5V, GND, Data MISO, SCK, 2nd 5V, but don’t know about the Ready connection.

Hi again the code output is individual files is there anyway to list the .hex program that can just be uploaded as a single file as i have no idea how to upload multiple small .c and .h files. Thanks again

Hi Aviator7,

Managed to use your code in Atmel Studio 7, and compile it, debug it and send to my Leonardo, connected up ( with a breadboard for the red and green status led’s and happy to say you’ve cracked it and it works perfectly

I too am trying to accomplish the same thing with my throttle quadrant. I would really appreciate it if something could give a quick tutorial on how to accomplish this. How was this wired to the board and how is it calibrated on the pc side to work with games. Thanks


If you want to use my code, you can either download the source files I posted above and then customize and compile them using Atmel Studio. I’ve also attached a compiled .hex file suitable for flashing to the Arduino Leonardo, also using Atmel Studio (or avrdude, if you’re using Linux / macOS).

As for the pin assignments, the throttle cable consists of six wires. You can either cut off the connector and hook them up to the Arduino directly, or you can use a 6-pin mini DIN connector. The pin mapping (for an Arduino Leonardo) is as follows:

miniDIN pin Wire color Purpose ATmega32U4 pin Arduino Leonardo pin
1 blue clock / SCK D1 Digital Pin 2
2 brown throttle data ready (active-low) D0 Digital Pin 3
3 red +5V
4 orange ground
5 yellow data / MISO D2 Digital Pin 0
6 green +5V

As for the calibration: Using my code, the Arduino Leonardo will show up on your PC just like a regular joystick. In fact, it will show up as the standalone USB version of the Saitek Throttle Quadrant. On Windows you can then calibrate it just like any other game controller.

Hope that helps (3.13 KB)

This absolutely helps. Thanks for responding. I'm definitely gonna try this out when i have a chance. Is this kind of project limited to the leonardo for any reason or can it be performed with any arduino board? Thanks

This project is suited best for the Arduino Leonardo or Arduino Micro. The reason for that is that these boards provide direct access to the USB interface from the MCU. Other Arduino boards do not have this capability. Take the Arduino Uno for example: There are two AVR MCUs on the board: One ATmega328P, which is the MCU actually running your Arduino sketch, and a separarte ATmega16U2, which acts as an interface between the USB port and the ATmega328P. You could, in theory, flash the code directly onto the ATmega16U2 on the Arduino Uno. However, since you can't access the 16U2's I/O ports, you would then also have to write some code to interact with the 328P and have it manipulate the boards pins which just becomes unnecessarily complicated. Thus it's easiest to just use an Arduino Leonardo or Micro and avoid all that hassle.

Hi Guys,

I am newbie but have basic understanding

My PS/2 Saitek quadarant has stopped working.

Can I use an Arduino UNO board for the thottle, prop and mixture axis with your above code



Oh the wirings in there at the moment im using mobiflight to control parking brake light, beacon light etc

aviator7: Hi

Not sure if this is still relevant to you, but I'm currently working on exactly the same thing. I've managed to reverse engineer the interface between the throttle and the yoke. I've attached my handwritten notes, maybe they are still of some use to you.

I have managed to turn the throttle into a standalone USB controller using an Arduino Leonardo. I'll share the code once I've cleaned it up a bit.

Dear Aviator7, I have the PS/2 throttle quadrant but without the PS/2 connector ( the cable was cutted and now I hane only the 6 wires cable attached to the quadrant. I'd like to re-solder a new PS/2 connector to the wires to use it again connected with the yoke. I Saw your handwritten notes and here I could find the solution but... the image of the pin scheme, looking into the connector is looking into the connector attached in the yoke or attached to the cable? female or male? you know, for not inversing wires..... otherwise, don't you have the original cutted PS/2 connector ? in case, could you sell it to me?

Thanks a lot Piergiorgio

Hi Piergiorgio,

As per Aviator7 notes the 6 colours are as if you were looking into the end of the 6 pin mini din ps2 connector so you would need to rotate the connector through 180 degrees and wire up to match.

You can buy the 6 pin mini din ps2 connectors at many electronics stores and or eBay

Hi all!

I tried to flash the code from aviator7 to a Pro Micro and to a Leonardo, respectively, but i just can not make it work. Regardless of whether I flash the HEX file directly, or compile the source code myself using Arduino IDE, the result is always the same on both controllers: upload is successful, but then Windows loses the connection to the microcontroller immediately, and it is not detected anymore, regardless of how many times I unplug-replug it. The only way to ‘revive’ the microcontrollers is to use RST to temporarily make the bootloader port available, and reflash using some generic code.

I am using Windows10. The code is reported to be good and operational. Can anybody tell what I am doing wrong?

I had something similar and couldn't work out why it didn't show up as a USB device. Spent hours trying to re-flash the firmware onto the device in different ways.

Then I read the code and realized it does not initialize USB connection until the throttle is plugged in! I changed the code (as I didn't have the wiring ready) and it showed up!

This may not be your problem, but might help someone else?

My problem now is the device seems to disconnect after a random amount of time, and then immediately windows 10 says its now an unrecognized device as getting "USB Device Not Recognized, Unknown USB Device (Device Descriptor Request Failed)" :(

Hi shanus!

Thanks for the reply! Can you maybe share what you have changed in the code?

From memory, I changed in main.c

bool throttle_connected = false; to bool throttle_connected = true;


if (flag_timer_1) { to if (0) {

The idea was just to make it seem like the throttle was connected so I could see if the USB device would show up. You shouldn't run with these changes if your device is connected to your Leonardo correctly as the original code detects your throttle connection and then makes the USB show up.