ESP32-S3 + ESP32 Classic bridge that lets a PlayStation 3 see an ESP32-S3 as a DualShock 3-style USB controller while input can come from a DualSense through an ESP32 Classic Dev Kit 1.
This repository started as a VX8 DualShock 3 repair and reverse-engineering lab. It became a practical controller bridge after the original controller could not be repaired reliably. The current recommended build is Tiger Edition, a RAW/HEX route that avoids Bluepad32 in the DualSense path and uses direct Bluetooth Classic HID Host handling on the DK1.
DualSense -> ESP32 Classic Dev Kit 1 -> UART -> ESP32-S3 -> PS3 USB OTG
There is no direct Bluetooth connection from this project to the PS3 yet. The PS3-facing route is USB OTG through the ESP32-S3.
- PS3 sees the ESP32-S3 as a DS3-style USB HID controller.
- DualSense connects to the ESP32 Classic DK1 through Bluetooth Classic HID.
- Buttons, D-pad, analog sticks and analog triggers.
- Sixaxis-style accelerometer/gyro translation, validated in real games.
- Rumble forwarding from PS3 to DualSense.
- Player LED mapping from PS3 to DualSense player LEDs.
- DualSense lightbar mirrors S3 status color.
- DualSense battery estimate and charging state forwarded to PS3/web UI.
- DualSense charging fade and low/critical battery lightbar pulses.
- PS3 controller power-off command can turn off/disconnect the DualSense.
- S3 web configuration page served from LittleFS.
- BLE keyboard/control GUI fallback for the S3 route.
Tested games and tools include GamePad Tester on PS3/HEN, Flower, Wipeout HD, Ultra Street Fighter IV, Burnout Paradise and MotorStorm. Motion support should be described as functional and validated, not perfect. Different games, cars, tracks, sensitivity settings and rumble patterns can still feel different.
Use:
versions/DS5_to_DS3_Tiger_Edition_V1/
Tiger Edition is the current best build. Older versions are kept for research, comparison, and easier migration:
versions/DS5_to_PS3_Bluepad32_V0/ earliest playable baseline, no rumble
versions/DS5_to_PS3_Bluepad32_V1/ Bluepad32 route with rumble forwarding
versions/DS5_to_PS3_HEX_RAW_V0/ first no-Bluepad RAW/HEX route
versions/DS5_to_DS3_Tiger_Edition_V1/ current recommended build
- One ESP32-S3 board with USB OTG capability. The project was developed on an ESP32-S3 N16R8-style board.
- One ESP32 Classic Dev Kit 1-style board for Bluetooth Classic HID Host.
- One DualSense controller.
- One PlayStation 3.
- Wires for UART between the boards.
- Common ground between boards.
- Optional power bridge hardware if you want the PS3/S3 OTG port to power the
DK1 as well. See
docs/hardware-and-wiring.md.
The project was developed and tested with the hardware available to me. Other ESP32-S3 variants may work if they expose the needed USB OTG and GPIO features, but they are not guaranteed.
Install first:
- Arduino IDE 2.x.
- ESP32 by Espressif Systems
3.3.8. - Adafruit NeoPixel.
- Bluepad32 board package only for the Bluepad32 historical builds.
Then apply:
core-mod/ArduinoCoreMod_3.3.8/
The core mod is required because stock Arduino-ESP32 3.3.8 does not expose
or link all of the USB/TinyUSB and Classic HID Host behavior needed by this
project.
For core-mod audit/licensing/rebuild notes, read:
core-mod/source-patches/
core-mod/THIRD_PARTY_NOTICES.md
core-mod/REBUILDING_CORE_MOD.md
For the complete board menu checklist, read:
versions/DS5_to_DS3_Tiger_Edition_V1/COMPILE_AND_FLASH_GUIDE.md
core-mod/ArduinoCoreMod_3.3.8/README_ArduinoCoreMod_3.3.8.md
Most important S3 setting:
Tools > USB Mode > USB-OTG (TinyUSB)
If the S3 is flashed with Hardware CDC/JTAG USB mode, it can compile and upload but fail the PS3 handshake.
The technical datasheet is available here:
docs/technical-datasheet.md
It documents the project internals for developers who want to audit or extend the build: PS3/DS3 handshake reports, HID descriptors, DS3 input/output fields, DualSense raw Bluetooth report offsets, UART frames, rumble transport, IMU conversion constants, battery buckets, web configuration routes, and the core mod rationale.
core-mod/ Arduino-ESP32 3.3.8 patch package and installers
docs/ story, architecture, wiring, technical notes and credits
tools/ shared helper notes/tools when needed
validation/ local compile verification records
versions/ build folders with one Arduino sketch per board
The early versions used Bluepad32 because it quickly proved the gameplay idea: DualSense input could be routed through DK1/S3 and presented to a PS3. The later RAW/HEX route was chosen because higher-level wrappers limited visibility and control over rumble, lightbar, player LEDs, battery, charging state, and Bluetooth HID output reports.
Tiger Edition uses the DK1 to parse DualSense raw Bluetooth HID report 0x31
and to send merged DualSense output report 0x31 for rumble, lightbar and
player LEDs. This gives the project more room to grow.
All coding in this project was done through AI-assisted iterative development, also called vibecoding. ChatGPT, Claude, Gemini and Codex were used at different stages for code generation, debugging, research comparison, documentation and alternative approaches.
The project direction, hardware decisions, physical wiring, manual testing, problem framing, repeated experiments, game validation and final decisions came from Ivves Hermosilla. The point of this repository is to be transparent: this is not a claim of traditional solo coding. It is a record of practical problem solving, AI-assisted development, hardware iteration and test-driven learning.
See:
docs/ai-assisted-development.md
docs/project-story.md
Current status: Tiger Edition is functional and is the recommended build.
Paused/future directions:
- PS3 Bluetooth pairing/wake support through DK1.
- Deeper investigation of whether a PS3 can accept multiple controller identities from a single S3/composite USB device. Early tests suggested it only accepted one primary controller, but this should be considered open for community research.
- Broader controller support beyond DualSense.
- Cleaner PCB or enclosure work.
This is free/open code under the MIT license. You may use, study, modify and build on it under that license.
If this work helps you, please credit Ivves Hermosilla. As a courtesy, I would also appreciate the chance to publish the first full start-to-finish YouTube build tutorial showing the soldering, board setup, core patching and flashing process. That is a request for respect toward the research time invested, not an additional license restriction.
Donations are optional. Nobody needs to donate to use this code. If the project helped you and you want to buy me a soda or support continued development, you can use PayPal.Me:
Text link: https://paypal.me/ivveshermosilla
The PayPal logo is a trademark of PayPal and is used here only to identify the optional payment method. This project is not affiliated with PayPal.
Use this material at your own risk. This project can involve soldering,
electrical modification, USB behavior, Bluetooth behavior, modified Arduino
core files and firmware flashing. Read DISCLAIMER.md before building or
installing anything.
This project is independent and unaffiliated with Sony, PlayStation, Arduino, Espressif, Bluepad32 or any other trademark owner.