Connector pinout — generated
What each module header pin and each bottom-slot breakout lead carries, and where the cat firmware
reads or drives it, from firmware/cat/src/bin/main.rs (verified by tools/electronics/check_wiring_harness.py).
A header's pins come from the board's netlist: its KiCad board once KiCad owns the board, the frozen
baseline until then. Each wire leaves the main board from the pin named after its signal's GPIO,
a rail from its slot's rail pin (below). The physical cable and wires are unknown until
electronics/wiring-harness.toml says otherwise — the column is printed, never guessed. Regenerate with
./lx pcb pinout.
A signal is named by its function; silk is its compact alias, printed on the boards next to the header and carried by the frozen EasyEDA sources' nets; a bottom-slot signal's is the sensor's pin name. Matrix rows and columns count from 1; the firmware's index is one less. Directions are seen from the cat's microcontroller.
Signals
| Signal | Silk | Cat side | Slot | Function |
|---|---|---|---|---|
FINGER_MATRIX_ROW_1 | FI1 | GPIO38 | fingers | matrix row 1 (firmware row 0), input, pull-up — physical bottom row |
FINGER_MATRIX_ROW_2 | FI2 | GPIO37 | fingers | matrix row 2 (firmware row 1), input, pull-up |
FINGER_MATRIX_ROW_3 | FI3 | GPIO36 | fingers | matrix row 3 (firmware row 2), input, pull-up |
FINGER_MATRIX_ROW_4 | FI4 | GPIO35 | fingers | matrix row 4 (firmware row 3), input, pull-up — physical top row |
FINGER_MATRIX_COLUMN_1 | FO1 | GPIO1 | fingers | matrix column 1 (firmware column 0), output — driven low to scan; index · outer |
FINGER_MATRIX_COLUMN_2 | FO2 | GPIO2 | fingers | matrix column 2 (firmware column 1), output — index · inner |
FINGER_MATRIX_COLUMN_3 | FO3 | GPIO42 | fingers | matrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1 |
FINGER_MATRIX_COLUMN_4 | FO4 | GPIO41 | fingers | matrix column 4 (firmware column 3), output — ring |
FINGER_MATRIX_COLUMN_5 | FO5 | GPIO40 | fingers | matrix column 5 (firmware column 4), output — pinky · inner |
FINGER_MATRIX_COLUMN_6 | FO6 | GPIO39 | fingers | matrix column 6 (firmware column 5), output — pinky · outer |
FINGER_SCROLL_ENCODER_A | WA | GPIO43 | fingers | scroll encoder channel A, input, pull-up — EVQWGD001; fkw only |
FINGER_SCROLL_ENCODER_B | WB | GPIO44 | fingers | scroll encoder channel B, input, pull-up — EVQWGD001; fkw only |
THUMB_MATRIX_ROW_1 | TI1 | GPIO4 | thumb | matrix row 1 (firmware row 0), input, pull-up — physical bottom row |
THUMB_MATRIX_ROW_2 | TI2 | GPIO5 | thumb | matrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pins |
THUMB_MATRIX_ROW_3 | TI3 | GPIO6 | thumb | matrix row 3 (firmware row 2), input, pull-up |
THUMB_MATRIX_ROW_4 | TI4 | GPIO7 | thumb | matrix row 4 (firmware row 3), input, pull-up; tk only — physical top row |
THUMB_MATRIX_COLUMN_1 | TO1 | GPIO18 | thumb | matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b |
THUMB_MATRIX_COLUMN_2 | TO2 | GPIO8 | thumb | matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key |
THUMB_MATRIX_COLUMN_3 | TO3 | GPIO3 | thumb | matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e |
THUMB_LED_DATA | LED_DATA | GPIO17 | thumb | LED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0) |
THUMB_JOYSTICK_X | JX | GPIO5 | thumb | joystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pin |
THUMB_JOYSTICK_Y | JY | GPIO7 | thumb | joystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pin |
BOTTOM_SENSOR_SPI_CLOCK | SCLK | GPIO12 | bottom | sensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle high |
BOTTOM_SENSOR_SPI_MOSI | MOSI | GPIO11 | bottom | sensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an input |
BOTTOM_SENSOR_SPI_MISO | MISO | GPIO13 | bottom | sensor SPI MISO, input; bm-pmw3389 only — SPI2 data in |
BOTTOM_SENSOR_SPI_SELECT | NCS | GPIO10 | bottom | sensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle high |
BOTTOM_SENSOR_I2C_DATA | SDA | GPIO11 | bottom | sensor I2C SDA, bidirectional; bg only — I2C0 data, open drain; the breakout's own pull-ups hold it high |
BOTTOM_SENSOR_I2C_CLOCK | SCL | GPIO12 | bottom | sensor I2C SCL, output; bg only — I2C0 clock, open drain; the breakout's own pull-ups hold it high |
BOTTOM_SENSOR_MOTION | MOTION | GPIO9 | bottom | sensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active low |
BOTTOM_SENSOR_RESET | NRESET | GPIO46 | bottom | sensor reset, output; bm-pmw3389 only — active low, idle high; a boot strap (Strapping pins) |
BOTTOM_ADNS5050_SPI_CLOCK | sclk | GPIO14 | bottom | sensor SPI SCLK, output; bm-adns5050 only — SPI2 clock, idle high; v3's pin, main-board pin 20. The main board's battery divider (470 kΩ / 470 kΩ) hangs on it: the module never has a battery |
BOTTOM_ADNS5050_SPI_DATA | sdio | GPIO13 | bottom | sensor SPI MOSI, bidirectional; bm-adns5050 only — the one half-duplex data line (SDIO), SPI2 SIO0; v3's pin, main-board pin 19 |
BOTTOM_ADNS5050_RESET | n | GPIO12 | bottom | sensor reset, output; bm-adns5050 only — NRESET, active low, idle high; v3's pin, main-board pin 18 |
BOTTOM_ADNS5050_SPI_SELECT | nsc | GPIO11 | bottom | sensor SPI NCS, output; bm-adns5050 only — NCS, driven by software, idle high; v3's pin, main-board pin 17 |
BATTERY_VOLTAGE_SENSE | BATTERY_VOLTAGE_SENSE | GPIO14 | any | battery voltage, analog input; battery only — ADC2; the cell voltage through the BPI-Leaf-S3's own 470 kΩ / 470 kΩ divider (firmware/docs/battery-monitoring.md); the ADNS-5050's clock shares its pin, which build.toml [[rule]] battery-not-with-usb-only-sensor keeps apart |
3V3 | 3V3 | 3.3 V rail | any | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) |
5V | 5V | 5 V rail | any | 5 V rail; bm-adns5050 only — the main board's USB VBUS: live only while USB is plugged in, never from the battery; supply of the ADNS-5050 module alone, so its hand has no battery (build.toml [[rule]] battery-not-with-usb-only-sensor) |
GND | GND | ground | any | ground — LED return, encoder common, sensor ground |
Main board: BPI-Leaf-S3 (ESP32-S3)
Pins are electronics/lib/parts.toml BPI-Leaf-S3's: 1–22 the 3V3 row (J1), 23–44 the row that
starts with GND (J3), each counted from the antenna end; the silkscreen names them. A rail has
several pins, so each slot's rail wire has its own:
| Slot | Rail | Main-board pin |
|---|---|---|
| thumb | 3V3 | 1 (3V3, J1·1) |
| thumb | GND | 44 (GND, J3·22) |
| fingers | GND | 23 (GND, J3·1) |
| bottom | 3V3 | 2 (3V3, J1·2) |
| bottom | 5V | 21 (5V, J1·21) |
| bottom | GND | 22 (GND, J1·22) |
The rail pins are a proposal: not confirmed until a cat has been wired this way.
The battery plugs into its own socket, CN1, a 2-pin MX 1.25 mm socket on the top face
beside the USB-C end: pin 1 +, pin 2 -. No module wire goes to it. Source: Banana Pi's schematic (contacts) and dimension drawing (position), measured off the drawing, ±0.3 mm.
The battery's own lead (2-pin JST 1.25 mm plug) runs through the power switch (build.toml
power-switch, pins 1 throw, 2 common, 3 throw, 4.7 mm pitch):
| Carries | Lead | From | To |
|---|---|---|---|
| + | red | battery + | switch 2 |
| + | red | switch 1 | socket 1 |
| - | black | battery - | socket 2 |
The plug's polarity is not verified: measure which contact is + before plugging it in.
Strapping pins
ESP32-S3 strapping pins the cat wires. The chip latches a strap while it is held in reset, before any firmware runs: what counts is the level the hardware holds the line at then.
| Pin | Strap | Wired to | Note | Verified |
|---|---|---|---|---|
| GPIO46 | boot mode, with GPIO0 (weak pull-down by default); gates the ROM boot log only if the UART_PRINT_CONTROL eFuse is burnt | BOTTOM_SENSOR_RESET | PMW3389 NRESET, bm-pmw3389. The breakout's NRESET pull-up holds GPIO46 at 1 during reset. A normal boot (GPIO0 = 1) ignores GPIO46, but holding BOOT (GPIO0 = 0) with GPIO46 = 1 is the combination the datasheet calls invalid, so the manual BOOT-button download may fail with a PMW3389 fitted. If it does, disconnecting the sensor's NRESET lead for the download should restore it. Whether the automatic USB reset into download mode is affected is untested as well. | no — bench check pending |
| GPIO3 | JTAG signal source; read only if the STRAP_JTAG_SEL eFuse is burnt (not by default) | THUMB_MATRIX_COLUMN_3 | no boot effect with default eFuses | no — bench check pending |
Left finger module, 21 keys (left-F21) — J1
PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/left-finger-module-21-keys/left-finger-module-21-keys.kicad_pro.
Pins from the frozen baseline electronics/baseline/F21-left/netlist.json (source designator H4), which owns this board until its review.
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | FINGER_MATRIX_COLUMN_1 | FO1 | matrix column 1 (firmware column 0), output — driven low to scan; index · outer | GPIO1 | 26 (GPIO1, J3·4) | unknown |
| 2 | FINGER_MATRIX_COLUMN_2 | FO2 | matrix column 2 (firmware column 1), output — index · inner | GPIO2 | 27 (GPIO2, J3·5) | unknown |
| 3 | FINGER_MATRIX_COLUMN_3 | FO3 | matrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1 | GPIO42 | 28 (GPIO42, J3·6) | unknown |
| 4 | FINGER_MATRIX_COLUMN_4 | FO4 | matrix column 4 (firmware column 3), output — ring | GPIO41 | 29 (GPIO41, J3·7) | unknown |
| 5 | FINGER_MATRIX_COLUMN_5 | FO5 | matrix column 5 (firmware column 4), output — pinky · inner | GPIO40 | 30 (GPIO40, J3·8) | unknown |
| 6 | FINGER_MATRIX_COLUMN_6 | FO6 | matrix column 6 (firmware column 5), output — pinky · outer | GPIO39 | 31 (GPIO39, J3·9) | unknown |
| 7 | FINGER_MATRIX_ROW_1 | FI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO38 | 32 (GPIO38, J3·10) | unknown |
| 8 | FINGER_MATRIX_ROW_2 | FI2 | matrix row 2 (firmware row 1), input, pull-up | GPIO37 | 33 (GPIO37, J3·11) | unknown |
| 9 | FINGER_MATRIX_ROW_3 | FI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO36 | 34 (GPIO36, J3·12) | unknown |
| 10 | FINGER_MATRIX_ROW_4 | FI4 | matrix row 4 (firmware row 3), input, pull-up — physical top row | GPIO35 | 35 (GPIO35, J3·13) | unknown |
Right finger module, 20 keys + scroll wheel (right-F20W) — J1
KH-2.54PH180-1X13P-L11.5 (LCSC C2932703), 1×13 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/right-finger-module-20-keys-scroll-wheel/right-finger-module-20-keys-scroll-wheel.kicad_pro.
Pins from the frozen baseline electronics/baseline/F20w-right/netlist.json (source designator H8), which owns this board until its review.
Note: the source board labels pin 9 'Fo9'; it is FO6, and the KiCad redraw labels every pin with its signal's alias.
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | GND | GND | ground — LED return, encoder common, sensor ground | ground | 23 (GND, J3·1) | unknown |
| 2 | FINGER_SCROLL_ENCODER_A | WA | scroll encoder channel A, input, pull-up — EVQWGD001; fkw only | GPIO43 | 24 (GPIO43, J3·2) | unknown |
| 3 | FINGER_SCROLL_ENCODER_B | WB | scroll encoder channel B, input, pull-up — EVQWGD001; fkw only | GPIO44 | 25 (GPIO44, J3·3) | unknown |
| 4 | FINGER_MATRIX_COLUMN_1 | FO1 | matrix column 1 (firmware column 0), output — driven low to scan; index · outer | GPIO1 | 26 (GPIO1, J3·4) | unknown |
| 5 | FINGER_MATRIX_COLUMN_2 | FO2 | matrix column 2 (firmware column 1), output — index · inner | GPIO2 | 27 (GPIO2, J3·5) | unknown |
| 6 | FINGER_MATRIX_COLUMN_3 | FO3 | matrix column 3 (firmware column 2), output — middle; the left board's m0 is on column 1 | GPIO42 | 28 (GPIO42, J3·6) | unknown |
| 7 | FINGER_MATRIX_COLUMN_4 | FO4 | matrix column 4 (firmware column 3), output — ring | GPIO41 | 29 (GPIO41, J3·7) | unknown |
| 8 | FINGER_MATRIX_COLUMN_5 | FO5 | matrix column 5 (firmware column 4), output — pinky · inner | GPIO40 | 30 (GPIO40, J3·8) | unknown |
| 9 | FINGER_MATRIX_COLUMN_6 | FO6 | matrix column 6 (firmware column 5), output — pinky · outer | GPIO39 | 31 (GPIO39, J3·9) | unknown |
| 10 | FINGER_MATRIX_ROW_1 | FI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO38 | 32 (GPIO38, J3·10) | unknown |
| 11 | FINGER_MATRIX_ROW_2 | FI2 | matrix row 2 (firmware row 1), input, pull-up | GPIO37 | 33 (GPIO37, J3·11) | unknown |
| 12 | FINGER_MATRIX_ROW_3 | FI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO36 | 34 (GPIO36, J3·12) | unknown |
| 13 | FINGER_MATRIX_ROW_4 | FI4 | matrix row 4 (firmware row 3), input, pull-up — physical top row | GPIO35 | 35 (GPIO35, J3·13) | unknown |
Left thumb module, 11 keys (left-T11) — J1
PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/left-thumb-module-11-keys/left-thumb-module-11-keys.kicad_pro.
Pins from the KiCad board, which owns this board; the frozen source called the header H3.
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | GND | GND | ground — LED return, encoder common, sensor ground | ground | 44 (GND, J3·22) | unknown |
| 2 | 3V3 | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 1 (3V3, J1·1) | unknown |
| 3 | THUMB_LED_DATA | LED_DATA | LED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0) | GPIO17 | 10 (GPIO17, J1·10) | unknown |
| 4 | THUMB_MATRIX_COLUMN_1 | TO1 | matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b | GPIO18 | 11 (GPIO18, J1·11) | unknown |
| 5 | THUMB_MATRIX_COLUMN_2 | TO2 | matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key | GPIO8 | 12 (GPIO8, J1·12) | unknown |
| 6 | THUMB_MATRIX_COLUMN_3 | TO3 | matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e | GPIO3 | 13 (GPIO3, J1·13) | unknown |
| 7 | THUMB_MATRIX_ROW_1 | TI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO4 | 4 (GPIO4, J1·4) | unknown |
| 8 | THUMB_MATRIX_ROW_2 | TI2 | matrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pins | GPIO5 | 5 (GPIO5, J1·5) | unknown |
| 9 | THUMB_MATRIX_ROW_3 | TI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO6 | 6 (GPIO6, J1·6) | unknown |
| 10 | THUMB_MATRIX_ROW_4 | TI4 | matrix row 4 (firmware row 3), input, pull-up; tk only — physical top row | GPIO7 | 7 (GPIO7, J1·7) | unknown |
Left thumb module, 4 keys + joystick (left-T4J) — J1
PH2.54-1X10P-H25 (LCSC C42431810), 1×10 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/left-thumb-module-4-keys-joystick/left-thumb-module-4-keys-joystick.kicad_pro.
Pins from the KiCad board, where the board was drawn (no frozen source).
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | GND | GND | ground — LED return, encoder common, sensor ground | ground | 44 (GND, J3·22) | unknown |
| 2 | 3V3 | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 1 (3V3, J1·1) | unknown |
| 3 | THUMB_LED_DATA | LED_DATA | LED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0) | GPIO17 | 10 (GPIO17, J1·10) | unknown |
| 4 | THUMB_MATRIX_COLUMN_1 | TO1 | matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b | GPIO18 | 11 (GPIO18, J1·11) | unknown |
| 5 | THUMB_MATRIX_COLUMN_2 | TO2 | matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key | GPIO8 | 12 (GPIO8, J1·12) | unknown |
| 6 | THUMB_MATRIX_COLUMN_3 | TO3 | matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e | GPIO3 | 13 (GPIO3, J1·13) | unknown |
| 7 | THUMB_MATRIX_ROW_1 | TI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO4 | 4 (GPIO4, J1·4) | unknown |
| 8 | THUMB_JOYSTICK_X | JX | joystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pin | GPIO5 | 5 (GPIO5, J1·5) | unknown |
| 9 | THUMB_MATRIX_ROW_3 | TI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO6 | 6 (GPIO6, J1·6) | unknown |
| 10 | THUMB_JOYSTICK_Y | JY | joystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pin | GPIO7 | 7 (GPIO7, J1·7) | unknown |
Right thumb module, 11 keys (right-T11) — J1
A2541WV-10P (LCSC C225485), 1×10 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/right-thumb-module-11-keys/right-thumb-module-11-keys.kicad_pro.
Pins from the KiCad board, which owns this board; the frozen source called the header H2.
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | THUMB_MATRIX_ROW_4 | TI4 | matrix row 4 (firmware row 3), input, pull-up; tk only — physical top row | GPIO7 | 7 (GPIO7, J1·7) | unknown |
| 2 | THUMB_MATRIX_ROW_3 | TI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO6 | 6 (GPIO6, J1·6) | unknown |
| 3 | THUMB_MATRIX_ROW_2 | TI2 | matrix row 2 (firmware row 1), input, pull-up; tk only — the joystick thumb (tkj) has no keys on rows 2 and 4: its stick's axes take their pins | GPIO5 | 5 (GPIO5, J1·5) | unknown |
| 4 | THUMB_MATRIX_ROW_1 | TI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO4 | 4 (GPIO4, J1·4) | unknown |
| 5 | THUMB_MATRIX_COLUMN_3 | TO3 | matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e | GPIO3 | 13 (GPIO3, J1·13) | unknown |
| 6 | THUMB_MATRIX_COLUMN_2 | TO2 | matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key | GPIO8 | 12 (GPIO8, J1·12) | unknown |
| 7 | THUMB_MATRIX_COLUMN_1 | TO1 | matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b | GPIO18 | 11 (GPIO18, J1·11) | unknown |
| 8 | THUMB_LED_DATA | LED_DATA | LED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0) | GPIO17 | 10 (GPIO17, J1·10) | unknown |
| 9 | 3V3 | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 1 (3V3, J1·1) | unknown |
| 10 | GND | GND | ground — LED return, encoder common, sensor ground | ground | 44 (GND, J3·22) | unknown |
Right thumb module, 4 keys + joystick (right-T4J) — J1
A2541WV-10P (LCSC C225485), 1×10 vertical 2.54 mm, bottom side.
KiCad project electronics/boards/right-thumb-module-4-keys-joystick/right-thumb-module-4-keys-joystick.kicad_pro.
Pins from the KiCad board, where the board was drawn (no frozen source).
| Pin | Signal | Silk | Function | Cat side | Main-board pin | Cable |
|---|---|---|---|---|---|---|
| 1 | THUMB_JOYSTICK_Y | JY | joystick axis Y, analog input; tkj only — ADC1 channel 6: the stick's VR1 output through 1 kΩ, with 100 nF to ground at the header; row 4's pin | GPIO7 | 7 (GPIO7, J1·7) | unknown |
| 2 | THUMB_MATRIX_ROW_3 | TI3 | matrix row 3 (firmware row 2), input, pull-up | GPIO6 | 6 (GPIO6, J1·6) | unknown |
| 3 | THUMB_JOYSTICK_X | JX | joystick axis X, analog input; tkj only — ADC1 channel 4: the stick's VR2 output through 1 kΩ, with 100 nF to ground at the header; row 2's pin | GPIO5 | 5 (GPIO5, J1·5) | unknown |
| 4 | THUMB_MATRIX_ROW_1 | TI1 | matrix row 1 (firmware row 0), input, pull-up — physical bottom row | GPIO4 | 4 (GPIO4, J1·4) | unknown |
| 5 | THUMB_MATRIX_COLUMN_3 | TO3 | matrix column 3 (firmware column 2), output — arc positions 4–5: PCB columns d, e | GPIO3 | 13 (GPIO3, J1·13) | unknown |
| 6 | THUMB_MATRIX_COLUMN_2 | TO2 | matrix column 2 (firmware column 1), output — arc position 3: PCB column c, with the center key | GPIO8 | 12 (GPIO8, J1·12) | unknown |
| 7 | THUMB_MATRIX_COLUMN_1 | TO1 | matrix column 1 (firmware column 0), output — arc positions 1–2: PCB columns a, b | GPIO18 | 11 (GPIO18, J1·11) | unknown |
| 8 | THUMB_LED_DATA | LED_DATA | LED data, output — WS2812-protocol data to LED1 DIN (RMT channel 0) | GPIO17 | 10 (GPIO17, J1·10) | unknown |
| 9 | 3V3 | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 1 (3V3, J1·1) | unknown |
| 10 | GND | GND | ground — LED return, encoder common, sensor ground | ground | 44 (GND, J3·22) | unknown |
Bottom slot: sensor breakouts
A bottom module is a purchased breakout, wired lead by lead to the main board: no module header.
Leads are named by the sensor pin the firmware driver's wiring table uses. One variant is fitted
per cat (LYNXware.toml); the pins are shared, so the variants are alternatives, never together.
bm-pmw3389 — build.toml part pmw3389-breakout
The breakout makes the sensor's 1.9 V VDD itself; VDDIO takes the 3.3 V rail, so the sensor runs on battery.
Its header, pin 1 first: 1 VIN (VDDIO), 2 MISO, 3 MOSI, 4 SCK (SCLK), 5 SS (NCS), 6 MT (MOTION), 7 GND, 8 RST (NRESET). Source: the sellers' product photos on Tindie: one row, pin 1 the square pad at VIN (citizenjoe/pmw3389-motion-sensor); the original JACK Enterprises board has the same order, labelled VI, MI, MO, SC, SS, MT, GD, RS (jkicklighter/pmw3389-motion-sensor). The pitch is not stated.
| Lead | Signal | Function | Cat side | Main-board pin | Wire |
|---|---|---|---|---|---|
| SCLK | BOTTOM_SENSOR_SPI_CLOCK | sensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle high | GPIO12 | 18 (GPIO12, J1·18) | unknown |
| MOSI | BOTTOM_SENSOR_SPI_MOSI | sensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an input | GPIO11 | 17 (GPIO11, J1·17) | unknown |
| MISO | BOTTOM_SENSOR_SPI_MISO | sensor SPI MISO, input; bm-pmw3389 only — SPI2 data in | GPIO13 | 19 (GPIO13, J1·19) | unknown |
| NCS | BOTTOM_SENSOR_SPI_SELECT | sensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle high | GPIO10 | 16 (GPIO10, J1·16) | unknown |
| MOTION | BOTTOM_SENSOR_MOTION | sensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active low | GPIO9 | 15 (GPIO9, J1·15) | unknown |
| NRESET | BOTTOM_SENSOR_RESET | sensor reset, output; bm-pmw3389 only — active low, idle high; a boot strap (Strapping pins) | GPIO46 | 14 (GPIO46, J1·14) | unknown |
| VDDIO | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 2 (3V3, J1·2) | unknown |
| GND | GND | ground — LED return, encoder common, sensor ground | ground | 22 (GND, J1·22) | unknown |
bm-pmw3610 — build.toml part pmw3610-breakout
3-wire SPI: SDIO is the one data line; the breakout regulates the sensor's core supply. Driver compile-checked only, not yet brought up on hardware.
Its header, pin 1 first, 2.54 mm pitch: 1 VIN (VDD), 2 GND, 3 SDIO, 4 SCLK, 5 CS (NCS), 6 MOT, 7 RST (open). Source: siderakb's pmw3610-pcb rev 2.1 (github.com/siderakb/pmw3610-pcb, J1 1×7): the design randware builds, its shipped revision unconfirmed. RST (the sensor's NRESET) stays open: the driver does not wire it.
| Lead | Signal | Function | Cat side | Main-board pin | Wire |
|---|---|---|---|---|---|
| SCLK | BOTTOM_SENSOR_SPI_CLOCK | sensor SPI SCLK, output; bm-pmw3389, bm-pmw3610 only — SPI2 clock, idle high | GPIO12 | 18 (GPIO12, J1·18) | unknown |
| SDIO | BOTTOM_SENSOR_SPI_MOSI | sensor SPI MOSI, output; bm-pmw3389, bm-pmw3610 only — SPI2 data out; the PMW3610's one half-duplex data line (SDIO) is this pin, then also an input | GPIO11 | 17 (GPIO11, J1·17) | unknown |
| NCS | BOTTOM_SENSOR_SPI_SELECT | sensor SPI NCS, output; bm-pmw3389, bm-pmw3610 only — chip select, driven by software, idle high | GPIO10 | 16 (GPIO10, J1·16) | unknown |
| MOT | BOTTOM_SENSOR_MOTION | sensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active low | GPIO9 | 15 (GPIO9, J1·15) | unknown |
| VDD | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 2 (3V3, J1·2) | unknown |
| GND | GND | ground — LED return, encoder common, sensor ground | ground | 22 (GND, J1·22) | unknown |
bm-adns5050 — build.toml part adns5050-module
3-wire SPI: SDIO is the one data line, as the PMW3610's. VDD5 takes the main board's 5 V pin, which only USB powers: the sensor is dead on battery. v3 bit-banged these pins; the SPI2 driver is compile-checked only.
Its header, pin 1 first, 2.54 mm pitch: 1 GND, 2 V (VDD5), 3 sclk (SCLK), 4 sdio (SDIO), 5 n (NRESET), 6 nsc (NCS). Source: the v3 board (EasyEDA PCB_PCB_adns5050, 2026-10-16), header H1: pin 1 the square pad, its nets and the silkscreen beside each pin; electronics/boards/bottom-module-mouse-sensor-adns5050 draws it 1:1, the header as J1.
| Lead | Signal | Function | Cat side | Main-board pin | Wire |
|---|---|---|---|---|---|
| SCLK | BOTTOM_ADNS5050_SPI_CLOCK | sensor SPI SCLK, output; bm-adns5050 only — SPI2 clock, idle high; v3's pin, main-board pin 20. The main board's battery divider (470 kΩ / 470 kΩ) hangs on it: the module never has a battery | GPIO14 | 20 (GPIO14, J1·20) | unknown |
| SDIO | BOTTOM_ADNS5050_SPI_DATA | sensor SPI MOSI, bidirectional; bm-adns5050 only — the one half-duplex data line (SDIO), SPI2 SIO0; v3's pin, main-board pin 19 | GPIO13 | 19 (GPIO13, J1·19) | unknown |
| NCS | BOTTOM_ADNS5050_SPI_SELECT | sensor SPI NCS, output; bm-adns5050 only — NCS, driven by software, idle high; v3's pin, main-board pin 17 | GPIO11 | 17 (GPIO11, J1·17) | unknown |
| NRESET | BOTTOM_ADNS5050_RESET | sensor reset, output; bm-adns5050 only — NRESET, active low, idle high; v3's pin, main-board pin 18 | GPIO12 | 18 (GPIO12, J1·18) | unknown |
| VDD5 | 5V | 5 V rail; bm-adns5050 only — the main board's USB VBUS: live only while USB is plugged in, never from the battery; supply of the ADNS-5050 module alone, so its hand has no battery (build.toml [[rule]] battery-not-with-usb-only-sensor) | 5 V rail | 21 (5V, J1·21) | unknown |
| GND | GND | ground — LED return, encoder common, sensor ground | ground | 22 (GND, J1·22) | unknown |
bg — build.toml part mpu-6050-breakout
The GY-521's own regulator makes the MPU-6050's supply from VCC (3.3 to 5 V; from the 3.3 V rail it drops a little, inside the chip's 2.375 to 3.46 V), and its own pull-ups hold SDA and SCL. AD0's pull-down sets the address 0x68. No driver yet.
Its header, pin 1 first, 2.54 mm pitch: 1 VCC, 2 GND, 3 SCL, 4 SDA, 5 XDA (open), 6 XCL (open), 7 AD0 (open), 8 INT. Source: Fritzing's GY-521 part (fritzing-parts, core/InvenSense_MPU6050.fzp; the board gyro_ref.py draws): one row, pin 1 VCC, the order of the board's silkscreen. XDA and XCL (the MPU-6050's auxiliary I2C) and AD0 stay open.
| Lead | Signal | Function | Cat side | Main-board pin | Wire |
|---|---|---|---|---|---|
| SDA | BOTTOM_SENSOR_I2C_DATA | sensor I2C SDA, bidirectional; bg only — I2C0 data, open drain; the breakout's own pull-ups hold it high | GPIO11 | 17 (GPIO11, J1·17) | unknown |
| SCL | BOTTOM_SENSOR_I2C_CLOCK | sensor I2C SCL, output; bg only — I2C0 clock, open drain; the breakout's own pull-ups hold it high | GPIO12 | 18 (GPIO12, J1·18) | unknown |
| INT | BOTTOM_SENSOR_MOTION | sensor interrupt, input, pull-up — active low: motion or data to read; wakes the sensor task. The gyro's INT, which its driver sets active low | GPIO9 | 15 (GPIO9, J1·15) | unknown |
| VCC | 3V3 | 3.3 V rail — supply of the thumbs' LEDs, the joystick thumb's stick and the bottom slot's sensor breakout (no GPIO can source it) | 3.3 V rail | 2 (3V3, J1·2) | unknown |
| GND | GND | ground — LED return, encoder common, sensor ground | ground | 22 (GND, J1·22) | unknown |
Provenance
electronics/wiring-harness.tomlsha2560985ced98b402be8…firmware/cat/src/bin/main.rspin assignments (check_wiring_harness.firmware_map) sha2564c693529ce1f3801…electronics/lib/parts.tomlBPI-Leaf-S3pins sha256b5f220238e2207a7…electronics/baseline/F21-left/netlist.jsonH4pin → net sha256f2d4384fe3bd7bfc…electronics/baseline/F20w-right/netlist.jsonH8pin → net sha2566ba9386f0652cb58…electronics/boards/left-thumb-module-11-keys/left-thumb-module-11-keys.kicad_pcbJ1pin → net sha25678d13bf845ee2d0e…electronics/boards/left-thumb-module-4-keys-joystick/left-thumb-module-4-keys-joystick.kicad_pcbJ1pin → net sha25644a96e81c31bdbbd…electronics/boards/right-thumb-module-11-keys/right-thumb-module-11-keys.kicad_pcbJ1pin → net sha25638651e03ef8d303c…electronics/boards/right-thumb-module-4-keys-joystick/right-thumb-module-4-keys-joystick.kicad_pcbJ1pin → net sha2565d4ad4a2363863bd…- command:
python3 tools/electronics/pinout.py