I own a C64 with Quickshot II Turbo joysticks. Unfortunately the joysticks are worn out. On one, one spring of the micro switch is broken and the micro switches are discrete, which means there is a spring between two poles. Without the exactly matching spring it's not possible to repair. Also the rubber ring which shall bring the joystick back to middle position has dried out over the years. So, buy another pair of used joysticks which are decades old, or find another solution?
The idea: Use two Competition Pro joysticks which are available still today as vintage rebuild but with USB. Important to know: There are two variants available. One which as a slower USB polling rate and one with a high polling rate (125 Hz). In some forums you can read about complaints that the slow polling rate is too slow. So, make sure to get the one with the high polling rate.
Option 1: Connect the micro switches in the joystick and mount a C64 compatible connector. See http://www.stefan-uhlmann.de/cbm/CPUSB/CPUSB.html
Option 2: Convert the USB port into C64 control port digital signals by using an Arduino --> This is described here.
How does it work
The HW is an Arduino Uno and an USB Host Shield ( http://shop.tkjelectronics.dk/product_info.php?products_id=43 ). Furthermore, a breadboard PCB with the switching transistors and the connections of the C64 control port.
1 / 3 • Open housing. The USB hub is glued to the side wall. A slot in the side wall allows two USB connectors to connect.
The SW uses the USB Host Shield library. In detail, the PS3USB implementation of the library. The Competition Pro is detected as a PS3 compatible device. However, the fire buttons are interpreted as cross, triangle, circle, square.
A USB hub is used to connect more than one joystick to the USB Host Shield. Depending on the order of connection the joysticks the first is detected as joystick1, the second as joystick2.
To swap the joysticks for the two C64 control ports an pushbutton is used. n LED signals the position of joystick1. As pushbutton input input the GPIO input of the USB Host Shield In0 is used. To control the LEDs the GPIO output of the USB Host Shield Out2, 3 is used.
The C64 control port expects a switch-to-ground for any activation. Details can be found here: https://en.wikipedia.org/wiki/Atari_joystick_port#Other_platforms. For switching the control port pins to ground simple transistor switches are used. To control the transistors the Arduino digital outputs D2-D7 are used and the GPIO outputs of the USB Host Shield Out0, 1, 4, 5 are used.
As power supply I'm using an external power supply (7, 5V) which is connected to Vin of the Arduino. I didn't want to use the 5V output of the C64 control port to not put any additional load to the C64 power supply.