Carrier PCB Design Brief (Rev E)
Reference: ScreenKey Module (Waveshare SKU 34168)
Canonical pinout: hardware/pinout.py — schematic and PCB generators consume it and hard-fail if firmware/config.h disagrees.
Status: routed + DRC-clean. Fab outputs live in hardware/pcb/gerbers/.
What's new in Rev E
Rev D was a working 6-key carrier. Rev E keeps that layout and adds the on-board sensing and feedback the enclosure was designed around:
| Subsystem | Part | What it does |
|---|---|---|
| IMU | LSM6DS3TR-C | Pickup / tap detect — the deck ticks when you lift it |
| Ambient light | VEML7700 | Auto-dims the six backlights through a face-plate light pipe |
| Haptics | DRV2605L + LRA jack | Click feedback on key press; optional coin motor on J10 |
| Piezo | CUI CPT-9019S | Optional beep alongside (or instead of) the LRA |
| Edge glow | 8× SK6812MINI-E | Per-key status (6) + rear link/SD indicators (2), 5 V via a level shifter |
| Qwiic | JST-SH 4P | Extra I2C sensors on the same bus, out the rear wall |
Also in this rev: uniform 11 mm cap-to-cap gaps (the board grew to 59.5 × 108.5 mm), dual SPI so a full-deck redraw is ~15 ms instead of ~60 ms, and a single pinout source so firmware and copper cannot drift.
Added board cost is about $4–6.
Board specification
| Parameter | Value |
|---|---|
| PCB size | 59.5 × 108.5 mm |
| Shape | Rectangular (r=4 corners), 4× Ø2.2 corner case-screw holes on the corner-module standoff axes |
| Mounting | Flat in bottom shell (centred under key grid) |
| Layers | 2-layer |
| Min trace | 0.2 mm signal / 0.5 mm power |
| Min via | 0.3 mm drill / 0.6 mm pad |
| Finish | ENIG, matte black solder mask |
Layout
Uniform 11 mm cap-to-cap gaps both axes: column pitch 33.0 mm, row pitch 36.3 mm.
J1–J6 centres (board origin 0,0 = back-left)
| Ref | Col | Row | X | Y |
|---|---|---|---|---|
| J1 | 0 | 0 | 13.25 | 17.95 |
| J2 | 1 | 0 | 46.25 | 17.95 |
| J3 | 0 | 1 | 13.25 | 54.25 |
| J4 | 1 | 1 | 46.25 | 54.25 |
| J5 | 0 | 2 | 13.25 | 90.55 |
| J6 | 1 | 2 | 46.25 | 90.55 |
Major placements
| Ref | Part | Notes |
|---|---|---|
| U1 | ESP32-S3-WROOM-1-N16R8 | Centre corridor between rows 0 and 1 |
| J7 | USB-C GCT USB4105 | Port exits rear edge, centred at X=29.75 |
| J8 | microSD Hirose DM3D-SF | Card mouth faces the x=59.5 edge (side-wall slot) |
| U2 | AMS1117-3.3 1 A LDO | Rear-left strip, VBUS → 3V3 |
| U3 | USBLC6-2SC6 ESD | USB D+/D−/VBUS |
| U4 | LSM6DS3TR-C IMU | I2C, INT1 → GPIO9 |
| U5 | VEML7700 ALS | I2C, drives backlight auto-dim |
| U6 | DRV2605L haptic | I2C + EN=GPIO44, LRA on J10 |
| U7 | 74AHCT1G125 | 3.3 V → 5 V LED data |
| J9 | Qwiic / StemmaQT | Rear edge next to USB |
| J10 | LRA motor (JST-SH 2P) | Optional haptic actuator |
| BZ1 | Piezo | GPIO43 LEDC |
| D1–D6 | SK6812MINI-E | Beside each key, outer edge |
| D7–D8 | SK6812MINI-E | Rear corners — link / SD |
| SW1 / SW2 | BOOT / RESET | Front strip, clear of the rear sensors |
Connectors J1–J6
Molex PicoBlade 53261-0971 — 9-pin 1.25 mm right-angle SMD.
The 200 mm cable included in every Waveshare module box plugs straight in (pin 1 → pin 1; verify straight-through before buying spares).
Pin order (Waveshare SPI module — pin 1 = KEY)
| Pin | Signal | Bus A (J1–J3) | Bus B (J4–J6) |
|---|---|---|---|
| 1 | KEY | GPIO per table below | GPIO per table below |
| 2 | DC | GPIO 14 (DC_A) | GPIO 8 (DC_B) |
| 3 | CS | GPIO per table below | GPIO per table below |
| 4 | SCLK | GPIO 12 (SCK_A) | GPIO 18 (SCK_B) |
| 5 | DIN | GPIO 11 (MOSI_A) | GPIO 17 (MOSI_B) |
| 6 | GND | GND | GND |
| 7 | VCC | +3V3 | +3V3 |
| 8 | PWM | GPIO 13 (BL, LEDC) | GPIO 13 (shared) |
| 9 | RST | GPIO 21 (shared) | GPIO 21 (shared) |
Per-module GPIO
| Module | Bus | CS | KEY |
|---|---|---|---|
| J1 | A | 10 | 38 |
| J2 | A | 1 | 39 |
| J3 | A | 2 | 40 |
| J4 | B | 3 | 41 |
| J5 | B | 4 | 42 |
| J6 | B | 5 | 47 |
Dual SPI: bus A (FSPI) also carries the microSD (CS=16, MISO=15). Panels run 40 MHz with DMA on both buses at once.
Other subsystem GPIO
| Signal | GPIO | Notes |
|---|---|---|
| SDA / SCL | 6 / 7 | I2C: IMU + ALS + haptics + Qwiic |
| IMU_INT | 9 | LSM6DS3TR-C INT1, wake-on-pickup |
| LED_DATA | 48 | SK6812 chain, 5 V via 74AHCT1G125 |
| PIEZO | 43 | LEDC tone |
| HAPTIC_EN | 44 | DRV2605L EN |
Pins avoid IO35–37 (octal PSRAM) and leave the boot-strap pins clean.
Decoupling
- C1–C6: 100 nF 0402 on each Jx pin 7 (VCC), ≤2 mm from connector
- C7/C8: 10 µF 0805 bulk at LDO in/out
- C9/C10: 100 nF at U1; C11 1 µF on EN
- 100 nF at U4, U5, U6, U7 + 10 µF near the LED chain 5 V feed
Mounting holes
All Ø2.2 (M2 free fit):
- H1–H4 corner case screws @ (3.25, 3.32), (56.25, 3.32), (3.25, 105.17), (56.25, 105.17) — on the corner modules' outermost soldered-nut axes (M2×25 case screws, see Mechanical)
- H5–H16 module standoffs @ the usable positions of the 20.0 × 29.25 per-module pattern from the official vendor drawing
BOM
| Qty | Ref | Part |
|---|---|---|
| 1 | U1 | ESP32-S3-WROOM-1-N16R8 (soldered) |
| 6 | J1–J6 | Molex PicoBlade 53261-0971 — 9-pin 1.25 mm right-angle |
| 1 | J7 | USB-C receptacle, GCT USB4105 |
| 1 | J8 | microSD, Hirose DM3D-SF push-push |
| 1 | U2 | AMS1117-3.3 1 A LDO |
| 1 | U3 | USBLC6-2SC6 USB ESD protection |
| 1 | U4 | LSM6DS3TR-C 6-axis IMU |
| 1 | U5 | VEML7700 ambient light |
| 1 | U6 | DRV2605L haptic driver |
| 1 | U7 | 74AHCT1G125 LED data level shifter |
| 8 | D1–D8 | SK6812MINI-E RGB LED |
| 1 | BZ1 | SMT piezo (CUI CPT-9019S) |
| 1 | J9 | JST-SH 4P Qwiic / StemmaQT |
| 1 | J10 | JST-SH 2P LRA motor |
| 2 | SW1, SW2 | BOOT / RESET tactile switches |
| 6 | — | Waveshare MX1.25 9P cable (included with each module) |
Full line-item board BOM: hardware/pcb/bom.csv. Case fasteners and feet are in the parts list.
Fabrication
- 59.5 × 108.5 mm 2-layer FR4 1.6 mm, ENIG
- JLCPCB / PCBWay: ~$15 / 5 pcs
See the Fab Checklist for ordering and bring-up.

