← Commit history
README.md+4−2
@@ -35,7 +35,7 @@ The original cabinet mechanical sources were not changed. Earlier two-layer and  ## Design limits and open checks -- Provisional regulated input 11.4–12.6 V; combined fan load 2 A continuous and logic load 0.6 A at 3.3 V. Confirm the exact Noctua suffix: industrialPPC variants differ.+- Provisional regulated input 11.4–12.6 V; combined fan load 2 A continuous and logic load 0.6 A at 3.3 V. Selected fans: two ARCTIC P14 Max units, listed at 12 V and 0.35 A each (0.70 A combined running current). The existing 1 A per-fan design allowance is retained; startup/stall current remains a bench check. - The 4 A fuse requires starting-current/I²t and available-fault-current qualification. The TVS clamps transients; it does not make an incorrect supply voltage safe for a fan. - Copper routing is complete. Native KiCad DRC reports zero violations and zero unconnected items; schematic ERC reports zero violations, and all 28 named nets match the intended circuit. Current/thermal screens use explicit load currents. Physical thermal and transient qualification remains required. - Power-stage simulation is a prescribed-duty periodic ripple screen. It does not model AP63203 compensation, startup, current limiting or load-step response.@@ -50,7 +50,7 @@ The finer 0.1 mm thermal screen for the final copper candidate found regional ri  ## Package contents -Open `fan-controller.kicad_pro` in KiCad 10. Version 0.1.1 is the native KiCad 10 save; the earlier 0.1.0 archive retains the KiCad 9 file. The project carries its symbols, footprints and models. `manufacturing/` contains the native checked files and JLC-formatted BOM/CPL. `docs/fan-controller-development.pdf` is the three-page review document. `docs/field-issues-review.md` records unresolved advisory findings. `firmware/` contains the ESPHome configuration and control-policy source; supply your own private credentials.+Open `fan-controller.kicad_pro` in KiCad 10. Version 0.1.2 documents the confirmed ARCTIC P14 Max fan model; the PCB is the unchanged native KiCad 10 save from 0.1.1; the earlier 0.1.0 archive retains the KiCad 9 file. The project carries its symbols, footprints and models. `manufacturing/` contains the native checked files and JLC-formatted BOM/CPL. `docs/fan-controller-development.pdf` is the three-page review document. `docs/field-issues-review.md` records unresolved advisory findings. `firmware/` contains the ESPHome configuration and control-policy source; supply your own private credentials.  ## Review drawings @@ -71,3 +71,5 @@ This 42-second silent review shows the assembled model, nominal enclosure fit, c ::adom-video{src="/matt/fan-controller/render/videos/review.video.json"}  [Download the review video](/matt/fan-controller/render/videos/fan-controller-review.mp4) · [Download the complete development package](/matt/fan-controller/render/downloads/fan-controller-development.zip)++Fan reference: [ARCTIC P14 Max specification, page 2](https://www.arctic.de/media/8a/18/01/1710507321/Spec_Sheet_P14_Max_EN.pdf). Listed speed is 400–2800 RPM, with stop below 3% PWM. The proposed 35% minimum control command stays above that threshold. The firmware’s two-pulses-per-revolution scaling remains an assumption to verify against an optical tachometer; this specification does not state pulse count.
docs/fan-controller-development.pdf+9−9
@@ -72,7 +72,7 @@ endobj endobj 10 0 obj <<-/Author (\(anonymous\)) /CreationDate (D:20261023115628-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261023115628-07'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (\(anonymous\)) /CreationDate (D:20261023120148-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261023120148-07'00') /Producer (ReportLab PDF Library - \(opensource\))    /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False >> endobj@@ -83,10 +83,10 @@ endobj endobj 12 0 obj <<-/Filter [ /ASCII85Decode /FlateDecode ] /Length 1302+/Filter [ /ASCII85Decode /FlateDecode ] /Length 1326 >> stream-GasaogJZcs&:N^lqU%kPU!_+_nRR#=OX38OMV<iuN2<dBM54!j0k"i^IZHs]0,RVl"sg[hkF=_a&WBD2R/S&$6oQ8pbo&6o_A+fGE%&Ao=a8?IrPffo?=u-#P6E#&\(>*F"L.<1a!(oSUbl3DlnVIA<N%/T"YIZY`q1oYB@!orLW=>>qiEGprZS)Vlu"_1RS@MqYb:geAoTmMLURfgT.'V/iTH4u&)]L_iOV)bG2W&j@`Q?`d3q8CYaO3gbgIaWI5SKikqjumac`pEE(2'7%V$F4Ms<_G^F8)7R>Hf]'C'QjO+P1,4$L\Y4Ki2aenTR3O.W2Jj#?l?Xba77MF?R*a=7I1g%5hUC'fkOe++"@3+W0K;^PgY[nMef0[5,^>r3(uiR*jc_=W7G/5!IuL6SZp$BYU#MO7GEJ7Qhi7_Fm61GgiBDu-71h.Dqnim+ma#SMVt=ikJSKrVJH6l%)KX:%<e<'lDBEU)!l*)rakBH1#0:RWp^@o/?=l]>#I:YQ/chGcj)XHO!(D>7-5OTPXi(+J6`;1M'WZUc3ihmES89"gBVH9hIgWh+]<?[lUrAG6g^XB%7627qPR\=*NfDm_E<Hb$L(a,bgPm&bZUp/_9=\ZiU^RGQ#]WB*JTbn#/VFj8B.h%k!LO&WQ>rfRp9do/5Q,[Qc\>pc`ZI1_l4V'tNS0>83*S5Q50,$,BlJejb>P80=^=<o24#aFhT^a-iDF_)sSe5g+>L:\WE@Z?P.iYi<4,lBJN_J'B3I;i8^4cupcj&Ka&b3O^^,5tDb.gY!GB]ch,4GN<-,CD3I1[n+o$pS\J7L=ZXNO.r4CRT@%ksmq<cUW:>9cr``45N:F5V0U!VRlNLXEkl)qb)jXqg_2X,YKs/qJOK?qFsLZ[Z=hD9?eop=^G/OJ9>`;Z#4-kDSpq,'V8^-5LX`FI]u=nY9W3IV6\D<j:r%6D1RO)&(ecS/16Ah72q898VUcl&?3%)<8BqjG-1'#*;%>$a5!XO>-[!@3KMh'g4i>J6SaeQ\6D=b-m#!JE8.kA(ui;rBJ^3:=;U.?\cBdHaYiVeQK\Ie;E+(`X^>UO'=5=!:N"H&FZth<ea\DaGfrsQ%Z)@:1r\7G&u;eO<*`o(?:AiLNO?0dW'&tPVr$[#f$,E3&,d?(9WHP`T1C-7,WUOgmT1RFaD+(Lmj?)#1pcok^HXGkc+)_>K/_E$QO>Y-bAQNA4a,(U6;Q<MFuJs5Ep1t94cO"!Xg@#)B4X/3[Qi784!SWh)d^gl%6(uFkp\Z?*34k"H5,MMN1+P.kkjV)@^b%Z.(]0a,8"]B~>endstream+Gasaofi$Qs&:N^lqU%lccq'o`4;fe$\-.Ub;0g7+=<?3h,`SP;5jEgr4W6mu!)p?8Q=tEe3IQ2cN(eVdrf0mNbE1#IN0m&mOr-,;Kf:gp:HH,FQik7nXG15j^h*07>-+.met(&;Z>`Q2K;HZ7,*c/^8eP:R9Q"N7s3c/_34ZT3s#.Csl&9NK6CLVd-GtV\R&5'`RLUu`=/02KFa*_>_I""+mMPTs%egFQfqP]6Y<OC=(-["MJ0\PZ[I''P8NQ]qC(\p/>#ph5@tDHZ&!+U3%;obMUl+%DM0YW5M@L<bER,,H^u@F>LJ1s^@Ii,e]Dmp6f@BC1IY1\>L"sa;jf-HR#\r%7(KG2[N@iV"p[i^R"MSfB\3=\r*"]@0L&oc7BHCd'UF/]enK*O@/E9`R8su]XOGO[J>gQ@`ODJ7AOf2`S)4Hr\2gs,)Y-LZ3MpAY499RV@=iK'O$<:^HP$+$JZ7[EI;$e\X`i2aPYZI+<TEh,Z<HArTr'J<S.(gJG4iI4ESdg)3F4W0RXfGA[eObHnf4#Bq>6#(%(TBqRQNcTK,)[^t9Tj2m$i-]\5mApFN8_$7lA4/sa'Yn7H\Onr`EU$de]MSfAiGo$k>Qp2:ijO_kB!,6573\aGNj2'?O"@ZdM?G*\t29!obPp^pd[Kd\u+acck^hEMc;TtreX-S5nDr8SjZ`(FIp,^oMoK9'r5)&^Vrf[WQI3FPB[s4D.o%tGA*ADKhP)O&1A-3M$[<]X=HbcTf+ZA']%5YKi6+R!Y03Aph<o%cj!nSi3Y)gNl\WWGh#s"ni@A]oS:k!^@tBt1YZg/0mqUD\3i_n#/84$n,pri@Lt)+S/k@bC!mm-!qKKC51$VRL0uCdiHB5bZDAAd=O.,==HA;dJ!i$((N9nQiY"t>0&28YIML:qm3>a*;KKu\QIjXl@%H%GY$)^Jo<@s>KdYOFO#.ok+7)n`lc?'HW3#SQH,3rX>K#(8EO[WU@;0/S-s@#N96*W?%$=/O$._h(@b7V4O$S,=(Cb93$E[Ed3'!#O\_;d4O/HM4Vd['+-rFGn%)HZ8-:<Uh;PMPA\7)]aa6<Z88YZY+;,sB+fKFX*=R$)sU%O?1BOZ-dqU+DEUs=a:XH$ranFiV64XGj4dM-bd`ZU83VWn5XpEGNjBWS?78EK[8rUipHZu-YY^[uU*R8g(K5ES9M8[8kJdB>l_MQ8U?hi&':BP-]O^V;I@c+)_>L0*![f+U!udrsqQ4a,(U64_dbFuJs-ZL?7+I2g;$>A(q2f#kG8Cj2cFG=LB[2S?D$)fBs@mj[fJNn)$L4UQ767a8>Ro_n0;@f=K;:At@Zlu;n~>endstream endobj 13 0 obj <<@@ -97,10 +97,10 @@ Gat=+9lo;b'#"%CaNI%tArJ8IM3%<9gUKK!"pS1Q%Wa(p!`rT(WCmj4)uJ[iAP&V52^Ysl*!Sj3W\Wo% endobj 14 0 obj <<-/Filter [ /ASCII85Decode /FlateDecode ] /Length 1704+/Filter [ /ASCII85Decode /FlateDecode ] /Length 1706 >> stream-Gat%b>Ar7S'Z],&.F)E]`3M#0[b*t,fKco&a]r<pp-qW<c'AtWP&b#>++A^&[d1:i[_dPJUr[WQs3<W".)me-mmTrmZ_IFCTd6I77EHYjd-?YRX,HrQ`%=c[d=*qk`lW=ed'oWnm1(E=]*Bd]\>Q4IMD`(62-)4V\Y^\1dP^tj\+;iHG7T`VkP$LldJ^t?QLh`aor%U;/KU4b\@u*pQsHmZ4P]s)X3\0LH10.s^i1uaL;TdOm,Y.DMk_(%)NUd%&o4aZHgPB<rcEXP;W>Sf;\s#.9VT@:MX=D8QO@6*W+*:Q"g^NQ`0ujt>`3@3E%p*pFUjH0Nn8&Z7O.*?X4;2HU]GN)SK,Ycc"oAlbB)'<-sckLnn=8nnT^5[H-&SP,T[\j&$eJbXp.mo<I$m>l?eHBE:R')fd+KHojb2>O8ncWeY6K8N9YN$HaE$BdX3S?o/hi)N9Zi=adHa8_9"1,ft-..Eb,Y<=2`fnWu"VhbN4b=d:DH9BN>IF=Ym`,NB:]1r/eJ4K!j+NDLLW1bFCLE'TT/q.="KRB2rSs?.#b0C#Ue_=SG04VhA8c3TW>U<n@qcn;-$Tr3Vt$VR>@YX$m3T>>&gGNPFh"Fp"pO@[@#mAK862]JD7OjbD2sl;r#6jn*=T3Nn\0rZnX%>]8R%[\P;`$#=cR$[+qudKPEU'J,RjB:BMu=p,JN<i?Fn9G>9]/8lHhXsnV?)iNe/$q]cRJ/p;<'AUoISpX$G<n$.0'uIb=0_$8::9Y63]P0?sS2$OcjW@!3!VDK,[RJN(Cr\CGAtKe]AR%;Tf:Iq_C[B#;lLY+dU@(eO]K-UNf\$U$V%ut?*J`8R'$a\,WZEhFO;=XDC8XT8`MZdN??+4Qr;=N'oVbcj$m7,*Qb9On)6I$L2*m%>XH3*ipi'O\ea(1O4IE!K6E=b1S>i@u\u#gHbf2@Z_KR%<bDIrY9@(Imkh!EaBT67MKd)Pl#$.!Y]ulMMnc2oeU/:4%T0=Di=g+\_\.F#9Xs-.e.r:!j1=U<7UNYCbq#PZ8_sMBjQO_$u+@sL::>^FL8tT]36`:#e/l2!,]B4IkQ$@8fPpC^_,nAtA4M#.QKG(Hg&(J]9dj8juU"1Nk4Db$EAdn'V3U>QTBAW<'dW>B7'H=tu!CuIP6&1!GcOLSd-&N^^1A7ZjV*!sAR=BP,dbZOM]G%UCej=G1n7W*+#P8a6F>D?[JI\O8'VnVQN+p\J&p;PLMm:fsb12cLa$$EKn:4Ol,lBY@FsMWfgU5muY*nVmS^n:D'2*mphOpK^cNPNBS7CARb$S<T,qQV`/'WDWb0HW0,=b\)];BOkodm<*0sdG6%/&onWX&4e`N?fd4X/C5kp5';nD]AjgYcWrn/?^5a9.O[:C1EW1231TPaD_X<-,DA"t_9=YqM1t+]#Cb/U%%=j6%APCB<rbb;*F[2keSTg'BM4*BF,$W-3\#);UW,r_Xi024ecDfbZ16X2>A$E3\8%QZ.q8gT-utT2K(tqLHI#63@C1mpC8?T29k3o4)-K_em.gcT#J1;[4n%B3@EI$nVcX,K1CM%aH!FV5f`>.e'XSRZ>F:D[D<L;,R([lK`ii]U:rIUdR/n9ZTB,_,c>pW"67W,ENPje&UTPG(k&tf><o*V&uEn4S$u.N@iOcbe(GTX[I97^5h="c@@>].aNY^WnMYXeFqH&CYlR1JhZkI%,PtDTV.3m!G[*soD~>endstream+Gat%b?Z4[W'ZJu$.IL\(`3LZ3s'"b4EGV:RRUiS+%==iqb%=;'$;!64YReK9dWV0<b>oIa'?]B!pR^9UF@%]gM170nU8o%%(C;B:XXZrK.&5<%bu\QToncnE7\fos1lRX_.&!!"HL3U9qm3Vn;Og\7H,Z4YTc0tsP[)\#Ds<GaVX+'Ho:*Ah:\3<Up#u*e7EbMOr:9IWRML*?>$PAc5Kk`]+7=#rU=C&`rOc3R#VaILd;X>h1-#*\_q@o+KZ<%$P/LPjf:K%%am\XN;G)>*C$MutP"CmtVKfa'l$OZ@"][,*U0q$#L0.C&Q>9@b(Cm-cch9ZGDg4D]1E&8.cW8*6O>>>BM]B`&k$XSDm5aJcPck$cGr/.HGWa+>]]>i8&s!CFZU'n<X/mcU<F4%[qEEnH3-d%Q_'J(PpLE[+ci<oDeY6K8N9YN$HaCn2dX3S?j#`-n!S'%BOu(@OJs026ZZX/;jiSEX/r6p;<_oH%QHL9XUWLmMd&[p@Z=\D7)Rmn-pn;`k"`(*&h>4u)QT6p!'Xk!D.="KRB2rS3>g]Y/DW4I/=SIkUc3^u&ElrSsXf`mPi@BYlctPKT9P_K;[tkCN>>&gGNBccYFp1kt0h[#p161-%?46mQ\Y1jKqNY<&3IORLkEXKNn&/(XlR`h/OVB)s@1A92_2`3!]AueWK&r/*Dc>Yf(5W1E$D$.5BgVZUj\<YJ0a4b+@o</mTkI^FYiB;:K)7'i-f7dUeMR)ONKADs-6@iZ$2/q#2Zq*a<s#:-q8X(P!'O;iD)!glgMr4)fgeIZ):snn[3m3K)UICkFoHnq;0OC8?6"ba4P:'2V%ut?-P!Bp,[@^J<BXZk@4b"Re]s:&MGK;[]],B,q"^,5k[(;j)*h@4/pUl&10V""DLrEIXH3*ipi%^Dme,QfcDKhKU"(BYcW!gL>uQG2B&f6hkrT'gZJoZOd\F#cqKOduXc]*LE5_:u+KElR='9Rq*e6mT1lC,bh'XHsleOB&$*b$.3YE^E_KI=Z6Qao?HFF?T+(//2SGjj`Bf:DLJn4f>oZak>oOW2+KH>+"nc4[,%Gt6``7ZY=P/3V4E>ZI5UDkOSB^lH!^n"^b?.+HFC0eZu_rG+CN+)W;BDq/XbY(_Z4Z=HWYsAj8E4"I?9F0;LkTGF\U=]Jo@unp*]<0ADq<.W@g7&O"mt<6?ZnU9C49bl`!HU[FSIBpM?p\R`JlSg=0J2!ZU(8/REG[S0Edd'<j.93eGX*bq&pfRh*D)p]G--h#CF8pIVmQWj,Z<Qi2jid`F+F`Wk?.JCnu!6p$&e&l9(Uo9ZL^.#j;@/Tf+dYST&hgD1Y[3#d(c`WH>jsU\@#tH7tb2'SV3LB0><mh%4Z^UfBA,Y*J!MUQ2oJ`2bd5.&i[Z2e_FtITI!#Yp'pR>jN6>f&NbH*nUDEu=/!)[-3l@)?2/!9_[hdi?ih?`mt"lc#'EBiRe;$'^jL:u*=E/=E"Qut=Dt:A]#Ll,X'gRpWa=J4m_j&l@@De^pS"7%s2V%Ok(_W>Wuf*Di=?sAn<7F/s!`mP3/nPP$pM0d@$dlg3i^!1nnpK0_e_=RH1<:UVge%:S*=VX`OEKS+!4BiZth#LT&L<k_k1TXb]b:.(Bi@18Q^.iFXPbWR)#Z8;0VfX6RO]D?Of9t!,rs</rJjn;7kL!:aSO_3YXrRqq6aBhn&-C2m0jP>Q#XFnMh#Gd+LY`G&G.~>endstream endobj xref 0 15@@ -117,12 +117,12 @@ xref 0000168242 00000 n  0000168523 00000 n  0000168595 00000 n -0000169989 00000 n -0000172267 00000 n +0000170013 00000 n +0000172291 00000 n  trailer << /ID -[<09fa56359c774ef18643c93471def2fb><09fa56359c774ef18643c93471def2fb>]+[<fb27456a18ae4ea3280dc238cbcbdd49><fb27456a18ae4ea3280dc238cbcbdd49>] % ReportLab generated PDF document -- digest (opensource)  /Info 10 0 R@@ -130,5 +130,5 @@ trailer /Size 15 >> startxref-174063+174089 %%EOF
docs/fan-model-confirmation.jsonadded+27
@@ -0,0 +1,27 @@+{+  "model": "ARCTIC P14 Max",+  "quantity": 2,+  "source": "https://www.arctic.de/media/8a/18/01/1710507321/Spec_Sheet_P14_Max_EN.pdf",+  "verified_specifications": {+    "voltage_V": 12,+    "listed_current_A_each": 0.35,+    "listed_current_A_pair": 0.7,+    "speed_RPM": [+      400,+      2800+    ],+    "stop_below_PWM_percent": 3,+    "connector": "4-pin PWM: 1 GND, 2 +12V, 3 tach, 4 PWM",+    "operating_ambient_C": [+      0,+      40+    ]+  },+  "assessment": "Listed running load fits the unchanged 1 A/channel design allowance. No PCB, BOM, Gerber or firmware logic change.",+  "remaining": [+    "Startup/stall current and fuse coordination",+    "Actual plugged-in connector height and cable clearance",+    "Tach pulses per revolution (firmware assumes two)",+    "Reset/unpowered PWM behavior and physical thermal/fault qualification"+  ]+}
downloads/fan-controller-development.zip
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -3,7 +3,7 @@   "type": "component",   "title": "Network cabinet fan-controller",   "brief": "Development PCB for two network-cabinet fans: local temperature control, independent PWM and RPM monitoring, and a nominal fit in the existing round enclosure.",-  "version": "0.1.1",+  "version": "0.1.2",   "visibility": "private",   "kind": "board",   "source": "kicad",
page.json+18−5
@@ -4,20 +4,25 @@   "type": "component",   "title": "Network cabinet fan-controller",   "brief": "Development PCB for two network-cabinet fans: local temperature control, independent PWM and RPM monitoring, and a nominal fit in the existing round enclosure.",-  "version": "0.1.1",+  "version": "0.1.2",   "visibility": "private",   "kind": "board",   "source": "kicad",   "hero": {     "type": "billboard",     "headline": "Network cabinet fan-controller",-    "subhead": "Rev A development \u2022 dual PWM \u2022 temperature and RPM monitoring"+    "subhead": "Rev A development • dual PWM • temperature and RPM monitoring"   },   "author": {     "name": "matt",     "email": "[email protected]"   },-  "tags": [],+  "tags": [+    "pcb",+    "fan-controller",+    "kicad",+    "network-cabinet"+  ],   "license": "proprietary",   "sample_prompts": [],   "discovery_triggers": [],@@ -44,5 +49,13 @@     "readme",     "viewers",     "files"-  ]-}+  ],+  "description": "Development PCB for two network-cabinet fans: local temperature control, independent PWM and RPM monitoring, and a nominal fit in the existing round enclosure.",+  "files": [+    "README.md",+    "docs/",+    "models/",+    "downloads/"+  ],+  "dependencies": {}+}\ No newline at end of file