PS2 Guitar Hero Guitars on Playstation 3 Rock Band
interpreting a PS2 controller and emulating a PS3 Rock Band controller

Disclaimer: Use any of the information on this page at your own risk. I am not responsible for any damage you incur to any of your equipment. Do not plug anything into your playstation 3 or controller until you have thoroughly tested and verified your connections. I used an old computer and somewhat broken dualshock 2 to do my tests. I recommend the same. This is not an especially complicated circuit or software, but I would not attempt it unless you have some electronics/programming experience. In other words there is no warranty, implied or otherwise and you are on your own if something goes badly.

If you are like me you went out and bought the playstation III version of Rock Band and found that you did not like the guitar at all.  Personally, the clickity-clack helps me stay on beat and also gives an audible feeling that I am actually playing the song.  It's effect on others is another, and somewhat unimportant story. In addition I desired very much to have another guitar, and the thought of shelling $60 for another one of these less than desirable guitars was unapealing. Unfortunately, my PS2->USB converter did not seem to work with my guitar, as Rock Band somehow detects guitars and only allows you to activate guitar playing if you have the right type of device.

I was very interested to find that the drums could be used on the PC as normal drum pads because they simply implement the standard USB HID spec. Upon plugging the PS3 guitar dongle into my computer, I found it also implemented the HID spec. My plan was born: I would make a HID compatible device of my own that pretended to be a rock band guitar.  This would involve broadcasting a set of data that is consistent with the Rock Band HID device:

  1. The USB Vendor and Product ID. These are each 2 byte codes.
  2. The manufacturer and device string.
  3. The HID report descriptor. This gives information about what the device transmits to the host and what it means.  I.e. I will be giving you 2 bytes, they represent 16 buttons, or I have one analog axis and it will be encoded with one byte with minimum 0 and maximum 255.

Interpreting the PS2 Controller

The first task was interpreting a Playstation II controller. This is well documented on the internet. I used several sites. Most had a very basic description and derived mostly from this http://www.gamesx.com/controldata/psxcont/psxcont.htm. This covers a lot of material and even has a circuit to emulate a controller. A very useful document is this http://docs.google.com/View?docid=ddbmmwds_5cw4pk3 which describes how to use escape mode which among other things allows you to change the state of the controller to analog (important for the guitar's whammy bar) and also read the pressure sensitive buttons. The other very useful document was Playstation Controller Redux http://www.parallax.com/dl/docs/cols/nv/vol4/col/nv101.pdf which uses a controller to control a robot.

I salvaged the female PSX connector out of a controller extender cable, and I built a simple PIC16f428 circuit and wrote some code to blink leds in response to buttons. This worked reasonably well, but I had some timing issues that I didn't resolve until later when I moved to the PIC18f4550 microcontroller. A few things. USB is very sensitive to drawing too much current and noise. I used 4.7k or 10k Ohm pull up resistors for the data input from the controller, and I fed all data output lines to the controller through 290 Ohm resistors. I highly recommend connecting the ACK line, even though sites like the "Controller Redux" do not.  I could not get the timing of the guitar hero controller to work right without it. It is important to sample the controller at about 500kHz (which is the PS2 rate, 250 kHz is the Ps1 rate). I am running my clock at 48 Mhz, so this means each clock cycle should take 96 instruction cycles. The playstation controller uses an SPI type protocol.

To get the guitar hero whammy bar to work, the controller should be in analog mode. To do this I first go into escape mode, then switch it into dual analog mode, and then sample as usual. 

When connecting the controller it sometimes can cause the USB to lose connection.  This is because of a power surge I suspect, but reconnecting the device usually makes it work better. A todo for me is to make a transistor switch so the power to the controller can be turned on and off by the microcontroller.  This is also important during the enumeration phase (when the usb is first connected), because you are only allowed to draw 50 mA at that time. Once negotiated you can draw up to 500 mA (if you request it).

Making a USB HID device

I decided to use the PIC18f4550 based on a recommendation of my friend. It supports USB 2.0, has a pretty large support community, and turned out to be decently easy to use. It has 40 pins so it is a little bit larger. I might consider trying to redesign for the PIC18f2550, but that is more work than its worth for me. It's about $10 retail. I followed the outline of http://pic18fusb.online.fr/wiki/wikka.php?wakka=UsbBootload to build a USB demo board clone that could use the Microchip bootloader. This meant for reprogramming I could use the USB port. This is incredibly convenient and much faster and easier than a standard ICSP programmer. This was the hardest part of the project as I had to rebuild my circuit. Do not forget to connect both power pairs on the pic and to put a decoupling capacitor of .1uF capacitor between each.  Also do not forget the 44 pF capacitor from Vusb to ground. Usb is v

Once that was done and I could program the chip over USB, I made sure I could run a non-usb app (I used a blinking led test). To do this you need a special linker script and a remapping of the interrupt vectors (See the page above).

Hardware

Here is my schematic. It is missing what I consider to be an important control to turn on and off the playstation controller. Also, This has not been checked thoroughly so make sure you sanity check connections if you try to build that. It consists of a PIC18f4550, 20 Mhz Crystal Oscillators, a USB B connector, a PSX Female Connector, Several .1 uF capacitors, two switches, and many resistors.

 This is actually version 3 of the schematic. Here all the resistors are being used as pull ups. In addition, I have made special schematic view for female connector.  I also have a serial debugging output connector which is optional.

 

I build this both as a breadboard depicted, and a wirewrapped version and a printed circuit board (PCB). An outline of how it works.  It is powered by the USB power which I have buffered with a .1uF cap. The two data lines for USB are connected directly. I used a 20MHz Half Cap Crystal Oscillator to reduce part count (it's about $1) which needs power, gnd and then outputs directly to the PIC's OSC1 line and I use EC.  This is divided to get the input to the PLL to generate the USB clock. The microcontroller runs with PLL/2 on the PIC so myprocessor runs at 43 MHz. S1 is a reset and S2 selects to go into bootloader mode. Notice the two decoupling caps across the two sets of power pins on the PIC. LED1 displays USB status (flashing when in programming mode). The rest of the circuit is for interfacing the PSX controller. There are nine pins on the playstation, one is unused though, and one is only used if you want vibration. VCC and GND should be connected to power and ground respectively.   DATA and ACK are inputs from the controller (some guides like Redux omit ACK, but I found it essential to get the Guitar Hero to work). Both of these are connected with a 4.7k pullup, but a 10k would work fine too. The other pins are CLOCK, CMD and ATT which are outputs from the PIC which are connected with a resistor in serial (this seemed to be important to not get the USB from dropping out). It is also a bit safer in case the controller fails and shorts.

If you build this I would suggest building each part separately. First build a USB demo board and make sure you can bootload and flash an LED. Then while not using USB build a playstation interpreter that flashes LEDs.  Finally put both of them together. That's what worked best for me.

Breadboard Version

 

 

 

 

  

Wire Wrapped Version

Printed Circuit Board

Most recently, I have layed out a printed circuit board version of the board. The artwork for the board is available here. I used a bunch of DIY guides on the internet to figure out how to do this. If there is enough interest, I might look into doing a small run of professional boards.  On the other hand, I have etched two of these boards, so that will be enough for my own purposes. I used the toner transfer method on both sides. Here Ishow a board before I populated the ehaders for the connector. Unlike the wire-wrap version I am going to just connect the wires of the playstation connector.  Extracting the connector was a little bit flimsy and I wanted to avoid having to do it again. 

The parts for this project are here. You can find most of these at usual electroncis stores. I use http://www.jameco.com as they are local to me, and they have a decent selection. The only parts that you won't be able to find from them are the Playstation connector and the PIC chip. For the PIC18f4550, you could find it on http://www.futurlec.com or maybe http://www.digikey.com  For the playstation connector, just cut apart an extender cable and solder onto the board (or the headers, if you choose to go that route.



 Software 

The software is written in C (I used C18 as I am a student). It consists of a modified HID mouse demo from Microchip and my playstation controller polling code (psx.c, psx.h).  The polled data is then mapped to the USB format that the rock band controller desires (user_mouse.c).  I mapped this out by using the rock band controller connected to my PC in the gamepad config in Windows XP. 

Download coming soon. Sorry I have not posted my code yet. I need to do some cleanup and fix a few aspects that I have been experimenting with.

Technical Information

I'm assembling as much useful technical information about this on a separate page. View (RB Guitar Technical Details) it if you are interested in doing this or something similar yourself.

Other Efforts

I have recently found another very similar page. Lynx44 on the rock band forums has used the USB board together with directly wiring buttons of his guitar hero III les paul. You can find information about that at http://www.rockband.com/forums/showthread.php?t=26452.