Skip to content

SYN-265 - The APDS-9301, and a circular courtyard that read as no courtyard - #266

Open
JeffMboya wants to merge 5 commits into
absmach:mainfrom
JeffMboya:SYN-265-apds9301-lux
Open

JeffMboya wants to merge 5 commits into
absmach:mainfrom
JeffMboya:SYN-265-apds9301-lux

Conversation

@JeffMboya

@JeffMboya JeffMboya commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

What type of PR is this?

This is a feature and a bug fix.

What does this do?

Names a product on 17 parts, adds five per-value parts, smaj15a_tvs and apds9301_lux, and reads circular courtyards.

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

Resolves #265. Related Issue #39, #152, #273, #275.

Have you included tests for your changes?

Yes. Four over a footprint's text: a circle's bbox, a rectangle unchanged, silkscreen ignored, none found.

Did you document any new/modified features?

No. Parts, a loader fix and corrected figures; registry/README.md already lists the directories.

Notes

Also corrects TPS22918's envelope (TI: 1–5.5 V) and a false RP2350 note; its map matches KiCad on all 61 pads.

The registry's light sensor is `bh1750_lux`, which names a footprint KiCad
does not ship and declares no symbol at all, so no board can export with it.
The Class-A irrigation controller needs an ambient light reading, so it needs
a part that resolves.

Broadcom APDS-9301, I2C, six pads. `Sensor_Optical:APDS-9301` and
`OptoDevice:Broadcom_APDS-9301`, both stock in KiCad 10.0.6 and both checked
before this file was written.

Pin numbers, names and electrical types are the symbol's rather than
transcribed by hand, and the footprint is the one that symbol names in its own
`Footprint` property. `adr_sel` is `required`: the address is 0x29, 0x39 or
0x49 depending on how it is strapped, and a floating one has no defined
address at all. `int` is not required — the device works polled.

`registry qualify` reports only `E-SYNTH-QUAL-008`, no provenance, which every
shipped part reports.

Carved out of the five-board bundle in absmach#196, where a registry addition did not
belong.
@JeffMboya JeffMboya changed the title SYN-265 - Add the APDS-9301 ambient light sensor the irrigation controller needs SYN-265 - The APDS-9301, and the courtyard three mechanical parts never declared Oct 23, 2026
@JeffMboya
JeffMboya force-pushed the SYN-265-apds9301-lux branch 2 times, most recently from 6a5d23b to c20f606 Compare October 23, 2026 03:58
@JeffMboya JeffMboya changed the title SYN-265 - The APDS-9301, and the courtyard three mechanical parts never declared SYN-265 - The APDS-9301, and a circular courtyard that read as no courtyard Oct 23, 2026
`courtyard_rect` matched `(fp_rect` and `(fp_line` blocks on `F.CrtYd` and
nothing else, and all three of KiCad's mechanical footprints draw their
courtyard as a single `fp_circle`:

  MountingHole:MountingHole_2.5mm   fp_circle r 2.75  -> 5.5 mm across
  TestPoint:TestPoint_Pad_D1.5mm    fp_circle r 1.25  -> 2.5 mm across
  Fiducial:Fiducial_1mm_Mask2mm     fp_circle r 1.25  -> 2.5 mm across

So the lookup returned `None` for each of them and
`pcb_courtyard_geometry_for_part` fell through to the declared
`footprint_dimensions` -- which for a mounting hole is the 2.5 mm *hole*, not
the 5.5 mm footprint. The placer then packed neighbours 1.5 mm a side too
close and `kicad-cli pcb drc` reported `courtyards_overlap`, which it was
right to do: the first routed run of the standalone `protected_power_entry`
had four of them, every one a mounting hole on top of another part, with H1
alone colliding with three.

A circle on `F.CrtYd` now contributes the bbox of `center` +/- `r`, where the
radius is the distance from `(center ...)` to the `(end ...)` point on the
circumference. Strictly additive: a footprint that already draws a rectangle
or a line loop is unaffected, and the only parts in the registry that reach
the new branch are those three.

The parsing is split out as `courtyard_rect_from_text` so it can be tested
over a footprint's text rather than an installed library, which is what the
four new tests do -- including that the 5.0 mm silkscreen circle in the same
footprint does not widen the answer, and that a footprint with no courtyard
still returns `None`.

Not fixed here, and left on absmach#273: the fallback drops `courtyard_margin_mm`
altogether, so any footprint with an `fp_poly` courtyard still reserves its
body rather than its courtyard. Proven by raising this part's declared margin
from 0.25 mm to 1.5 mm and getting a byte-identical placement. That branch
moves many more parts than these three and wants its own measurement.

One test moves with it. `a_net_less_board_feature_takes_the_border_and_not_the
_middle` allowed a feature 6 mm from the circuit envelope, and that constant
silently encoded a 2.5 mm hole: `place_board_features` searches a band of
`max(w, h) + gap` and packs against courtyards the placer inflates by its
extra margin, while the test measures the raw courtyard, so the furthest a
correctly-bordered feature can legally sit grows with the part -- about 5.25 mm
at 2.5 mm, about 8.25 mm at 5.5 mm. The tolerance is now the feature's own
extent plus 3 mm, which still catches what the test is for: placed with the
circuit rather than against it, these landed at the quadrant centres, 17 mm in.
…ootprint

`mounting_hole_m2_5`, `testpoint_pad_1_5` and `fiducial_1mm` each declared a
0.25 mm courtyard margin, which is not what their footprints draw:

  mounting_hole_m2_5   2.5 mm hole, 5.5 mm courtyard   -> 1.5 mm a side
  testpoint_pad_1_5    1.5 mm pad,  2.5 mm courtyard   -> 0.5 mm a side
  fiducial_1mm         1.0 mm mark, 2.5 mm courtyard   -> 0.75 mm a side

Measured from the installed footprints: the `F.CrtYd` circles are radius
2.75 mm, 1.25 mm and 1.25 mm.

This is documentation rather than behaviour. The geometry now comes from the
footprint itself, so nothing reads these numbers for these three parts --
which is exactly why they were able to drift this far. They are corrected so
that the declared figure agrees with the drawn one, and so the fallback does
something sensible if a footprint ever goes missing.
@JeffMboya
JeffMboya force-pushed the SYN-265-apds9301-lux branch from c20f606 to 421b176 Compare October 23, 2026 05:22
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 23, 2026
It was a correct protection chain that nobody could bring up, integrate or
switch. 23 components to 42, and every addition answers something a reviewer
would have asked.

The one real electrical defect first. U1's COMP and SS pins were unconnected.
Both are declared `passive` so nothing complained, but COMP is the MP2307's
error-amplifier output: with no compensation network the loop has no dominant
pole, so the converter rings or refuses to regulate. R6 6.2k and C8 2.2nF to
ground, which is the datasheet's typical network for a 5 V output -- stated in
the source as typical rather than measured, because it is. C9 100nF on SS sets
the start ramp so the buck does not current-limit into its own output
capacitance.

Then the things that make it a module rather than a schematic:

  - Four rails declared with `power`, so the regulator-range and load-budget
    rules have something to check and the schematic names V12_PROT, V5, V5_SW
    and V3V3 instead of numbering them.
  - J2 is a 1x4 header, not a 1x3: switched 5 V, GND, enable, GND. A
    downstream system can now shed the load the TPS22918 exists to switch, and
    the enable sits between two grounds so a short to either neighbour turns
    the output off rather than on.
  - R7 on QOD discharges the output when the switch opens. Without it a
    capacitive load holds the rail up after shutdown and the next soft-start
    begins from an unknown voltage.
  - D4 and R8 12k indicate the protected rail, behind the FET and the fuse, so
    the indicator is dark on reverse polarity and dark on a tripped fuse --
    the two faults a person needs to see. D3 on 3V3 stays.
  - U3 is an LP5907, not an AMS1117. The housekeeping rail drives an indicator
    and whatever logic a carrier adds, so it wants tens of milliamps, not 800,
    and an AMS1117 declared at its full rating puts its own junction near
    107 C through 60 C/W. W-SYNTH-THERMAL-001 is gone with it.
  - C10 and C11 bypass the switch input and the output at the connector, which
    is where a downstream load sees the impedance. Both E-SYNTH-POWER-004
    findings cleared.
  - Five test points, one per rail plus a ground reference, and four M2.5
    mounting holes hinted to the corners with two fiducials.
  - J1 on the left edge and J2 on the right: power in one side and out the
    other, which is how a module gets wired into a system and what keeps both
    connectors clear of the corner holes.

`synth validate` reports zero errors. E-SYNTH-POWER-001 twice,
E-SYNTH-POWER-006 and W-SYNTH-THERMAL-001 were all present before and are all
gone -- not suppressed, answered.

Measured on this tree:

  18 of 18 nets closed, none open
  582.3 mm over 179 segments and 32 vias
  kicad-cli pcb drc: 0 errors, 0 unconnected, 0 warnings
  routing verdict: validation_failed, not fabrication-ready

Not fabrication-ready, and for one reason: a single stitching via lands inside
U2.2, the load switch's ground pad, and this board declares the standard tier
which does not fill vias. Same net, so it shorts nothing -- it is the ground
pour reaching the bottom layer -- but an unfilled via in a pad wicks solder,
so refusing it is right. `requires via_in_pad` is deliberately not declared:
asking a two-layer power front end to be built on a filled-via process for one
ground via is a real cost for no electrical gain. The README says what a
reviewer's two options are.

The four `courtyards_overlap` errors this board reported before are gone with
the courtyard fix in absmach#266: the mechanical parts were reserving their feature
size instead of their courtyard.

What else is left is in the README's Limitations, and the one worth reading is
absmach#275: four of this board's parts declare a 5 V 100 mA envelope on a 12 V
1.5 A rail, which is placeholder registry data rather than a datasheet figure.
Until that is corrected the board's current capability cannot be checked by
anything but a reader.
@SammyOina

Copy link
Copy Markdown
Collaborator

Changes requested — APDS-9301 registry entry needs correction

CI is green, and the focused circular-courtyard tests pass. However, the new APDS-9301 part is not yet modeled accurately enough to merge.

Blocking

  1. Do not mark ADR_SEL as required. In registry/parts/sensors/apds9301_lux.synth.toml, pin 3 is declared required = true, but the APDS-9301 explicitly supports a floating address-select pin for its default 0x39 address. This forces every design to connect the pin and prevents the documented floating-address configuration. Make the pin optional, or model floating as a valid address mode.

    Datasheet: https://docs.broadcom.com/doc/AV02-2315EN

  2. Add provenance for the new part. Running synth registry qualify --part apds9301_lux --no-fail reports blocking E-SYNTH-QUAL-008 because the part has no reviewer or datasheet provenance. Add the reviewer and authoritative source before treating this registry entry as qualification-ready.

Follow-up quality issues

  • Add an integration test against the actual OptoDevice:Broadcom_APDS-9301 KiCad footprint. The current tests parse trimmed synthetic text and do not verify the real library file, layer filtering, or geometry.
  • The actual courtyard is 3.1 × 3.8 mm around a 2.2 × 2.6 mm body: 0.45 mm on X and 0.6 mm on Y. The scalar courtyard_margin_mm = 0.45 understates the Y keep-out when fallback metadata is used. Support axis-specific margins or use a conservative value and document it.

The circular-courtyard implementation itself looks reasonable; these changes are needed to make the new part electrically correct and qualification-ready.

Found while correcting the Class-A boards against review. Each is a statement
in the registry that a datasheet contradicts, and each was hiding a real
finding.

`tps22918_loadswitch` declared 3.5-15 V and 800 mA. TI's SLVSD76C gives
1 V to 5.5 V and 2 A continuous; the figures that stood were a linear
regulator's. It stayed invisible until a board declared its rails with
`power`, at which point a 3.3 V rail into the switch became an
E-SYNTH-POWER-009 error that was the registry's fault, not the board's.

`rp2350` carried a comment saying its numbers "match the referenced
MCU_RaspberryPi:RP2040 symbol" and that "the symbol+footprint are RP2040".
Neither was true of the map. Compared pad for pad against the installed
RP2350A symbol, hidden stacked supply pins included, all 61 agree: IOVDD on
1, 11, 20, 30, 38 and 45, DVDD on 6, 23 and 39, the exposed pad on 61. An
RP2040 is a 56-pin QFN with DVDD on 23 and 50. absmach#152 was filed from the
sentence rather than from the pads, and a board README then repeated it as
"laid out to the wrong device". The comment is replaced with what was
checked.

`smaj15a_tvs` is the 12 V transient clamp the Class-C board already carries,
needed here so the irrigation controller stops clamping a 12 V rail with a 5 V
array. Its comment called the MP2307's input rating 28 V; Rev 1.9 gives 26 V
absolute and 23 V operating. 24.4 V still clears 26 V, with less margin than
the file claimed, and the comment now says so.
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 23, 2026
A review found the 3V3 rail would have been 4.0 V, the reverse-polarity FET
conducting on a reversed supply, a 5 V clamp across a 12 V rail, and every
declared netclass assigned to nothing. All of that was right, and the
datasheet turned up more.

The buck. R2/R9 were 10k over 3k01. The MP2307's output is 0.925 x
(R1 + R2) / R2, so that is 0.925 x (1 + 10/3.01) = 4.0 V, above the
STM32G030's 3.6 V maximum, on a rail feeding the MCU and three sensors.
Rev 1.9's own Table 1 gives 26.1k over 10k for 3.3 V: 3.34 V, and
3.25 to 3.43 V across the feedback tolerance. C4 sat between FB and COMP,
which is not compensation; the pin description calls for a series RC to GND.
R17 = 2k32 and C4 = 15nF come from the datasheet's procedure (22 uF output,
20 kHz crossover, GEA 820 uA/V, GCS 5.2 A/V), calculated and not measured. EN
went straight to the 12 V rail; the datasheet's absolute maximum for every pin
but IN, SW and BS is 6 V and its pin description says to pull EN up to IN
through 100k, so R18 does. C22 on SS adds the soft start.

The reverse-polarity FET had its source on the input. A P-FET's body diode runs
drain to source, so that pointed it from the load back to the input and a
reversed supply forward-biased it through the load: the part meant to block
reverse polarity conducted it. Drain is now on the input, source on the
protected rail. D1 was gate to ground, which does nothing for Vgs, and the
Si2301's limit is +/-8 V; it is now a 5V1 zener from source to gate.

D2 was the 5 V `tvs_array_5v` on a 12 V rail. It is an SMAJ15A, 15 V standoff,
24.4 V clamp, which is under the MP2307's 26 V absolute maximum.

Rails are declared with `power`, which is what made the registry's TPS22918
envelope (an LDO's 3.5-15 V) show up as an error, fixed in absmach#266. Netclasses
are assigned: V12 and both valve returns route at 0.6 mm, measured per net. The
I2C class asks for 0.15 mm and the router draws 0.2 mm; the exported project
states 0.15, so the router is what does not honour it.

Schematic. Twelve decoupling capacitors sat 47-330 mm from their ICs and the
region boxes overlapped, because a pinned layout strung passives in rows far
from the parts they serve. Capacitors now live in the group of the IC they
decouple, each group is its own band, and the capacitors sit beside their ICs.
E-SYNTH-SCHEM-003 went 12 to 0 and -013 11 to 0. The junction warning
(-005) is still reported once.

Measured, three consecutive runs with fabrication output: 37 of 37 nets, 0
open, 0 DRC errors or warnings, no via in a pad, fabrication-ready. The
schematic, BOM, symbol library, position file and project are byte-identical;
the copper and all 67 placements are identical; the routed board and the two
copper Gerbers are not (absmach#277, and KiCad's embedded timestamps).

Not fixed, and said so in the README: W-SYNTH-DRC-016 still reports 106 layer
changes with no ground-return via. A 4-layer stackup with ground on every layer
only takes it to 81. Filed as absmach#280. The BOM still has 19 components without a
distributor identity; part numbers were not invented. No independent PCB review
has happened.
Twelve parts carried no distributor identity, so a BOM built from them could
not be ordered and W-SYNTH-SUPPLY-002 fired on every board that used them. Each
now names a manufacturer part number and, where one exists, the LCSC number
that JLCPCB also uses. Chosen to match the footprint the part already names,
not the other way round.

  jst_ph_4pin        S4B-PH-K-S(LF)(SN)     C157926
  jst_ph_3pin        S3B-PH-K-S(LF)(SN)     C157929
  jst_xh_2pin        S2B-XH-A-1(LF)(SN)     C163035   the -A-1 its footprint names
  mp2307_buck        MP2307DN-LF-Z          C18921
  tps22918_loadswitch TPS22918DBVR          C131941
  n_mosfet_irlml6244 IRLML6244TRPBF         C143946
  p_mosfet_si2301    SI2301CDS-T1-GE3       C10487
  d_zener_5v1        BZT52C5V1-TP           C78728
  spst_tactile       PTS645SM43SMTR92 LFS   C221880
  xtal_8mhz          X32258MOB4SI           C2682775  8 MHz, 12 pF load
  header_1x4         PZ254V-11-04P          C492403
  apds9301_lux       APDS-9301-020          (none)

The APDS-9301 has a manufacturer number and no LCSC number: LCSC lists the
APDS-9300-020 (C691994), which is a different device, and no listing for the
9301 turned up. A wrong number is worse than a missing one.

Two generic parts could not take a single product. `polyfuse` is used at
500 mA, 1.1 A and 1.5 A on different boards, and `l_generic_1210` at 6.8 uH and
10 uH, so one part number would put the wrong product on some BOMs. They stay as
they are for anything still using them, and five per-value parts are added:

  polyfuse_500ma   MF-NSMF050-2          C75464    1206, 13.2 V
  polyfuse_1r1a    MF-MSMF110/16-2       C210834   1812, 16 V
  polyfuse_1r5a    1812L150/16DR         C207070   1812, 16 V
  l_1210_10uh      CBC3225T100MR         C90315    1210, 900 mA rated
  l_1210_6r8uh     CBC3225T6R8MR         C223222   1210, 940 mA rated

The 1.5 A fuse is Littelfuse and not Bourns: Bourns' MF-MSMF150-2 is rated only
6 V, which a 12 V rail would exceed.

The existing `polyfuse` also has a footprint, Fuse_Bourns_MF-RG300, that is a
radial 3 A-hold device, which no board using it asks for.

All seventeen pass `synth registry qualify` apart from provenance (absmach#51). The
numbers come from LCSC and JLCPCB listings and datasheet-style summaries, not
from a purchase: confirm stock and the exact suffix before ordering.
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 23, 2026
The BOM had nineteen components, of fourteen distinct parts, with no
manufacturer or distributor identity, and the review asked for it to be
orderable. The registry now names a product on each (absmach#266). Two needed more
than a number: the generic polyfuse and the generic 1210 inductor are used at
different values on different boards, so one product could not be right for all
of them. This board now uses per-value parts:

  F1  polyfuse_1r1a   MF-MSMF110/16-2   1.1 A hold, 16 V, 1812   C210834
  L1  l_1210_10uh     CBC3225T100MR      10 uH, 900 mA rated      C90315

The fuse is no longer the radial 3 A-hold footprint the generic carried, which
none of the board's values asked for. That moved F1, and with it a failure that
nothing but Synth's own validator reported: the router ended the input net's
track at (11.8, 51.0), 0.04 mm outside the rounded corner of J1's pad 1.
kicad-cli accepts it, because the 0.2 mm track's width overlaps the copper;
the independent validator wants the end point on the pad and refused the
package. F1's pinned y is now the row of J1's pad 1, so the track runs straight.

W-SYNTH-SUPPLY-002 no longer fires on this board at all.

Measured, three consecutive runs with fabrication output: 37 of 37 nets, 0
open, 0 DRC errors or warnings, no via in a pad, fabrication-ready; 574
segments and 105 vias. Schematic, sub-sheets, BOM, position file and project are
byte-identical, the copper and all 67 placements are identical, and the routed
board and the two copper Gerbers are not (absmach#277, and KiCad's embedded
timestamps). Eighteen of twenty Gerber layers and both drill files are
identical once the timestamps are removed.

Two things the new part numbers made visible, written into the README. The
IRLML6244 is a 20 V part and the SMAJ15A clamps this rail at 24.4 V, so a surge
the clamp passes is across an off valve FET at more than its rating; that is
not changed here. And the inductor's 900 mA is a rated current, not a
saturation current.

Still not fixed: W-SYNTH-DRC-016 (absmach#280) and an independent PCB review.
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 25, 2026
A review found the 3V3 rail would have been 4.0 V, the reverse-polarity FET
conducting on a reversed supply, a 5 V clamp across a 12 V rail, and every
declared netclass assigned to nothing. All of that was right, and the
datasheet turned up more.

The buck. R2/R9 were 10k over 3k01. The MP2307's output is 0.925 x
(R1 + R2) / R2, so that is 0.925 x (1 + 10/3.01) = 4.0 V, above the
STM32G030's 3.6 V maximum, on a rail feeding the MCU and three sensors.
Rev 1.9's own Table 1 gives 26.1k over 10k for 3.3 V: 3.34 V, and
3.25 to 3.43 V across the feedback tolerance. C4 sat between FB and COMP,
which is not compensation; the pin description calls for a series RC to GND.
R17 = 2k32 and C4 = 15nF come from the datasheet's procedure (22 uF output,
20 kHz crossover, GEA 820 uA/V, GCS 5.2 A/V), calculated and not measured. EN
went straight to the 12 V rail; the datasheet's absolute maximum for every pin
but IN, SW and BS is 6 V and its pin description says to pull EN up to IN
through 100k, so R18 does. C22 on SS adds the soft start.

The reverse-polarity FET had its source on the input. A P-FET's body diode runs
drain to source, so that pointed it from the load back to the input and a
reversed supply forward-biased it through the load: the part meant to block
reverse polarity conducted it. Drain is now on the input, source on the
protected rail. D1 was gate to ground, which does nothing for Vgs, and the
Si2301's limit is +/-8 V; it is now a 5V1 zener from source to gate.

D2 was the 5 V `tvs_array_5v` on a 12 V rail. It is an SMAJ15A, 15 V standoff,
24.4 V clamp, which is under the MP2307's 26 V absolute maximum.

Rails are declared with `power`, which is what made the registry's TPS22918
envelope (an LDO's 3.5-15 V) show up as an error, fixed in absmach#266. Netclasses
are assigned: V12 and both valve returns route at 0.6 mm, measured per net. The
I2C class asks for 0.15 mm and the router draws 0.2 mm; the exported project
states 0.15, so the router is what does not honour it.

Schematic. Twelve decoupling capacitors sat 47-330 mm from their ICs and the
region boxes overlapped, because a pinned layout strung passives in rows far
from the parts they serve. Capacitors now live in the group of the IC they
decouple, each group is its own band, and the capacitors sit beside their ICs.
E-SYNTH-SCHEM-003 went 12 to 0 and -013 11 to 0. The junction warning
(-005) is still reported once.

Measured, three consecutive runs with fabrication output: 37 of 37 nets, 0
open, 0 DRC errors or warnings, no via in a pad, fabrication-ready. The
schematic, BOM, symbol library, position file and project are byte-identical;
the copper and all 67 placements are identical; the routed board and the two
copper Gerbers are not (absmach#277, and KiCad's embedded timestamps).

Not fixed, and said so in the README: W-SYNTH-DRC-016 still reports 106 layer
changes with no ground-return via. A 4-layer stackup with ground on every layer
only takes it to 81. Filed as absmach#280. The BOM still has 19 components without a
distributor identity; part numbers were not invented. No independent PCB review
has happened.
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 25, 2026
The BOM had nineteen components, of fourteen distinct parts, with no
manufacturer or distributor identity, and the review asked for it to be
orderable. The registry now names a product on each (absmach#266). Two needed more
than a number: the generic polyfuse and the generic 1210 inductor are used at
different values on different boards, so one product could not be right for all
of them. This board now uses per-value parts:

  F1  polyfuse_1r1a   MF-MSMF110/16-2   1.1 A hold, 16 V, 1812   C210834
  L1  l_1210_10uh     CBC3225T100MR      10 uH, 900 mA rated      C90315

The fuse is no longer the radial 3 A-hold footprint the generic carried, which
none of the board's values asked for. That moved F1, and with it a failure that
nothing but Synth's own validator reported: the router ended the input net's
track at (11.8, 51.0), 0.04 mm outside the rounded corner of J1's pad 1.
kicad-cli accepts it, because the 0.2 mm track's width overlaps the copper;
the independent validator wants the end point on the pad and refused the
package. F1's pinned y is now the row of J1's pad 1, so the track runs straight.

W-SYNTH-SUPPLY-002 no longer fires on this board at all.

Measured, three consecutive runs with fabrication output: 37 of 37 nets, 0
open, 0 DRC errors or warnings, no via in a pad, fabrication-ready; 574
segments and 105 vias. Schematic, sub-sheets, BOM, position file and project are
byte-identical, the copper and all 67 placements are identical, and the routed
board and the two copper Gerbers are not (absmach#277, and KiCad's embedded
timestamps). Eighteen of twenty Gerber layers and both drill files are
identical once the timestamps are removed.

Two things the new part numbers made visible, written into the README. The
IRLML6244 is a 20 V part and the SMAJ15A clamps this rail at 24.4 V, so a surge
the clamp passes is across an off valve FET at more than its rating; that is
not changed here. And the inductor's 900 mA is a rated current, not a
saturation current.

Still not fixed: W-SYNTH-DRC-016 (absmach#280) and an independent PCB review.
JeffMboya added a commit to JeffMboya/synth that referenced this pull request Oct 26, 2026
It was a correct protection chain that nobody could bring up, integrate or
switch. 23 components to 42, and every addition answers something a reviewer
would have asked.

The one real electrical defect first. U1's COMP and SS pins were unconnected.
Both are declared `passive` so nothing complained, but COMP is the MP2307's
error-amplifier output: with no compensation network the loop has no dominant
pole, so the converter rings or refuses to regulate. R6 6.2k and C8 2.2nF to
ground, which is the datasheet's typical network for a 5 V output -- stated in
the source as typical rather than measured, because it is. C9 100nF on SS sets
the start ramp so the buck does not current-limit into its own output
capacitance.

Then the things that make it a module rather than a schematic:

  - Four rails declared with `power`, so the regulator-range and load-budget
    rules have something to check and the schematic names V12_PROT, V5, V5_SW
    and V3V3 instead of numbering them.
  - J2 is a 1x4 header, not a 1x3: switched 5 V, GND, enable, GND. A
    downstream system can now shed the load the TPS22918 exists to switch, and
    the enable sits between two grounds so a short to either neighbour turns
    the output off rather than on.
  - R7 on QOD discharges the output when the switch opens. Without it a
    capacitive load holds the rail up after shutdown and the next soft-start
    begins from an unknown voltage.
  - D4 and R8 12k indicate the protected rail, behind the FET and the fuse, so
    the indicator is dark on reverse polarity and dark on a tripped fuse --
    the two faults a person needs to see. D3 on 3V3 stays.
  - U3 is an LP5907, not an AMS1117. The housekeeping rail drives an indicator
    and whatever logic a carrier adds, so it wants tens of milliamps, not 800,
    and an AMS1117 declared at its full rating puts its own junction near
    107 C through 60 C/W. W-SYNTH-THERMAL-001 is gone with it.
  - C10 and C11 bypass the switch input and the output at the connector, which
    is where a downstream load sees the impedance. Both E-SYNTH-POWER-004
    findings cleared.
  - Five test points, one per rail plus a ground reference, and four M2.5
    mounting holes hinted to the corners with two fiducials.
  - J1 on the left edge and J2 on the right: power in one side and out the
    other, which is how a module gets wired into a system and what keeps both
    connectors clear of the corner holes.

`synth validate` reports zero errors. E-SYNTH-POWER-001 twice,
E-SYNTH-POWER-006 and W-SYNTH-THERMAL-001 were all present before and are all
gone -- not suppressed, answered.

Measured on this tree:

  18 of 18 nets closed, none open
  582.3 mm over 179 segments and 32 vias
  kicad-cli pcb drc: 0 errors, 0 unconnected, 0 warnings
  routing verdict: validation_failed, not fabrication-ready

Not fabrication-ready, and for one reason: a single stitching via lands inside
U2.2, the load switch's ground pad, and this board declares the standard tier
which does not fill vias. Same net, so it shorts nothing -- it is the ground
pour reaching the bottom layer -- but an unfilled via in a pad wicks solder,
so refusing it is right. `requires via_in_pad` is deliberately not declared:
asking a two-layer power front end to be built on a filled-via process for one
ground via is a real cost for no electrical gain. The README says what a
reviewer's two options are.

The four `courtyards_overlap` errors this board reported before are gone with
the courtyard fix in absmach#266: the mechanical parts were reserving their feature
size instead of their courtyard.

What else is left is in the README's Limitations, and the one worth reading is
absmach#275: four of this board's parts declare a 5 V 100 mA envelope on a 12 V
1.5 A rail, which is placeholder registry data rather than a datasheet figure.
Until that is corrected the board's current capability cannot be checked by
anything but a reader.
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 APDS-9301 ambient light sensor the irrigation controller needs

2 participants