Back in my day, we had to sit within seven feet of the TV when we wanted to play a game, because that was as far as the controller cables could reach. The industry-wide switch to wireless controllers was arguably the most practical advancement of the 21st century. That let us sit on the couch and enjoy our massive 30” TVs from a comfortable viewing distance. If you go back and try to do some retro gaming on real console hardware today, you’ll quickly realize how much that matters. To fix the situation, Zachary Murtishi used spare parts to add a BLE controller interface to an NES.
There are already Bluetooth / BLE (Bluetooth Low Energy) receivers on the market that are compatible with the NES and modern controllers — they aren’t even very expensive. So, Murtishi’s project was mostly done for funsies. But we are impressed by what he was able to achieve using spare parts that he already had lying around.
Like most consoles released in the days before wireless controllers, the NES has a very simple way of reading controller button presses. The controller contains an 8-bit shift register, with each bit representing the state of a specific button. That’s why the NES controller has eight buttons (including each of the four on the d-pad). The pins on the controller port just let the NES’s CPU (a derivative of the ubiquitous 6502) read from the shift register so it can react to button presses.
Murtishi’s BLE interface replicates that part of the equation, so the NES thinks that it is reading a regular controller’s shift register. But, in reality, a PIC18LF2420 microcontroller is setting those bits according to data it receives from an HM-10 BLE module. In theory, that data can come from any device that is capable of connecting to and transmitting data over BLE. Murtishi could, for example, create a smartphone app that moves Mario around.
In this case, however, Murtishi chose to use a Logitech F310 gamepad paired with an M2 MacBook Air. A simple Python script reads the input from the gamepad and then transmits it over BLE to the HM-10. We have to assume that Murtishi did that because he didn’t have a gamepad on hand with compatible BLE capability.
Murtishi reports that his BLE interface works, but with noticeable lag. It has a latency of around 60ms and Murtishi attributes that to the poorly made HM-10 module. He believes that a new HM-10 module would solve the problem.