Community project
Dual-Channel PS3 HDMI Control System
This dual-channel HDMI control system uses an ESP32 to manage the 5 V power pin (pin 18) on two separate HDMI inputs, allowing remote switching between PS3 consoles or other HDMI sources without physically unplugging cables. The system uses two relay modules to independently control each channel, with shielded Cat6 cabling to maintain signal integrity over distance.
The guide includes a complete wiring diagram showing how to terminate the shielded cable and connect the relay modules to the ESP32, a full parts list with PCB receptacles for four HDMI connectors, and step-by-step assembly instructions for building the control boxes and routing HDMI bypass pairs on a controlled-impedance PCB. Firmware is provided with serial commands to toggle each channel individually or control both simultaneously.
Wiring diagram

Gather all the parts
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"
2. Connections between "tb1" and "ESP32"
3. Connections between "k1" and "ESP32"
4. Connections between "k2" and "ESP32"
5. Connections between "c1" and "ESP32"
6. Connections between "c2" and "ESP32"
7. Connections between "j1_hdmi1_in" and "ESP32"
8. Connections between "j2_hdmi1_out" and "ESP32"
9. Connections between "j3_hdmi2_in" and "ESP32"
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.




