The ability to combine an old SNES console with new a modern input device gives a new way to play the games we all know and love. This enables re-using old technology with new input devices and allows putting them to new innovative purposes. This reduces waste and proves that old technology need not just be thrown away, but the old can be combined with the new into something even great.
What it does
Allows using a Google Daydream controller as a steering wheel to control Super Mario Kart on the SNES by rotating it in the air. Also allows controlling other games when the controller is in D-Pad simulation mode (tested and working with Super Mario World).
How we built it
[Google Daydream controller] -> BLE -> [Raspberry Pi] -> [node.js] -> [python] -> USB Port -> [Arduino] -> Controller Port -> [SNES]
As seen above: The Daydream controller is connected to a node.js script using Bluetooth Low Energy (BLE) running on the Raspberry Pi (or an Apple Mac). The script reads the raw data from the controller and decodes it into orientation and button data. Next, a python script is used by the node.js script to map the Daydream controller buttons and rotation into SNES controller buttons (in steering or D-Pad mode). The python script encodes the rotation and button data from the Daydream controller into a SNES controller data packet and sends it through a serial port to the Arduino. The Arduino reads all the data packets from python and stores them in a buffer. When the SNES requests controller data, the Arduino uses 2 interrupt service routines to latch the bits of the data packet into the controller data registers on the SNES. The SNES interprets these bits as a standard controller and controls the game!
Challenges we ran into
At first, we tried to load a custom game into the SNES memory through the controller port. After spending lots of time with that, we were stuck since the SNES would not write the custom game data to memory! After debating writing self-modifying code for the data loader, it was decided to not risk it...
Powering the SNES using the Raspberry Pi's USB port did not provide a reliable power source, so we had to play around with the power supply circuitry.
Accomplishments that we're proud of
Reading orientation and button data from the Google Daydream controller using node.js over BLE
Successfully simulating a SNES controller using the Arduino
Making the two work together was the tricky part, but we did it!
What we learned
How to read orientation and button data from the Google Daydream controller.
How to send data to the SNES controller port by simulating a controller with an Arduino.
Pair programming actually works!
Programming the SNES using assembly is HARD!
What's next for SuperDreamWheel
More user-configurable button mappings for specific games.
Support for more HID devices.
Support for more retro consoles.