The fab-o-lab blog was my new brainchild this year, but I blogged already since a few years, one of my most popular posts on that blog was ‘Connecting old school joysticks to the Arduino’. So it’s no bad idea I think to repost it here. More vintage gaming stuff here
So you’ve got some old school joystick with a DB9 connector lying around, time to connect it an Arduino board.
The pin out’s for the joystick connector (male connector) I took from the original Atari pin out, as we see later on this pin layout is the most generic one and works with joysticks from Atari, Commodore, Sega, Quickshot, …
Pin’s 1 to 4 are up/down/left/right
Pin 6 is the fire button
Pin 8 is the GND
If you need to support more button’s then there’s some bad news every manufacturer seems to did his own extra button wiring, so for simplicity I took a one button configuration. We simply need to connect these pins to the the Arduino digital pins. I choose pins 3 to 7, you can choose other configurations but for me it was more easier to choose 5 pins next to each other as I reused an old serial switch box to recuperate the DB9 male connector on it, so I simply cut the wires from it.
Next I soldered the wires comming from the male DB9 to the pins as in the picture. Pins 7 -> 3 Up/Down/Left/Right/Fire
A soldered 1 pin to the GND wire.
Then it was time to test this setup, I used an Arduino Decimilla for the test, with a small sketch.
Joystick test Sketch
Reads the digital direction and button state from Atari compatible joystick.
Some code reused from the Sparkfun joystick shield test sketch.
//Variables for the buttons
char buttonUp=7, buttonDown=6, buttonLeft=5, buttonRight=4, buttonFire=3;
digitalWrite(buttonUp, HIGH); //Enable the pull-up resistor
digitalWrite(buttonDown, HIGH); //Enable the pull-up resistor
digitalWrite(buttonLeft, HIGH); //Enable the pull-up resistor
digitalWrite(buttonRight, HIGH); //Enable the pull-up resistor
digitalWrite(buttonFire, HIGH); //Enable the pull-up resistor
Serial.begin(9600); //Turn on the Serial Port at 9600 bps
Serial.print(digitalRead(buttonUp)); //Read the value of the button up and print it on the serial port.
Serial.print(digitalRead(buttonDown)); //Read the value of the button down and print it on the serial port.
Serial.print(digitalRead(buttonLeft)); //Read the value of the button left and print it on the serial port.
Serial.print(digitalRead(buttonRight)); //Read the value of the button right and print it on the serial port.
Serial.println(digitalRead(buttonFire)); //Read the value of the button fire and print it on the serial port.
//Wait for 100 ms, then go back to the beginning of 'loop' and repeat.
Then I did some testing with joysticks and gamepads I had lying around:
Quickshot standard, original from my C64 works exactly like the Atari.
Atari gamepad with button 1 & 2 both buttons trigger the same fire button but can be wired different to get both working.
Sega Master System gamepad, only button 1 works.
Sega Mega Drive gamepad, only button B works.
We can conclude that all support the directional buttons and fire button but the extra button’s are a different story maybe for another blog post ?
Finally I hooked the joystick up to my Uno/Gameduino setup, that’s why I didn’t used pin 2 as it’s used by the Gameduino.
I remapped the pins in the Gameduino Asteroids sketch and the whole thing runs perfectly. Although the Asteroids game doesn’t use the fire button.