← Commit history

Document released fan assets, live board pin mapping and remaining cooling checks

John Lauer ·0dc7a50c3c ·15d ago ·parent 789bee4
6 files changed +204−2
docs/build-clips.md+2
@@ -123,6 +123,8 @@ Two new raw recordings capture the actual ESD/link relocation and copper landing  ## Gentle fan states and connector harness, 9 October +<video width="100%" playsinline controls preload="metadata" src="/adom/adom-custom-electronic-load/render/videos/fan-hero/window-5969372-20261009-163213.mp4"></video>+ [Watch the labeled fan-state demonstration](../videos/fan-hero/window-5969372-20261009-163213.mp4). The actual canonical viewer shows a stopped rotor, smooth spin-up, steady rotation, smooth spin-down and rest. Wires and the added Adom connector stay still. This is simulated, deliberately slowed rotation, not hardware feedback. The Sunon factory variant has bare-ended wires; the Harwin termination is an added assembly.  The clip passed a full decode and contact-sheet review. The published wiki hero was separately checked through its full 20-second loop and animation-off mode. Native KiCad accepted the connector symbols and footprint. This does not establish physical mating, crimp strength, airflow or cooling qualification.
docs/completion-plan.md+5−1
@@ -8,7 +8,7 @@ Native-saved board 17 SHA-256 `653e54e711552eb2f16b6d01cd144fd82645a52c30ff11e39  ## Resume here -1. Inspect the live AdomLapper board and AIFlow run; current required step is routing revisit. Preserve other threads and project rules. The shunt experiment is adopted; continue the remaining thermal/cooling work after recording the routing proof.+1. Inspect the live AdomLapper board and AIFlow run; current required step is thermal-vias. Preserve other threads and project rules. The shunt experiment is adopted and routing proof recorded. Declared pour regions now match board 17; nine proposed D1 vias are under isolated native DRC and electrical review. 2. Continue the compact 5 W prototype basis announced on 9 October. It follows the original size/cost priority and 5 V/1 A DUT. The prior 25 W assistant assumption is documented as a future option, not a blocker. Keep the 55 C trip and all validation requirements. 3. Solve the actual MOSFET case/interface/sink/fan assembly and probe clearance. The shunt-via candidate now passes only with the verified GND stitch at (133.018,77.818). Earlier candidates without that stitch disconnected ground; do not replay them. Via-count acknowledgements require actual engineering justification, not a desire to advance the timeline. 4. Complete and revalidate pours, outline, same-board current/thermal Fields screens, net tour, full fitted-model/silkscreen review, native 3D, finish and fabrication exports in the enforced sequence. Record significant real actions. Never mark these passed to bypass an unresolved gate.@@ -16,3 +16,7 @@ Native-saved board 17 SHA-256 `653e54e711552eb2f16b6d01cd144fd82645a52c30ff11e39 6. Edit and review the 4–5 minute narrated film from actual clips. Label simulations and historical reviews; exclude static/rejected takes. No YouTube upload is implied by preparation alone.  The finish gate has not passed. The board is not released for fabrication.++## Fan component delivery++Sunon MF40200V1-1000U-G99 version 0.2.1 is published in source and registry: factory flying leads, explicitly added Harwin harness, connector symbols/header footprint, complete static STEP/GLB variants and gentle 20-second hero cycle. Published playback, stopped mode and native connector parsing passed. Wiki Skill Pack 0.8.42 and Component Widgets 1.1.17 teach restrained state heroes and honest termination variants. Three raw recordings were added; two full-cycle takes decoded and reviewed, one short take is not a complete cycle. This supporting task does not complete load cooling or the finish gate.
docs/fan-feedback.md+3−1
@@ -10,4 +10,6 @@ Host C tests cover slow, zero, implausibly fast, nonfinite and unqualified RPM,  The reusable [fan component page](https://wiki.adom.inc/adom/mf40200v1-1000u-g99) contains the symbol, mechanical mounting pattern, nominal STEP, animated GLB, thumbnails and fan-specific state skill. Its preview is simulated and does not switch this board's always-powered fan. The proposed motion contract separates `Fan.Housing` and `Fan.Rotor`; `Fan.Rotor.Revolution` plays at RPM/60 cycles per second, with explicit presentation scaling. Measured telemetry must carry freshness/validity; unknown feedback must never look like confirmed OFF. -Shared integration is pending owner review: [AIFlow PR 32](https://wiki.adom.inc/adom/adom-aiflow/prs/32), [component widgets PR 1](https://wiki.adom.inc/adom/component-widgets/prs/1), [wiki authoring PR 8](https://wiki.adom.inc/adom/adom-wiki-skillpack/prs/8), and [Probing issue 1](https://wiki.adom.inc/adom/adom-aiflow-probing/issues/1). These are proposals and a working reference preview, not a released probing simulator capability.+On 9 October, fan component 0.2.1, Wiki Skill Pack 0.8.42 and Component Widgets 1.1.17 were released with gentle hero-presentation guidance and explicit connector assets. The baked hero animation works in the published canonical viewer without a new state runtime. The optional Adom harness is M20-1060300 plus three M20-1180046 contacts, mating with J9 M20-9990346. Native board readback confirms J9 pins 1/2/3 are 5V_AUX/GND/FAN_TACH, matching the documented red/black/yellow assembly map. The factory fan is bare-ended; orientation, strip preparation, crimp and continuity checks are still required.++Interactive shared motion-widget integration remains proposed in [Component Widgets PR 1](https://wiki.adom.inc/adom/component-widgets/prs/1), [wiki motion-authoring PR 8](https://wiki.adom.inc/adom/adom-wiki-skillpack/prs/8), and [Probing issue 1](https://wiki.adom.inc/adom/adom-aiflow-probing/issues/1). These remained open when checked on 9 October. AIFlow PR 32 is closed, not merged; do not cite it as a pending runtime delivery. Published hero playback does not establish a released probing simulator capability.
docs/thermal-budget.md+6
@@ -27,3 +27,9 @@ A shorter sink can improve the height budget, but neither candidate resolves the The [IXTP15N50L2 manufacturer sheet](https://www.littelfuse.com/~/media/electronics/datasheets/discrete_mosfets/littelfuse_discrete_mosfets_n-channel_linear_ixt_15n50_datasheet.pdf.pdf) lists junction-to-case resistance 0.42 K/W and TO-220 case-to-sink 0.50 K/W. The latter does not establish the resistance of an added electrical isolator. The drain tab must remain isolated from a touchable sink. A selected isolator, both contact interfaces, spreading and mounting force need their own budget.  The [Boyd accessory catalog, page 101](https://info.boydcorp.com/hubfs/Thermal/Air-Cooling/Boyd-Board-Level-Heatsinks-Catalog.pdf) provides TO-220 alumina washer drawings, but its listed 1.57–1.78 mm thicknesses do not match the nominal 0.2 mm interface clearance study. These are research alternatives, not selected BOM items. Do not adopt distributor conductivity figures at elevated temperature as room-temperature design data.++## Insulating interface screen, 9 October++Henkel's [SIL PAD TSP K1300 technical sheet](https://datasheets.tdx.henkel.com/BERGQUIST-SIL-PAD-TSP-K1300-en_GL.pdf) specifies nominal 0.15 mm thickness and typical flat-plate resistance of 0.2 C-in2/W. For an illustrative 100 mm2 contact area, converting that area-normalized figure gives about 1.29 K/W, before application-specific differences. It therefore cannot justify the previous 0.5 K/W interface assumption. Actual TO-220 effective contact area, clamp pressure, spreading and tolerances require review. This is an excluded assumption, not a selected or qualified part.++The MOSFET datasheet's 1.13 N m mounting-torque limit is a maximum rating, not a recommended assembly torque or proof of isolator pressure. Do not use it as a crimp/clamp procedure. The ceramic alternative still needs an unambiguous drawing, contact-stack specification and assembly qualification.
mechanical/cooling-mount-screen.jsonadded+166
@@ -0,0 +1,166 @@+{+  "boardSha256": "653e54e711552eb2f16b6d01cd144fd82645a52c30ff11e39699b760402af51a",+  "status": "nominal-envelope-candidate-only",+  "sinkXY": [+    110,+    31.5,+    160,+    81.5+  ],+  "holePitchMm": 43,+  "holeCenters": [+    {+      "x": 113.5,+      "y": 35,+      "nearbyBodies": []+    },+    {+      "x": 156.5,+      "y": 35,+      "nearbyBodies": [+        {+          "ref": "R30",+          "bodyDistanceMm": 4.422951503238533,+          "radialClearanceMm": 1.422951503238533+        },+        {+          "ref": "MP4",+          "bodyDistanceMm": 3.4828149534535884,+          "radialClearanceMm": 0.4828149534535884+        },+        {+          "ref": "R29",+          "bodyDistanceMm": 3.25,+          "radialClearanceMm": 0.25+        },+        {+          "ref": "J8",+          "bodyDistanceMm": 3.5299998995144932,+          "radialClearanceMm": 0.5299998995144932+        }+      ]+    },+    {+      "x": 113.5,+      "y": 78,+      "nearbyBodies": [+        {+          "ref": "Q4",+          "bodyDistanceMm": 3.25,+          "radialClearanceMm": 0.25+        }+      ]+    },+    {+      "x": 156.5,+      "y": 78,+      "nearbyBodies": []+    }+  ],+  "assumedHardwareRadiusMm": 3.0,+  "bodyConflicts": [],+  "probeChecks": [+    {+      "ref": "TP13",+      "x": 108.0,+      "y": 66.0,+      "distanceToSinkMm": 2.0,+      "conflictAt2mm": false+    },+    {+      "ref": "TP11",+      "x": 109.6,+      "y": 85.2,+      "distanceToSinkMm": 3.7215588131856823,+      "conflictAt2mm": false+    },+    {+      "ref": "TP6",+      "x": 106.8,+      "y": 82.6,+      "distanceToSinkMm": 3.383784863137727,+      "conflictAt2mm": false+    },+    {+      "ref": "TP7",+      "x": 109.6,+      "y": 82.6,+      "distanceToSinkMm": 1.1704699910719591,+      "conflictAt2mm": true+    },+    {+      "ref": "TP4",+      "x": 100.8,+      "y": 77.2,+      "distanceToSinkMm": 9.200000000000003,+      "conflictAt2mm": false+    },+    {+      "ref": "TP3",+      "x": 109.6,+      "y": 80.0,+      "distanceToSinkMm": 0.4000000000000057,+      "conflictAt2mm": true+    },+    {+      "ref": "TP2",+      "x": 106.8,+      "y": 80.0,+      "distanceToSinkMm": 3.200000000000003,+      "conflictAt2mm": false+    },+    {+      "ref": "TP1",+      "x": 104.0,+      "y": 80.0,+      "distanceToSinkMm": 6.0,+      "conflictAt2mm": false+    },+    {+      "ref": "TP9",+      "x": 104.0,+      "y": 85.2,+      "distanceToSinkMm": 7.049113419430845,+      "conflictAt2mm": false+    },+    {+      "ref": "TP5",+      "x": 104.0,+      "y": 82.6,+      "distanceToSinkMm": 6.099999999999999,+      "conflictAt2mm": false+    },+    {+      "ref": "TP10",+      "x": 106.8,+      "y": 85.2,+      "distanceToSinkMm": 4.891829923454007,+      "conflictAt2mm": false+    },+    {+      "ref": "TP8",+      "x": 100.8,+      "y": 80.0,+      "distanceToSinkMm": 9.200000000000003,+      "conflictAt2mm": false+    },+    {+      "ref": "TP12",+      "x": 104.0,+      "y": 66.0,+      "distanceToSinkMm": 6.0,+      "conflictAt2mm": false+    }+  ],+  "probeConflicts": [+    "TP7",+    "TP3"+  ],+  "limitations": [+    "Mount holes are NOT on PCB",+    "Hardware type, insulation, spring preload and head diameter not selected",+    "Copper routing/zone clearance around new holes not checked",+    "Fan plenum, guard, wires, mating plugs and clamp tooling not included",+    "TIM material/contact resistance and exact MOSFET tab contact unresolved"+  ]+}
tools/screen_cooling_mount.pyadded+22
@@ -0,0 +1,22 @@+"""Conservative nominal mount screen; no board edits or fabrication release."""+from pathlib import Path+import json,math,hashlib+import sexp+P=Path(__file__).resolve().parents[1];a=json.loads((P/'mechanical/cooling-body-audit.json').read_text());board=P/'kicad/adom-custom-electronic-load.kicad_pcb';assert hashlib.sha256(board.read_bytes()).hexdigest()==a['boardSha256']+# 50 mm sink, mounting holes 43 mm apart; top-left corner revised away from USB/Q4.+sink=[110,31.5,160,81.5];holes=[(113.5,35),(156.5,35),(113.5,78),(156.5,78)];hardware_radius=3.0+rows=[]+for x,y in holes:+ nearby=[]+ for r in a['rows']:+  b=r.get('boundsMm')+  if not b or b[5]<0:continue+  distance=math.hypot(max(b[0]-x,0,x-b[3]),max(b[1]-y,0,y-b[4]))+  if distance<5:nearby.append({'ref':r['ref'],'bodyDistanceMm':distance,'radialClearanceMm':distance-hardware_radius})+ rows.append({'x':x,'y':y,'nearbyBodies':nearby})+b=sexp.parse(board.read_text());probe=[]+for f in sexp.find(b,'footprint'):+ props={v[1]:v[2]for v in sexp.find(f,'property')};ref=props['Reference']+ if not ref.startswith('TP'):continue+ x,y=map(float,sexp.first(f,'at')[1:3]);dist=math.hypot(max(sink[0]-x,0,x-sink[2]),max(sink[1]-y,0,y-sink[3]));probe.append({'ref':ref,'x':x,'y':y,'distanceToSinkMm':dist,'conflictAt2mm':dist<2})+result={'boardSha256':a['boardSha256'],'status':'nominal-envelope-candidate-only','sinkXY':sink,'holePitchMm':43,'holeCenters':rows,'assumedHardwareRadiusMm':hardware_radius,'bodyConflicts':[{'hole':[r['x'],r['y']],**n}for r in rows for n in r['nearbyBodies']if n['radialClearanceMm']<0],'probeChecks':probe,'probeConflicts':[r['ref']for r in probe if r['conflictAt2mm']],'limitations':['Mount holes are NOT on PCB','Hardware type, insulation, spring preload and head diameter not selected','Copper routing/zone clearance around new holes not checked','Fan plenum, guard, wires, mating plugs and clamp tooling not included','TIM material/contact resistance and exact MOSFET tab contact unresolved']};(P/'mechanical/cooling-mount-screen.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps({k:v for k,v in result.items()if k not in ['probeChecks','holeCenters']},indent=2))