blue 2c6e7e8762 hardware: KiCad bootstrap for the Resound carrier PCB (Small Build)
Netlist-first KiCad-import package for the single carrier PCB (ESP32-WROOM-32E,
SINK/BROADCASTER assembly variants):
- hardware/carrier/resound-carrier.net : KiCad s-expr netlist, 44 components /
  40 nets, real library footprints (RF_Module:ESP32-WROOM-32, 2x13 stacking
  header, 0402 passives, SOT-23 auto-reset, JST-SH HUD conn). Parens balanced.
- hardware/carrier/BOM.csv : 44 parts (ref/value/footprint/MPN/DNP/notes).
- hardware/carrier/LAYOUT.md : 45x45 4-layer stackup, 15mm antenna keep-out,
  placement, JLCPCB DRC, SINK-vs-BROADCASTER variant + address-strap table.
- hardware/carrier/README.md : KiCad import steps + caveats.

Agent decisions flagged for EE: LED moved off the GPIO13 strap to LED_DAT=GPIO21
/ LED_CLK=GPIO4; verify WROOM footprint pad numbering; UART2 is connector-only
this rev. Deliverable is import-ready netlist+BOM+spec, not a finished .kicad_pcb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 15:10:15 -04:00

85 lines
5.3 KiB
Markdown

# Resound Small Build — Carrier PCB (KiCad bootstrap)
A netlist-first hardware bootstrap for the **Resound** carrier PCB: one 45 x 45 mm
4-layer board built around an **ESP32-WROOM-32E**, with a 26-pin stacking bus, that
ships in two assembly variants — **SINK** and **BROADCASTER** — from the same layout.
## What's here
| File | Purpose |
|------|---------|
| `resound-carrier.net` | KiCad S-expression netlist: every component (ref/value/**real KiCad footprint**) and every net with pin connections. The importable artifact. |
| `BOM.csv` | Bill of materials: Ref, Qty, Value, Footprint, MPN/JLCPCB, DNP, Notes. |
| `LAYOUT.md` | Board outline, 4-layer stackup, antenna keep-out, placement plan, mounting holes, JLCPCB design rules, and the SINK vs BROADCASTER variant table. |
| `README.md` | This file. |
## Honest scope
A text agent cannot emit a guaranteed-openable `.kicad_pcb` with real geometry. So the
deliverable is a **complete, accurate, importable netlist + BOM + layout spec**. The
schematic is **not yet drawn** — this is a netlist-first workflow. An engineer imports
the netlist, lays out the board per `LAYOUT.md`, and (optionally) back-annotates a
schematic afterwards.
## How to import into KiCad (8.x)
### Option A — straight into the PCB editor (fastest, matches netlist-first)
1. New KiCad project. Open the **PCB Editor** (Pcbnew).
2. **File -> Import -> Netlist...** Select `resound-carrier.net`.
3. KiCad places all footprints (it resolves the library footprint names like
`RF_Module:ESP32-WROOM-32`, `Connector_PinHeader_2.54mm:PinHeader_2x13_P2.54mm_Vertical`,
`Resistor_SMD:R_0402_1005Metric`, `Package_TO_SOT_SMD:SOT-23`, etc. from the standard
KiCad footprint libraries — make sure those libs are installed/enabled).
4. Build the board outline on **Edge.Cuts** (45x45, rounded corners) and lay out per
`LAYOUT.md`. Add the antenna keep-out zones, GND/PWR plane pours, and mounting holes.
5. Run **DRC** with JLCPCB rules from `LAYOUT.md` section 6.
### Option B — schematic-first (if you prefer drawing the schematic)
1. Use the netlist as the connectivity spec and draw the schematic in Eeschema, matching
refs/nets exactly, then **Update PCB from Schematic** (F8). The provided `.net` is the
single source of truth for which pin connects to which net.
> Note: the `.net` uses KiCad's S-expression `(export ...)` netlist format with
> `(comp ...)` + `(net ...)` sections and per-component `(footprint ...)`. This is what
> "Import Netlist" consumes. The `(libparts)`/`(libraries)` blocks are intentionally empty
> (footprints are assigned directly on each component, which is sufficient for PCB import).
## ESP32-WROOM-32E pad mapping used
The netlist references U1 by the standard KiCad `RF_Module:ESP32-WROOM-32` footprint pad
numbers 1..38 (+ EP on pad 38). Key assignments:
- GND = pads 1, 15, 38(EP) | 3V3 = pad 2 | EN = pad 3
- I2C: SDA=GPIO32 (pad 8), SCL=GPIO33 (pad 9)
- I2S SINK: BCK=GPIO5 (pad 29), WS=GPIO25 (pad 10), DATA=GPIO23 (pad 37)
- I2S BCAST: BCK=GPIO19 (pad 31), WS=GPIO18 (pad 30), DATA=GPIO22 (pad 36)
- ADDR: GPIO13 (pad 16), GPIO14 (pad 13), GPIO27 (pad 12), GPIO26 (pad 11)
- UART bus: TX=GPIO17 (pad 28), RX=GPIO16 (pad 27)
- LED: DAT=GPIO21 (pad 33), CLK=GPIO4 (pad 26) *(reassigned — see caveats)*
- Prog UART0: RX/IO3=GPIO3 (pad 34), TX/IO1=GPIO1 (pad 35), IO0=pad 25
**Verify this pad mapping against the exact footprint variant you load** before committing
copper, since some WROOM footprint variants renumber pads.
## Known caveats / open items for the EE
1. **LED pin reuse (RESOLVE THIS).** The original spec note put the APA102 LED DATA on
GPIO13, but GPIO13 is already an **address strap** (ADDR0). To avoid the conflict the
netlist reassigns LED to spare pins: **LED_DAT = GPIO21, LED_CLK = GPIO4**. Confirm
these spares are truly free for your firmware and that GPIO4/GPIO21 have no strapping or
boot side-effects in your build. Adjust if needed — flagged intentionally.
2. **Antenna coupling across the stack.** Boards stack vertically; the WROOM antenna of a
lower board sits near the copper/components of the board above. Enforce the 15 mm
all-layer keep-out (LAYOUT.md §4) and consider stack spacing / antenna orientation so
the antenna of any board does not sit under metal of the neighbor.
3. **Verify HUD SH1.0 pin order.** J3 is keyed/genderable; confirm pin 1 of the chosen
SH1.0 connector and the HUD cable match the `1=+5V 2=GND 3=SDA 4=SCL 5=SPARE 6=NC`
order before fab. Easy to mirror.
4. **UART2 bus pins (J1 19/20)** are connector pass-through only on this rev — no MCU tap
is routed (the ESP32 second hardware UART pins are not broken out here). If a board
needs to drive UART2, the EE must route MCU spares to those connector pins.
5. **Auto-reset cross-bias.** The DTR/RTS auto-reset/boot circuit follows the NodeMCU
2-transistor pattern; the base-resistor cross-bias nets (R8_BIAS->RTS, R9_BIAS->DTR)
prevent EN+IO0 asserting simultaneously. Sanity-check against your USB-serial adapter's
DTR/RTS polarity.
6. **I2S series terminators R1/R2/R3** are DNP by default (direct connection). Populate
33R only if I2S signals ring across the stack.
## Variants in one line
SINK = I2S jumpers JP1/JP2/JP3 + I2C pull-ups R4/R5 populated. BROADCASTER = I2S jumpers
JP4/JP5/JP6, pull-ups DNP. Address straps set per board. Full table in `LAYOUT.md` §7.