GamePort Joystick to CV Module

This module is designed to convert a classic GamePort PC joystick into control voltages and gate signals for use in a modular setup. I recently picked up a beautiful CH Products Mach III joystick and thought it would make an interesting control peripheral.

GamePort joysticks are quite simple internally. Two potentiometers for the X and Y directions and two push buttons. Initially, I thought that the pots were configured as voltage dividers and I could just use some op-amp buffers, but it turns out that the opposite leg of the pots are not connected to ground, so there is no voltage change exposed on the pins, just a change in resistance. The switches are just connected to ground:

The entry for the GamePort connector on stated that the original PC interface used a 555 timer configured in monostable (one-shot) mode to read the change in resistance. The resistance value determines the the high time of the pulse when it’s triggered. The timer needs to be repeatedly triggered to provide a continuous output, so we can use another 555 timer configured in astable (oscillator) mode to provide a repeating trigger signal. A passive RC low-pass filter can then be used to convert the PWM output to an analog level. Schematic below.

Breadboarded it up and took some measurements and it looks good. The smoothed analog output is around 0-4V, so I’ll use some op-amps to boost it up to 5V and provide some buffering. I’ll also look into switching the direction of the Y direction to go high when the stick is pushed up. The schematic above currently does not represent this.

Video of oscilloscope readings. Part 1 is the clock signal and the PWM output of the 555 timer for the X direction. Part 2 shows the smoothed analog output for both directions.

Next steps for this module is to determine the values for the output op-amps (and try to figure out how to invert the response of the Y direction), and complete the PCB layout for the internals and the front panel. I’ll post updates to this thread as they come up. Let me know if you have any thoughts or suggestions, I’d love to hear it!!

EDIT: forgot to mention the buttons. Inside the joystick, they just connect to ground when pressed, so an external pullup resistor is needed. I’m planning to send these into a 40106 Schmitt trigger inverter to convert the active low signal into active high gate signals, as well as do some debouncing


Any reason you can’t just jumper the third pot terminals to ground and read them as voltage dividers?

1 Like

They’re not exposed on the connector, so I can’t without opening up the joystick. It’s an easy enough modification, but I wanted the module to work with any gameport joystick in case other folks implemented it


This is a module I have been working on for a while. It might help you with ideas. Witches BrewStick Based around the CGS joystick DC mixer. I have a few posts about adding a proper always inverted output, but further testing is needed. This is also a good source for DC mixing Tomas Henry MFOS Quad DC Modulation Mixer Great post and interesting read.


At some point, it might be easier to just use a 100k to ground and use an arduino nano to deal with the non-linearity (you could have it do calibration and trigger generation as well).


Yeah that’s certainly an option, and an extremely flexible one at that. I wanted to explore an analog only solution, more just as a practical exercise for myself than anything. Plenty of other modules I’m working on will have some arduinos involved so I didn’t want that to be my only answer to things

1 Like

OK, confess!

You used a 555 just to prevent people from saying ** You could have done that with a 555! **, haven’t you?

But seriously: nice analog solution!

** Hackaday parlance **


I think this is wonderful, and I’d particularly love to see it with a panel! Imagine walking up to a synth rig and seeing a serial input port!


Haha that’s the plan! I’ll post some kicad renders when I finalize the layout (and pics of the full assembly when I get around to ordering it)


Finalized some values, added some filtering, and figured out how to “invert” the response of the Y direction so that it feels more natural (CV increases as you push the stick away) using a differential amplifier. PCB layout of the mainboard and the faceplate to follow


Layout complete, working on finishing up the faceplate now.
Project page is here


Faceplate finished. Plan is to mount the mainboard through the panel using the lug screws on either side of the DB15 connector