The controller uses a simple protocol, which allows an application (robot, etc) to configure exactly what is desired. The robot can request to enable / disable joysticks and buttons, and can adjust the poll frequency and maximum analog transmit rate.
You can download complete source code from
As part of this project, I wrote a PSX library for AVR GCC which allows you to bit-bang commands to and from the PSX. The PS2 controllers actually use a version of SPI (clock polarity and clock phase are 1), so in theory you could use the SPI hardware on an AVR to talk directly to the controller. However, I chose to do a bit-banging protocol because a) I want to use the SPI pins for other things, b) this is more portable to other AVRs (and in fact other micro controllers in general). Plus, the actual SPI implementation is just a small part of the library; the protocol communicating on top of SPI is more difficult (well, more obscure... there is nothing really hard there, but you need to know the message formats). For details on the PSX library component, please see
This controller is currently used in two of my robotics projects: a quadcopter (Chiindii), and a hexapod (Stubby), and i am planning on using it for additional builds in the future.