Here are some photos of the SS/ZF switch board I have been using in my CFA3 build. The original SS/ZF switch board, designed by ang728 & vwvwbg, uses a ULN2003 as a relay driver. The mode-control input drives several ULN2003 inputs in parallel. When the control line is high, the corresponding Darlington outputs sink current through the relay coils, so the relays energize. When the control line is low, the ULN2003 outputs turn off and the relays release. The relay coils are tied to +5V, and the ULN2003 provides the low-side switching path to ground. Its COM pin is tied to +5V so the internal clamp diodes handle the relay flyback. I have been using this SS/ZF switch board for about a year and a half without any reliability issues. The only thing I noticed is that switching modes produces a small pop. Even with headphones on it has been acceptable, but recently I started wondering whether this could be improved. . So I added a small Arduino Nano interlock board in front of the existing SS/ZF control input. The Arduino reads the front-panel SS/ZF switch and outputs the required mode-control voltage to the existing ULN2003 relay board. The sequencing is: 1. Detect SS/ZF switch change. 2. Assert mute. 3. Wait briefly. 4. Change the SS/ZF relay control output. 5. Wait for the circuit to settle. 6. Release mute. The mute control is done through a PC817 optocoupler. On the Arduino side, one digital output drives the PC817 LED. On the protector-board side, the PC817 transistor pulls the existing protector MOSFET gate node toward the protector boardโs -12V rail. This mimics a fault condition and forces the headphone output protection relay to open during the SS/ZF transition. So the Arduino does not touch the audio signal path. It only sequences the existing relay-control line and temporarily forces the existing KG protector circuit into mute during mode switching. In the installed photo: The top connector goes to the front-panel switch. The switch controls whether Arduino D2 is grounded or left open. The middle-right connector outputs the mode-control signal to my SS/ZF switch PCB. This is the 0V / control / +5V connection. The lower-left connector goes to the KG protector board: one wire to the 2N7000 gate node, and one wire to the -12V output of the 7912 regulator. The lower-right connector is the 5V / 0V power input for the Arduino interlock board. Arduino code attached below: const int SWITCH_PIN = 2;
const int MUTE_PIN = 8;
const int MODE_PIN = 9;
const bool MODE_INVERT = true; // if SS/ZF mode inverted
const unsigned long MUTE_BEFORE_SWITCH_MS = 250;
const unsigned long SETTLE_AFTER_SWITCH_MS = 700;
const unsigned long POWER_ON_MUTE_MS = 1500;
const unsigned long DEBOUNCE_MS = 50;
bool currentMode;
bool readMode() {
bool sw = digitalRead(SWITCH_PIN); // HIGH = open, LOW = grounded
bool mode = sw;
if (MODE_INVERT) mode = !mode;
return mode;
}
void forceMute(bool on) {
digitalWrite(MUTE_PIN, on ? HIGH : LOW);
}
void setMode(bool mode) {
digitalWrite(MODE_PIN, mode ? HIGH : LOW);
}
void setup() {
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(MUTE_PIN, OUTPUT);
pinMode(MODE_PIN, OUTPUT);
forceMute(true);
delay(100);
currentMode = readMode();
setMode(currentMode);
delay(POWER_ON_MUTE_MS);
forceMute(false);
}
void loop() {
bool newMode = readMode();
if (newMode != currentMode) {
delay(DEBOUNCE_MS);
newMode = readMode();
if (newMode != currentMode) {
forceMute(true);
delay(MUTE_BEFORE_SWITCH_MS);
setMode(newMode);
currentMode = newMode;
delay(SETTLE_AFTER_SWITCH_MS);
forceMute(false);
}
}
}Some pics: