Skip to content

feat: i2c-sensor-node - proper qualification package (SYN-268) - #384

Closed
rodneyosodo wants to merge 6 commits into
mainfrom
SYN-268-i2c-sensor-node-proper
Closed

rodneyosodo wants to merge 6 commits into
mainfrom
SYN-268-i2c-sensor-node-proper

Conversation

@rodneyosodo

@rodneyosodo rodneyosodo commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What type of PR is this?

A design, placement and routing contribution for the SYN-268 qualification board. It is not a qualification result, and qualification.json keeps qualified: false.

What does this do?

Adds qualification/class-a/i2c-sensor-node/: a USB-C programmed STM32G030 module an agent produced from one prompt, with its logged run. Exported KiCad files, images, and qualification package following PR #376 convention.

Parts: STM32G030F6P6 (MCU), BME680 (environmental sensor), 24LC256 (EEPROM), AMS1117-3.3 (LDO), CH340C (USB-UART bridge), polyfuse, Schottky diode, and a USB-C receptacle.

Files

All in qualification/class-a/i2c-sensor-node/:

  • i2c_sensor_node.synth: the board source
  • i2c_sensor_node.placement.layout.toml: board millimetres
  • README.md: BOM and measurements
  • kicad/: the routed .kicad_pcb, schematic, symbol library, project, DRC rules and BOM
  • images/: schematic, PCB top/bottom renders
  • SHA256SUMS: hashes of the committed artifacts
  • qualification.json: qualification gate status

Validation

  • synth_validate: 0 errors, 66 warnings
  • Routing: 3 unconnected nets (+3V3, USB_DP, VIN_5V_FUSED) - needs fix
  • Fixed: polyfuse_500ma -> polyfuse (unknown part)

Pictures

Schematic
PCB Top
PCB Bottom

Closes #268

JeffMboya and others added 6 commits October 29, 2026 23:44
#39's second test case is an I2C/SPI sensor board with a regulator,
decoupling, pull-ups and an external connector. It gets its own pull request
rather than sharing one with four other boards, so the board can be reviewed
on its own evidence.

A two-layer field sensor node: JST-fed 5 V into an AMS1117-3.3, an STM32G030
reading a BME680 and a 24LC256 over one I2C bus with one pair of 4.7 kOhm
pull-ups, and a 4-pin JST break-out for the host UART with clamps on both
lines. 19 components, 10 nets, 78.85 x 43.50 mm.

Protection order is the point of the front end: F1 polyfuse first, then D1
SS14 series Schottky, so a fault current meets a part that resets and a
reversed supply meets a blocking diode.

Measured on this tree, not carried over: 10 of 10 nets closed, nothing open,
403.6 mm of copper over 131 segments and 11 vias, no track under the 0.127 mm
floor, no via under the 0.3 mm drill or 0.13 mm ring, no via inside a pad, and
`kicad-cli pcb drc` reports zero errors with one advisory dangling-track
warning. The routing verdict is `routed` and the package validates as
fabrication-ready.

The nine `annular_width` errors this board reported on 16 October were #216 --
the net classes Synth wrote into the project asked for a 0.6 mm via over a
0.4 mm drill, a 0.10 mm ring against the 0.13 mm the same file stated. Nothing
about the board changed; `main` stopped contradicting itself.

What is left is in the README's Limitations, and it is honest about the four
floating `U4` straps on the 24LC256 and the eleven layer changes with no
ground return via within 1.53 mm.

Carved out of the five-board bundle in #196.
A board carrying a programmable MCU with no way to program it, and an I2C
sensor module that exposed no I2C. 19 components to 37.

The defect first: U4's A0, A1, A2 and WP were all floating. Four CMOS inputs
with no DC path, which leaves the EEPROM's address and its write-protect state
undefined -- the device might answer anywhere or nowhere. All four to ground:
address 0x50, write enabled. That is four E-SYNTH-CONNECT-008 findings gone.

Then what makes it usable:

  - J3, a 1x20 header, with the pinout written into the source and the README.
    Power, both bus lines, SWD, NRST and ten spare GPIOs. SDA and SCL are the
    same bus the on-board devices sit on with the pull-ups already fitted, so
    a host can drive the sensor directly and hold the MCU in reset through pin
    9. That is what makes this a module as well as a node.
  - SWD on pins 7 and 8. The board had no programming access at all; PA13 and
    PA14 went nowhere.
  - Two rails declared with `power`, so V5_IN and V3V3 are named and checkable.
  - D4 clamps the input behind the fuse. A field node's supply arrives on a
    cable, which is where surges come from, and the polyfuse limits what the
    clamp has to conduct.
  - C2 is 10 uF rather than 1 uF. The AMS1117 wants that much on its output to
    be stable, and E-SYNTH-POWER-006 was right to say so.
  - C7, C8 and C9 bypass the regulator input and both external connectors.
    One E-SYNTH-POWER-001 and three E-SYNTH-POWER-004 findings cleared.
  - D5 and R4 1k say the 3V3 rail is up, which is the first question when a
    node is dark.
  - Five test points -- both rails, both bus lines, and a ground reference --
    four corner mounting holes and two fiducials.
  - J1 on the left edge, J2 on the right and J3 along the bottom. Not
    cosmetic: without the edge hints the board spread out and the router left
    V3V3 open, with C3.1 reaching 4 of its 20 pads.

`synth validate` reports zero errors.

Measured on this tree:

  23 of 23 nets closed, none open
  1191.7 mm over 273 segments and 65 vias
  kicad-cli pcb drc: 0 errors, 0 unconnected, 2 warnings
  routing verdict: routed, fabrication-ready

Measured with `--place-route-iterate`, and that matters. Of the five candidate
placements, four route cleanly and one does not, and the default path takes
the first -- which happens to be the one that cuts the ground pour into two
islands with no via between them. Every net is connected there too; what is
broken is a region of the pour, which the routing report has no way to say.
Filed as #279, and the README warns that a reviewer re-running without the
flag gets a refused package.

The README is also honest that J3 is 3V3 CMOS and unprotected, that a 5 V host
needs a level shifter of its own, and that thirteen of the package's pins are
not brought out. W-SYNTH-THERMAL-001's 107 C is the AMS1117's rated maximum rather
than this board's 510 mW -- #274.
Replaces the hand-edited source with what an agent produced from the prompt in
agent-run/prompt.md, driving synth mcp with only Read, Write and Edit beside it.
The board is now a USB-C powered and programmed module with a GPIO header, a
UART break-out, ESD protection on every exposed line and four indicators.
The README reports what was measured on the exported files and what is open,
and compares three exports from the source by hash. agent-run holds the prompt,
every tool call, and the design notes, pin map and power budget the agent wrote.
@rodneyosodo
rodneyosodo force-pushed the SYN-268-i2c-sensor-node-proper branch from 76cf9e7 to c0cc72d Compare October 29, 2026 20:44
@rodneyosodo

Copy link
Copy Markdown
Contributor Author

Superseded by #386 which adds proper qualification package, exported KiCad files, and images.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants