MACROPAD

Most macropads today rely on custom PCBs and fixed firmware, which makes them difficult to modify, repair, or customize. For this project, I wanted to build something more accessible, modular, and maker-friendly while still looking and feeling like a polished commercial product.

So I designed and built a fully customizable 3D printed macropad using a DFRobot Beetle RP2350, a rotary encoder, a 0.96" OLED display, and 9 mechanical switches — all without using a custom PCB.

The entire macropad was designed in Fusion 360 and assembled using hand-wired connections and snap-fit 3D printed parts. The switches directly lock into the printed frame, making the build simple, repairable, and easy to modify.

The macropad supports multiple workflow modes such as:

  1. Windows
  2. VS Code
  3. Fusion 360
  4. DaVinci Resolve
  5. Media Controls

Using the rotary encoder, you can quickly switch between modes, while the OLED display dynamically updates all key mappings in real time.

Screenshot 2026-05-20 121659.png

To make customization even easier, I also started developing a dedicated web-based configuration tool that allows users to visually manage modes, remap keys, configure encoder actions, and sync everything directly to the device over USB without editing firmware manually.

This project reflects my idea of a better maker ecosystem:

  1. Hardware that is repairable
  2. Tools that are customizable
  3. Devices that are easier to build and learn from
  4. Open workflows that encourage creativity instead of locked ecosystems

Instead of creating another closed gadget, this project focuses on accessibility, learning, personalization, and long-term usability.

DSC04426.JPG
DSC04473.JPG
DSC04421.JPG
DSC04453.JPG

Supplies

HARDWARE LIST
1 DFRobot Beetle RP2350
DSC04325.JPG

For this build, I used mostly off-the-shelf components combined with fully 3D printed structural parts.

Electronics

  1. 1x DFRobot Beetle RP2350
  2. 1x 0.96" I2C OLED Display
  3. 1x Rotary Encoder
  4. 9x Outemu Mechanical Switches

Hardware

  1. M2 and M3 Screws Kit
  2. Hook-up Wire
  3. Solder Kit

Fabrication

  1. 3D Printed Parts
  2. Access to a 3D Printer

Software

  1. Autodesk Fusion 360
  2. CircuitPython

This project was intentionally designed without a custom PCB. All components snap into the 3D printed structure and are directly wired together, making the build easier to modify, repair, and reproduce.

DSC04345.JPG
DSC04326.JPG
DSC04336.JPG
DSC04327.JPG
DSC04342.JPG
DSC04328.JPG
DSC04329.JPG
DSC04330.JPG

Step 1: Selecting Mechanical Switches

Selecting Mechanical Switches

One of the best parts of building a custom macropad is choosing the typing feel you want. Mechanical switches can completely change how the device feels during daily use.

For this build, I used Outemu Blue mechanical switches because I wanted strong tactile feedback while triggering macros. The click and bump make it very satisfying to use, especially for shortcuts and repetitive actions.

I also tested Outemu Red switches, which feel much smoother and quieter since they don’t have a tactile bump or audible click.

If you're building your own version of this macropad, here’s a quick guide to common switch types:

Blue Switches — Clicky & Tactile

Blue switches are:

  1. Clicky
  2. Tactile
  3. Loud
  4. Very satisfying for shortcuts and macros

You can physically feel and hear the activation point, which makes them great for:

  1. CAD shortcuts
  2. Editing workflows
  3. Productivity tools
  4. Users who like strong feedback

This is the switch type I used in my macropad because each keypress feels intentional and responsive.

Best for: tactile feedback and satisfying clicks.

Red Switches — Smooth & Linear

Red switches are:

  1. Linear
  2. Smooth
  3. Quiet
  4. Lightweight

There’s no tactile bump or click sound — the key simply moves straight down smoothly.

These are excellent for:

  1. Fast repeated inputs
  2. Silent setups
  3. Long editing sessions
  4. Gaming

I have a few red switches as well, and they feel much softer and smoother compared to the Blue switches.

Best for: smooth and quiet operation.

Brown Switches — Balanced Option

Brown switches sit between Blue and Red switches.

They provide:

  1. Mild tactile feedback
  2. Minimal noise
  3. Balanced feel

If you want feedback without loud clicking, Browns are usually the safest choice.

Best for: mixed productivity and everyday use.

Black Switches — Heavier Linear Feel

Black switches are similar to Reds but require more force to press.

They are:

  1. Linear
  2. Smooth
  3. Heavier to actuate

Some users prefer them for avoiding accidental key presses.

Best for: users who prefer firm key presses.

My Recommendation

For a macropad specifically, I personally prefer Blue switches because:

  1. Every macro press feels deliberate
  2. The tactile bump helps avoid accidental triggers
  3. The clicking sound makes the device feel more interactive

But if you want a quieter setup for office or studio use, Red or Brown switches may be a better choice.

Step 2: Meet the Brain of the Macropad - Beetle RP2350

DSC04309.JPG

For this project, I wanted a microcontroller board that was:

  1. Extremely compact
  2. Powerful enough for multiple macro layers
  3. Easy to program
  4. Affordable
  5. Simple to integrate without designing a PCB

That made the DFRobot Beetle RP2350 the perfect choice.

The Beetle RP2350 is a coin-sized development board based on the Raspberry Pi RP2350 microcontroller. Despite its tiny size, it packs impressive performance with:

  1. Dual-core architecture
  2. ARM Cortex-M33 + RISC-V support
  3. 520KB RAM
  4. 2MB Flash
  5. USB Type-C
  6. 11 GPIO pins
  7. Built-in Li-ion charging support
DSC04346.JPG

The board measures only 25 × 20.5 mm, which made it ideal for creating a compact macropad enclosure without wasting space.

One of the biggest advantages of this board is the price. At around $4.90 USD, it delivers incredible value for custom input devices, wearable electronics, and embedded projects.

Because the board is inexpensive and easy to source, this project stays accessible to makers who want to experiment with custom hardware without investing in expensive custom PCBs or manufacturing.

The Beetle RP2350 also supports:

  1. Arduino
  2. MicroPython
  3. C/C++

which makes firmware development beginner-friendly while still being powerful enough for advanced macro systems and HID projects.

Step 3: Flashing the Macropad Firmware

Now it’s time to bring the macropad to life.

This project uses CircuitPython, which makes development incredibly beginner-friendly. You can edit the code like a normal USB drive without installing complicated toolchains.

Step 1: Flash CircuitPython onto the RP2350

First, download the latest CircuitPython .uf2 firmware for RP2350 boards:

CircuitPython Downloads

Search for:

Pico 2

Download the latest correct .uf2 file for your board.

Screenshot 2026-05-13 123236.png

Screenshot 2026-05-13 125801.pngFlashing Process

  1. Hold the BOOTSEL button on the board
  2. Plug the board into your PC using USB
  3. Release the BOOTSEL button

A USB drive named:

RP2350

will appear on your computer.

Simply drag and drop the downloaded .uf2 file onto that drive or Copy -> Paste.

Screenshot 2026-05-13 123522.png
Screenshot 2026-05-13 123619.png

The board will automatically reboot, and a new drive called:

CIRCUITPY

will appear.

Screenshot 2026-05-13 123803.png

Your board is now running CircuitPython.

Step 2: Download the Adafruit Library Bundle

Next, download the official Adafruit CircuitPython library bundle:

Adafruit CircuitPython Bundle Releases

Download the file named something like:

adafruit-circuitpython-bundle-10.x-mpy-YYYYMMDD.zip

Make sure the version matches your installed CircuitPython version.

You can check your version by opening:

CIRCUITPY/boot_out.txt

Extract the ZIP file on your computer. Inside, you’ll find a lib/ folder containing all the libraries.

Screenshot 2026-05-13 124137.png

Step 3: Copy Only the Required Libraries

From the extracted lib/ folder, copy these files and folders into:

CIRCUITPY/lib/

Screenshot 2026-05-13 124319.png

Required libraries:

adafruit_hid/ ← whole folder
adafruit_displayio_ssd1306.mpy
adafruit_display_text/ ← whole folder
adafruit_imageload/ ← whole folder
adafruit_display_shapes/ ← whole folder

Your final structure should look like:

Screenshot 2026-05-13 124439.png

Step 4: Copy boot.py and Replace the code.py

Download the complete macropad firmware from the GitHub repository:

Macropad GitHub Repository

Extract the downloaded ZIP file on your computer.

Screenshot 2026-05-20 123921.png

Inside the repository, you’ll find:

  1. boot.py
  2. code.py
  3. modes.py

Copy the all file into the root of your:

CIRCUITPY

drive.

If a code.py file already exists, replace it.

Screenshot 2026-05-20 123848.png

Final File Structure

When everything is copied correctly, your board should look like this:

Once the files are copied, the unplug the board.

Step 4: CAD Design

I designed the complete macropad in Autodesk Fusion with a focus on simplicity, compactness, and easy assembly without using a PCB.

The entire design consists of 4 main parts:

1. Top_Cover:

This is the main structural part of the macropad.

  1. Holds all 9x Outemu switches using snap-fit mounting
  2. Mounts the OLED display and rotary encoder from the back side
  3. Also acts as the top enclosure cover for the entire assembly

2. Housing:

  1. The bottom housing holds the DFRobot Beetle RP2350 securely in place.
  2. It also includes USB Type-C opening

3. Knob: A custom-designed rotary encoder knob designed specifically for this build.

4. Keycaps:

Custom 3D printable keycaps for all 9 switches.

I have attached:

  1. The original Fusion 360 design file
  2. STL files for all individual parts

You can:

  1. View the design directly in the browser
  2. Modify the CAD model as per your needs
  3. Directly slice and 3D print the provided STL files

MACROPAD Fusion 360 File

IM4.png
IMG2.png
IMG1.png
IMG8.png

Step 5: 3D Printing

DSC04349.JPG

Now it’s time to print all the parts.

Print the following:

  1. 1x Top_Cover
  2. 1x Housing
  3. 1x Knob
  4. 9x Key_Caps

I printed all parts using standard PLA settings, so no special print profile is required.

My print setup:

  1. Printer: Bambu Lab P1S
  2. Material: PLA
  3. Main body color: Light Gray
  4. Knob color: Red (for contrast)
DSC04331.JPG
DSC04333.JPG
DSC04352.JPG
DSC04334.JPG
DSC04353.JPG
DSC04354.JPG
DSC04356.JPG
DSC04355.JPG

Step 6: Mounting the Switches

DSC04361.JPG

Take all 9 mechanical switches and insert them into the Top_Cover from the top side.

Each switch is designed to:

  1. Snap directly into the printed plate
  2. Align automatically
  3. Lock itself in place after pressing

Simply push each switch firmly until you hear or feel a click.

DSC04366.JPG
DSC04365.JPG

Step 7: Mounting the OLED Display

DSC04370.JPG

Take:

  1. The 0.96" OLED display
  2. 4x M2 × 4mm screws

Place the OLED on the back side of the Top_Cover and align it with the mounting holes.

Insert the screws and tighten them gently until the display is securely mounted.

DSC04373.JPG
DSC04376.JPG

Step 8: Mounting the Encoder

DSC04377.JPG

Take:

  1. The rotary encoder
  2. 2x M3 × 6mm screws

Place the encoder on the back side of the Top_Cover and align it with the raised mounting holes.

Insert the screws and tighten them until the encoder is firmly secured in place.

DSC04379.JPG
DSC04380.JPG
DSC04381.JPG
DSC04382.JPG

Step 9: Circuit Connections

Add a little bit of body text.png

Now connect and solder all the components according to the wiring diagram provided.

This macropad uses a simple hand-wired matrix, so no custom PCB is required. All switches, the OLED display, and the rotary encoder are directly connected to the DFRobot Beetle RP2350.

Switch Matrix:

Columns

  1. Column 1 → Pin 9
  2. Column 2 → Pin 16
  3. Column 3 → Pin 18

Rows

  1. Row 1 → Pin 19
  2. Row 2 → Pin 26
  3. Row 3 → Pin 27
DSC04386.JPG
DSC04387.JPG

Rotary Encoder:

  1. VCC → 3.3V
  2. GND → GND
  3. A → Pin 0
  4. B → Pin 1
  5. Switch (C) → Pin 8

OLED Display (I2C):

  1. VCC → 3.3V
  2. GND → GND
  3. SCL → SCL
  4. SDA → SDA

Soldering Tips:

  1. Use thin flexible wires to keep the assembly compact
  2. Double-check polarity before powering the board
  3. Test connections with a multimeter if possible
  4. Keep solder joints small to avoid shorts between switch terminals

Once all connections are complete, the hardware assembly is ready for final installation into the enclosure.

DSC04389.JPG
DSC04390.JPG
DSC04392.JPG
DSC04395.JPG

Step 10: Housing Assembly

DSC04398.JPG

Now take:

  1. The Housing
  2. The fully assembled Top_Cover

Carefully place the DFRobot Beetle RP2350 inside the housing and align the USB Type-C port with the cutout provided on the side.

Press the board gently into its slot until it sits securely in place.

DSC04399.JPG
DSC04400.JPG

Next:

  1. Align the Top_Cover with the housing
  2. Make sure no wires are getting pinched inside the enclosure

Use:

  1. 4x M2 × 6mm screws

to secure the cover to the housing.

DSC04403.JPG

Step 11: Keycaps and Knob Assembly

DSC04405.JPG

Now take:

  1. The 9x 3D printed keycaps
  2. The 3D printed encoder knob

Press each keycap onto the mechanical switches until they fit securely.

Next, align the knob with the rotary encoder shaft and press it into place.

Your macropad is now fully assembled and ready to use.

DSC04408.JPG
DSC04409.JPG
DSC04410.JPG
DSC04413.JPG

Step 12: How to Use the Macropad

Simply connect the macropad to your PC using a USB Type-C cable.

DSC04451.JPG

Once powered on:

  1. The OLED display shows a boot animation
  2. The macropad starts in the default Windows Mode

Currently, the firmware includes 5 different modes:

  1. Windows
  2. VS Code
  3. Fusion 360
  4. DaVinci Resolve
  5. Media Controls
DSC04455.JPG
DSC04452.JPG
DSC04453.JPG
DSC04454.JPG

Switching Between Modes

The rotary encoder is used for navigation.

To open the mode selection menu:

  1. Press the encoder knob once

To navigate:

  1. Rotate the encoder to move through the available modes

To select a mode:

  1. Press the encoder again

Once selected, the OLED updates and displays all key functions in a simple 3×3 layout corresponding to the physical keys.

Quick Media Toggle

Double-pressing the encoder knob enables quick switching between:

  1. Media Mode
  2. Your currently selected working mode

This makes it easy to quickly adjust volume or media playback without leaving your active workflow.

Step 13: Customizing the Macropad Using the Web App

Screenshot 2026-05-20 121529.png

To make the macropad easier to configure, I also built a dedicated web-based configuration tool.

Instead of manually editing the code.py file, you can now visually:

  1. Add new modes
  2. Edit key mappings
  3. Configure encoder actions
  4. Customize OLED labels
  5. Create shortcuts
  6. Sync everything directly to the macropad

The interface is designed to look and behave like the physical macropad itself, making customization much more beginner-friendly and intuitive.

Open the Web App

Open the Macropad UI in your browser: Macropad Web UI

Connect the Macropad

  1. Connect the macropad to your PC using a USB Type-C cable
  2. Open the web app
  3. Click the Connect Device button
  4. Select the CIRCUITPY drive
Screenshot 2026-05-20 121602.png

Once connected:

  1. The app automatically reads the saved mode configuration
  2. Existing modes appear in the sidebar
  3. The OLED preview updates live

Editing Modes

The left sidebar contains all available modes.

You can:

  1. Select a mode
  2. Rename it
  3. Duplicate it
  4. Delete it
  5. Create completely new modes

Example modes:

  1. Windows
  2. VS Code
  3. Fusion 360
  4. DaVinci Resolve
  5. Media

The selected mode instantly updates the virtual macropad preview in the center.

Screenshot 2026-05-20 121617.png

Editing Keys

Screenshot 2026-05-20 121659.png

Click any key on the virtual 3×3 keypad to edit it.

For every key, you can configure:

  1. OLED label
  2. Description
  3. Shortcut type
  4. Multi-key combinations
  5. Media controls
  6. Macros

Example:

Label: COPY Shortcut: CTRL + C

The UI also includes a visual keyboard selector, making it easy to create complex shortcuts without memorizing keycodes.

Encoder Configuration

Screenshot 2026-05-20 121634.png

The encoder can also be customized directly from the UI.

You can assign:

  1. Clockwise rotation
  2. Counter-clockwise rotation

Example uses:

  1. Volume control
  2. Zoom
  3. Timeline scrubbing
  4. Brightness control
  5. Mode switching

The OLED preview updates in real time while editing.

Platform Support

The web app also includes preset profiles and shortcut mappings for:

  1. Windows
  2. macOS
  3. Linux

This makes it easier to use the same macropad across different operating systems without manually rebuilding shortcuts every time.

Import & Export Profiles

The UI supports:

  1. Profile export
  2. Profile import

This allows you to:

  1. Back up your configuration
  2. Share profiles with others
  3. Load different workflow setups instantly

For example, you can maintain separate profiles for:

  1. Coding
  2. Video editing
  3. CAD work
  4. Streaming
  5. Productivity

Syncing to Device

Once finished:

  1. Click Sync to Device
  2. The app automatically updates the macropad configuration
  3. The device reloads with the new settings

The web app generates and updates a modes.py configuration file stored directly inside the CircuitPython filesystem.

This means:

  1. No firmware reflashing required
  2. No manual coding required
  3. Easy future customization

The goal of this software was to make custom hardware feel much more accessible, visual, and beginner-friendly while still keeping the flexibility of an open maker project.

Step 14: Conclusion

DSC04448.JPG

This project started as a simple idea for a custom macropad, but it gradually evolved into a complete ecosystem combining hardware design, embedded programming, 3D printing, and user-focused software tools.

By avoiding a custom PCB and using snap-fit 3D printed parts, the macropad becomes easier to build, modify, repair, and customize using commonly available components. The modular approach also encourages experimentation and learning, especially for makers who want to explore electronics and product design without expensive manufacturing processes.

What makes this project especially exciting is the software side. Alongside the hardware, I also designed a web-based configuration interface that allows users to visually create modes, remap keys, customize encoder actions, and sync settings directly to the device. This transforms the macropad from a fixed hardware tool into a highly flexible productivity platform tailored to individual workflows.

For me, this project represents a small step toward a better future where technology is:

  1. More open
  2. Easier to repair
  3. More customizable
  4. More approachable for learning and creativity

I hope this project inspires others to build their own tools, experiment with custom hardware, and explore how maker-driven design can create more accessible and user-friendly technology.

License
All Rights
Reserved
licensBg
0