Six physical CPU boards across three USB-serial chains. The two Cobra boards share one physical PCB (two STM32 modules) but count as independent CPUs/chains for wiring purposes — a hardware autofire rule cannot cross between them, or onto the PSOC chain. This machine is being rewired from scratch, board assignment follows a fixed priority: CobraPin first (chain 0, then chain 1), the red PSOC boards (chain 2) only as a fallback when CobraPin can't fit something, and every LED goes on CobraPin, no exceptions. See docs/opp-hardware-reference.md for the full rulebook this page is built from. Counts below are real, derived from hardware-switches.yaml/-coils.yaml/-leds.yaml — remaining free capacity per board isn't tracked as structured data anywhere in this repo, so it isn't shown here (see board Overviews.xlsx or physical inspection for that).
| Board | Port | Role | Switches in use | Coils in use | Reserved | LEDs in use |
|---|---|---|---|---|---|---|
| Chain 0 / Board 0x20 (CobraPin) | COM4 | cobrapin-switches-coils-leds | 8 | 7 | 4 | 40 |
| Chain 1 / Board 0x20 (CobraPin) | COM5 | cobrapin-switches-coils-leds | 0 | 0 | 0 | 0 |
| Chain 2 / Board 0x20 (PSOC card 0) | COM6 | psoc-switches-coils | 12 | 0 | 0 | 0 |
| Chain 2 / Board 0x21 (PSOC card 1) | COM6 | psoc-switches-coils | 0 | 0 | 0 | 0 |
| Chain 2 / Board 0x22 (PSOC card 2, incl. incandescent card) | COM6 | psoc-switches-coils-incand | 0 | 0 | 0 | 0 |
| Chain 2 / Board 0x23 (PSOC card 3) | COM6 | psoc-switches-coils | 0 | 0 | 0 | 0 |
The 3 solenoid banks (A/B/C, 8 outputs each) each have their own fused HV supply pin (HV_A/HV_B/HV_C on connector J13) — a coil's +50V lead must come from the HV pin matching its own bank, never a generic shared bus. Full detail and sources in docs/opp-hardware-reference.md.
| Bank | Chain 0/1 pins | HV feed | Wire color |
|---|---|---|---|
| A | 0-0-0, 0-0-8…0-0-14 | HV_A | brown — includes flipper coils 0-0-8/0-0-9, slings 0-0-0/0-0-12, ball saver 0-0-13 |
| B | 0-0-1…0-0-7, 0-0-15 | HV_B | teal |
| C | 1-0-0…1-0-7 | HV_C | purple |
tools/wiring_test.py automates the switch-continuity + coil-LED half of this check (see the repo README) — used first for the flippers, 2026-09-06.
Chain 2's 4 PSOC boards follow a different, tighter rule than CobraPin — used here only as the fallback when CobraPin can't fit a component (per section 01's priority). Full detail in docs/opp-hardware-reference.md.
Generated from tools/hw_console/data/components.yaml — update that file first (or the hw_console web UI) if anything changes, then re-run the generator, never edit this table by hand. One row per switch/coil pin; Component and Status show only on a group's first row. Pin Silk Screen is blank when not yet confirmed against a real board/photo (see docs/board-silkscreen-reference.md); Other Pin is GND for every switch, or a CobraPin coil's HV bank feed — blank for a red-board coil, since none is wired yet.
| Component | Switches & Coils | Type | Board | Pin Silk Screen | Other Pin | MPF | Status |
|---|---|---|---|---|---|---|---|
| Sling left (autofire) | s-sling-left | Switch | chain0-0x20 | 0-0-19 | GND | 0-0-19 | wired 10/11 · next: Tested in game |
| c-sling-left | Coil | chain0-0x20 | 0-0-12 | HV-A | 0-0-12 | ||
| Sling right (autofire) | s-sling-right | Switch | chain0-0x20 | 0-0-25 | GND | 0-0-25 | wired 10/11 · next: Tested in game |
| c-sling-right | Coil | chain0-0x20 | 0-0-0 | HV-A | 0-0-0 | ||
| Ball saver post (between the flippers) | s-ball-saver | Switch | chain0-0x20 | 0-0-24 | GND | 0-0-24 | wired 7/11 · next: Lights fitted |
| c-ball-saver | Coil | chain0-0x20 | 0-0-13 | HV-A | 0-0-13 | ||
| Kickback ball saver (leftmost bottom lane) | c-kickback | Coil | — | — | planned 4/11 · next: On playfield | ||
| Pop bumper 1 (autofire) | s-popbumper-1 | Switch | — | — | planned 4/11 · next: Wires & plug | ||
| c-popbumper-1 | Coil | — | — | ||||
| Pop bumper 2 (autofire) | s-popbumper-2 | Switch | — | — | planned 4/11 · next: Wires & plug | ||
| c-popbumper-2 | Coil | — | — | ||||
| Pop bumper 3 (autofire) | s-popbumper-3 | Switch | — | — | planned 4/11 · next: Wires & plug | ||
| c-popbumper-3 | Coil | — | — | ||||
| Plunger lane / auto-launch | s-plunger-lane | Switch | chain0-0x20 | 0-0-26 | GND | 0-0-26 | wired 10/11 · next: Tested in game |
| c-plunger | Coil | chain0-0x20 | 0-0-10 | HV-A | 0-0-10 | ||
| Launch-lane diverter (ball dropper feeder, idea) | c-launch-diverter | Coil | — | — | planned 2/11 · next: Obtained | ||
| Ball trough | s-trough1 | Switch | chain2-0x20 | 3.1 | GND | 2-0-22 | planned 7/11 · next: Wires & plug |
| s-trough2 | Switch | chain2-0x20 | 3.7 | GND | 2-0-16 | ||
| s-trough3 | Switch | chain2-0x20 | 3.6 | GND | 2-0-17 | ||
| s-trough4 | Switch | chain2-0x20 | 3.5 | GND | 2-0-18 | ||
| s-trough5 | Switch | chain2-0x20 | 3.4 | GND | 2-0-19 | ||
| s-trough6 | Switch | chain2-0x20 | 3.3 | GND | 2-0-20 | ||
| s-trough-jam | Switch | chain2-0x20 | 3.2 | GND | 2-0-21 | ||
| c-trough-eject | Coil | chain0-0x20 | 0-0-11 | HV-A | 0-0-11 | ||
| Start button (cabinet) | s-start | Switch | chain0-0x20 | 0-0-27 | GND | 0-0-27 | wired 10/11 · next: Tested in game |
| Launch button (cabinet) | s-launch | Switch | chain0-0x20 | 0-0-3 | GND | 0-0-3 | wired 10/11 · next: Tested in game |
| Era select button (cabinet, next to Start) | s-era-select | Switch | — | — | planned 1/11 · next: Obtained | ||
| Co-op button (cabinet, idea) | s-coop | Switch | — | — | planned 1/11 · next: Obtained | ||
| Drop target bank (3) - exit turret | s-drop1 | Switch | — | — | planned 6/11 · next: On playfield | ||
| s-drop2 | Switch | — | — | ||||
| s-drop3 | Switch | — | — | ||||
| c-drop | Coil | — | — | ||||
| Exit ball lock (behind the turret drop bank) | s-exit-success | Switch | — | — | planned 3/11 · next: Restored & cleaned | ||
| Knock-down coil on a turret-bank target (idea) | c-drop-knockdown | Coil | — | — | planned 2/11 · next: Obtained | ||
| Single drop target | s-drop-single | Switch | — | — | planned 6/11 · next: On playfield | ||
| c-drop-single | Coil | — | — | ||||
| Top lane 1 | s-toplane1 | Switch | — | — | planned 7/11 · next: Wired to controls | ||
| Top lane 2 | s-toplane2 | Switch | — | — | planned 7/11 · next: Wired to controls | ||
| Top lane 3 | s-toplane3 | Switch | — | — | planned 7/11 · next: Wired to controls | ||
| Bottom lane 1 (right outlane) | s-bottomlane1 | Switch | chain2-0x20 | 2.4 | GND | 2-0-27 | wired 10/11 · next: Tested in game |
| Bottom lane 2 (right inlane) | s-bottomlane2 | Switch | chain2-0x20 | 2.3 | GND | 2-0-28 | wired 10/11 · next: Tested in game |
| Bottom lane 3 (left inlane) | s-bottomlane3 | Switch | chain2-0x20 | 2.0 | GND | 2-0-31 | wired 10/11 · next: Tested in game |
| Bottom lane 4 (left outlane) | s-bottomlane4 | Switch | chain2-0x20 | 2.1 | GND | 2-0-30 | wired 10/11 · next: Tested in game |
| Big rollover button (playfield) | s-button | Switch | chain2-0x20 | 2.2 | GND | 2-0-29 | wired 9/11 · next: Lights fitted |
| Orbit left | s-orbit-l | Switch | — | — | planned 5/11 · next: On playfield | ||
| Orbit right | s-orbit-r | Switch | — | — | planned 5/11 · next: On playfield | ||
| Spinner (just after the left orbit entry) | s-spin1 | Switch | — | — | planned 5/11 · next: On playfield | ||
| Pop-up post (top of orbit) | c-up1 | Coil | — | — | planned 6/11 · next: Wired to controls | ||
| Pop-up post (powered up, PWM hold) | c-up2 | Coil | — | — | planned 5/11 · next: On playfield | ||
| Pull-down post between the pop bumpers (Orange Portal pre-load) | s-up3 | Switch | — | — | planned 4/11 · next: On playfield | ||
| c-up3-drop | Coil | — | — | ||||
| c-up3-hold | Coil | — | — | ||||
| VUK1 ball lock (vertical upkicker) | s-vuk1 | Switch | — | — | planned 3/11 · next: Wires & plug | ||
| c-vuk1 | Coil | — | — | ||||
| VUK2 ball lock (vertical upkicker) | s-vuk2 | Switch | — | — | planned 4/11 · next: On playfield | ||
| c-vuk2 | Coil | — | — | ||||
| VUK3 ball lock (vertical upkicker) | s-vuk3 | Switch | — | — | planned 4/11 · next: On playfield | ||
| c-vuk3 | Coil | — | — | ||||
| VUK4 ball lock (vertical upkicker) | s-vuk4 | Switch | — | — | planned 3/11 · next: Wires & plug | ||
| c-vuk4 | Coil | — | — | ||||
| VUK5 ball lock (vertical upkicker) | c-vuk5 | Coil | — | — | planned 4/11 · next: On playfield | ||
| VUK7 ball lock (vertical upkicker) | c-vuk7 | Coil | — | — | planned 2/11 · next: Restored & cleaned | ||
| VUK8 ball lock (vertical upkicker) | c-vuk8 | Coil | — | — | planned 2/11 · next: Restored & cleaned | ||
| Drop-down post (powered down, PWM hold) | c-up4 | Coil | — | — | planned 3/11 · next: Restored & cleaned | ||
| Incinerator ball lock (to be built) | s-insinerator | Switch | — | — | planned 2/11 · next: Obtained | ||
| Pull-down coil (spare mechanism) | c-pulldown | Coil | — | — | planned 2/11 · next: Restored & cleaned | ||
| Standup target 1 | s-target1 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 2 | s-target2 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 3 | s-target3 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 4 | s-target4 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 5 | s-target5 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 6 | s-target6 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Standup target 7 | s-target7 | Switch | — | — | planned 5/11 · next: Wires & plug | ||
| Left ramp opto - just before the top | s-ramp-l1 | Switch | — | — | planned 2/11 · next: Restored & cleaned | ||
| Left ramp opto - just after the top | s-ramp-l2 | Switch | — | — | planned 2/11 · next: Restored & cleaned | ||
| Right ramp - top room entry opto (just before the top) | s-ramp-r1 | Switch | — | — | planned 2/11 · next: Restored & cleaned | ||
| Right ramp - top room exit opto (just past the top) | s-ramp-r2 | Switch | — | — | planned 2/11 · next: Restored & cleaned | ||
| Diverter (to the ball dropper) | c-ramp-diverter | Coil | — | — | planned 7/11 · next: Wired to controls | ||
| VUK6 ball lock (upkicker into the box) | s-vuk6 | Switch | — | — | planned 7/11 · next: Wired to controls | ||
| c-vuk6 | Coil | — | — | ||||
| Aerial Faith Plate launcher - ball switch | s-aerial | Switch | — | — | planned 3/11 · next: Restored & cleaned | ||
| Pedestal button target (Faith Plate platform) | s-pedestal | Switch | — | — | planned 2/11 · next: Obtained | ||
| Left flipper | s-flipper-left | Switch | chain0-0x20 | 0-0-1 | GND | 0-0-1 | wired 10/11 · next: Tested in game |
| c-flipper-left | Coil | chain0-0x20 | 0-0-8 | HV-A | 0-0-8 | ||
| Right flipper | s-flipper-right | Switch | chain0-0x20 | 0-0-2 | GND | 0-0-2 | wired 10/11 · next: Tested in game |
| c-flipper-right | Coil | chain0-0x20 | 0-0-9 | HV-A | 0-0-9 | ||
| Mid flipper (next to the pop bumpers) | c-flipper-mid | Coil | — | — | planned 4/11 · next: On playfield | ||
| Service button - Enter | sw_service_enter | Switch | — | — | planned 2/11 · next: Obtained | ||
| Service button - Escape | sw_service_esc | Switch | — | — | planned 2/11 · next: Obtained | ||
| Service button - Up (+) | sw_service_up | Switch | — | — | planned 2/11 · next: Obtained | ||
| Service button - Down (-) | sw_service_down | Switch | — | — | planned 2/11 · next: Obtained | ||
| Playfield magnet (idea) | s-magnet | Switch | — | — | planned 2/11 · next: Obtained | ||
| c-magnet | Coil | — | — | ||||
| Shaker motor (idea) | c-shaker | Coil | — | — | planned 2/11 · next: Obtained | ||
| Tilt plumb bob (idea) | s-tilt | Switch | — | — | planned 2/11 · next: Obtained | ||
| Slam tilt switch (idea) | s-slam-tilt | Switch | — | — | planned 2/11 · next: Obtained | ||
| Hidden ball sensor in a side panel (idea) | s-hidden-side | Switch | — | — | planned 1/11 · next: Obtained | ||
| Ideas only - not in the story, the review or the build yet | |||||||
| 2nd launch-lane diverter (portal feeder, idea) | c-launch-diverter-2 | Coil | — | — | planned 1/11 · next: Obtained | ||
| Diverter at the top of the orbit (portal loader, idea) | c-orbit-diverter | Coil | — | — | planned 1/11 · next: Obtained | ||
| High post at the Excursion Funnel's exit (idea) | c-funnel-post | Coil | — | — | planned 1/11 · next: Obtained | ||
| Moving-panel ramp (idea) | c-panel-ramp-post | Coil | — | — | planned 0/11 · next: Obtained | ||
Decision: route the flipper switch + coil through Cobra chain 0 (chain0-0x20, port COM4) instead of the PSOC chain. CobraPin's own documentation says timing-critical devices (flippers, slings, pop bumpers) should have their switch and coil on the same physical STM32 board, so the hardware autofire rule runs with minimal latency and doesn't need to cross a board boundary. Chain 0 has plenty of free capacity and already anchors most of the game's LEDs, so it's the natural home. Coil numbers (0-0-8/0-0-9) and switch numbers (0-0-1/0-0-2) are both the actual pins used for real physical wiring (2026-09-06, confirmed while wiring); bank/HV feed from section 02's reference table.
| Device | Old (PSOC, unused) | New (Cobra chain 0) | Connector |
|---|---|---|---|
| c-flipper-left | 2-1-0 | 0-0-8 | Coil bank (pins 0-0-8/9/10/11) |
| c-flipper-right | 2-1-1 | 0-0-9 | same bank, adjacent pin |
| s-flipper-left | 2-1-0 | 0-0-1 | Switch input header, chain 0 |
| s-flipper-right | 2-1-1 | 0-0-2 | same header, adjacent pin |
Visual/mechanical pass with the machine unplugged. Catches the cheap failures before anything gets energized.
Run (no ) from — this is the real platform, not . Compare the scan MPF prints against the pasted reference in (lines 12–44).
Every switch wired to a controller, generated from the registry (components.yaml). Use Service Mode → Switch Test (or trip each by hand) and confirm it registers cleanly with no double-bounce. Note anything intermittent. Per-switch test history lives in hardware-switches.yaml's comments and CHANGES.md.
Fire each from Service Mode → Coil Test. Watch the actual mechanism move, not just the console log — and record pulse strength if it looks over/under-powered relative to (in hardware-coils.yaml, with each coil's test history). Generated from the registry: every coil wired to a controller.
Chain 0 (COM4), 40 addresses , all . Run a full-chain color sweep (or Service Mode's light test) and walk the playfield.
Parts in the registry whose switches and coils aren't wired to a controller yet: they live in hardware-draft.yaml on MPF's virtual platform, with no number (docs/wiring-workflow.md, "Parts not wired yet"). Wire one with the wire-component skill, which picks its number by the priority policy in sections 01-03. Generated from the registry.
Not a wiring gap — there is no tilt switch installed anywhere on the machine yet.
Once the sections above pass, run a real end-to-end game.