A dual concentric rotary encoder is two knobs on one spindle. The outer sleeve and the inner shaft turn separately, and each one tells your controller which way it was turned and by how many clicks. This one has 30 clicks a turn on both shafts and a push switch that works when you press the shaft in, so one panel hole gives you two rotary controls and a button.
It is the control behind the COM and NAV frequency knobs on a home flight sim radio panel, where the outer knob changes the whole numbers and the inner knob the decimals. You can also use it for heading and altitude on an autopilot panel, or on a synth to pick a menu item with one knob and set its value with the other. It reads on an Arduino Nano or Mega, an ESP32 or a Pico, and it uses five input pins and a ground. The collar is plain, with no thread or nut, so the solder joints hold it: solder it to a PCB that sits behind your panel and let the shaft come through a hole of about 8mm. Knobs are not included. The inner shaft is 3.5mm with a flat and the outer is a 6mm slotted sleeve, so look for a concentric knob pair made for dual encoders.
Specifications
Datasheets
Wiring & getting started
- Fit it
On a PCB, push the eight terminals and the frame lugs through the board. Solder the lugs as well as the terminals, because the lugs take the strain when you turn and press the knobs. For a test before your board is made, solder short wires straight onto the terminals.
- Wire the two encoders
Each row of three long terminals is one encoder. Connect the middle terminal of each row to GND. Connect the two outer terminals of one row to D2 and D3 on a Nano, and the two outer terminals of the other row to D4 and D5. Each row needs its own pair of inputs. If both rows share a pair, only one knob responds. You need no resistors, because the example code and MobiFlight turn on the ones built into the board. On an ESP32, keep off GPIO34 to 39, which have none built in.
- Wire the push switch
The two short terminals are the switch. Both sit on the same side, set in from one row of three and lined up with its end terminals. Connect one to GND and the other to D6. Either way round works.
- Find which row is which knob
Install the Encoder library from the Arduino Library Manager, upload the code below and open the Serial Monitor at 9600 baud. Turn only the inner shaft, the thin one with the flat. If Row 1 counts, the row on D2 and D3 is the inner shaft. If Row 2 counts, it is the row on D4 and D5. Label your wires once you know.
Example Arduino codeArduino C++
// Dual encoder test on an Arduino Nano. // Row 1: outer pins to D2 and D3, middle pin to GND. // Row 2: outer pins to D4 and D5, middle pin to GND. // Switch: one short terminal to D6, the other to GND. // Needs the Encoder library by Paul Stoffregen (Library Manager). #include <Encoder.h> Encoder row1(2, 3); // turns on the Nano's built-in resistors for you Encoder row2(4, 5); long last1 = 0, last2 = 0; bool lastPressed = false; void setup() { pinMode(6, INPUT_PULLUP); Serial.begin(9600); Serial.println("Turn each knob, then press the shaft."); } void loop() { long count1 = row1.read() / 2; // 2 counts per click long count2 = row2.read() / 2; bool pressed = digitalRead(6) == LOW; if (count1 != last1) { last1 = count1; Serial.print("Row 1: "); Serial.println(count1); } if (count2 != last2) { last2 = count2; Serial.print("Row 2: "); Serial.println(count2); } if (pressed != lastPressed) { lastPressed = pressed; if (pressed) Serial.println("Switch pressed"); delay(20); } } - Check it works
Each click changes the count by 1, and pressing the shaft prints "Switch pressed". Clockwise counts up, anticlockwise counts down. However, if clockwise counts down, swap the two outer wires of that row.
- Set it up in MobiFlight (optional)
Add two Encoder devices, one for each row, and one Button for the switch. Set the type of both encoders to 2 detents per cycle (00, 11). If one click then moves the value two steps, or it takes two clicks to move it one step, choose the other type.

