Multiplayer Bluetooth controllers adapter for retro video game consoles

Public Chat
Similar projects worth following
BlueRetro is a multiplayer Bluetooth controllers adapter for various retro game consoles. Lost or broken controllers? Reproduction too expensive? Need those rare and obscure accessories? Just use the Bluetooth devices you already got! The project is open source hardware & software under the CERN-OHL-P-2.0 & Apache-2.0 licenses respectively. It's built for the popular ESP32 chip. All processing for Bluetooth and HID input decoding is done on the first core which makes it easy for other projects to use the Bluetooth stack within their own project by using the 2nd core. Wii, Switch, PS3, PS4, PS5, Xbox One & generic HID Bluetooth devices are supported. Parallel 1P (NeoGeo, Supergun, JAMMA, etc), Parallel 2P (Atari 2600, Master System), NES, Genesis, SNES, Saturn, JVS (Arcade), N64, GameCube & Dreamcast are supported with simultaneous 4+ players using a single adapter. Soon PSX, PS2, PCE, CD-i, 3DO, PC-FX...

Project documentation

General documentation

Other links

Software files repository
• Hardware files repository
• Wireless traces repository
• Development env. setup & building instruction
• Cables building instruction
• BlueRetro mapping label reference
• Advance configuration web interface
• Preset configuration web interface
• Hardware building instruction


There are various ways available to enjoy retro gaming. Those of us that prefer playing with the original systems face various challenges regarding the controllers. Controllers are the part that degrades the most and often with old console not all of your original controllers (if any) are in good working condition. If you have more than one console, it can quickly get expensive to buy NOS or replica controllers. Adapters for USB & Bluetooth exist on the market but are compatible with one or two systems only.

When it comes to 4+ retro multiplayer party, it’s hard to have enough working controller and it quickly becomes a cable mess if you end up playing more than one console. Most systems included only 2 ports and 3+ players games required a multitap accessories that are now often hard to find and expensive. Existing adapters solutions are all limited for single player use, one need to buy multiple adapters for each player.

Some early games got really awkward control style by today's standard and it is often not even possible to edit the buttons mapping. Even when possible, it's often too much trouble doing so while your friends are waiting to play. Controllers & adapters including configurability are not simple enough to be used in a party.

Mouse, trackball & keyboards are often rare and expensive to get accessories for most systems. And let not forget that some controller design got questionable ergonomic! Very few, if any, adaptive option existed back in the day for people with limited mobility.


Across all current and last generation console and PC accessories, we already own a large quantity of Bluetooth HID devices. BlueRetro is a Bluetooth controller adapter for retro video game consoles that enable to use all those devices. Any Bluetooth HID (BR/EDR/BLE) devices can be connected and used including gamepad, mouse, keyboard, trackball, etc. This includes the Xbox adaptive controller.

The BlueRetro core can be used with every retro gaming system supported. This has the benefits of not requiring to repair your Bluetooth controllers between different system uses. No reconfiguration is required since the adapter auto detect the system it is plug on. Only the cable adapter need switched between system.

Up to 7 controllers can be connected simultaneously on a single adapter for multiplayer games. This means the adapter also emulate the multitap accessory for most systems. Rumble accessories/function is supported. Keyboard, trackball & mice console accessories will be supported too.

The adapter is highly configurable via a Web Bluetooth (BLE) interface for mobile & desktop. Buttons and axes can be mapped to any buttons or axis direction (Ex. mapping axis direction to a button, buttons on an axis direction, inverting an axis direction, trigger to axis, buttons to trigger, etc.). Various scaling and response curve options is available for axes and trigger. Presets configuration for various games are available. Using presets, you can change every player mapping at once with a few clicks on your mobile phone.

A secondary objective is for the code to be easily used on other...

Read more »


Testjig cable schematic

Adobe Portable Document Format - 33.53 kB - 10/03/2020 at 03:05



Diagram latency test

Adobe Portable Document Format - 25.49 kB - 10/03/2020 at 03:05



GameCube adapter cable schematic

Adobe Portable Document Format - 24.45 kB - 10/03/2020 at 03:04


BlueRetro DevKit PCB gerber

x-zip-compressed - 403.92 kB - 10/03/2020 at 03:04



All console controller port reference

Adobe Portable Document Format - 85.79 kB - 10/03/2020 at 03:03


View all 19 files

View all 9 components

  • 2020-11-22 Update - Proper PS5 DualSense support

    Jacques Gagnon7 days ago 0 comments

    Steam beta client recently added support for DualSense controller. Using USBPcap I was able to get a trace to see how it work. The DualSense use report 0x31 for config and buttons reports. Using the native PS5 mode vs the HID mode allow using the LED and Rumble. BlueRetro now support the DualSense rumble. The LED support for Steam didn't work for me so it's still missing on BlueRetro.

    See implementation detail here and v0.8.1 pre-release here.

    On a different note, PSX & PS2 support is progressing very well. I'm also working on adding keyboard & mouse support for systems already supported.

  • 2020-11-13 Progress update - Received Xbox Series X/S controller

    Jacques Gagnon11/13/2020 at 18:20 0 comments

    I received the Xbox Series X/S controller today! It's really nice but unfortunately at first view it only support BLE. (PS5 Dual Sense is still BR/EDR (aka. BT classic)).

    Support for this controller will need to wait for me to add the BLE support which will also enable using BLE keyboard & mouse and the Steam controller.

    Checkout the Android trace & HID descriptor for the new Xbox controller here.

    The descriptor is a mix of the Xbox One controller xinput and dinput descriptor. Look like microsoft is moving away from Xinput. Report 1 & 3 closely match the dinput one, report 2 & 4 are added from the xinput one.

    Other than that I ordered some new cables PCB for making PSX cable and ordered 20 BlueRetro DevKit assembled boards for the Beta. I also received most of the extension cord required for building the cable adapter for the Beta.

  • 2020-11-07 Progress update - Release v0.8 Genesis & Parallel support

    Jacques Gagnon11/08/2020 at 02:36 0 comments

    Genesis support is finally done!!! I also added support for parallel interfaces for systems like NeoGeo, Supergun, JAMMA, Atari 2600, Master System, etc.

    See release v0.8 on GitHub!


    * [PS3] Fix again PS3 timing for earlier controller version
    * [BLECFG] Add minimal support for Find By Type Value Request


    * Add basic PS5 Dual Sense support via PS4 HID mode


    * Add Genesis 3 buttons support (2 players)
    * Add Genesis 6 buttons support (2 players)
    * Add SEGA's Team Player multitap support (8 players)
    * Add EA 4 Way Play multitap support (4 players)
    * Add 1P 12 buttons parallel mode (NeoGeo, JAMMA, etc)
    * Add 2P 6 buttons parallel mode (Atari 2600, Master System, etc)
    * Add 1P 6 buttons parallel mode while in auto mode while waiting for detection

    Consult the following documentation for building cables:

    Consult the following documentation each system usage & web-config specifics:

  • 2020-11-05 Progress update - Documentation overhaul

    Jacques Gagnon11/06/2020 at 01:02 0 comments

    Being a project with a huge feature set, BlueRetro got a lot of trap for new users. I took some time in the last week to improve the overall project documentation. Existing page now got much more detail and are easier to navigate via a table of contents. I also added a new page to document in more detail the web config for each supported system. This page is also a good place to see the currently supported feature.

  • 2020-10-30 Progress Update - PS5 DualSense & Genesis support

    Jacques Gagnon10/30/2020 at 17:02 0 comments

    I was quite busy this month but still made good progress on Genesis support.

    2P mode support both 3 buttons and 6 buttons controller or any mix of the two. Support for the SEGA Team Player is done also and support any mix of multitap / controllers. You can play up to 8!

    I somehow received my PS5 dual sense controller before launch (Thanks BestBuy!!) and quickly got basic HID support working. The more specific mode is different than PS4 so I will have to wait for that support to land in Linux to add it since I got no PS5 system to reverse engineer it! The only loss for BlueRetro using the basic HID mode is rumble and LED support.

    Checkout this pre-release v0.7.3 for basic Dual Sense support.

    See for wireless traces and HID descriptor of the PS5 Dual Sense.

    I should get an Xbox Series X/S controller soon as well.

    I will now work on adding EA multitap support and then I will add 1P & 2P Parallel modes for Atari/Master System & NeoGeo. Once this is done, I got to retest everything before finally releasing v0.8.

  • 2020-10-11 Progress Update - OSHWA Certification

    Jacques Gagnon10/11/2020 at 19:13 0 comments

    I just got the OSHWA Certification for BlueRetro!

    Other than that I'm still working on the Genesis implementation. I got 6 buttons mode kind of working but it's not reliable yet...

  • 2020-10-09 Progress update - Genesis 2P work!

    Jacques Gagnon10/09/2020 at 12:35 4 comments

    I won't go in detail yet but just wanted to share I got basic Genesis support working.

    I figured a way to get sub 1us GPIO transition on the ESP32! More on that later :)

  • Open Beta Preorder

    Jacques Gagnon10/04/2020 at 15:39 0 comments

    Contest end tomorrow and I think now is the good time to start taking preorder for the open beta.

    I will make 25 BlueRetro DevKit available and they should be ready around December 2020. The first 25 persons on the preorder list we be offered to buy them once they are build. (No money taken upfront)

    I will sell each DevKit 100 USD since the low volume and external assembly will add to the cost. I will also make any cable you want for 20 USD (30 USD for those that require more work). Alternatively you can buy a cable kit for 5 USD that will only include the PCB pre-soldered with the SMD parts & the DB25 connector. (You got to source the cable & backshell yourself).

    You can add your name to the preorder list via this form:

    Once I got the board ready, I will send PayPal invoice to the people on the list. 

    On another subject I made kicad symbol for all consoles controller port. It's quite nice! I updated all cable schematic to use them! Also checkout the new cable assembly guide.

  • Testing BlueRetro

    Jacques Gagnon09/30/2020 at 17:59 0 comments

    Testing the BlueRetro software revolves around 4 distinct categories: Manual, Community, Automation & Performance testing. As of today the vast majority of the test were from the manual testing category which is my wife, my friends and I playing games with BlueRetro. Each release I try to retest as much as possible.

    Manual testing

    I retest the following every release by playing around 5 minutes in each test. (Probably take me around ~3 hours when motivated ;) )

    • FC/NES
      • 2 players mode
      • Four score 4P mode
      • FC 4P player mode
    • SNES
      • 2 players mode
      • Multitap 5P mode
    • Saturn
      • 2 players mode / Digital mode
      • 2 players mode / Analog mode
      • 1 multitap slot 1 / Digital mode
      • 1 multitap slot 2 / Analog mode
      • 2 multitaps / digital mode
    • N64
      • 4 players mode with rumble enable
      • 2 players / 4 controllers dual joystick mapping (GE / PD)
    • Dreamcast
      • 4 players mode with rumble enable
      • GamePad Alt (2nd joystick + D,C,Z) mode
    • GameCube
      • 4 players mode with rumble enable
    • JVS
      • 2 players mode (only what my Arcade board support)
    • Bluetooth
      • Generic HID controller (8bitdo Dinput / xinput)
      • PS3 Sixaxis & DualShock 3
      • Wiimote + Nunchuck & Classic controller
      • WiiU Pro
      • PS4 DS4
      • Xbox One S
      • Xbox adaptive controller + Logitech 3D joystick
      • Switch Pro
      • Generic HID keyboard

    Community testing

    BlueRetro community is still quite small but very valuable feedback is already provided and resulted in bugs fixes!

    Going forward this will be the main way of debugging BlueRetro. I will make a limited release of the BlueRetro DevKit PCBs for the open beta.

    The beta will help in testing the various Bluetooth controllers revision that exist for already supported devices and also test new devices I do not own. While the wired interface work well with the games I tested, I fully expect some games to be troublesome and I can't myself test the 1000+ games that compose BlueRetro supported systems library.

    Automation testing

    Automation testing will be handle by using another BlueRetro with a special test firmware that will allow simulating the wired system and the Bluetooth controller. The special firmware will be minimal and leverage the existing BlueRetro code. The higher level control will be handled by a Python script using the pytest framework for running the test suite.

    Connecting the two BlueRetros together will be done via a special test jig cable.

    Since some of the ESP32 pins are inputs only, it's not possible to simply connect each pin of both DB25 to each other. Since the host BlueRetro SD card will not be used, those extra IOs are used to control the input only pin of the DUT. The UART output of the DUT will be connected to the host BlueRetro for helping validation by parsing the logs. The JVS UART driver will be leveraged for the PC interface via the USB UART of the host BlueRetro.

    Performance testing

    Performance of BlueRetro is measured by the added latency in the control input versus an original wired controller. Latency in a video games controller is the time between a button is pressed and an action appear on the TV screen.

    The easiest way to test this would be to put BlueRetro in one of the parallel modes and measure the time between the buttons press and the output pins change. The problem doing this is that the parallel mode is not representative at all of the vast majority of supported system that requires a more complex wired driver. Measuring at that point for a serial base protocol would make triggering automatically on the output event quite complex. For a single test it would probably be fine to analyze the trace by hand and figure the timing. But for characterizing the latency properly multiple tests will need to be done in the order of thousand measurements.

    A little bit more complicated but more easier to replicate a thousand time approaches is to probe one of the analog RGB lines of the console output. This make the measurement process identical across all platform (At least with those with RGB output). The only thing required is a flash card to run a...

    Read more »

  • Input and output specifications

    Jacques Gagnon09/27/2020 at 19:22 0 comments

    Quick log today only to document BlueRetro's various interfaces specifications:

View all 37 project logs

View all 3 instructions

Enjoy this project?



BBsan wrote 09/05/2020 at 07:22 point


This is a really great project!!

I‘m trying to build some kind of a „lite“ Version using a Devkit v4 without SD card for use only with my Gamecube.  Unfortunately I wasn‘t able to find any documentation about how to pair my PS3 Controller... Could you briefly explain it somewhere? Thanks!!!😊 

  Are you sure? yes | no

Jacques Gagnon wrote 09/07/2020 at 15:54 point

Sorry missed your message, at boot on the serial console the log will display your ESP32 BDADDR (MAC). Search for line "local_bdaddr". Then connect the PS3 ctrl to a PC via USB and use a tool call "sixaxis pair tool" to set the ESP32 Address. Drop by the  chat ( if you need more help! Thanks for giving BlueRetro a try!!

  Are you sure? yes | no

BBsan wrote 09/07/2020 at 17:28 point

Thanks a lot! This worked really well 😊 I just have two problems now with my SIXAXIS:

1. Once it starts vibrating it doesn't stop anymore.

2. R2 doesn't seems the be mapped on GC output as it seems.

But wow - what a nice project!!! 😊😊 

  Are you sure? yes | no

Jacques Gagnon wrote 09/07/2020 at 16:48 point

  Are you sure? yes | no

Arnaldo Pirrone wrote 07/26/2020 at 10:18 point

Hi there,

Is the support for original Xbox planned? (maybe using the same original gamepads)

  Are you sure? yes | no

Jacques Gagnon wrote 07/26/2020 at 11:15 point

Yes but it's very far on my list, it's an USB interface so it will require a special adapter cable with some uC with a USB PHY.

  Are you sure? yes | no

PixJuan wrote 07/24/2020 at 10:23 point

I was wondering if you know of any 3d model of joystick connector, because it would hurt me to cut one from a 30 year old Joystick :-(

  Are you sure? yes | no

Jacques Gagnon wrote 07/24/2020 at 10:27 point

Just buy cord extension on AliExpress they are around 1 to 3$ each.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates