All Projects

Physical LED Controls

Individual Project · Summer 2025

ECE Discovery Project

Overview

A custom-built USB control interface featuring sliders and mechanical switches that manipulate colors and effects on addressable LED devices. Designed from the ground up, including soldered hardware, embedded software, and computer-side integration using OpenRGB, the device blends electrical engineering and interaction design into both a functional tool and a proof of concept for intuitive lighting control.

Highlights

  • Designed and built a 10-slider, 10-switch USB control board around an Arduino Micro, from breadboard prototype to a fully soldered final build in a custom case.
  • Planned the circuit and pin layout for all 20 inputs, fitting them onto the Arduino Micro’s available analog and digital pins.
  • Wrote embedded software that sends input data over USB only when a value changes or the device is polled, and scales easily to any number of buttons and sliders.
  • Wrote a Python desktop program that decodes the board’s input and drives lighting modes and colors through the OpenRGB SDK.
The finished control board: ten slide potentiometers and ten mechanical switches set into a cardboard case

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:

  1. To easily change the number of buttons and sliders for the final board
  2. 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.

Pin plan mapping the 10 sliders and 10 buttons to the Arduino Micro's analog and digital pins
The final pin plan

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.

The finished control board at an angle, with sliders and mechanical switches in a cardboard case
Top-down view of the finished control board

Soldering

The underside of the board, showing the soldered wiring to the Arduino Micro
The finished circuitry

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:

The board controlling the lighting in my PC setup

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