Drogheda/03-Architecture-Hardware/watchdog-pcb-v3-routing-status.md

125 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Watchdog v3 PROD — PCB Routing Status
tags: [project-drogheda, hardware, pcb, kicad, routing, freerouting, status]
project: Project Drogheda
author: Helgen CTO
date: 2026-07-03
status: Active — routing skeleton complete (98%), punch-list to fab-ready below
---
# HBOX Watchdog v3 PROD — Routing Status (2026-07-03)
Board: `kicad/hbox-watchdog-v3-PROD.kicad_pcb` — 120×100 mm, 126 footprints.
Continues the routing Fable started (and left broken by a mid-route spend-limit cutoff).
## ⭐ UPDATE 2026-07-03 — RESPUN TO 4-LAYER (the real fix)
The 2-layer board **could not take wide power**: FreeRouting left **51 unrouted** even at a
moderate 1.0/0.8 mm (and the intended 1.5+ mm was worse). That's the honest limit of 2 layers
on a board this dense (3 switchers + 4G modem + RTK shield). **Leo's call: respin 4-layer.**
- **Stackup now 4-layer:** `F.Cu / In1.Cu (GND plane) / In2.Cu / B.Cu` (JLC standard 1.6 mm; no
explicit stackup block → JLC applies theirs). Converted by adding In1.Cu(id 4)+In2.Cu(id 6) as
copper (KiCad 9 IDs verified empirically; hand-`add_layer` cascades junk — direct file edit used).
- **GND moved to the In1 inner plane** (pour relayered B.Cu→In1.Cu, refilled). Exports as
`(plane GND (polygon In1.Cu …))` → FreeRouting bonds GND to the plane; routes on F/In2/B.
- **2-layer routing stripped** for a clean 4-layer route.
- **Route artifact for Leo:** `kicad/hbox-watchdog-v3-PROD-4layer-wideclass.dsn` (PWR_HI 1.5 mm,
PWR_MID 1.0 mm, signals 0.2 mm, through-via `Via[0-3]`, 4 routing layers). Run FreeRouting on the
Mac → `.ses` → I import + refill In1 plane + DRC. Instructions: `kicad/RUN-4layer-autoroute-README.md`.
- **Order at JLC as 4-layer.** Wide power now has room; solid GND is the reliability win we went for.
- Backups: `…bak-pre4layer-*` (2-layer routed), `…bak-pre4Lroute-*` (4-layer pre-strip).
### 4-layer route imported (FreeRouting, 70 passes)
Leo ran FreeRouting on `…-4layer-wideclass.dsn` → **13 unrouted** (vs **51** on 2-layer — the
respin worked). SES imported: **862 tracks, 129 vias**, In1 GND plane filled (8,550 mm²),
**no new shorts** (the 5 shorting-item lines = placement baseline: J7↔MOD1 no-net under the
shield ×4 layers + SYS5V↔SW_5V kiss). **Wide power rails routed with real width** — the goal.
**Punch-list (finish in KiCad interactive router — fine-pitch, needs eyes; quick on 4-layer):**
- **~7 IC-pad opens, all in the U3/U6 cluster (center):** `BAT_PLUS` (U6.23), `VIN_SW` (Q7.5↔U6.7),
`IGATE` (Q7.4↔U6.15), `SW_5V` (C3.1↔Q1.3), `3V3` (→U3.3), `I2C_SDA` (U3.1↔R31.2), `I2C_SCL` (U3.2).
U3 = SHT40 (0.3–0.5 mm pads), U6 = LTC4040 QFN — the autorouter can't finesse these.
- **~10 GND pads not fully bonded to the In1 plane:** THT — P10.2, P13.3, J1.19, J2.19, MOD1.6, J7.10
(fix: set In1 zone pad-connect to solid, or add a plane via); SMD — C7.2, C11.2, Rfreq.2, U3.4
(fix: short GND via to In1). Safe to do via MCP (GND-to-GND).
- Minor: FreeRouting parked short `BAT_PLUS`/`SW_5V` segments **on the In1 plane layer** — reroute
onto F/In2/B for a fully solid plane (cosmetic-ish for this slow board).
> The 2-layer material below is retained for history; the board is now 4-layer.
## What was done this session
1. **Ripped up Fable's partial hand-route.** It was interrupted mid-route with **19 net-to-net
shorts** (GND↔SYS5V, MAIN5V↔VIN_SW, 24V↔Q10_GATE…), 6 track crossings, 13 dangling vias —
not salvageable. Stripped all routed copper (178 segments + 32 vias) back to clean placement;
footprints, nets, and the B.Cu GND pour preserved. Backups kept (see below).
2. **Net-classes / rules.** Global clearance was **0 → fixed to 0.2 mm** (would have let the
router short). Project already carried `PWR_HI`/`PWR_MID` patterns (kept: PWR_HI = BAT_PLUS,
SW_BAT, MAIN5V, VEH5V, SYS5V, VIN_SW; PWR_MID = SW_5V, 3V3_MODEM, 5V_FAN, 24V, 24V_IN, IGN_IN,
SW_FAN, SW3_NODE, FAN_RET).
3. **Autorouted with FreeRouting 1.9** (best-of-N, on the Mac's Java 23). Result imported:
**1072 segments, 131 vias, 100 % of nets routed** (0 unrouted at import), and — critically —
**no new shorts or clearance violations from the routing itself**.
4. **GND handled as a plane.** The B.Cu GND pour exports as a real `(plane GND)`, so FreeRouting
bonded GND to the bottom plane instead of thin traces. Pour **filled** (8160 mm²).
## Current DRC = 204 (down from Fable's 276)
Essentially the **placement baseline** + connectivity stragglers:
| Bucket | Count | Nature |
|---|---|---|
| courtyards_overlap | 67 | **by-design** under-shield overlap (MOD1/J7/J8) — pre-existing |
| silk_overlap / silk_over_copper | 59 / 50 | cosmetic silkscreen — pre-existing |
| pth_inside_courtyard, lib_footprint, hole_to_hole, solder_mask | 9/4/1/3 | placement baseline |
| clearance | 7 | sub-mm placement **pad kisses** — pre-existing (in Fable's Jul-2 baseline) |
| shorting_items | 3 | **placement, not routing**: J7-Pin8↔MOD1-A5 (no-net, under shield) ×2; **SYS5V↔SW_5V pad kiss** — verify (real nets) |
| starved_thermal | 1 | one GND thermal relief with 1 spoke — trivial |
| **unconnected_items** | **17** | **the routing punch-list ↓** |
## Punch-list to fab-ready (the last 2 %)
**A. Close 17 open connections (do in KiCad GUI — interactive route with copper visible; NOT
blind by coordinate, which is how the 19 shorts happened last time):**
- **U3 (SHT40) — 4 pins near-missed**: pad1 SDA (65.3, 77.6), pad2 SCL (65.3, 78.4),
pad3 3V3 (66.7, 78.4), pad4 GND (66.7, 77.6). Tiny 0.5×0.3 mm pads on 0.8 mm pitch; the
I2C/3V3 tracks stop ~3–5 mm east near U4. **Functionally critical** (sensor won't work).
- **~13 GND-to-plane**: edge THT grounds not reaching the plane — P5 pad2 (20.5, 6),
H3 pad3 (31, 11), P13 pad3 (41, 6), MOD1 pad6 (72.7, 48), J1 pin19 (72.7, 16),
J2 pin19 (72.7, 33.8) — plus a few GND track/via gaps mid-board. Fix by nudging the zone /
short GND jumper to the plane body (visible in GUI).
**B. Widen power nets to class widths.** The autoroute ran at a **uniform 0.2 mm** (see tooling
note) — power rails are currently thin. Widen to spec: **PWR_HI ≥1.5 mm, PWR_MID/SW_5V ≥0.8–1.0 mm,
signals 0.25 mm** (per `watchdog-pcb-v3-kicad-guide` §6: power/5V ≥0.5, SW_5V ≥0.8). Easiest via
GUI: select each power net → set width from net-class → push-and-shove reflows neighbors.
**This is the project's core reliability lever (voltage drop / heat) — required before fab.**
**C. Verify the SYS5V↔SW_5V placement kiss** (bottom-right cutoff-switch area) — real nets.
## Tooling notes (why power isn't already wide)
- FreeRouting 1.9 jar needs **Java 17+**; the analysis sandbox only has Java 11 (no net to fetch a
JDK) → can't run the jar there. The Mac has Java 23.
- The KiCad-MCP `export_dsn` (swig backend) **flattens all nets into one `kicad_default` class at
0.2 mm** — it does not apply the `PWR_HI/PWR_MID` patterns. So the MCP autoroute (which
re-exports internally) routes everything at 0.2 mm; the wide classes can't be driven through it.
- MCP tool calls cap at 30 s, but FreeRouting finishes **asynchronously on the Mac** (~2–3 min) and
the SES still imports — that's how this route landed despite a "timeout".
- **Path to wide-power autoroute (optional):** inject `PWR_HI/PWR_MID` classes into the exported
DSN and run `java -jar freerouting-1.9.0.jar -de <fixed>.dsn -do out.ses` on the Mac, then
`import_ses`. Otherwise just widen in the GUI (recommended — current signal routing is good).
## Backups (in `kicad/`)
- `…kicad_pcb.bak-preAutoroute-20260703-200734` — clean placement, pre-route.
- `…kicad_pcb.bak-postAutoroute-20260703-202442` — routed, pre-fill (the 1072-seg import).
- Fable's own `…bak-preroute-20260703-151135` and `…bak-leoclose-160912` retained.
- DRC reports: `_route-continue-drc-{poststrip,postauto,postfill,clean}.txt`.
## Related
- [[watchdog-electrical-design-state]] (canonical electrical) ·
[[watchdog-pcb-v3-kicad-guide]] (widths §6) · [[watchdog-production-schematic-delta]] · [[CLAUDE|Master Index]]