Converting old Game-port joysticks to USB

This project intend to revive old PC Game port type joysticks by converting them to modern USB HID game device.

So, you want to convert your good old Suncom F15 Talon joystick from this:

OldCon

into this:

NewCon

In this post I will explain in detail how to convert an old Game Port joystick to USB using pic microcontroller. I will also provide PCB schematics and PIC firmware.

Note: This project requires basic electronics understanding and soldering skills, And of course, everything provided here is given as-is, use it wisely and on your own risk.

This project is intended to replace the hardware of a Suncom f15 Talon joystick, but with little tweaks can be used for other types of joysticks. The PCB have several extra inputs to accommodate for extra inputs/axis.

Suncom F15 Talon joystick

The SFT joystick, aside from Game-port connector, have a keyboard bypass connector that enables the joystick to convert joystick buttons into keystrokes. This function was necessary since PC Game-port supports only 4 buttons. It has a programmable feature to set what key is mapped to which button. This function is now obsolete since a USB joystick can support as many buttons as needed. The joystick itself contains 2 PCBs inside, one at the base that controls all programmable functions and keyboard emulation, and another one inside the grip that collects all button presses and communicate them with the base PCB. I had to reverse engineer this communication since the communication chip was too old to find a datasheet for. Turns out its a simple parallel to serial converter, easily handled by a microcontroller. This also eliminate the need to replace the PCB in the grip.

Dismantling the SFT base PCB

We now need to carefully remove the base PCB taking notes of some wiring connections.

Open the base: remove the suction cups by unscrewing them. Reveal the base screws by pealing off the rubber pads. Unscrew the base screws and remove the metal base.

Remove the PCB: Unscrew the 5 PCB holding screws. Lift the PCB. Using a soldering iron start removing all wires from the PCB. There are 4 wires connecting the pots, and 9 wires connecting the grip. 5 of the wires coming from the grip must be carefully noted and marked before disconnection: GND, PR, CS, D0-D1, and Pi-P/S

bottom_pcb_note

Note and mark these wires!

The other 4 wires coming from the grip are the original game port buttons and we don’t need them. (There is a button in the grip just under the POV lever, that selects if the 4 main buttons will be send using the com chip or using the 4 direct wires. By default its on, so we do not need the direct button wiring)

Salvage necessary components: Some parts are needed to be salvaged from the main PCB, to be used on the replacement one. Carefully remove the 4 tact buttons, the slider switch and the 5 LEDs. (these parts are rather standard, so they can be replaced with new ones if needed)

Further preparations: The original game-port used only 2 wires per potentiometer it used a very unreliable method to measure the pots state. The new PCB used DA converters to detect POT state. For this we need 3 wire per pot – VCC, GND, and return. Applying VCC and GND to the POT ends, gives a voltage on the return pin that is relative to the POT dial position. Add an extra wire to each POT as in the following photo, and take note of the pin names:

pot_conn

Potentiometer connections


Replacement PCB

The new PCB I designed is based on Microchip’s PIC18F25K50. All other components are just capacitors/resistors and the salvaged parts. Here are all the files you need in order to make this PCB yourself:

Schematics:  SuncomF15
Kicad Project: SuncomF15KicadProj
Gerber files: gerbers_suncomf15_5by10_Green_HASL_1.6mm
Part list: Suncom_F15_BOM

Feel free to use/change/distribute these files. There are no restrictions whatsoever.

The simplest way to have this PCB is to get it manufactured on line. For merely 15$ you can get 10 pieces using this fine website:  IteadStudio. Just select and buy the “2Layer Green PCB 5cm x 10cm Max“, note the order #, and send them an email with the Gerber zip file attached. (see detailed instructions on the product page).

PCB Assembling

After obtaining the parts and PCB you will need to assemble it. The PCB is 2 layered with components on both sides. First you should assemble the PIC, the programming connector, and all capacitors and resistors. Then on the other side, assemble LEDs and switches. Then connect all the wires.

Assembling PIC and res/caps: This stage is mostly SMD soldering. If you are not familiar with it, there are a lot of tutorials on Youtube. Its not that difficult. Start with the PIC, then resistors/capacitors, then solder the JST programming connector.

Assy_step1

Assembling SMD components

Assembling the Switches: First assemble the tact buttons. Make sure they are fully inserted into the PCB:

Assembling tact switches

Assembling tact switches

Next you need to solder the slide switch. The PCB I designed have no space for the switch mounting holes, so you will have to Cut/file the mounting legs out:

Cutting slide switch mounting pins

Cutting slide switch mounting pins

Then solder it to the PCB, direction is irrelevant, it is symmetric.

Assembling the LEDs: The LEDs are a bit tricky to solder since they have to be mounted in a certain height to fit the led holes in the plastic base correctly. Any method can be used but here is how I did it. First I placed a piece of  tape over the holes of the LEDs from the outside:

Placing a tape over the holes of the LEDs

Then I inserted the LEDs into the PCB without soldering them. Next, I carefully turned the PCB over and placed it inside the base in the correct location, using the screw holes as guides. I then let the LED fall into place. The tape will prevent them from falling too low. And if you use a clear tape, you can make sure the LEDs indeed fell into place correctly. I then put 2 screws to hold the PCB, and solder the LEDs inside the plastic base. Take extra care as not to damage the plastic with the soldering iron.

Placing the PCB and letting the LEDs fall into place.

Placing the PCB and letting the LEDs fall into place.

Connecting a USB cable: You will need a USB cable for this. Either salvage it from an old unused USB device, or just get a USB2 extension cable from EBAY and cut the female edge. You will also need to salvage the rubber gasket at the entry of the cable into the base, from the old cable. Just cut the old cable from both sides of the gasket and remove the inner wires from it. Then, insert the cut side of the USB cable through the gasket, making sure it is from the correct side:

Passing the USB cable inside the gasket

Passing the USB cable inside the gasket

Next, Solder the cable to the PCB from the switch side. The cable should be color coded, if not, you will have to figure out each wire functionality.
Connect green wire to D+
Connect white wire to D-
Connect red wire to the square pad
Connect the black wire to the last pad

USB cable wire connections

USB cable wire connections

PCB completed with LEDs switches and cable

PCB completed with LEDs switches and cable

Connecting grip wires: Its time to connect the 5 grip wires. They should be connected based on the markings made in the “Removing PCB” section. I have added wire colors based on my own joystick, but I can not guaranty its the same for all.

Connect CS wire (Dark blue) to CK pad
Connect Pi-P/S wire (Brown) to ST pad
Connect D0-D1 wire (Gray) to DA pad
Connect PR wire (Red) to the square pad on the bottom left
Connect GND wire (Black) to the bottom right pad

assy_grip

Connecting the 5 wires of the grip

Connecting the potentiometers: We now connect the potentiometers to the analog inputs. Connect x axis pot to the A1 analog input and the y axis pot to A2.

assy_pots

Connecting the potentiometers

Note: Make sure the potentiometers wires are long enough, if not, you must replace or extend them.

Wrapping up: That’s it! The hardware part is finished. All is left is to fix the PCB into the base. Place back the red button cups with their spring in place. Align the slider switch hat with the slider switch itself. Carefully place the PCB into its place aligning the switches with the cups. Fasten the 3 screws to hold the PCB in its place. Press the red buttons and move the slider switch to make sure all is working mechanically.

Placing red cups and aligning the slide switch

Placing red cups and aligning the slide switch

Lastly, Fit the rubber cable gasket in its place.

PCB is fasten in place. Rubber gasket is fit.

PCB is fasten in place. Rubber gasket is fit.


 

Software

The software for the PIC is based ob Microchip’s HID game device demo. I have adjusted it to fit specifically for the Suncom F15 Talon. For other joysticks you will have to tweak the SW accordingly. It shouldn’t be that hard. A feature I added in my version is that when the slide-switch is on (LED is lit), the base buttons become toggle buttons. When the switch is off, they are momentary.

Download the project from this link: SuncomUsbJoystick_PIC18F25K20

The project can be compiled with Microchip MPLAB IDE 8.56 and up. If no tweaks are needed, just use the hex file available in the above zip. You will have to make an adapter cable from PicKit/ICD to JST. Just connect pins 1 – 5 of the programmer to pins 1 – 5 of the JST connector. Pin 6 is unused. Here is an example programming cable for pickit 3:

pic_cable

PicKit 3 programming cable

Thats it!


 

An optional mechanical tweak

This step is optional, but I find this tweak as a very nice improvement to the Suncom joystick.  The Suncom have a 4 way POV. The POV input comprises of 4 tact switches for north, south, east and west directions. Theoretically, by detection of two switches pressed together, it is possible to add the sub-directions as well: north-east, north-west, south-east, and south-west. However, the Joystick mechanically prevents it. Here is a way to overcome this mechanical limitation. Caution:  do this tweak carefully as you might mechanically damage the stick.

For this part, you will have to take apart the joystick’s grip. First, pull out the 2 4-way controls cups. Then unscrew the grip screws and carefully separate the 3 plastic pieces comprising the grip. After opening the grip, remove the 2 screws holding the grip’s PCB, and remove the PCB. During this process, springs and button cups may fall, so be careful not to loose anything. Now take a look at the POV base (The POV is the right 4-way control). There is a concave indentation with 4 pins from 4 sides. These pins limit the POV stick movement. Cut about 2 mm from their height to remove this limitation:

pov_tweak1

Cutting the limit pins

Next, we address the POV stick itself. We need to add some thickness to the stick plate. We do it by adding a layer of isolation tape to the bottom side of the plate:

pov_trweak2

Adding a layer of tape

Lastly we need to address the cover. The opening in the grip plastic for the POV stick is “+” shaped to make place for 4-way movement. You will need to file it to make way for the 4 other directions. I used a small round file to add slits for the “X” directions:

pov_tweak3

Filing the “X” directions.

Voila! You have an 8 directions POV now. You might need fine tune these changes if it does not work at the first try.


 

Good luck, and if you have questions, feel free to leave a comment.

-SHS

56 Responses to 'Converting old Game-port joysticks to USB'

  1. Craig says:

    The timing on this is almost perfect! Just this week I took a look at my old Suncom F-15E Talon and wondered how I could get it to work with my modern rig. Adding this to my “to do” project list, thanks for all the work! Curious, in the USB interface is there any “serial number” info that gets passed to the USB controller on the PC? I saw this mentioned in the Leo Bodnar BU0836X interface board in order for saved settings (in Windows at least) to follow the joystick from port to port. I can’t tell from the images if the USB cable is stress-secured in the base and don’t know how well the cable gasket grips the cable but you may want to either knot the cable on the inside of the base or at least add a zip-tie to make sure if it gets pulled that it doesn’t pull the soldered wires. Maybe add a panel mount USB B socket in place of the gasket? Any chance you’d be looking at doing the same for the Suncom SFS Throttle? I know that had macro capability which I imagine would need to be reproduced in software if at all, but it would still be great to have basic button functionality as exists with your Talon mod. I guess throttle-only functionality could be obtained by creating an extension from the SFS Throttle’s potentiometers to the two extra analog inputs on your board.

  2. Jonny says:

    Sent you a message on the SC forums about my still boxed new CH products FX force feedback stick.

    Regards
    JonnyRedHed

    • shaise says:

      Did you mean RSI forums? Did not see any message.

    • Marty says:

      It’s a long shot knowing that this was posted in 2014 but i am looking for the install disk for the CH Force FX i purchased it new way back when and i just built a windows 98 PC and would like to get it going again but i cannot find the disk. Any help would be appreciated and thanks

  3. Shawn says:

    You are my hero. I love the detail and directions on how to get the pcb cheaply. Waiting on the edge of my seat for the throttle project. Thank you!

    • shaise says:

      You are welcome!
      Throttle project hopefully in two weeks from now. Everything is ready, just need to assemble all.

  4. Craig says:

    I want to publicly say thanks again to Shai (I don’t know how many times I’ve already done so in email) for doing this work and sharing it with the world at no cost. I’d like to pay it forward by offering flashing of his code at no additional cost beyond shipping. I’m located in the USA and have the PICkit 3 programmer required in the project. I bought it for this conversion of my joystick, I figure might as well get more use out of it and maybe save others some money. Please reach out to me at “craig.optin(at)gmail.com” if anyone needs this help. Note, as you might guess from the name this is a mailbox I use as a bit of a “throwaway” address. It isn’t something I check daily. Sorry, don’t want to put my “normal” email out here at this time. So if you don’t hear back from me immediately please be patient but feel free to send another message. I will note that I got my PICkit 3 for a very reasonable $20USD or so from banggood.com without issue. It may be more worthwhile for individuals to pick up their own instead of shipping a ready-to-program board back and forth to me.

  5. Robert T. Retired USAF says:

    Hi, Great project directions. I am curious if you have any of the PCB’s left over from your project and would you be willing to sell one to me. I just found my old joystick, dusted it off and did a Google search and found your great tutorial. I can help recoup some of your cost and I won’t be adding to the pile of unused PCB’s lying around. Thank You, have a great day

    Robert T.

    • shaise says:

      Hi Robert,

      Indeed I have some spare PCBs. I’ve sent you an email with details.

      Shai

      • Jacob Romare says:

        I too (if possible, and you don’t mind) would love to put some money in your pocket in exchange for a PCB. This way I make a small contribution to your fine work and at the same time I don’t get to screw things up ordering the worng things 😛

        Jacob

  6. Ted Gillam says:

    I have NO electronics talent. Does anyone know of anyone who would make this conversion for me and what it would cost.

    Thanks, Ted

  7. Simon says:

    Neat. I’m looking at something like this with my old Gravis Xterminator. Real solid stick, and loads of buttons, but gameport convertor doesn’t; work with it. I’ve no electronics talent, so was just wondering if I can re-wire it with a USB cable? Think I can’t as stick has 6 wires plus GND, whereas USB has 4 plus GND. Can I use the old cable wired into the USB lead, or am I out of luck?

    • shaise says:

      Hi Simon,

      Unfortunately converting gameport joysticks to USB is not as simple as rewiring cables, You must have dedicated electronics to convert the signals.

      • Simon says:

        Thanks at least for the reply. Looks like I am out of luck. Save up for a new joystick then. 🙂

  8. Jack says:

    Great stuff in here, thank you. Question I ordered the boards and now need to order the programmer. Can a Pickit 2 work to program the chip, or should I stick with getting a Pickit 3? Thanks

  9. Jack says:

    Hello Again Shaise,

    Boards are on the way and I got a Pic3 from eBay. I was looking through the BOM for this so as to order the remaining items needed and there’s two items I’m not clear on and was hoping you could help.

    3 x 1N_0603 C3 C5 C7
    &
    5 x 500_0603 R16 R17 R18 R19 R24

    Can you help with the details on these so that I do not order incorrectly. Thanks in advance

  10. Ian says:

    I have a quick question (I hope) about the wires coming from the grip. Do GND, PR, CS, D0-D1, and Pi-P/S represent a button matrix? I am attempting to recreate this project using MMjoy and if I can avoid extensive rewiring of the grip it will make my project go much quicker.

    • shaise says:

      Hi Ian,

      No, these pins do not represent a button matrix. They are connected to a Parallel to Serial chip inside the grip. To query button data, you need to clock it out of the chip. you control Pi and CS and receive data from D0-D1.
      start with Pi and CS at 0. set Pi to 1, then CS to 1, then Pi to 0 then CS to 0.
      Then repeat the following 16 times to get all 16 buttons:
      set cs to 1, read D0 (1=button pressed 0=released)
      then set cs to 0.

      For more details, take a look at the PollButtons(void) function in the source code.

      • Ian says:

        Thank you for the help. Looks like in this case mmjoy is a no go unless I want to rewire. I will just have to brush up on my SMD soldering skills.

  11. Filippo says:

    Hello Shaise,
    very nice and inspiring job, thanks for sharing!
    Since I have no pic programmer and a cheap way to get the pcb (I live in Italy), I am starting a conversion using an Arduino Leonardo compatible board. How shall I use the 5 wires from the grip (GND, PR, CS, D0-D1, and Pi-P/S) so I might not rewire it all ?

    Filippo

    • Filippo says:

      I realise now I had a cached version of the page and didn’t see the last comments, which addresses my problem.
      You can delete my comments.

      Thank you

      Filippo

  12. steveB says:

    Hi Shaise,

    I have the jr. version of the F15 joystick (8-1100-0004) as it does not have the front switches or lights on the base. Do you think this mod will still work in my case? If so I will give it a shot. Any chance you have any spare pcb’s left? Lucky for me your throttle “how-to” will work so I will give that a try also and learn some new stuff at the same time.

    • shaise says:

      As this PCB completely replaces the original base electronics there is no reason it will work on the JR version or any other joystick. There are two ways to work with it:
      1. Make mechanic modifications to the joystick base (mainly holes) and install new buttons and leds (they are very standard parts) this way you will enhance your joystick.
      2. Connect only the available buttons. This will work ok, apart from extra buttons detected by windows that will do nothing. (these buttons can be eliminated if you play a bit with the firmware)

    • jt says:

      That Joystick is called the Hawk.

  13. Debolestis says:

    A question on 5 wires from grip. Are they same wires as in Cougar/Warthog joysticks. Gnd, vcc, sck, cs and miso? Cougar/warthog use shift register I think chip is 4021.

    Thank you.

    • shaise says:

      Hi Debolestis,

      I am not that familiar with Cougar/Warthog, but the suncom indeed uses a simple shift register. Its a 16 bit shift register, so if yours is different, you might need to change the code accordingly.

      shai

  14. Debolestis says:

    Thank you for quick response. Can you just explain what this codes mean PR, CS, D0-D1, and Pi-P/S? Which one is vcc?

  15. robert stewart says:

    hello, Thanks for sharing this project. For the Talon, you list both in the BOM and on the Schematic three 10 uF caps on pads C11, C12, C13. There are no pads on the board That I can see that take theses caps. All available pads are populated other than three test pads, or what I assume are test pads. The silk screen also does not list theses caps. Is this a revision issue or am I missing something? Thanks in advance…

    • shaise says:

      Hi Robert,

      You are perfectly correct – I missed marking them on the silk. Anyway, the pads for C11, C12 and C13 do exist. They are the 3 unmarked capacitor pads near C7.

      shai

  16. Brian says:

    I can only find a 499 Ohm resistor rather than the 500 ohm mentioned. Would that do?

  17. TJ says:

    Is there anyone out there willing to convert a stick for money of course. Years ago I found a USB-Nest Converter RM-203 by Rockfire. It doesn’t replace the keyboard connector used for programming. A solution, but not as clean as this one. I am not as technical as this solution requires.
    Thanks

  18. Brian says:

    What do I need to buy for the software side of things? What’s a PicKit and how do I use it?
    Thanks!

    • Brian says:

      Thanks! Do you have a link to a male JST cable for the programming cable? I’ve bought two and both turned out to be too small for the connector on the board.

        • Brian says:

          Great, I’ve ordered it. Thanks again, you’ve been more than helpful with this project. Almost ready to get this thing programmed.

          I’m seeing if I can make use of the other boards that came with the bulk-order by soldering up some spares to sell on after buying some extra switches and LEDs. I’m wondering, will I be able to pre-program the microcontroller without soldering the pots and grip wires of the joystick? As in a board with all the components attached minus the USB and joystick? Would be good to have a kit set up for the buyer to just solder up to their joystick and not have to worry about programming the chip themselves.

          • shaise says:

            Brian,

            Selling kits is a great idea!
            To program the MCU all you need is to supply external 5V to the PCB (where the red(+5) and black(GND)) wires from the USB are connected.
            You can temporary connect a usb cable for that, no need to solder the D+ and D- lines. Then de-solder it after programming is completed

  19. Brian says:

    Okay! Final point, I think. I’ve got the PICkit 3 software you recommended in an earlier comment. It throws up an unhandled exception when I load the hex so it looks like I need to manually assign the PIC through device family. I saw in the file name the PIC is called 18F25K20, I found that in the list and hit Write. There wasn’t a confirmation prompt and when I click read or verify, it says Unknown Device detected. Has it worked?

    • Brian says:

      Tried it in MPLAB IDE 8.92. I got “Target Device ID (00000000) does not match expected Device
      ID (00005c20)” when I attached the board.

      • Brian says:

        I tried one of the other boards I made, it seemed to write and verify it in IDE 8.92, although when connected, it said “Device ID Revision = 00000002”, not sure if that’s a problem.

  20. MICHAEL LAMAGNA says:

    I HAVE A TALON I’D LIKE TO CONVERT, BEFORE I BUY ABOARD, HAS ANYONE PUT TOGETHER A KIT? IF NOT I WOULD TRADE BOARDS FOR PROGRAMMED CHIP. THANKS, MIKE

  21. Adam says:

    Hi,
    I’m replacing the pots with Hall sensors, but I’m getting a very poor resolution. This controller supposed to have a 10bit resolution but its behaving like 8bit, what do I have to change in the program?

    Thanks

    • shaise says:

      Adam,

      This can be a bit tricky. I am using standard joystick descriptors (usb_descriptors.c) which are 8 bit. You will need to tinker with the descriptors. Not sure if hid joystick support 10 bit report size by the OS. Maybe need to pad to 16bit and set maximum of 1024. Then when reporting use 2 byte report instead of 1. (_INTPUT_CONTROLS_TYPEDEF)
      But more important then that, you need to check your noise. if the last 2 bits are noisy, then reporting 10 bits instead of 8 will not make anything better.

      shai

  22. Russ B says:

    Hi there.
    Just came across this project of yours from 2014. I was wondering if you had any of the pcb’s and pic chips still kicking around for both the throttle and joystick?
    Let me know if these are still available and how much you’re looking for a set.
    Cheers,
    Russ

    • Ronald Rugel says:

      Hi Russ,

      I’m new here, just found this site. I’ve just started the process of converting my Suncom joystick and dual throttle to USB. I’m using a different strategy that you may want to consider.

      My plan is not only to do the conversion, but to put them on new bases with additional switches/knobs. I’m also thinking about making it a back lit panel, something along the lines of the Saitek X-55 Rhino throttle base.

      I’ve already sketched out my design using and Arduino Pro Micro and some MCP23071 shift registers. The Micro can be programmed from a computer, so that eliminates buying a PIC Kit. (Note that not all Arduinos can be used, see link below.

      I’ve just read here that the Suncoms also use PISO (parallel in serial out shift registers) which I also have in my design. Not sure yet if I’ll use theirs or wire mine in, need to do a little more reverse engineering.

      Info on programming the Arduino as a joystick is here:
      https://www.instructables.com/id/Arduino-LeonardoMicro-as-Game-ControllerJoystick/
      and here:
      https://github.com/MHeironimus/ArduinoJoystickLibrary

      I still need to check how many buttons I can assign. Currently I have 64 buttons and 4 axes in my design, but need to verify that it will work with 64 (I know it will work with 32.)

      Hope that helps.

      • shaise says:

        Using mini boards such as arduino is definitely better approach these days. BTW Arduino micro is rather expensive. STM32F103 BluePill boards are only $2 have much more Flash and RAM, and have fast 32 bit ARM core.

        • Ronald Rugel says:

          Thanks for your comment! I’ve been getting Arduino Micro Pro boards from aliexpress for about $4, so other than the ship time they’re fine. I wasn’t aware of the BluePill boards. I just found the documentation and take a closer look. Thanks for the idea!

Leave a Reply

Your email address will not be published. Required fields are marked *

*