Skip to content

Class A, case 2: I2C/SPI sensor board with regulator, decoupling, pull-ups, and external connector - #268

Open
JeffMboya wants to merge 11 commits into
absmach:mainfrom
JeffMboya:SYN-261-i2c-sensor-node
Open

JeffMboya wants to merge 11 commits into
absmach:mainfrom
JeffMboya:SYN-261-i2c-sensor-node

Conversation

@JeffMboya

@JeffMboya JeffMboya commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

What type of PR is this?

This is a feature.

What does this do?

Adds qualification/class-a/i2c-sensor-node/: a four-layer STM32G030 sensor node with BME680 and 24LC256, powered from 5 V.

Which issue(s) does this PR fix/relate to?

Resolves #261. Related Issue #39, #273, #274, #275.

Have you included tests for your changes?

No. The board is data; the README compares three exports by hash.

Did you document any new/modified feature?

Yes. The README gives measurements, review answers and reproduction; agent-run/ holds the tools and export table.

Notes

Needs Synth PRs #370, #388, #394, pinned in reproduce/pins.env. JLCPCB DFM and quote pending.

@SammyOina

Copy link
Copy Markdown
Collaborator

Changes requested — not ready for Class-A qualification

[P1] Make the default export valid. The default path does not produce the claimed board: it splits the ground pour into two islands and leaves an unconnected zone. The clean result requires --place-route-iterate. Encode the placement/routing constraint in the design or fix the default selection so a normal export is valid without an optional flag.

[P1] Provide issue #261 reproducibility evidence. The acceptance criteria require three consecutive byte-identical board and schematic exports, but the PR documents only one iterative run. Add the repeated artifact hashes/files and verify the exact command used to reproduce them.

[P1] Resolve the exposed-I/O protection boundary. J3 exposes unprotected 3.3 V GPIO, I2C, SWD, reset, and power. A 5 V host can damage the MCU, and external lines have no fault protection. Add suitable level shifting/protection, or narrow the module interface and obtain explicit review sign-off that this boundary is acceptable.

[P1] Apply power and connector net geometry. No netclasses are applied, so the 5 V input, 3V3 rail, and exposed connector paths use default routing geometry. Define suitable widths and clearances, then rerun routing and DRC.

[P2] Complete qualification quality. The AMS1117 result remains only an estimate at approximately 0.51 W dissipation for the stated 300 mA load; provide thermal validation or reduce the load/replace the regulator. Eighteen parts lack distributor identity, the input clamp is unverified, and the BOM requires --allow-unverified-parts. Finally, resolve the schematic readability findings and PCB silk-overlap warnings before independent Class-A sign-off.

Generic CI passes, but it does not validate the default board export or the qualification acceptance criteria.

@JeffMboya
JeffMboya force-pushed the SYN-261-i2c-sensor-node branch 2 times, most recently from a707666 to dcf1e32 Compare October 26, 2026 03:53
@JeffMboya

Copy link
Copy Markdown
Contributor Author

@SammyOina re your review: agent-made now. Default export passes, three exports hash-match, I/O ESD-protected, classes applied. Open: 17 return vias, BOM identity, part review. Pushed in dcf1e32.

@JeffMboya JeffMboya changed the title SYN-261 - The Class A I2C sensor node Add the I2C sensor-node board to the Class A qualification set Oct 26, 2026
@JeffMboya JeffMboya changed the title Add the I2C sensor-node board to the Class A qualification set Class A, case 2: I2C/SPI sensor board with regulator, decoupling, pull-ups, and external connector Oct 26, 2026
@rodneyosodo

Copy link
Copy Markdown
Contributor

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

@JeffMboya

Copy link
Copy Markdown
Contributor Author

Superseded by #386.

@JeffMboya JeffMboya closed this Oct 30, 2026
@rodneyosodo rodneyosodo reopened this Oct 30, 2026
absmach#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 absmach#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 absmach#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 absmach#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 -- absmach#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.
@JeffMboya
JeffMboya force-pushed the SYN-261-i2c-sensor-node branch from dcf1e32 to 21cb4ce Compare October 31, 2026 20:39
…ee times

Four layers, 93.4 x 67.7 mm, 57 parts: routed with 0 KiCad DRC errors and 0 unconnected items; three exports agree on every file hash. Adds the export, reports, fabrication package with an orderable BOM, a reproduce kit pinned to the Synth PR stack, and the tools.
JeffMboya and others added 6 commits November 1, 2026 15:22
…uses

JeffMboya reviewed the regulator, Schottky, polyfuse, TVS, zener, connectors, switch, mounting hole and generic passives on 2026-11-01.
… listing

Nexperia PTVS6V0S1UR,115 is LCSC C294622; the BOM and the sourcing table carry it.
…117 datasheet; re-record the IR snapshots with the part reviewers

The regulator notes use the Advanced Monolithic Systems datasheet (800 mA, thetaJA 90 C/W, 15 V input maximum, 22 uF tantalum output). The schematic, reports, fab package and README come from three fresh identical exports. Reviewer records now appear in the lowered IR of three fixtures.
fab_package.sh exported only F.Cu and B.Cu, so the four-layer board's zip held two copper layers. It now exports In1.Cu and In2.Cu; the Gerber content hash is 169492d786 on all three exports.
…report

Four layers, 0 Danger; annular-ring and solder-mask warnings listed in the README.
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.

Add the I2C sensor-node board to the Class A qualification set

3 participants