This is a project I worked on for my electronics class at Pomona College. Thanks to Professor Dwight Whitaker and Tony Grigsby for their help and guidance throughout this project, and credit to Jonathan Wong for the idea for this project!
Also, here's a list of Instructables I looked at for ideas/inspiration while working on this project:
How it works
The basic idea of this speech-controlled Game Boy Advance is that you can say the name of a button (left, A, start, etc.) and have the GBA respond as if that button had been pressed. Here’s a quick rundown of how I’ve set it up to work:
1. You say a word into a small microphone (let’s assume you say “start”), and this signal is sent from the microphone to the computer through the Arduino.
2. The speech recognition software BitVoicer sees that “start” is a word it’s supposed to respond to and sends the Arduino the string “start”.
3. The Arduino receives the string and sets the voltage of one digital output pin to HIGH and the rest to LOW. The pin set to HIGH is connected to a relay that is in turn connected to two metal pads on the GBA circuit board that correspond to the start button.
4. Since the pin is set to HIGH the relay switches states, making the two metal pads electrically connected. This electrical connection is what happens when you usually press GBA buttons, so the GBA responds as if the start button was pressed.
I have this currently set up for all buttons except L, R, and select. I chose not to do it for these buttons because they aren’t used quite as often as the other buttons and I wanted to first focus on getting the essential buttons to work. The direction buttons are set to stay on HIGH until you say a new command (equivalent to holding down the button) while the A, B, and start buttons are set to stay on HIGH for 200 ms before switching to LOW (equivalent to pressing the button once). I’ve also programmed a “stop” command that sets all the pins to LOW to stop all ongoing commands.
Although the speech control works fairly well, there are a few issues to be aware of. For one, there’s a delay of about one or two seconds between when you say a command and when the GBA responds to it. So don’t expect to be playing any games where timing’s important, unless you happen to be really good at thinking ahead and saying commands early! Another issue is that BitVoicer sometimes fails to recognize a command, but this doesn't happen too often and when it does you usually only need to repeat yourself once or twice. I’ve particularly had trouble with it thinking I said “b” when I was saying “a”. Also, menu navigation can sometimes be troublesome with the current setup: sometimes you’ll scroll through menus really fast since the direction buttons are held down, while at other times you’ll have to alternate between a direction button and the stop command (i.e. “down, stop, down, stop,...”) if you want to keep going in one direction on a menu. Whether you run into these problems or not depends on how the game you’re playing deals with menu navigation. To fix this last problem I’m thinking of eventually adding some code that’ll allow for two commands for each direction button, one that’ll hold it down and one that’ll press it once.
Despite these issues I thought this project turned out fairly well and I really enjoyed working on it. I hope you do too!