Goals
The main objective for this project was to create a versatile and configurable control surface for LED lighting setups. Some specific goals I set for myself were:
- Designing a physical interface with multiple input types (sliders and switches)
- Enabling user reconfiguration of control behavior (e.g. a single slider could control brightness, hue, or effect speed)
- Implementing USB communication for broad OS compatibility
- Building a finished device housed in a custom casing
- Successfully integrating with OpenRGB, an open-source API for lighting control
I chose this project in order to improve my ECE skills, specifically targeting USB data transfer and physical fabrication.
Process
Choosing a board
I started the process with research on how to create custom USB devices. This specific topic had me going in circles for quite a while, but I ended up settling on the Arduino Micro. It was an ideal solution, since the board already has built-in USB capabilities, and I was already familiar with boards in the Arduino family.
Next up was finding all the additional components I would need for this build. This included the slide potentiometers, knobs for them, and blank keycaps for my mechanical switches. The rest of the parts were needed specifically for the final build: some PCB prototype boards to solder onto, and some extra jumper wires. Other than that, I already had all of the pieces I would need.
Prototyping
Once I had picked out all the pieces, I designed the circuitry that would let the board read from the switches and sliders. This circuitry was fairly simple, mainly connecting power, ground, and the analog and digital input pins in the right places. The original design that I planned to prototype only used two buttons and two sliders.
After waiting for all my parts to arrive, I quickly put together a prototype of the 2-button-2-slider design on a couple of breadboards, then wrote some test code that simply plotted the button and slider values in the debugger. Both the buttons and sliders were working as intended, meaning that the hardware prototype was successful!
Software
Once the hardware prototype was working, I modified the embedded software in a few ways:
- To easily change the number of buttons and sliders for the final board
- To send signals over USB only when a value changes, or when the device is polled
After making these changes, I ran the embedded software again on the prototype hardware, and eventually got it to work as intended. The final embedded code can be downloaded here.
The desktop-side software ended up being a pretty simple task: all it had to do was receive USB input, decode it, and send that data on to the OpenRGB SDK. I implemented this code in Python, and it can also be downloaded here.
Planning the final board
Before I started wiring the finalized hardware, I updated my wiring diagram for the 10-slider-10-button final design. This ended up being super helpful, since all 20 inputs used a lot of the Arduino Micro’s available pins, and finding space for all of them while wiring would have been a lot more stressful.

Building the case
When I initially set out on this project, I wanted to improve my physical fabrication skills and use the tools provided by the makerspace to 3D print a housing for the final design. I didn’t end up having enough time to accomplish this, so instead I put together a casing out of a cardboard box! Through some meticulous box cutting and hot gluing, I arrived at a pretty clean final product.


Soldering

The final step was placing and soldering all the electronics. This took me quite a while, but luckily I had already set myself up for success by planning the exact wiring I would need. After many hours spent improving my soldering skills, I finally finished wiring the full circuit.
Demo
Once the build was done, I retested the embedded software on the final hardware, and thankfully everything was working. After a few tweaks to the desktop-side software, the basic controls were working! Here is a short demo of the final product:
Successes and Failures
What went well
- The embedded software worked reliably and was adaptable to the control scheme
- The transition from breadboard to soldered hardware went smoothly
- The USB-based communication with OpenRGB was successfully implemented and debugged
- The physical layout of the board offered good usability and response
What didn’t go as planned
- Design and parts ordering took longer than expected, delaying hardware prototyping
- Not all planned computer-side features (like a GUI) were implemented by showcase time
- Building and soldering the final hardware took more iteration than anticipated, which compressed portfolio writing and presentation time