We were inspired by creations like TASBot, and wanted to try to make something like it on our own.

What it does

Allows a computer complete control over controller inputs to a console (currently Gamecube/Wii, though more can be added)

How I built it

We used a Metro M4 microcontroller. On one side, it's connected to the console's controller data line. With this, we can talk to the console, pretending to be a controller. On the other side, it's connected to a computer over USB/serial. On the computer, we have a program running that allows us to send controller inputs to the microcontroller. These controller inputs can be generated any way we like; random data, keys from the keyboard, and data from a file can all be used, for instance.

Challenges I ran into

Pretending to be a controller is hard. That is, you must conform to strict timing specifications. If you don't meet the timing deadlines, things won't work. We had to carefully balance the microcontroller's CPU time between talking to the console and the computer. Interrupts were used for the former, which required careful programming.

Accomplishments that I'm proud of

Overcoming the challenges related to juggling the communications to the console and that of the computer was a difficult task. Being able to address these issues in just a day required a good amount of effort, and we're proud for having done that.

What I learned

We both learned more about the mechanics of serial communication. We also gained experience with embedded programming with tight resources, and how to be mindful while writing interrupt routines. Finally, we had to learn how to interact with such devices from a PC.

What's next for Controller Protocol Emulator

We plan to add support for more controller types. More importantly though, we will continue to refine our current code to offer the best possible experience. This includes performance gains, as well as support for reading from files. We would like to create user friendly programs to manage all of this, such as a program that generates controller input data files.

Built With

Share this project: