Replacement Board Design
Design notes for a single board replacing both the original I/O board and the ISA card. The cabinet harness plugs in unmodified, using the same connector types and pinouts; the host connects over USB as a composite HID device.
This is a draft. No schematic, layout or firmware exists. It is recorded here so the work can be picked up. The Arduino bridge remains the working path and can stay in service throughout development, so the cabinet does not need to come down.
Core: a Raspberry Pi Pico soldered flat via its castellated pads. This gives a USB connector, a 3.3 V regulator and hand-solderable assembly for free. A bare RP2040 can replace it later for a slimmer board.
Signal inventory
| Group | Count | Path |
|---|---|---|
| Switch inputs | 21 | 3× 74HC165 chain, 24 bits with 3 spare |
| Encoder inputs | 4 | Direct GPIO into PIO quadrature |
| Lamp outputs | 24 | 4× 74HC595 into 4× ULN2803A |
Switch inputs are B1–B10, both Starts, four Effectors, both Pedals, Test, Service and Coin. Lamp outputs are the same set plus both turntable lamps, the neon channel, the mechanical coin counter and four generic cabinet lamps.
Power
- J12, 4-pin, same type as the original:
+5V,GND,GND,+12Vfrom the cabinet PSU. - +12 V feeds the
ULN2803COM pins and the lamp common pin on every harness connector, through a 2 A polyfuse. Bulk capacitor 100 µF 25 V. - +5 V from the cabinet supplies the turntable encoders only. It is not used for logic.
- The Pico is powered from USB. The logic rail is its 3V3 output; three
74HC165and four74HC595draw a few milliamps, well inside the regulator budget. - Grounds — cabinet ground and USB ground joined at a single star point near the Pico.
- 100 nF decoupling at every logic IC.
Input chain
Three 74HC165 on SPI0 RX. Each input line is pulled up to 3V3 through 10 kΩ
(bussed resistor networks) and RC filtered — 100 Ω series with 10 nF to
ground. The capacitors can be left unpopulated and debouncing done in
firmware. Switches short the line to ground, so inputs are active-low.
Chain U1.QH to U2.SER, U2.QH to U3.SER, U3.QH to the Pico's MISO.
Clock is shared with SCK, SH//LD is driven by /PL, and CLK INH is tied
to ground.
Bit assignment mirrors the original read ports so the firmware mapping can be copied directly:
| Byte | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
|---|---|---|---|---|---|---|---|---|
| 0 | TEST | SERVICE | E4 | E3 | E2 | E1 | P2 START | P1 START |
| 1 | P1 PEDAL | COIN | spare | B5 | B4 | B3 | B2 | B1 |
| 2 | P2 PEDAL | spare | spare | B10 | B9 | B8 | B7 | B6 |
Output chain
Four 74HC595 into four ULN2803A. Chain the Pico's MOSI to U4.SER, then
QH' of each device to SER of the next. SRCLK is shared with SCK, RCLK
is on GP6, and /SRCLR is tied to 3V3.
/OE is on GP7 with a 10 kΩ pull-up to 3V3, so the lamps stay dark until
firmware drives it low. Hold it high until USB is configured to avoid a lamp
flash at boot.
Each 595 output drives one ULN2803 input 1:1, and each ULN2803 output
sinks one lamp cathode on the harness. ULN2803 COM, pin 10, must go to
+12 V — it clamps the flyback from the coin counter solenoid and the neon
relay coil.
Four devices rather than three, so that the bytes map exactly onto the
original write ports 0x100–0x103:
| Byte | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
|---|---|---|---|---|---|---|---|---|
| 0 | spare | spare | spare | NEON | LAMP3 | LAMP2 | LAMP1 | COIN CTR |
| 1 | spare | spare | E4 | E3 | E2 | E1 | P2 START | P1 START |
| 2 | spare | spare | P1 TT | B5 | B4 | B3 | B2 | B1 |
| 3 | spare | spare | P2 TT | B10 | B9 | B8 | B7 | B6 |
Encoders
TT1A, TT1B, TT2A, TT2B on GP8–GP11. Keeping them consecutive allows
one PIO state machine per player.
Encoder power comes from the cabinet +5 V, with ground to the star point.
RP2040 GPIO is not 5 V tolerant. Each signal line needs a 10 kΩ pull-up to 3V3, which is sufficient for open-collector encoders, plus a divider footprint — 2.2 kΩ top, 3.3 kΩ bottom — in case the encoders turn out to be push-pull 5 V. Scope them and populate one option or the other.
Firmware counts edges in PIO and wraps to an unsigned 8-bit absolute position, matching what the game and 2EZConfig expect, and also exposes it as an HID axis.
Pico pin map
| GP | Function |
|---|---|
| GP2 | SPI0 SCK, shared by the 165 and 595 chains |
| GP3 | SPI0 TX to the 595 chain |
| GP4 | SPI0 RX from the 165 chain |
| GP5 | /PL, 165 load |
| GP6 | RCLK, 595 latch |
| GP7 | /OE, 595, pulled up |
| GP8–GP11 | TT1A, TT1B, TT2A, TT2B |
| GP16 | WS2812 header, optional addressable lighting |
| GP17, GP18 | Spare header, I²C or UART |
Scan loop: assert /PL, run one duplex SPI transfer reading the 165 chain
while writing the 595 chain, then pulse RCLK. At 1 MHz SPI this is roughly
30 µs for a full scan, leaving ample margin for a 1 kHz poll rate.
Connectors
Clone the original footprints. Board-side mates for Molex 5051 housings are Molex 5045 vertical or 5046 right-angle wafers at 2.5 mm pitch; choose orientation to suit your cabinet's cable dressing.
| Ref | Type | Function |
|---|---|---|
| J2 | Molex 5045-05A | Test, Service, coin counter |
| J3, J4 | Molex 5045-08A | Start 1/2 and Effectors 1–4 |
| J5 | Molex 5045-02A | P1 pedal |
| J6, J9 | Molex 5045-08A | Turntables — supply, quadrature, lamp |
| J7 | Molex 5045-12A | P1 buttons |
| J8 | Molex 5045-03A | P2 pedal, keyed |
| J10 | Molex 5045-14A | P2 buttons |
| J11 | 2×10 IDC | Neon and light controller, 330 Ω series lines |
| J12 | Molex SPOX 5281-04A | Power |
| J13 | Molex 5045-02A | Coin switch |
| J-LED | JST 3-pin | Optional WS2812: 5 V, GP16, GND |
Per-pin assignments are in connector-pinout.md.
Transcribing them into the KiCad project is the first design task.
WS2812 data expects 5 V logic. A 74AHCT1G125 handles the level shift, or a
spare ULN2803 channel with a pull-up.
Bill of materials
Excluding the PCB.
| Qty | Part | Note |
|---|---|---|
| 1 | Raspberry Pi Pico | Castellated, soldered flat |
| 3 | 74HC165, SOIC-16 |
Input shift |
| 4 | 74HC595, SOIC-16 |
Output shift |
| 4 | ULN2803A, SOIC-18 or DIP-18 |
Lamp, relay and counter sinks |
| 6 | 10 kΩ bussed resistor network | Input pull-ups |
| 24 | 100 Ω 0603 and 10 nF 0603 | Input RC, optional |
| 4 | 10 kΩ, plus 2.2 kΩ / 3.3 kΩ divider pairs | Encoder inputs |
| 1 | 2 A polyfuse | +12 V |
| 1 | 100 µF 25 V electrolytic, 10× 100 nF 0603 | Bulk and decoupling |
| — | Molex 5045 or 5046 wafers per the table | Harness |
| 1 | Molex SPOX 5281-04A | Power |
| 1 | 74AHCT1G125 |
Optional, WS2812 level shift |
| 1 | 5-pin header | Spare GPIO and debug; SWD pads are on the Pico |
Firmware outline
- TinyUSB composite HID: gamepad input report with 24 buttons and 2 absolute axes; output report carrying the lamp bitmap.
- Two PIO quadrature state machines producing 8-bit absolute positions.
- 1 kHz scan loop: duplex SPI reading switches and writing lamps, firmware debounce by 2-of-3 sample majority, then HID report update.
- Hold
/OEhigh until USB is configured. - Optional: a CDC or vendor channel answering reads and writes against the
original
0x100–0x106semantics, so software written for the original port map runs unchanged.
Much of this ports directly from the Arduino bridge. The USB layer, report descriptor, coin handling and test routines carry over; only the bus read and write functions are replaced by the shift-register scan and PIO counter reads.
This page is synced from docs/replacement-board.md in the ez2-io repo.