In order to connect Atari/Amiga style joysticks and an old X-Arcade stick with blown controller, I decided to make a USB Joystick Controller. There are a couple of similar projects on the net, but they are designed for analogue joysticks and a limited number of buttons. The X-Arcade has 12 buttons, and having extra buttons is useful for emulators like MAME.

Later, I added support for Sega Saturn, Mega Drive, Master System, Famicom (NES) and Super Famicom (SNES) controllers to create the "Retro Adapter".

Click here for Retro Adapter V2 information. V2 supports more controllers and a new modular design.

A new version of the Arcade Joystick controller is also in the works. Stay tuned for more info.

BBC coverage of the original Retro Adapter and the new prototype (starts after the PacMan segment, at 1.35):

Updates

04.03.08    Updated schematics and stripboard layouts with new diode based USB interface. Old interface used 5V signalling, new version uses more compatible 3.6V signalling.
27.04.08Fixed missing pin 4 -> pin 14 wire in stripboard layouts.
15.06.08Correct diode polarity and added missing D- jumper wire to stripboard layouts.
09.08.08Added Retro Adapter source code.

Joystick Controller


Features:

I found Igor Cesko's web site and his USB implementation for Atmel AVR microcontrollers. I decided to use it with an ATmega8, and modified it for use as a HID joystick. The device has X/Y axis for the joystick and 13 buttons.

The controller can also be used to convert up to three Atari style joysticks to USB, or two Neo Geo joysticks.

Windows joystick config page

The AVR needs very few external components. A 12MHz crystal is used to provide accurate USB timing. Apart from that, there are just four resistors for the USB interface. Power is taken from USB, and filtering capacitors do not seem to be necessary.

The four directional switches and all buttons are simply switches to ground. Internal weak pull-ups in the AVR keep all lines high when the switches are not closed. There does not seem to be any problem with switch bounce using microswitches, or any input lag.

Schematic

schematic    stripboard    stripboard without ISP
Schematic    Stripboard with ISP    Stripboard without ISP

Note 1: Schematics and PCB have been updated. Old schematic: schematic_v1.png. Old PCB: pcb_v1.png.

Note 2: The stripboard layout is identical to the Retro Adapter, except that R5 and R6 are omitted. The device will work with either firmware even if they are included.

The circuit can easily be constructed on stripboard (veroboard). That is how I made the prototype, which was installed in the X-Arcade stick. See the Retro Adapter section for a two layer PCB.

Retro Adapter


Supported controllers:

Features:

I wanted to connect Sega Saturn pads to USB. Sega manufactured some USB Saturn controllers for sale in Japan, but they are very hard to get. I looked at the Saturn controller interface and realized it would not be difficult to decode. Since I had free pins on the ATmega8, I decided to also support NES/SNES controllers.

Sega Mega Drive and SG-1000 Mark III (Master System) controllers also use 9 pin connectors, and it is possible to connect them to the same port as Atari joysticks. Pin 5 is both an input for fire button 3 on Atari style sticks and +5V supply for Sega controllers. Pin 7 can supply +5V for Amiga joysticks that need it, however it will be pulled low for a few milliseconds every time the joystick is read. So far I have not found any joysticks that use +5V, as autofire circuits use the pull-ups on the fire button line to create oscillation.

Schematic

retro schematic    retro stripboard    retro stripboard no ISP
Schematic    Stripboard with ISP    Stripboard without ISP

The Retro Adapter circuit is compatible with the Arcade Stick controller, and both can also be easily built on stripboard. The PCB can be used for both, simply changing the firmware depending on which type of controller is desired.

Parts List


Name    Part
IC1Atmel ATmega8-P
Q112MHz Crystal, HC49U or U4 package
C1, C222pF ceramic disc capacitor
C3100nF ceramic disc capacitor
C410µF electrolytic capacitor
R1, R268Ω resistor, 0.125w
R32k2Ω resistor, 0.125w
D1, D23V6 Zener diode, 0.5w
H1, H2, H3, H41 row pin headers 1
USBUSB-B PCB header 2
ISP2x3 6 pin header 3
R5, R610kΩ resistor, 0.125w 4

1 Makes soldering wires on easy, but you could solder them directly to the board.
2 You can also just solder a USB cable directly to the board, as I did for the prototypes.
3 The ISP header is optional. It is only needed to program the AVR microcontroller once, so if you have a pre-programmed chip it can be omitted.
4 R5 and R6 are only needed for the Retro Adapter, they can be omitted from the Joystick Controller version.

C3 and C4 are to provide protection from noise on the power supply line. I have found them to be unnecessary on every board I have made, but it is possible they may improve compatibility with very long USB cables or poor quality hubs.

Connections


Connections are shown on the schematics, and printed on the PCBs. Here is a complete list of connections for the Retro Adapter, in case you want to use the same PCB for a Joystick Controller. Pin-outs for the retro console connectors are also provided.

d sub 9 Atari/Commodore/Amiga style joystick connector (male 9 pin d-sub)
 Pin  Atari/Commodore  Sega 
 1UpUp
 2DownDown
 3LeftLeft
 4RightRight
 5Fire 3 (Amiga only)+5V
 6Fire 1A / B
 7+5V (Amiga only)Select
 8GNDGND
 9Fire 2Start / C

 

sega saturn connector Sega Saturn Controller (at console)
PinSega Saturn
1+5V
2Data 1
3Data 0
4Select 0
5Select 1
6+5V
7Data 3
8Data 2
9GND

 

famicon connector Nintendo Famicom / NES Controller (at console)
super famicon connector Nintendo Super Famicom / SNES Controller (at console)
PinFamicomSuper Famicom
1GND+5V
2ClockClock
3LatchLatch
4Serial Data  Serial Data  
5+5VNC
6NCNC
7NCGND

The Famicom and Super Famicom connectors can be wires to the same pins on the Retro Adapter. Only one or the other can be used at the same time, although nothing bad will happen if both are connected. Be sure to get the +5V/GND wires the right way around!

&nbp;

Generic PCB connections

The same PCB can be used for the Retro Adapter, Joystick controller, and a triple Atari/Commodore joystick adapter. For the latter, extra fire buttons are used for the joystick movement of the second and third sticks. Note that stick 3 only supports one fire button, the others support 2. Of course the same technique works for dual six button joysticks, or any combination. Perfect for Robotron :)

AVR pin      Retro Adapter    Joystick  Tripple Atari Adapter
2 (PD0)Saturn 2Up1.Up
3 (PD1)Saturn 3Down1.Down
5 (PD3)Saturn 4Left1.Left
6 (PD4)Saturn 5Right1.Right
11 (PD5)Saturn 7Button 11.Fire 1
12 (PD6)Saturn 8Button 21.Fire 2
13 (PD7)Atari 5Button 32.Up
16 (PB2)Atari 7Button 10 (A)2.Down
17 (PB3)Famicom 2Button 11 (B)    2.Left
18 (PB4)Famicom 3Button 12 (C)2.Right
19 (PB5)Famicom 4Button 13 (D)2.Fire 1
23 (PC0)Atari 1Button 42.Fire 2
24 (PC1)Atari 2Button 53.Up
25 (PC2)Atari 3Button 63.Down
26 (PC3)Atari 4Button 73.Left
27 (PC4)Atari 6Button 83.Right
28 (PC5)Atari 9Button 93.Fire 1

Support for other "simple" joysticks/gamepads is simply a matter of connecting the right wires up. Neo Geo, Sega Master System and most other 8 bit controllers should work without any problem.

Dual USB/Playstation Joystick Controller


Features:

After finishing the USB interface, I realised it would be useful to have a joystick that supports both USB and Playstation (PSX) connections. The PSX interface, used on both the PS1 and PS2, is a fairly simple serial protocol. The microcontroller automatically detects which interface is in use. A tri-colour LED shows which interface is active: yellow while detecting, red for PSX and green for USB.

I have one working prototype of this design. Both interfaces work perfectly. The Playstation interface is fortunately rather simple and easy to interface with. However, I ran into a problem with not having enough I/O pins on the AVR to give a reasonable number of fire button inputs as the Playstation connection requires five I/O pins to operate.

My first attempt to overcome this was to use 74153 multiplexers, similar to how the Sega Saturn controller works. Unfortunately this proved to be somewhat unstable in operation, due to the increased current requirements and switching noise. A simpler solution would be to simply use a larger AVR with more I/O pins, which is something I may look at in the future. Such an AVR could also easily support connection to Saturn and Nintendo consoles too.

Prototypes


Joystick Controller:

prototype photo 1   prototype photo 2   prototype photo 3  
(Click for larger versions)

Retro Adapter:

Two Retro Adapter prototypes were built into a Sega Saturn multi-tap. Two NES connectors are available on the other side, not visible in the photo.

retro adapter prototype  
(Click for larger version)

Downloads


Joystick Controller:

Firmware hex file: JoystickControllerV1.1.zip
Firmware source code: Arcade_Joystick.zip

Retro Adapter:

Firmware hex file: RetroAdapterV1.0.zip
Firmware source code: RetroAdapterV1.0-asm.zip