Home office redesign · plan for review · updated Sep 25, 2026

IR control link

Carries IR control from the side table to the racks over one slim Cat6 cable, between an IR sender at the side table and an IR receiver at the racks. Nothing is built yet. The parts list has a column for what's already on hand.

Requirements

System

Four remote boxes and the amp selector feed the sender at the side table; one trunk cable carries RS-485 and the ZP3 trigger to the receiver at the racks, which drives twelve emitter ports. SIDE TABLE RACKS sealed, unchanged ZP3 remote Arcam remote Yamaha remote Flex remote rebuilt Amp selector buttons · knobs · routing 12 V trigger 3.5 mm RJ45 · UART Sender ESP32-WROOM 4 optocoupler inputs relays raw timing 2 displays slim Cat6 · 25 ft RS-485 + ZP3 trigger pair Receiver own channel each 9 10 11 12 74HC4051 mux 1 2 3 4 5 6 Fosi ZP3 Arcam AVR20 Yamaha R-N800A miniDSP Flex Fosi LC30 NFJ&FX PW-6 #1 NFJ&FX PW-6 #2 Luxman AS-50R Douk VFD253-PRO BlueRigger

Remote box modes

ModeJack outputPlug intoLED blinks
EmitterCommand pulses on a 38 kHz carrier (36 kHz for the Arcam), as todayan IR emitter cable2
LinkCommand pulses, no carrierthe sender4

Firmware changes, all four boxes, over Wi-Fi

Cables to the racks: 2

Cross-section to scale of the two cables to the racks: a 0.11-inch slim Cat6 beside a 0.2-inch glass optical cable. slim Cat6, 0.11″ glass TOSLINK, ≈0.2″ 0.2″ tall together

Drawn to scale: slim Cat6 0.11″ (2.8 mm, from its spec sheet) and glass TOSLINK ≈0.2″. The Cat6 carries the IR link and the ZP3 trigger; the optical carries the D10s's digital feed.

Trunk pinout, T568B straight-through

PinsPairUse
1 / 22, orangeRS-485 A / B, sender → receiver
3 / 63, green3 = +3.3 V from the sender, powering the receiver's MAX3485; 6 = spare
4 / 51, blueZP3 12 V trigger: 4 = tip (+12 V), 5 = sleeve (ZP3 ground)
7 / 84, brownRS-485 signal common, and the return for pin 3

The trigger pair runs from a screw terminal to a 3.5 mm panel jack at each end and touches nothing else: not the breadboard, not either box's ground. At the side table it still lands only on the ZP3 box's optocoupler, as today. Each RJ45 is a screw-terminal breakout board whose own jack pokes through the panel, so there are no couplers or internal patch cords. The trunk is unshielded (UTP), so the jacks' metal shells connect to nothing; check with a meter that no shell is tied to one of the 8 terminals.

Selector ↔ sender patch, 1–3 ft

PinUse
1Selector TX → sender RX
2, 6Ground
3Sender TX → selector RX (reserved for acknowledgements)
4, 5, 7, 8Spare

Sender, at the side table

ESP32-WROOM-32U DevKitC V4 straddling two half-size breadboards, which also hold the four input circuits, the MAX3485 and the fuse, in a Parts Express 320-482, the same case as the amp selector, stacked with it. Every cable enters at the rear panel; the front carries two SH1122 OLEDs, the left showing the active preamp and amp with the sample rate and format, the right the link status, Wi-Fi and the selector's channel (also the Douk's input), speaker pair and BlueRigger input, with a FILN button at each end: the left toggles the screens, the right advances the Douk.

One sender input: the remote box's jack drives a 150 ohm resistor and the LED inside a PC817 optocoupler; the phototransistor pulls GPIO34 low against a 4.7 kilohm pull-up. REMOTE BOX CIRCUIT SENDER CIRCUIT 3.5 mm jack tip sleeve 150 Ω sleeve goes only to PC817 pin 2 PC817 light only, inside the chip 1 2 4 3 4.7 kΩ 3.3 V → ESP32 GPIO34 (RMT receive) sender ground
InputRemote boxPartsGPIO
1Fosi ZP3PC817, 150 Ω, 4.7 kΩ pull-up34
2Yamaha R-N800APC817, 150 Ω, 4.7 kΩ pull-up35
3Arcam AVR20PC817, 150 Ω, 4.7 kΩ pull-up36 (VP)
4miniDSP FlexPC817, 150 Ω, 4.7 kΩ pull-up39 (VN)
5–8future remote boxessame25, 16, 17, 21

Enclosure: Parts Express 320-482, stacked with the selector

EndContentsWidth used
RearRJ45 from the selector, 4 input jacks, ZP3 trigger jack, USB-B, SMA, RJ45 trunk, in one row with an RJ45 in each corner≈183 of 218 mm
Front2 × SH1122 side by side, centred; a FILN button at 16 and at 202 mm≈205 mm

Inside the 320-482, top view to scale

Top view of the sender's Parts Express 320-482 interior: an RJ45 breakout in each rear corner with the input and trigger jacks and USB-B between them along the rear panel on the left, two half breadboards side by side with the ESP32 straddling their joint in the middle, and the two SH1122 modules, with a button nut at each end, behind the front panel on the right. Rear panel: every cable Front panel: displays and buttons inputs + ZP3 trigger RJ45selector RJ45trunk USB-B half breadboard half breadboard ESP32-WROOM-32UUSB end toward the rear PC817 ×4 · MAX3485 · fuse SH1122 (left) SH1122 (right) screens Douk inside ≈155 deep × 216 wide (197 usable between the corner posts) × 27 tall · top of drawing = right end seen from the front · mm

The two half breadboards sit side by side, 110 mm across and 82 mm deep, ≈6 mm in front of the RJ45 boards and ≈24 mm behind the displays. The ESP32 straddles their joint with one header row in each board, leaving free holes beside every pin, its USB end toward the rear panel's USB-B. The PC817s, MAX3485 and fuse use the ≈25 mm of columns in front of it. Everything has to stay under the 27 mm ceiling: lay jumpers flat, and a strip of tape keeps them seated. The two RJ45 boards lie flat on the floor behind the rear panel. Corner screw posts drawn at approximate positions; Parts Express's usable 197 mm is the width between them.

Sender end panels, to scale

Sender front panel with two SH1122 OLED windows side by side and a button at each end; rear panel with the RJ45 from the selector in the left corner, the four input jacks, the ZP3 trigger jack, USB-B, SMA, and the RJ45 trunk in the right corner, seen from behind. Front panel · 218 × 34.5 mm SH1122 leftpreamp · amp · rate SH1122 rightlink · CH · SPK · OPT screens Douk Rear panel, seen from behind · 218 × 34.5 mm RJ45selector ZP3 Yamaha Arcam Flex trigger USB-B SMA RJ45trunk

Rear, left to right seen from behind: the RJ45 from the selector at 30 mm, the same position as the selector's RJ45 to the sender, so the two jacks line up when the cases are stacked; the four inputs at 52, 67, 82 and 97 mm (ZP3, Yamaha, Arcam, Flex, matching inputs 1–4) and the ZP3 trigger jack at 112, next in the row at the same 15 mm pitch and marked by a different-coloured panel nut; USB-B at 139 (screws at 123.75 and 154.25); SMA at 167; and the trunk RJ45 at 188. The floor's mounting bosses leave room for one RJ45 breakout in each rear corner: measured, the board's outer edge sits 17.5 mm from the panel's outer edge, so the jack is at ≈30 mm, and the selector's breakout sits in the same corner against the same bosses. Front: two SH1122s with the selector's window and mounting-hole pattern, centred as a pair, and Ø12.2 button holes at 16 and 202 mm, the same positions as the selector's outer buttons directly below; each button nut clears its display board by ≈4.5 mm. Jack holes Ø6.4 mm. RJ45 cutouts 18 × 15.5 mm, about 1 mm clear of the ≈16 × 13.5 mm jack on every side: the breakout is taped to the floor, so the cutout only has to clear the jack, and the slack absorbs measuring and print error. Measured from the case's outer edges, the jack centres sit 33 mm (left) and 33.5 mm (right) in, ≈30 mm from each panel edge. The jack's top is 19.5 mm above the case's outside bottom, so with the breakout taped to the floor its centre is ≈12.75 mm up, below the 17.25 mm centreline the other parts use. Measured from the floor of the groove the panel sits in, the jack's top is 17.2 mm up (the groove floor is 2.3 mm above the case's outside bottom), so its centre is ≈10.45 mm above the panel's bottom edge and the cutout runs from ≈2.7 to 18.2 mm. The selector's RJ45 cutout uses the same height.

RJ45 breakout terminals, seen from inside the box

An RJ45 breakout's eight-way screw terminal seen from inside the box, looking toward the rear panel: terminals numbered 8 to 1 from left to right, with their T568B wire colours. Rear panel and the jack's opening are beyond the block; you are inside the box looking toward them 8brown7w-brown6green5w-blue4blue3w-green2orange1w-orange square pad end pin 1 end screws on top, wire entries facing you · numbers are the jack's pins · T568B colours (w- = white with)

From the board's copper layout: the jack's square pad marks its pin 1, and the visible traces run terminal 3 to pin 3, 5 to 5 and 8 to 8, so the terminal block follows the jack's order. Seen from inside the box, terminal 1 is on the right and terminal 8, at the square-pad end, on the left. Confirm pin 1 once with a continuity beep against a T568B patch cable's orange-white wire. The same order applies to both breakouts.

Receiver, at the racks

ESP32-WROOM-32U DevKitC V4 straddling a half-size and a full-size breadboard, in a Hammond 1455U2201 (extruded aluminium, 191 × 66 mm end panels, 220 mm long) with 3D-printed end panels. It sits on the ZP3 on the east rack's upper shelf, fronts aligned, its back overhanging the ZP3 by ≈3″. Powered from an always-on outlet on the PDU through the rear USB-B: its 5 V and ground feed the breadboard rails and the ESP32's 5V pin, and its data pair goes to the Nano Every, so the Nano can be reflashed from outside the box. The ESP32 was flashed once over its own USB and updates over Wi-Fi (192.168.4.48); its USB stays unplugged while the rail is powered. Every cable enters at the rear panel; the front panel carries only the display.

JackTargetDriveSignal
1Fosi LC3074HC4051 pin 12, 120 ΩNEC, 38 kHz
2NFJ&FX PW-6 #174HC4051 pin 13, 120 ΩNEC, 38 kHz
3NFJ&FX PW-6 #274HC4051 pin 14, 120 ΩNEC, 38 kHz
4Luxman AS-50R74HC4051 pin 15, 120 ΩNEC, 38 kHz
5Douk VFD253-PRO74HC4051 pin 1, 120 ΩNEC, 38 kHz
6BlueRigger74HC4051 pin 2, 120 ΩNEC, 38 kHz
9Fosi ZP3GPIO19, 100 Ωraw, 38 kHz
10Arcam AVR20GPIO21, 100 Ωraw, 36 kHz
11Yamaha R-N800AGPIO22, 100 Ωraw, 38 kHz
12miniDSP FlexGPIO23, 100 Ωraw, 38 kHz
13–15future remote boxesfrom GPIO13, 18, 4, 16, 17

RS-485 input: MAX3485 + 6N137

PinConnects toSide
Module VCC / GND (5-pin row)Trunk pin 3 (+3.3 V) / trunk 7–8sender's
Module A / BTrunk pins 1 / 2sender's
Module ENThe module's GND in the A/B row (receive only)sender's
Module TXD (RO)6N137 pin 3 (LED cathode)sender's
Module RXD (DI)nothingsender's
6N137 pin 2 (LED anode)220 Ω to trunk pin 3sender's
6N137 pins 8 (VCC) and 7 (enable)Receiver's 5V rail; 0.1 µF from pin 8 to pin 5receiver's
6N137 pin 5Receiver's GNDreceiver's
6N137 pin 6 (output)GPIO34, with 1 kΩ pull-up to the ESP32's 3.3 Vreceiver's

Display: Nano Every + SSD1322 in parallel mode

The SSD1322 boards shipped with R6 + R8 fitted, which is 8080 parallel; ESPHome only drives the SSD1322 over SPI, so a Nano Every drives the panel. The receiver's display is the sender's left panel without its status lines (VOL and the number centred in the right column): the sender passes the selector's D frames down the trunk, the receiver's ESP32 draws them with its own copy of the sender's panel code (office-ir-receiver-panel.h; the sender's is office-ir-left-panel.h), and its nano_mirror display sends each finished 256 × 64 frame to the Nano at 500 kbaud (A5 'F', 2048 bytes in U8g2's buffer order, CRC-8), on every change and again every 2 s. The Nano only copies the frame into U8g2's buffer and puts it on the panel, writing the bus through its ports directly. Layout changes therefore go out over Wi-Fi to the sender and receiver and reach both panels together; the Nano needs reflashing only if the frame format changes. Two TXS0108E modules shift the Nano's 5 V lines to the display's 3.3 V.

FromThroughTo
ESP32 GPIO27 (UART TX)TXS0108E #2, A4 → B4: at 5 V the Nano's chip needs 3.5 V to read a highNano RX (D0, Serial1)
Nano D9, D8 … D2TXS0108E #1, B1–B8 → A1–A8SSD1322 pins 4, 6, 8, 10, 5, 7, 9, 11 in that order, so D0–D7 come from Nano D9, D5, D8, D4, D7, D3, D6, D2
Nano A5TXS0108E #2, B1 → A1SSD1322 WR (pin 13)
Nano A6TXS0108E #2, B2 → A2SSD1322 DC (pin 14)
Nano A7TXS0108E #2, B3 → A3SSD1322 RES (pin 15)
ESP32 3.3 V—SSD1322 RD (pin 12, held high), VCC (pin 2); both TXS VA and OE
GND—SSD1322 CS (pin 16, held low: the only device) and pin 1; TXS GND; Nano GND; ESP32 GND
Panel USB-B: 5 V, GND, D+, D−a cut micro-USB cable, spliced on the breadboardNano USB (power and data)
Nano 5V pin—both TXS VB, so the B side matches the Nano's logic level

Inside the 1455U2201, top view to scale

Top view of the receiver's Hammond 1455U2201 interior, about 220 millimetres from rear panel to front panel and 186 wide: jacks and the RJ45 breakout along the rear panel on the left, the full-size breadboard and ESP32 in the middle, the Nano Every and its two level shifters, and the SSD1322 module behind the front panel on the right. Rear panel: every cable Front panel: display only 14 jacks, SMA, USB-B · ≈30 mm deep with wires bent RJ45trunk Full-size breadboard, 165 × 5574HC4051 · 120 Ω ×8 · 100 Ω ×4 · MAX3485 · 6N137 ESP32-WROOMacross two breadboards Nano EveryTXS0108ETXS0108Efree: second mux, more ports SSD1322 module inside ≈220 deep × 186 wide × 61.5 tall · top of drawing = right end seen from the front · mm

Inside sizes from Hammond's 1455U drawing (the extrusion is made for a 186 mm wide circuit board). Module and breakout sizes are typical; the layout gets redrawn once the parts are in hand.

Receiver end panels, to scale

Receiver front and rear panels, each printed in two halves joined down the centre: the front has the SSD1322 screen window centred with four mounting posts behind it; the rear has mux jacks 1 to 6, two empty holes and the ZP3 trigger jack in the top row with the antenna, and remote-box jacks 9 to 15, the RJ45 trunk and USB-B in the bottom row; four corner screws on each panel. Front panel · 191 × 66 × 2 mm, two halves Rear panel, seen from behind · 191 × 66 × 2 mm, two halves screen 78.5 × 22 SSD1322 board dashed · posts on the inside at 95 × 29 · seam dashed 1LC30 2PW-6 #1 3PW-6 #2 4AS-50R 5Douk 6BlueRigger empty empty ZP3trigger in SMA 9ZP3 10Arcam 11Yamaha 12Flex 13 14 15 RJ45trunk USB-B

The end panels sit inside the bezel edge to edge at 191 × 66 mm, so they can't be made smaller, and at that size a panel needs 181.7 mm square at 45°, more than the A1 Mini's 180 mm bed. Each is printed in two halves that butt together down the centre (each half reaches 0.75 mm past the centre line, which closed a 2 mm gap the first print left in the bezel), held in place by the bezel (and on the front by the display board, which spans the seam); both halves print flat together (≈95 × 142 mm). Corner holes Ø4.3 at 181.5 × 58.02 mm (Hammond: Ø4.19 through); on the front they are drawn 0.5 mm in from each side, after a fit check. Both are 2 mm against Hammond's 1.63 mm, so the stock corner screws still reach. Corners are rounded R4.5 to match the bezel. Both must be printed plastic: each jack's threaded bushing is its sleeve contact, so a metal panel would short every sleeve together and tie the ZP3 trigger's ground to the receiver's. Front: the screen window (78.5 × 22 mm, the edge of the black glass) is centred, with a 1 mm bevel on the outside; the SSD1322 sits on four Ø4 × 3 mm posts on the inside (95 × 29 mm apart, M2.5 × 5 button heads), its board 0.25 mm right of and 1.75 mm below the window's centre, so the glass rests against the panel. Rear, seen from behind: jacks (PJ-30920-D, Ø6.4) on 15 mm centres from 13 mm, rows 26 mm apart, so the seam falls midway between jacks 6/7 and 14/15; the ZP3 trigger continues the top row at the same pitch. The RJ45 cutout is 18 mm wide from 5.5 to 22 mm above the bottom edge: the jack's top measured 20 mm, plus room for another layer of foam tape. USB-B is the rectangular-cutout type used on the sender and selector. OpenSCAD: ryans-office/ir-link/panels/receiver_front_panel.scad and receiver_rear_panel.scad; the SSD1322 measurements are from 2026-10-11.

Rear panel construction

The rear panel is 2 mm PETG, flat: under the jacks' 4.5 mm M6 thread with room for the nut, so no pockets are needed. The two halves butt together at the seam, between jacks 6/7 and 14/15, and the bezel holds them in place; a tongue and groove was tried and dropped, because the tongue printed stringy and didn't seat.

Link frames

Binary, 115200 baud 8N1 on both links. The sender forwards the selector's frames unchanged. Defined once in a shared header, office-ir-link.h, with the port table as one struct array.

ByteField
0Sync, 0xA5
1Type: N (NEC), R (raw), or one of the display frames below (D, Q, W, S)
2Receiver jack, 1–15
NAddress (2 bytes), command (2 bytes), high byte first: ESPHome's 16-bit values, e.g. LC30 Amp A is FF 00 FD 02
RCarrier in kHz (1 byte), count (1 byte), then count × 2-byte durations in µs, alternating mark and space from a mark
DByte 2 is the field: 0 preamp, 1 amp, 2 rate/format, 3 volume, 4 channel number, 8 the MiniDSP Flex's volume in dB and 9 the speaker pair's number (the left panel; under the volume, "sub: -5.0" centred (the number monospaced), then "ch: 4" left and "sp: 1" right along the bottom), 5 speaker pair name, 6 BlueRigger input and 7 the switchers' positions (the right display). The selector sends them on every change, when the sender asks, and every 30 s; then text length (1 byte) and the text (UTF-8). The sender draws its panels and passes the frame on to the receiver, which draws its version of the left panel; it also re-sends the left panel's fields down the trunk every 10 s
QSender → selector on the patch's return pair: A5 'Q' and the CRC, sent at startup and every 5 s until text arrives. The selector answers with every D field
WSelector → sender: A5 'W' and the CRC, on a gear or OPT change and on the active path's knob. The sender turns the displays on and restarts their 5 min timeout
SSender → receiver: A5 'S', 1 (on) or 0 (off), and the CRC, when the sender's displays go on or off and every 10 s. The receiver's display follows
lastCRC-8 (polynomial 0x07, initial 0) over bytes 1 to n. An N frame is 8 bytes: A5 4E 01 FF 00 FD 02 8F

A selector NEC frame is 8 bytes and takes under 1 ms. A relayed raw NEC frame is about 140 bytes, about 12 ms, and goes out once the IR frame ends and 10 ms of silence confirms it. The rack emitter starts roughly 90 ms later than a directly wired emitter would.

Amp selector

Changes

Speaker-pair buttons and front panel layout

Inside the selector, top view to scale

Top view of the amp selector's Parts Express 320-482 interior: the RJ45 to the sender and USB-B along the rear panel on the left, the ESP32-S3 and breadboards in the middle, and the four channel buttons, the input rotary housing and the four speaker-pair buttons behind the front panel on the right. Rear panel: every cable Front panel: controls btn 1 btn 2 btn 3 btn 4 input spk 1 spk 2 spk 3 spk 4 RJ45to sender USB-B ESP32-S3 and breadboardsroom once the mux and IR jacks are gone inside ≈155 deep × 216 wide (197 usable between the corner posts) × 27 tall · top of drawing = right end seen from the front · mm

Parts Express 320-482, 224.8 × 39.9 × 165.1 mm outside; usable inside 197 × 27 × 149 mm per Parts Express. Behind the front panel: button nuts (Ø18.5 across corners) and the Ø26.19 rotary housing, which just fits the 27 mm height as today's input rotary does. Corner screw posts drawn at approximate positions; Parts Express's usable 197 mm is the width between them.

Selector end panels, to scale

Amp selector front panel with four LED channel buttons, the input rotary at the centre and four LED speaker-pair buttons; rear panel with the RJ45 to the sender, USB-B and the antenna. Front panel · 218 × 34.5 mm 1 2 3 4 input 1 2 3 4 channelsspeaker pairs Rear panel, seen from behind · 218 × 34.5 mm RJ45sender USB-B antenna

Flat 218 × 34.5 × 1.5 mm plates (hammond-enclosure-panels/plastic-white-black-enclosure/pla/). Front: Ø12.2 button holes at 16, 36, 56, 76 (channels) and 142, 162, 182, 202 mm (speaker pairs) with their Ø14 bezels dashed; a Ø9.80 rotary hole at 109 mm with the Ø18 Kaish knob dashed; no display. Rear: the five IR jacks and the legacy Ø22.5 RJ45 coupler are gone; the sender-link RJ45 takes the jacks' space; USB-B and antenna stay where the current panel has them. The enclosure is a Parts Express 320-482.

Build and cutover order

  1. Prove link mode on the bench. Flash one remote box with the mode firmware, switch it to link mode, and capture through a PC817 with remote_receiver dump: raw. Pulse widths within about 10% of the box's own. Include the Arcam box's RC-5 frames.
  2. Flash the mode firmware to all four boxes. They start in emitter mode, so nothing changes yet.
  3. Build the receiver and sender, flash over USB, test on the bench with spare emitters. Sender and selector done 2026-10-11: both flashed, the patch carries frames both ways with valid checksums for every channel, speaker-pair and rotary command, and the sender's inputs capture clean NEC envelopes. Receiver built 2026-10-14 (192.168.4.48, over Wi-Fi since the first USB flash): every jack (1–6, 9–12) fires its test frame, checked with an IR learner, and the display shows the ESP32's status rows. Link tested end to end on the bench the same day: the sender passes the selector's checked frames on to the trunk (77 relayed from a round of selector presses, plus its own test and Douk frames), and the receiver logged every one with no bad frames. Installed 2026-10-14: the receiver is at the racks with every emitter moved over, the selector's channel and speaker-pair buttons reach all six of its targets, and the four remote boxes run in link mode through the sender, which relays their timing as R frames to jacks 9–12. Still to test: the ZP3 box's volume knob.
  4. Run the trunk and the optical cable to the racks.
  5. Move one remote box at a time: switch it to link mode, plug it into its sender input, and move its emitter to its receiver port. Reverting a box is switching it back to emitter mode and plugging an emitter cable into its jack.
  6. Selector cutover in one session: rebuild its IR section, deploy the firmware, move the five infra emitters.
  7. Move the ZP3 trigger onto trunk pair 1.
  8. Update the cable map, brief and room notes.

Verification

  1. Trunk continuity on all 8 conductors. Trigger pair above 10 MΩ to every other conductor and to both boxes' grounds.
  2. Mode switch on each box: the 5 s hold switches mode without sending power, the blinks match, and the mode survives a power cycle.
  3. Every jack 20 times from cold, 100% response.
  4. Arcam: standby toggle 10 times, and two identical presses in a row both register (the RC-5 toggle bit survives the relay).
  5. PW-6 pair: fire #1's A1 and #2 doesn't move; then the reverse.
  6. Press a gear button while turning the ZP3 knob. Every command lands.
  7. Turn the desk box knob fast on each path. Every step lands, with no oversized-frame errors in the sender's log.
  8. Fire each remote box and confirm only its own sender input relays (checks the wiring).
  9. Power-cycle the ZP3: binary_sensor.fosi_zp3_remote_12v_trigger follows both edges with no chatter.
  10. Hum check on every audio path against today.
  11. Revert test: one remote box switched to emitter mode on an emitter cable works with no other change.

Later, separately

Parts list

Jumper wires assumed on hand.

#ItemQtyForNotesHave?
1ESP32-WROOM-32U DevKitC V4, 38-pin, with antenna2receiver, senderAmazon or Elecbee boardshave
238-pin DevKitC screw-terminal expansion board2not used: both ESP32s straddle two breadboardsorderedordered
3Full-size breadboard1receiverhave
4Half-size breadboard2sender, side by side under the ESP32have
5Hammond 1455U2201 enclosure1receiverend panels 3D-printedhave
6Parts Express 320-482 desktop case1senderthe second one on hand; same case as the selector, no longer soldhave
774HC4051, DIP-161receiverhave
8120 Ω ¼ W resistor6receiver jacks 1–6or reuse the selector's fivehave
9100 Ω ¼ W resistor4receiver jacks 9–12have
10PC817 optocoupler, DIP-44 + 4 sparesender inputshave
11150 Ω ¼ W resistor4sender inputs, LED sidehave
124.7 kΩ ¼ W resistor4sender input pull-upsplus a few 1 kΩ in case faster switching is neededhave
133.5 mm panel jack with leads18receiver 12 + trigger; sender 4 + triggerLsgoodcare PJ-30920-D (M6 × 0.5), on hand. Stereo: a mono plug uses tip and sleeve, so the ring lead stays unconnected; confirm which lead is tip with a meterhave
143.5 mm mono male–male cable, 1–2 ft64 boxes → sender; ZP3 trigger at both endshave
15IR emitter cable, 3.5 mm mono, 1.5–3 m10receiver → gearhave
166N137 optocoupler, DIP-81 + sparesreceiver RS-485 inputkeeps the receiver isolated; PC817s are too slow for 115200 baudhave
17220 Ω and 1 kΩ resistors, 0.1 µF capacitor1 eachreceiver 6N137 stage0.1 µF: ceramic marked "104", 50 V X7R, 2.54 mm leadshave
18Littelfuse RXEF005 resettable fuse (PTC)1 + 1 sparesender, in series with the +3.3 V feed to trunk pin 350 mA hold, radial leadshave
19C&K A10405RNCQ rotary switch3desk box's planned second switch; sparessame part as the existing input rotaryordered
20Kaish Ø18 mm knob, ¼″ set screw1+amp selector input rotaryØ15 × 3 mm recess under the knobordered
21SH1122 2.08″ 256 × 64 OLED (SPI)2sender front panelthe selector's own OLED is droppedhave
22FILN 12 mm LED button6selector: speaker-pair buttons (4); sender: screens and Douk (2)same as the four channel buttons; green or blue LEDs; 470 Ω eachhave
23TTL ↔ RS-485 module, 3.3 V (MAX3485)2sender, receiverMAX3485ESA module marked "RS485 V2.05": EN in place of DE and /RE (high at the sender, low at the receiver); TXD is RO and RXD is DI on this board. Not MAX485: its 5 V output isn't safe for the ESP32have
24RJ45 8-pin screw-terminal breakout4receiver 1, sender 2, selector 1board-mounted RJ45 jack with 8 screw terminals and a 2.54 mm header row; the jack pokes through the panel, so no coupler or internal patchhave (8)
25Ultra-slim Cat6 UTP patch cable, 25 ft1 + 1 sparetrunk2.8 mm OD, 32 AWG stranded, 4 twisted pairs, T568B straight throughordered
26Cat6 patch, 1–3 ft1selector → senderhave
27USB-B panel pigtail2receiver, senderhave
28USB power brick, 5 V, ≥1 A2receiver, senderhave
29SMA bulkhead pigtail (U.FL) + antenna2receiver, senderoften included with the 32Uhave
30M3 nylon standoffs and screwskitexpansion boardsor double-sided tape on a printed base platehave
313D-printed end panels4receiver 2, sender 2PETG; receiver rear panel ribbed (see Rear panel construction)have (PETG)
32SSD1322 3.12″ 256 × 64 OLED1receiver front panelshipped set for 8-bit parallel; driven by the Nano Everyhave
33Arduino Nano Every1receiver display driverU8g2, 8080 parallelhave
34TXS0108E 8-channel level shifter module, headers fitted2 (pack of 3)receiver: Nano 5 V → display 3.3 VHW-221 boardhave (3)
35M2.5 × 5 button-head screws4SSD1322 onto the receiver front panel's posts1.6 board + ≈3.4 into the post; 6 mm bottoms outhave