Every connection, given as the actual perfboard hole (column letter + row number, matching the printed grid on your board) — not an abstract header-pin number. Read a grid ref, find that hole, solder. Click any grid ref to light up every other mention of that same hole.
0/107
Power (+5V / +3V3) — red kit wireGround — blue kit wireI²C bus (SCL / SDA / IRQ) — yellow kit wireSignal (per-pin GPIO) — white / orange / green kit wire
Using the jumper wire kit
You're wiring this with a pre-formed solid-core jumper kit (the boxed assortment of red/yellow/white/orange/green/blue wires, fixed pre-cut lengths, ends bent square) — the standard kit sold for solderless breadboards. That matters for a few reasons specific to this board:
These wires are made for solderless boards — this perfboard isn't one. The bent tip is shaped to grip a breadboard's spring clip, not to make a reliable joint on its own. It will friction-fit into a perfboard hole and feel "connected," but it isn't electrically sound until soldered. Treat every insertion as a dry-fit, not a finished connection:
Push the wire's tip through the two holes the guide calls out (component-side/top of the board), and check the fit against the grid ref before committing.
Flip the board to the copper/solder side and solder both tips to their pads. A perfboard pad is just a ring of copper around the hole — feed a little solder onto the joint so it wets the ring, not just the wire.
Clip the excess tip flush once the joint has cooled.
The kit's lengths are fixed — the "rail" runs below are not. A shared bus row (GND/+3V3/+5V/SCL/SDA, see Shared bus rails below) usually spans more holes than any single wire in the kit. Two options, both fine:
Pick the longest wire that reaches and let it bow slightly between holes — solid core holds its shape, it won't spring back.
Daisy-chain shorter wires hole-to-hole along the row: at every intermediate hole, both the incoming and outgoing wire tips land in the same hole and both get soldered there together with the pad. Don't skip soldering an intermediate joint just because the wire "looks continuous" — each hole is a separate solder joint, there's no copper trace linking adjacent holes on bare perfboard.
The solder checklist already lists each rail hop separately, with its length in millimetres, so you can match a hop to a wire in the box before cutting anything.
Colour convention (matches the legend above, the kit's actual colours, and the 3D-modelled wires on the board): red for every +5V/+3V3 connection, blue for every GND connection (the kit has no black — blue is the closest "stay off the power colours" choice and reads unambiguously once you commit to it), yellow for the SCL/SDA/IRQ bus, and white/orange/green for the remaining signal wires. Each signal net gets one fixed colour, so the same wire is the same colour everywhere it appears — on this page, on the diagram, and in the 3D render. The checklist's colour column is the authority.
Test before you solder the far end. The small compartment of premade spade/hook-tipped leads in the kit box is handy for exactly this: clip one onto a wire you've already soldered at one end and touch the other lead to the destination pad with a multimeter in continuity mode, confirming against the grid ref, before soldering the second end permanently.
Back-side wiring diagram
The board seen from the solder side (mirrored), with every jumper drawn where it actually runs on the finished board. Wires that cross are drawn in physical over/under order.
power (+5V / +3V3)groundI²C bus (SCL / SDA / IRQ)signal — whitesignal — orangesignal — green
The Teensy header sockets aren't outlined (48 near-parallel verticals would crowd the top of the diagram) — every net still ends at its correct header column. Signal colours are per net, not per connector group, so two adjacent wires can share a colour; cross-check the net name in the tables below.
Teensy header pinout
The two 24-pin sockets the Teensy drops into, drawn left to right as they sit on the board. Each cell shows the socket pin number, the perfboard hole under it, the Teensy net, and what this build wires to it. Greyed cells are unused — free for later expansion.
Header A — board row 23 (upper socket)
pin 1 at the left edge — the Teensy's USB end
1B23GNDrail
2A23D0B1.2
3Z23D1B2.2
4Y23D2S1.6
5X23D3S2.6
6W23D4B3.2
7V23D5R1.2
8U23D6CB2.1
9T23D7S3.6
10S23D8B4.2
11R23D9B8.2
12Q23D10NP1.4
13P23D11NP1.8
14O23D12S4.6
15N23+3V3rail
16M23D24NP1.7
17L23D25NP1.6
18K23D26B7.2
19J23D27S5.6
20I23D28NP1.5
21H23D29R5.2
22G23D30B6.2
23F23D31S6.6
24E23D32B5.2
Header B — board row 29 (lower socket)
pin 1 at the left edge — the Teensy's USB end
1B29+5Vrail
2A29GNDrail
3Z29+3V3rail
4Y29D23CB1.1
5X29D22J1.1
6W29D21J1.2
7V29D20J1.3
8U29D19—
9T29D18—
10S29D17R2.2
11R29D16J1.4
12Q29D15R3.2
13P29D14CB3.1
14O29D13R4.2
15N29GNDrail
16M29D41J2.4
17L29D40J2.3
18K29D39J2.2
19J29D38CB4.1
20I29D37J2.1
21H29D36NP1.3
22G29D35NP1.2
23F29D34CB5.1
24E29D33NP1.1
Shared bus rails
Five nets touch many holes each. Run each as one continuous chain past every hole listed, in the order listed (that's board order, top to bottom), rather than home-running each connector back to the header separately.
Five male 2.54mm header pins in the last column past S6 (column A — the letter sequence wraps back to A at the board's right edge), tapping the same rails S1–S6 share. Clip a jumper or scope hook straight onto a pin instead of back-probing a live JST connector.
TP2 · SCL
A07
TP1 · SDA
A08
TP5 · +5V
A09
TP4 · +3V3
A10
TP3 · GND
A11
Connectors
S1–S6 — haptic drivers (I²C)
Rotated vertical, one per column, centred on the board. GND/+3V3/+5V/SDA/SCL all fall on the same row across all six — a horizontal bus wire along that row reaches every connector. Only pin 6 (IRQ) is unique per connector.
S1JST-XH-6 · col D
1
D11
GND
GND rail
2
D10
+3V3
+3V3 rail
3
D09
+5V
+5V rail
4
D08
SDA
SDA rail
5
D07
SCL
SCL rail
6
D06
IRQ1
D2 → Y23
S2JST-XH-6 · col Y
1
Y11
GND
GND rail
2
Y10
+3V3
+3V3 rail
3
Y09
+5V
+5V rail
4
Y08
SDA
SDA rail
5
Y07
SCL
SCL rail
6
Y06
IRQ2
D3 → X23
S3JST-XH-6 · col T
1
T11
GND
GND rail
2
T10
+3V3
+3V3 rail
3
T09
+5V
+5V rail
4
T08
SDA
SDA rail
5
T07
SCL
SCL rail
6
T06
IRQ3
D7 → T23
S4JST-XH-6 · col O
1
O11
GND
GND rail
2
O10
+3V3
+3V3 rail
3
O09
+5V
+5V rail
4
O08
SDA
SDA rail
5
O07
SCL
SCL rail
6
O06
IRQ4
D12 → O23
S5JST-XH-6 · col J
1
J11
GND
GND rail
2
J10
+3V3
+3V3 rail
3
J09
+5V
+5V rail
4
J08
SDA
SDA rail
5
J07
SCL
SCL rail
6
J06
IRQ5
D27 → J23
S6JST-XH-6 · col E
1
E11
GND
GND rail
2
E10
+3V3
+3V3 rail
3
E09
+5V
+5V rail
4
E08
SDA
SDA rail
5
E07
SCL
SCL rail
6
E06
IRQ6
D31 → F23
R12 / R13 — I²C pull-ups
Sit just below the S-zone, tapping the SDA/SCL/+3V3 rails directly. 4.7 kΩ each.
B1–B4 (left cluster) mirror B5–B8 (right cluster) on the same row band, so left to right the refs read B1 B2 B3 B4 B8 B7 B6 B5 — the cards below are in that physical order, not numeric order. All eight pin-1 (GND) holes share one row: a single wire down that row grounds all eight.
B1JST-XH-2 · col D
1
D16
GND
GND rail
2
D15
B1
D0 → A23
B2JST-XH-2 · col Z
1
Z16
GND
GND rail
2
Z15
B2
D1 → Z23
B3JST-XH-2 · col V
1
V16
GND
GND rail
2
V15
B3
D4 → W23
B4JST-XH-2 · col R
1
R16
GND
GND rail
2
R15
B4
D8 → S23
B8JST-XH-2 · col O
1
O16
GND
GND rail
2
O15
B8
D9 → R23
B7JST-XH-2 · col K
1
K16
GND
GND rail
2
K15
B7
D26 → K23
B6JST-XH-2 · col G
1
G16
GND
GND rail
2
G15
B6
D30 → G23
B5JST-XH-2 · col C
1
C16
GND
GND rail
2
C15
B5
D32 → E23
J1 / J2 — joysticks (mirrored)
J1 (left stick) mirrors J2 (right stick); pin 5 (GND) on both lands on the same row.
J1JST-XH-5 · col X
1
X39
J1.1
D22 → X29
2
X38
J1.2
D21 → W29
3
X37
J1.3
D20 → V29
4
X36
J1.4
D16 → R29
5
X35
GND
GND rail
J2JST-XH-5 · col I
1
I39
J2.1
D37 → I29
2
I38
J2.2
D39 → K29
3
I37
J2.3
D40 → L29
4
I36
J2.4
D41 → M29
5
I35
GND
GND rail
CB1–CB5 — LED buttons (near-symmetric)
CB3 sits on the centre column; CB2/CB4 and CB1/CB5 mirror around it. Pin 3 is the LED anode and does not go to the Teensy — it goes to that connector's series resistor in the next column across, and the resistor's far end carries the GPIO. Both GND pins (2 and 4) sit on their own rows across all five. CB4's lamp is on D13, the Teensy's onboard-LED pin — safe only because a lamp is a driven output; never move a switch (pulled-up input) onto that pin.
CB1JST-XH-4 · col Z
1
Z47
CB1
D23 → Y29
2
Z46
GND
GND rail
3
Z45
LED_ARM
→ R1.1 A45
4
Z44
GND
GND rail
CB2JST-XH-4 · col U
1
U47
CB2
D6 → U23
2
U46
GND
GND rail
3
U45
LED_EN
→ R2.1 T45
4
U44
GND
GND rail
CB3JST-XH-4 · col P
1
P47
CB3
D14 → P29
2
P46
GND
GND rail
3
P45
LED_SFT
→ R3.1 Q45
4
P44
GND
GND rail
CB4JST-XH-4 · col K
1
K47
CB4
D38 → J29
2
K46
GND
GND rail
3
K45
LED_CONF
→ R4.1 L45
4
K44
GND
GND rail
CB5JST-XH-4 · col F
1
F47
CB5
D34 → F29
2
F46
GND
GND rail
3
F45
LED_ALT
→ R5.1 E45
4
F44
GND
GND rail
R1–R5 — LED series resistors
Standing upright in the column beside their own connector, pin 1 on row 45 — the same row as that connector's pin 3 — and pin 2 four holes up on row 41, pointing at the Teensy header. R2 and R5 sit one column to the right of their CB; R1, R3 and R4 one column to the left. That puts every LED-cathode jumper at a single 2.6 mm hole-to-hole hop (CB1.3 Z45 → R1.1 A45 and so on) instead of the 25–50 mm runs the old row-48 placement needed.
Pushed to the board's right edge to clear the Teensy header rows it shares rows with. Watch the labels here: the board's 32-column letter sequence reuses each letter at both ends, so NP1's holes can compute to the same letter+row as a header hole at the opposite edge. Use the left/right position, not the label alone. No numpad conductor is on D13 any more — that pin drives CB4's lamp. It stays reserved for driven outputs either way: the Teensy's onboard LED hangs off D13 and would fight a pull-up, so a column line must never be moved onto it.
NP1JST-XH-8 · col B
1
B30
NP1.1
D33 → E29
2
B29
NP1.2
D35 → G29
3
B28
NP1.3
D36 → H29
4
B27
NP1.4
D10 → Q23
5
B26
NP1.5
D28 → I23
6
B25
NP1.6
D25 → L23
7
B24
NP1.7
D24 → M23
8
B23
NP1.8
D11 → P23
Solder checklist
Every wire on the board, once. 107 connections, 3006 mm of wire in total; the longest single run is 109 mm (+5V, S6.3 → J_TEENSY_B.1). Lengths are hole-to-hole Manhattan distance — the routed wire follows the grid, so that is its length, but add a few millimetres for the bend at each tip. Ticks are saved in this browser only.
colour
net
signal
from
to
mm
blue
GND
D11S1.1
Y11S2.1
12.7
blue
GND
Y11S2.1
T11S3.1
12.7
blue
GND
T11S3.1
O11S4.1
12.7
blue
GND
O11S4.1
J11S5.1
12.7
blue
GND
J11S5.1
E11S6.1
12.7
blue
GND
E11S6.1
A11TP3.1
10.2
blue
GND
A11TP3.1
D16B1.1
86.4
blue
GND
D16B1.1
Z16B2.1
10.2
blue
GND
Z16B2.1
V16B3.1
10.2
blue
GND
V16B3.1
R16B4.1
10.2
blue
GND
R16B4.1
O16B8.1
7.6
blue
GND
O16B8.1
K16B7.1
10.2
blue
GND
K16B7.1
G16B6.1
10.2
blue
GND
G16B6.1
C16B5.1
10.2
blue
GND
C16B5.1
B23J_TEENSY_A.1
81.3
blue
GND
B23J_TEENSY_A.1
A29J_TEENSY_B.2
17.8
blue
GND
A29J_TEENSY_B.2
N29J_TEENSY_B.15
33.0
blue
GND
N29J_TEENSY_B.15
X35J1.5
40.8
blue
GND
X35J1.5
I35J2.5
38.1
blue
GND
I35J2.5
Z44CB1.4
66.0
blue
GND
Z44CB1.4
U44CB2.4
12.7
blue
GND
U44CB2.4
P44CB3.4
12.7
blue
GND
P44CB3.4
K44CB4.4
12.7
blue
GND
K44CB4.4
F44CB5.4
12.7
blue
GND
F44CB5.4
Z46CB1.2
55.8
blue
GND
Z46CB1.2
U46CB2.2
12.7
blue
GND
U46CB2.2
P46CB3.2
12.7
blue
GND
P46CB3.2
K46CB4.2
12.7
blue
GND
K46CB4.2
F46CB5.2
12.7
red
+3V3
A10TP4.1
D10S1.2
73.7
red
+3V3
D10S1.2
Y10S2.2
12.7
red
+3V3
Y10S2.2
T10S3.2
12.7
red
+3V3
T10S3.2
O10S4.2
12.7
red
+3V3
O10S4.2
J10S5.2
12.7
red
+3V3
J10S5.2
E10S6.2
12.7
red
+3V3
E10S6.2
M13R12.2
27.9
red
+3V3
M13R12.2
H13R13.2
12.7
red
+3V3
H13R13.2
N23J_TEENSY_A.15
40.6
red
+3V3
N23J_TEENSY_A.15
Z29J_TEENSY_B.3
45.7
red
+5V
A09TP5.1
D09S1.3
73.7
red
+5V
D09S1.3
Y09S2.3
12.7
red
+5V
Y09S2.3
T09S3.3
12.7
red
+5V
T09S3.3
O09S4.3
12.7
red
+5V
O09S4.3
J09S5.3
12.7
red
+5V
J09S5.3
E09S6.3
12.7
red
+5V
E09S6.3
B29J_TEENSY_B.1
109.1
yellow
SDA
A08TP1.1
D08S1.4
73.8
yellow
SDA
D08S1.4
Y08S2.4
12.7
yellow
SDA
Y08S2.4
T08S3.4
12.7
yellow
SDA
T08S3.4
O08S4.4
12.7
yellow
SDA
O08S4.4
J08S5.4
12.7
yellow
SDA
J08S5.4
E08S6.4
12.7
yellow
SDA
E08S6.4
Q13R12.1
43.1
yellow
SDA
Q13R12.1
T29J_TEENSY_B.9
48.3
yellow
SCL
A07TP2.1
D07S1.5
73.8
yellow
SCL
D07S1.5
Y07S2.5
12.7
yellow
SCL
Y07S2.5
T07S3.5
12.7
yellow
SCL
T07S3.5
O07S4.5
12.7
yellow
SCL
O07S4.5
J07S5.5
12.7
yellow
SCL
J07S5.5
E07S6.5
12.7
yellow
SCL
E07S6.5
L13R13.1
32.9
yellow
SCL
L13R13.1
U29J_TEENSY_B.8
63.5
orange
D0
B1
D15B1.2
A23J_TEENSY_A.2
27.9
orange
D1
B2
Z15B2.2
Z23J_TEENSY_A.3
20.3
green
D4
B3
V15B3.2
W23J_TEENSY_A.6
22.8
white
D8
B4
R15B4.2
S23J_TEENSY_A.10
22.8
orange
D32
B5
C15B5.2
E23J_TEENSY_A.24
25.4
green
D30
B6
G15B6.2
G23J_TEENSY_A.22
20.3
green
D26
B7
K15B7.2
K23J_TEENSY_A.18
20.3
orange
D9
B8
O15B8.2
R23J_TEENSY_A.11
27.9
white
D23
CB1
Z47CB1.1
Y29J_TEENSY_B.4
48.3
orange
LED_ARM
Z45CB1.3
A45R1.1
2.6
orange
D6
CB2
U47CB2.1
U23J_TEENSY_A.8
61.0
white
LED_EN
U45CB2.3
T45R2.1
2.6
white
D14
CB3
P47CB3.1
P29J_TEENSY_B.13
45.7
orange
LED_SFT
P45CB3.3
Q45R3.1
2.6
white
D38
CB4
K47CB4.1
J29J_TEENSY_B.19
48.3
green
LED_CONF
K45CB4.3
L45R4.1
2.6
green
D34
CB5
F47CB5.1
F29J_TEENSY_B.23
45.7
white
LED_ALT
F45CB5.3
E45R5.1
2.6
orange
D22
J1.1
X39J1.1
X29J_TEENSY_B.5
25.4
orange
D21
J1.2
X38J1.2
W29J_TEENSY_B.6
25.4
orange
D20
J1.3
X37J1.3
V29J_TEENSY_B.7
25.5
green
D16
J1.4
X36J1.4
R29J_TEENSY_B.11
33.1
orange
D37
J2.1
I39J2.1
I29J_TEENSY_B.20
25.4
white
D39
J2.2
I38J2.2
K29J_TEENSY_B.18
28.0
orange
D40
J2.3
I37J2.3
L29J_TEENSY_B.17
28.0
green
D41
J2.4
I36J2.4
M29J_TEENSY_B.16
28.1
orange
D33
NP1.1
B30NP1.1
E29J_TEENSY_B.24
10.2
orange
D35
NP1.2
B29NP1.2
G29J_TEENSY_B.22
12.7
orange
D36
NP1.3
B28NP1.3
H29J_TEENSY_B.21
17.7
orange
D10
NP1.4
B27NP1.4
Q23J_TEENSY_A.12
48.4
white
D28
NP1.5
B26NP1.5
I23J_TEENSY_A.20
25.6
white
D25
NP1.6
B25NP1.6
L23J_TEENSY_A.17
30.7
green
D24
NP1.7
B24NP1.7
M23J_TEENSY_A.16
30.7
orange
D11
NP1.8
B23NP1.8
P23J_TEENSY_A.13
35.8
orange
D5
LED1
A41R1.2
V23J_TEENSY_A.7
58.4
orange
D17
LED2
T41R2.2
S29J_TEENSY_B.10
33.0
white
D15
LED3
Q41R3.2
Q29J_TEENSY_B.12
30.5
green
D13
LED4
L41R4.2
O29J_TEENSY_B.14
38.1
white
D29
LED5
E41R5.2
H23J_TEENSY_A.21
53.3
yellow
IRQ1
D06S1.6
Y23J_TEENSY_A.4
55.7
yellow
IRQ2
Y06S2.6
X23J_TEENSY_A.5
45.5
yellow
IRQ3
T06S3.6
T23J_TEENSY_A.9
43.0
yellow
IRQ4
O06S4.6
O23J_TEENSY_A.14
43.0
yellow
IRQ5
J06S5.6
J23J_TEENSY_A.19
43.0
yellow
IRQ6
E06S6.6
F23J_TEENSY_A.23
45.5
Nothing matches that filter.
107 of 107 shown. On the board these 107 connections become 223 modelled jumper legs, because a run that changes both row and column is drawn as two straight legs meeting at a corner hole, and a run that would lie on top of another wire is detoured around it. Electrically each is still one connection — one length of wire, bent, will do it.
Revision notes
How this layout got here
GPIO assignment (2026-08-26). Connector signals are not in sequential blocks. Each one is wired to a Teensy pin chosen for physical proximity, solved as an assignment problem over the free GPIOs, which is why the numbers look scattered. Eighteen signals override proximity because they are already soldered and stay put: B1–B8 (D0 D1 D4 D8 / D32 D30 D26 D9), J1/J2 (D22 D21 D20 D16 / D37 D39 D40 D41, on the D13–D23 / D33–D41 rail — row 29 here) and LED4/LED5 (D13 / D29, their resistors jumpered L41→O29 and E41→H23). The other 22 — the six IRQs, the five control buttons, three of the five lamps and the eight numpad lines — moved to their nearest free pin. Firmware pin constants must follow this map (scripts/pin_map.json); the tables on this page, the schematic and the manufactured board are all generated from it.
Teensy orientation, verified against the board (2026-08-26). Two earlier revisions of this page had the module in wrong — once with the rows swapped, once with both rows reversed. It plugs in USB toward the B23/B29 end (the left edge of the header strips below), and each socket carries its Teensy row in that row's own order, neither reversed: row 23 runs GND D0 D1 … D12 +3V3 D24 … D32 left to right, row 29 runs +5V GND +3V3 D23 D22 … D13 GND D41 … D33. Three independent readings off the physical board agree: the Vin/GND/3.3V trio sits in B29 A29 Z29, B1's wire is in A23 (D0) and B2's in Z23 (D1) — exactly the firmware's pins. Every already-soldered wire keeps both its GPIO and its hole under this mapping. If this is ever doubted again, settle it by reading a hole off the board, never by checking whether the resulting map looks sensible — every table on this page is generated from the mapping, so a wrong one still looks self-consistent.
R4's jumper was moved off J1's pin (resolved). R4's LED wire had gone into L41→R29, but R29 reads D16 — J1 pin 4, already soldered. It has been pulled and re-landed five holes along in O29 (D13), so LED4 is now frozen on D13 alongside LED5's E41→H23 (H23 = D29). D13 also drives the Teensy's onboard LED, which is harmless here precisely because LED4 is a driven output — never put a pulled-up input on it.
Connector standard. S1–S6 follow the XH2.54 6-pin Haptic Console Connector Standard v1.1 — pin 1 GND, pin 2 3.3V, pin 3 5V, pin 4 SDA, pin 5 SCL, pin 6 IRQ — matching cables crimped to that spec.
Group layout. Every JST group shares one anchor row, mirrored left/right to match the physical panel (S1–S6 centred; B1–B4 mirrors B5–B8; J1 mirrors J2; CB1–CB5 near-symmetric about the centre column). Because each group shares an anchor row, the same pin number lands on the same row across the group, which is what makes the single-wire bus rails possible. Everything fits inside the physical 32×50 hole grid.
Moves since the first revision. The Teensy sockets moved one column left and two rows up (rows 25→23 and 31→29) and R12/R13 shifted two columns; S1–S6 shifted one column left to clear the TP1–TP5 header at the right edge; R1–R5 went from lying flat across row 48 to standing upright on rows 45/41 in the column beside their own CB, which is what shortened every LED-cathode jumper to one hole.
The KiCad files match this page (2026-08-26). Everything is now generated from the same scripts/pin_map.json: the perfboard has R1–R5 standing on rows 45/41 as rewired by hand (R1 A45/A41, R2 T45/T41, R3 Q45/Q41, R4 L45/L41, R5 E45/E41) with the modelled jumper legs on the back layer, the schematic's net labels carry each signal's GPIO name, and the manufactured board has been re-netted and re-routed from scratch (0 DRC violations, 0 unconnected pads) with fresh gerbers. Change a pin by editing the generator and re-running the pipeline — never by hand-editing this page or a KiCad file.