I did a search on Google and found an old post here about fixing loose N64 joysticks. Just signed up here, figured some of you may be interested in a project I’ve been working on.
I’m sick of all my N64 controllers grinding away their joysticks so I decided to try and work out a permanent fix. The PSX joystick is the stick of choice because I found a used controller at EB Games for $10 and I’ve always liked the feel of the PSX stick. Xbox’s analog would be easy to adapt to what I’ve done as long as it’s stick isn’t for some reason really massive to the point that it won’t fit in the N64 controller case.
I toyed with a few ideas that I think could all work.
1. Physically attaching the N64 quadrature encoding wheels to the PSX stick. It’s tough to explain, but the two sticks have similar dimensions – so similar that I think this is possible. The PSX even has ‘nubs’ that stick out of the potentiometers that rotate with the stick.
Why didn’t I do this? Well frankly I think it would be very difficult to align everything perfectly, and you may lose some range of motion after all the effort in retrofitting. Not worth the hassle to me.
2. Replacing the current chip. The current chip is pretty big, and PICs today are available that are as good and better than this chip while being significantly smaller, so there would be room to solder in some jumpers. Unfortunately it has something like 84 pins (can’t remember exactly, but it’s a lot). Also, I hate troubleshooting interrupts as I don’t really have much in terms of equipment at my disposal. The other issue with this method is the controller memory card/rumble pack port. I don’t know how the signals coming out of this work and I’d need to redo the code for that myself. No fun.
3. Converting the PSX potentiometer’s voltage levels to mimic the N64’s quadrature encoded signal.
This is what I did. The PIC I used has a bunch of ADC’s so it was easy to read in the voltage, all I had to do was determine when the stick had moved a specific amount, then send a pulse on two lines separated by a quarter wavelength. Google quadrature encoding if you’re curious/confused about this part. In fact, the code I’m using was initially just to see if I could do this, but it ended up working so well that I’ve just kept it. I’m still leaning towards completely redoing it to give me more control over stick sensitivity.
4. Last but definitely not least, I considered intercepting the controller’s output data and patching the ‘stick position’ bits to the position my ADC’s read from the PSX analog.
Why didn’t I do this? To be honest I didn’t think of it until I had already started the method in 3. Otherwise, I probably would have. Maybe better I didn’t though as there is a timing aspect that I’d have to adhere to with this; and my oscilloscope is just the line-in port on my sound card. Not exactly state-of-the-art. It is very inaccurate and only works for a very limited frequency range (the same range that the human ear can hear).
Now onto the good part…
I’m sick of all my N64 controllers grinding away their joysticks so I decided to try and work out a permanent fix. The PSX joystick is the stick of choice because I found a used controller at EB Games for $10 and I’ve always liked the feel of the PSX stick. Xbox’s analog would be easy to adapt to what I’ve done as long as it’s stick isn’t for some reason really massive to the point that it won’t fit in the N64 controller case.
I toyed with a few ideas that I think could all work.
1. Physically attaching the N64 quadrature encoding wheels to the PSX stick. It’s tough to explain, but the two sticks have similar dimensions – so similar that I think this is possible. The PSX even has ‘nubs’ that stick out of the potentiometers that rotate with the stick.
Why didn’t I do this? Well frankly I think it would be very difficult to align everything perfectly, and you may lose some range of motion after all the effort in retrofitting. Not worth the hassle to me.
2. Replacing the current chip. The current chip is pretty big, and PICs today are available that are as good and better than this chip while being significantly smaller, so there would be room to solder in some jumpers. Unfortunately it has something like 84 pins (can’t remember exactly, but it’s a lot). Also, I hate troubleshooting interrupts as I don’t really have much in terms of equipment at my disposal. The other issue with this method is the controller memory card/rumble pack port. I don’t know how the signals coming out of this work and I’d need to redo the code for that myself. No fun.
3. Converting the PSX potentiometer’s voltage levels to mimic the N64’s quadrature encoded signal.
This is what I did. The PIC I used has a bunch of ADC’s so it was easy to read in the voltage, all I had to do was determine when the stick had moved a specific amount, then send a pulse on two lines separated by a quarter wavelength. Google quadrature encoding if you’re curious/confused about this part. In fact, the code I’m using was initially just to see if I could do this, but it ended up working so well that I’ve just kept it. I’m still leaning towards completely redoing it to give me more control over stick sensitivity.
4. Last but definitely not least, I considered intercepting the controller’s output data and patching the ‘stick position’ bits to the position my ADC’s read from the PSX analog.
Why didn’t I do this? To be honest I didn’t think of it until I had already started the method in 3. Otherwise, I probably would have. Maybe better I didn’t though as there is a timing aspect that I’d have to adhere to with this; and my oscilloscope is just the line-in port on my sound card. Not exactly state-of-the-art. It is very inaccurate and only works for a very limited frequency range (the same range that the human ear can hear).
Now onto the good part…