
For the prototype, I reused the PCB from a wired game controller I built previously. That board was originally designed around an Arduino Pro Micro and the ATmega32U4. By replacing the Pro Micro with an Arduino Nano ESP32, I can take advantage of the ESP32-S3's built-in Bluetooth Low Energy and turn the same basic controller hardware into a wireless gamepad.
The prototype is already fully functional and can connect to a computer over Bluetooth and work as a regular game controller. I’ve been using it to play games like Cyberpunk 2077 and NieR while testing the hardware and firmware.
This isn't the final controller yet. The eventual version will have a completely custom PCB, a purpose-built enclosure, and a much more refined design. For now, this prototype is about proving that the concept works and laying the groundwork for the open-source controller project.
This article covers the complete build process of this prototype, so let's get started with the build.
MATERIALS REQUIRED
These were the components used in this build
- Custom PCB (Salvaged from previous Project)
- Arduino Nano ESP32 Board
- Right-Angle Push Buttons
- Horizontal Push Buttons
- Analog Joysticks
- Power bank
- USB to Type C Cable
- Double-sided tape
HARDWARE—ARDUINO GAME CONTROLLER

If the Arduino Nano ESP32 is the brain of this project, then the previously made game controller PCB is definitely the brawn.
For this project, I'm reusing the main joystick and button PCB from my previous Arduino game controller project. In the original version, an Arduino Pro Micro was connected to this PCB and acted as the interface between the controller and the PC. Using the ATmega32U4's native USB HID support, I was able to control games and use the board as a regular game controller.
The most interesting part of this controller, however, is that only one I/O pin is used to control all 10 buttons on the board. I achieved this using a clever resistor voltage-divider setup, which allows the microcontroller to identify which button is being pressed by reading different voltage levels from a single analog pin. I'll explain how this works in the next step.
I had also designed this PCB with provisions for two thumbsticks, which is something I was able to take advantage of for this wireless version.
For a more detailed look at the construction and the other design decisions behind the original controller, check out its project page.
https://www.hackster.io/Arnov_Sharma_makes/arduino-retro-game-controller-7cdd0e
PCB DESIGN

For this project, I made a fairly traditional, straightforward game controller PCB, with the buttons connected to the GPIO pins of a microcontroller that supports HID, since the original version was designed as a wired game controller.
The interesting part is how I managed to connect 10 buttons using a single I/O pin.
For this, I built a resistor-ladder arrangement using twelve 1 kΩ resistors connected in series between VCC and the button inputs. Each button connects to a different point on the resistor ladder, while the other side of each switch is connected to ground.
When a button is pressed, it produces a different voltage at the shared analog input depending on its position in the resistor ladder. The microcontroller reads this voltage through its ADC and can determine which button was pressed based on the measured value.
This approach makes it possible to connect a large number of buttons to a single analog I/O pin, instead of needing a separate GPIO pin for every button. In practice, you can use this technique to fit 10–20 buttons or even more onto a single input, depending on the resistor values, ADC resolution, and how much tolerance you can accommodate.
PCBWAY SERVICE



After finalizing the design, I generated the PCB Gerber file and sent them to PCBWay for fabrication. I chose a White PCB with a Black solder mask.
The quality turned out to be excellent with a clean finish and sharp silkscreen, and everything...
Read more »
Arnov Sharma

