Making an RGB Controller

I have been looking for an hardware device as a tactile interface for 3D software applications. There is a large choice of commercial midi controllers that can be used to interface with software applications. Some adventurous people even design their own controllers from the ground up. Somehow, that's the path I chose to make an RGB controller.

The device I have been looking for is an RGB controller with endless rotary encoder. Each encoder would control either the red, green or blue channel, and send the value to the listening application. I wanted a controller with enough resolution for precision and one that reflects the color component value with LEDs. I had another requirement I would talk about later.

The least expensive rotary encoder on the market has around 30 pulses per rotation. However, I was initially considering 14 bits of resolution for maximum precision. One type of encoder that fits this requirement is a magnetic rotary encoder. The AMS 5048 is one example. I found inexpensive NeoPixel rings from Adafruit to use as visual indicator of each component value. Since the encoder and the LED ring connect easily to an Arduino I thought it should be easy to build a prototype.

That being said, I didn't want to make my own device. I could have done with an inexpensive midi controller. In fact, I bought one; the Korg nanoKontrol 2. It also double as a midi device for popular music DAWs. However, its rotary encoder are not endless and it as more controls than I needed; which does not make it intuitive to use as an RGB controller.

There are very nice music controllers out there, but the biggest issue for me is that these devices are littered with UI text such as frequency, VCO, LFO, Mute Record... Which is expected for music devices. However I was looking to control RGB parameters in a 3D software.

There are controllers made for applications such as Adobe Photoshop or Premiere. These controllers could work for me if it wasn't for my last requirement: flexible drivers. For this RGB controller, I wanted a driver I can modify for my needs. I wanted the hardware to not be limited by vendor support.

This driver requirement wasn't that essential I thought. More like a nice to have. I was still undecided when I chose to make a simple prototype of what I wanted with an AMS 5048 encoder, a NeoPixel Led ring and an Arduino Uno. This is what I made:

Single rotary encoder prototype with LED ring

Inside the box, there is a mess of wires and an Arduino Uno. The prototype holds together with hot glue and tape.

Enter the Dark Controller.

Satisfied about the prototype, I thought to let go about all of this and get back to my normal routine. It could take time and skills to design a nice RGB controller that uses a smaller micro controller and holds itself better without tape.

I was casually browsing the web for midi controllers when I stumbled on the Dark Fader. What caught my attention was the Dark Board.

The Dark Board (Image from

My idea of an RGB controller became possible. Huge credit to Kalo, leader of the Dark Controller project. The philosophy of the Dark Controller project was what I needed.

Honestly, it happened by accident : )) … when we created our Dark Fader controller we needed a PCB (Printed Circuit Board) first. We created one and it worked well. But we asked ourselves: “Why not build a universal PCB, which can be used for any Teensy based controller?”.

I contacted Kalo at the Dark Controller project and what followed was a technical discussion on Teensy controllers, 5V vs 3.3V, RC filters, soldering SMD resistors and capacitors, wiring, I2C, power envelop, voltage divider... to arrive to this.

My RGB controller

Yes, there is a 4th knob for alpha or whatever parameter I can think of. The RGB LED rings can reflect the controlled values. The rotary encoders have 10 bits precision and I can implement a midi or OSC driver if I choose.

The enclosure is made of solid aluminum and the top cover is made of plexiglass. The device fits well in my development setup. And most of all, it is intuitive for me to use. All it does is provide physical controls to RGBA values or any similar parameters in a 3D software application.

I learned that making a hardware controller can be challenging, depending on what you want to achieve. I my case, the idea of an RGB controller was simple enough that I was able to make a prototype of it and then transpose it in the concept of the Dark Controller. It was a lot of fun to make.