20091215

XBOX Controller

XBOX Controller Controller
What is this? It's a system that will allow basically anything that can talk udp to control an Xbox. Why would you want to do this? I have no idea. I have my reasons, maybe you have some too. How this works: The XBOX buttons are physically pressed by arms (stiff wire) attached to servos that are controlled by a Basic Stamp 2. The BS2 is controlled by a gumstix over a serial port. The gumstix talks udp and accepts commands. So if you want to control an xbox, you basically have to talk a simple udp protocol to the gumstix.

xbc-c-controller
For this I tried 2 controllers, a PSP and a Nintendo DS. The udp protocol is simple. Build a message with the status of your controller, and the system takes care of moving the physical fingers on the xbox controller. The protocol is as follows: '!!' for start of message, and '##' for end of message. The juice of the message is a 1 character button identifier, followed by a 1 byte state. 1 means the button is pressed and 0 means button is not pressed. Here is a sample message:

The message should be self explanatory. So the controller (in this case the psp or nds) polls inputs every so often and then dumps the state. I had it all working at every 100ms, but then something happened - not sure what - so I backed it down to every 250ms. The bottle neck is on the BS2, and to keep things consistant, I just kept all polling intervals the same.

The app on the gumstix consists of 2 threads. One listens for udp commands and the other babbles out the serial port at 38.4k. The serial thread wakes up every 250 ms and sends the status of all buttons to the BS2. The status is stored in global variables that are updated by the udp thread whenever the controller sends an update.

The serial protocol to the BS2 is simple. A 'A' signifies a start of message followed by 8 bytes of status for each of the buttons currently supported. The PIC decodes this message and tells the servos to respond accordingly.
xbc-c-pic.