Volume Controller Updated

This is an independent personal project

This is a work-in-progress


Taking notes from my previous attempts, I had previously compiled a list of improvement features.

In this iteration, I have elected to eliminate the design requirement for lighting because:


Replace existing potentiometers with rotary encoders and rework physical enclosure to accommodate new components. Design and select components to account for above criterion.

Rewrite Arduino code to interpret rotary encoder values. The code should then relay information via serial in the same manner as original potentiometer-based versions to eliminate the need to modify the existing Windows application. 


In this iteration, I took inspiration from other existing hardware, utilizing a more reduced design. 

The positioning of each knob was changed to shift focus to the large knob, changing the volume of the currently open application.

Topside View

Underside View of Unit Interior

Rotary encoders utilize three pins to communicate encoder signals. With five encoders, the microcontroller requires fifteen cables to communicate these inputs. 

Utilizing five rotary I2C breakout boards from Adafruit, I was able to simplify wiring for rotary encoders by daisy-chaining them together, requiring a single wired input to the controller. These controllers interpret the encoder signal and communicates it using an I2C protocol, allowing for up to eight controllers to be used together.

While the smaller encoders are mounted directly to their breakout boards, the large encoder will need to be manually wired to the breakout board. 

Exploded View of New Volume Controller

The Adafruit QT PY controller and breakout board for the large encoder are mounted to the bottom of the case. 

The large encoder is mounted using M3 screws while the breakout boards are secured using M2.5 screws via holes tapped into the product. 

The final face of the housing is held on using countersunk M5 screws.


Final Product

The final project is manufactured using FDM additive manufacturing. Each knob has been delegated to adjust the volume of a specific application. The large knob is assigned to "other" to adjust the volume of the currently active application if it has not been assigned to a different knob.

GitHub link to original project: https://github.com/omriharel/deej 


The software for this project was adapted from an open-source github project. The project provides the computer-side software to interface with Window's volume mixer and the controller-side software to read the potentiometer inputs. 

The desktop application reads the serial data from a specified port. The program then modifies the volume in Window's Volume Mixer to reflect the values read from the serial connection.

The provided Arduino code was not used. New code was written for use with rotary encoders rather than potentiometers. The output of the code remains identical to the provided code to ensure the Windows-side interpreter program can still understand the controller. 


This design was created to address some of the underlying issues presented by the previous iteration. This device sees continuous use in my everyday life to help normalize the imbalanced volume levels present across the many applications that see daily use.

Other computer hardware companies had identified the same issue and started releasing similar hardware solutions costing >$150 (eg. Elgato Stream Deck). Some of my peers have purchased such devices but continue to use the volume controllers made for them as it provides a greater degree of control and simplicity.

Future Expansion:

This product will continue to see use for many years to come. At the time of current writing, the device has the following limitations that I would like to address in the future. This list will be updated as new ideas for design changes arise.