Community project

Dual-Channel PS3 HDMI Control System

ESP32
Photo of Dual-Channel PS3 HDMI Control System
Generated with AI

Bapel Doank

Published October 26, 2026

This project builds a dual-channel HDMI switcher controlled by an ESP32 microcontroller, allowing remote selection between two PS3 consoles on a single television. The system uses two relay modules to switch the 5 V power pin (pin 18) on HDMI cables, enabling or disabling each console's video output independently while maintaining signal integrity through shielded Cat6 cabling and controlled-impedance PCB routing.

The guide provides a complete parts list, wiring diagram showing relay control connections and HDMI signal routing, step-by-step assembly instructions for terminating the shielded cable and connecting the two enclosures, and Arduino firmware with serial commands to toggle each channel on and off. Builders will learn relay-based HDMI switching techniques, proper shielding practices for high-speed video signals, and how to implement remote device control via the ESP32.

Wiring diagram

Wiring diagram for Dual-Channel PS3 HDMI Control System

Gather all the parts

QtyComponent
1

5 m Cat6 STP/FTP direct-solder cable

One shielded 8-core cable carrying two power conductors, two control signals, and the bonded foil/drain shield between the cashier and receiver box.

1

TB1 5-position screw terminal block

The receiver-box input terminal where the long cable terminates.

1

K1 5 V single-channel SPDT relay module

A preassembled 5 V relay module that connects PS3 1 HDMI pin 18 to TV 1 only when Channel 1 is enabled.

1

K2 5 V single-channel SPDT relay module

A preassembled 5 V relay module that connects PS3 2 HDMI pin 18 to TV 2 only when Channel 2 is enabled.

1

C1 100 nF 50 V ceramic capacitor

100 nF, 50 V

A ceramic capacitor placed across K1 COM and NO as specified.

1

C2 100 nF 50 V ceramic capacitor

100 nF, 50 V

A ceramic capacitor placed across K2 COM and NO as specified.

1

J1 HDMI Type-A female PCB receptacle — HDMI1_IN

The receiver-box HDMI input receptacle for PS3 1.

1

J2 HDMI Type-A female PCB receptacle — HDMI1_OUT

The receiver-box HDMI output receptacle for TV 1.

1

J3 HDMI Type-A female PCB receptacle — HDMI2_IN

The receiver-box HDMI input receptacle for PS3 2.

1

J4 HDMI Type-A female PCB receptacle — HDMI2_OUT

The receiver-box HDMI output receptacle for TV 2.

Assemble it in 6 steps

1. Lay out the two boxes

Place the ESP32 board at the cashier station. Put the receiver box exactly between the two tables, then keep one 1 m HDMI lead from J2 to TV 1 and one 1 m HDMI lead from J4 to TV 2. Keep the PS3-to-J1 and PS3-to-J3 leads away from the relay coils and their wiring.

  • Use a metal receiver enclosure only if the HDMI connector shells can be bonded safely to it.
  • Do not build the HDMI paths on solderless breadboard or with loose jumper wire; it can corrupt the very fast video signals.

2. Terminate the long shielded cable

At the cashier end, join orange and orange-white to the ESP32 VIN 5 V point (power), join brown and brown-white to GND (ground), connect blue to GPIO25 (TV 1 signal), and connect green to GPIO33 (TV 2 signal). Tie blue-white, green-white, the foil, and drain wire together, then connect that bundle to the board GND reference (shield). At the receiver end, land the matching five bundles on TB1 in the printed order: 5V_BUS, GND_BUS, SIG_TV1, SIG_TV2, SHIELD.

  • Fit strain relief at both cable entries so a tug cannot pull a conductor from its terminal.
  • Make sure no foil or drain strands touch the 5 V or signal terminals; a stray strand can short the supply or control line.

3. Wire the relay control side

From TB1, wire 5V_BUS to K1 VCC and K2 VCC (power), GND_BUS to K1 GND and K2 GND (ground), SIG_TV1 to K1 IN (signal), and SIG_TV2 to K2 IN (signal). Leave both NC relay terminals empty.

  • Use a relay module whose IN pin is specified to recognize 3.3 V logic from an ESP32.
  • A relay board that pulls its IN pin up to 5 V can damage an ESP32 GPIO, especially while the ESP32 is unpowered.

4. Wire the HDMI 5 V contacts

Connect J1 pin 18, HDMI1_5V_IN, to K1 COM (switched 5 V input). Connect K1 NO to J2 pin 18, HDMI1_5V_OUT (switched 5 V output). Connect C1 directly across K1 COM and NO. Repeat the same pattern from J3 pin 18 to K2 COM, K2 NO to J4 pin 18, and C2 across K2 COM and NO.

  • Ceramic capacitors are not polarised, so either C1 or C2 lead can go to either contact.
  • The capacitor across a relay contact creates a small AC path even while the contact is open; test this function with the actual PS3 and TVs before relying on it for rental control.

5. Route the HDMI bypass pairs on a controlled-impedance PCB

For each channel, route pins 1–17 and 19 straight from input receptacle to output receptacle, pin-for-pin. Keep every TMDS plus/minus pair together at the same length over an uninterrupted ground reference: 1/2, 4/5, 7/8, and 10/11. Route pins 3, 6, 9, and 12 as their matching shields, and route pins 13–17 and 19 directly. Bond all four connector shells to the TB1 SHIELD net.

  • Have the PCB fabricator calculate the trace width and spacing for 100-ohm differential impedance using its exact layer stack-up.
  • Do not use ordinary hookup wire, perfboard, or long unmatched PCB traces for TMDS pairs; video may fail, flicker, or work only at a lower resolution.

6. Connect the consoles and televisions

Connect PS3 1 to J1 and TV 1 to J2 with the two 1 m HDMI cables. Connect PS3 2 to J3 and TV 2 to J4 the same way. Power the ESP32 from its micro-USB connector, then use the cashier controller to send 1 or 2 to toggle a channel, A to turn on both, or O to turn off both.

  • Start with both channels off and enable one channel at a time while checking that its intended television responds.
  • Do not connect or disconnect HDMI wiring while equipment is powered if you can avoid it; connector shells and pin 18 can carry live signals.

Review all connections

1. Connections between "cat6_stp_5m" and "ESP32"

Functioncat6_stp_5mESP32
powerA_5V_BUS → +5V_BUS from ESP32 VIN/USBVIN
groundA_GND_BUS → GND_BUS returnGND
digitalA_SIG_TV1 → SIG_TV1 from GPIO25GPIO 25
digitalA_SIG_TV2 → SIG_TV2 from GPIO33GPIO 33
groundA_SHIELD → Shield reference to PCB groundGND
powerB_5V_BUS → TB1 5-position screw terminal block 5V_BUSEXT
groundB_GND_BUS → TB1 5-position screw terminal block GND_BUSEXT
digitalB_SIG_TV1 → TB1 5-position screw terminal block SIG_TV1EXT
digitalB_SIG_TV2 → TB1 5-position screw terminal block SIG_TV2EXT
groundB_SHIELD → TB1 5-position screw terminal block SHIELDEXT

2. Connections between "tb1" and "ESP32"

Functiontb1ESP32
power5V_BUS → 5V star feedVIN
groundGND_BUS → Ground star returnGND
digitalSIG_TV1 → K1 5 V single-channel SPDT relay module INEXT
digitalSIG_TV2 → K2 5 V single-channel SPDT relay module INEXT
groundSHIELD → J1 HDMI Type-A female PCB receptacle — HDMI1_IN SHELLEXT

3. Connections between "k1" and "ESP32"

Functionk1ESP32
powerVCC → +5V_BUS star feedVIN
groundGND → GND_BUS star returnGND
powerCOM → J1 HDMI Type-A female PCB receptacle — HDMI1_IN P18_5V_INEXT
powerNO → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P18_5V_OUTEXT

4. Connections between "k2" and "ESP32"

Functionk2ESP32
powerVCC → +5V_BUS star feedVIN
groundGND → GND_BUS star returnGND
powerCOM → J3 HDMI Type-A female PCB receptacle — HDMI2_IN P18_5V_INEXT
powerNO → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P18_5V_OUTEXT

5. Connections between "c1" and "ESP32"

Functionc1ESP32
power1 → K1 5 V single-channel SPDT relay module COMEXT
power2 → K1 5 V single-channel SPDT relay module NOEXT

6. Connections between "c2" and "ESP32"

Functionc2ESP32
power1 → K2 5 V single-channel SPDT relay module COMEXT
power2 → K2 5 V single-channel SPDT relay module NOEXT

7. Connections between "j1_hdmi1_in" and "ESP32"

Functionj1_hdmi1_inESP32
groundSHELL → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT SHELLEXT
dataP1_TMDS2_P → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P1_TMDS2_PEXT
dataP2_TMDS2_N → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P2_TMDS2_NEXT
groundP3_TMDS2_SHIELD → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P3_TMDS2_SHIELDEXT
dataP4_TMDS1_P → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P4_TMDS1_PEXT
dataP5_TMDS1_N → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P5_TMDS1_NEXT
groundP6_TMDS1_SHIELD → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P6_TMDS1_SHIELDEXT
dataP7_TMDS0_P → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P7_TMDS0_PEXT
dataP8_TMDS0_N → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P8_TMDS0_NEXT
groundP9_TMDS0_SHIELD → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P9_TMDS0_SHIELDEXT
dataP10_CLK_P → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P10_CLK_PEXT
dataP11_CLK_N → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P11_CLK_NEXT
groundP12_CLK_SHIELD → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P12_CLK_SHIELDEXT
dataP13_CEC → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P13_CECEXT
dataP14_UTILITY_HEAC → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P14_UTILITY_HEACEXT
dataP15_DDC_SCL → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P15_DDC_SCLEXT
dataP16_DDC_SDA → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P16_DDC_SDAEXT
groundP17_DDC_CEC_GND → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P17_DDC_CEC_GNDEXT
dataP19_HPD → J2 HDMI Type-A female PCB receptacle — HDMI1_OUT P19_HPDEXT

8. Connections between "j2_hdmi1_out" and "ESP32"

Functionj2_hdmi1_outESP32
groundSHELL → J3 HDMI Type-A female PCB receptacle — HDMI2_IN SHELLEXT

9. Connections between "j3_hdmi2_in" and "ESP32"

Functionj3_hdmi2_inESP32
groundSHELL → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT SHELLEXT
dataP1_TMDS2_P → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P1_TMDS2_PEXT
dataP2_TMDS2_N → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P2_TMDS2_NEXT
groundP3_TMDS2_SHIELD → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P3_TMDS2_SHIELDEXT
dataP4_TMDS1_P → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P4_TMDS1_PEXT
dataP5_TMDS1_N → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P5_TMDS1_NEXT
groundP6_TMDS1_SHIELD → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P6_TMDS1_SHIELDEXT
dataP7_TMDS0_P → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P7_TMDS0_PEXT
dataP8_TMDS0_N → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P8_TMDS0_NEXT
groundP9_TMDS0_SHIELD → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P9_TMDS0_SHIELDEXT
dataP10_CLK_P → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P10_CLK_PEXT
dataP11_CLK_N → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P11_CLK_NEXT
groundP12_CLK_SHIELD → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P12_CLK_SHIELDEXT
dataP13_CEC → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P13_CECEXT
dataP14_UTILITY_HEAC → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P14_UTILITY_HEACEXT
dataP15_DDC_SCL → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P15_DDC_SCLEXT
dataP16_DDC_SDA → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P16_DDC_SDAEXT
groundP17_DDC_CEC_GND → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P17_DDC_CEC_GNDEXT
dataP19_HPD → J4 HDMI Type-A female PCB receptacle — HDMI2_OUT P19_HPDEXT

Deploy the firmware

#include <Arduino.h>

constexpr uint8_t SIG_TV1_PIN = 25;
constexpr uint8_t SIG_TV2_PIN = 33;

bool channel1Enabled = false;
bool channel2Enabled = false;

void applyOutputs() {
  digitalWrite(SIG_TV1_PIN, channel1Enabled ? HIGH : LOW);
  digitalWrite(SIG_TV2_PIN, channel2Enabled ? HIGH : LOW);
}

void printStatus() {
  Serial.print("TV1 HDMI 5V: ");
  Serial.println(channel1Enabled ? "ENABLED" : "DISABLED");
  Serial.print("TV2 HDMI 5V: ");
  Serial.println(channel2Enabled ? "ENABLED" : "DISABLED");
  Serial.println("Commands: 1 toggle TV1, 2 toggle TV2, A enable both, O disable both");
}

void setup() {
  pinMode(SIG_TV1_PIN, OUTPUT);
  pinMode(SIG_TV2_PIN, OUTPUT);
  applyOutputs();

  Serial.begin(115200);
  delay(100);
  Serial.println("Dual-channel HDMI pin-18 controller ready.");
  printStatus();
}

void loop() {
  if (Serial.available() > 0) {
    const char command = static_cast<char>(Serial.read());
    bool changed = true;

    switch (command) {
      case '1':
        channel1Enabled = !channel1Enabled;
        break;
      case '2':
        channel2Enabled = !channel2Enabled;
        break;
      case 'A':
      case 'a':
        channel1Enabled = true;
        channel2Enabled = true;
        break;
      case 'O':
      case 'o':
        channel1Enabled = false;
        channel2Enabled = false;
        break;
      case '\r':
      case '\n':
        changed = false;
        break;
      default:
        Serial.println("Unknown command. Use 1, 2, A, or O.");
        changed = false;
        break;
    }

    if (changed) {
      applyOutputs();
      printStatus();
    }
  }
  delay(10);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik