You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Mittzon handset panel clips off the desk frame. Remove it and undo the screws on the back.
Inside is a small PCB with 4 momentary tactile buttons.
Each button has a signal pad and shares a common ground.
Button pad electrical characteristics
Signal pads idle at 3.3V (pulled up from the panel's MCU)
Pressing a button shorts the signal pad to GND
This is exactly what our ESP32 GPIO replicates in open-drain mode
Soldering the taps
Solder one thin wire to each of the 4 button signal pads (UP, DOWN, M1, M2) and one to any GND point on the PCB. Route the wires out through the cable channel.
Why direct GPIO works (no optocoupler needed)
Voltage match — Panel buttons operate at 3.3V, same as ESP32 GPIO
Common ground — ESP32 and panel share GND, so voltage references are aligned
Open-drain mode — GPIO configured as open-drain can only pull LOW (assert) or float (release). It never drives HIGH, so there's no risk of back-current into the panel's pull-up resistors
Galvanic isolation unnecessary — Both devices are grounded together intentionally. The desk controller's power rail is separate from the button signals
This saves 4 optocouplers and simplifies the build significantly.
LIN bus tap
The LIN bus runs on RJ45 pin 3 between the controller and handset panel. We tap it receive-only directly to ESP32 GPIO16 (hardware UART2 RX). Since we're only receiving (not transmitting), there's no risk of bus disruption from this tap.
RJ45 pinout (observed)
Pin
Function
3
LIN bus (data)
8
GND
Others
Power rails (not tapped)
Caveats
Parallel wiring — Physical buttons remain fully functional. The ESP32 GPIO taps are wired in parallel with the panel's own buttons.
Assert-only — ESP can drive a button LOW (pressed) but cannot force it HIGH if the user is physically holding the button down.
Safety via "two buttons = STOP" — The ROL Group controller has built-in behavior: if two buttons are active simultaneously, it stops all motion. The firmware exploits this for physical button safety (see JOURNEY.md).