From 53be5d4de4df561b6e74e39b3d21c79beb15995f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leopoldo=20Rodr=C3=ADguez?= Date: Thu, 17 Sep 2026 20:12:59 -0600 Subject: [PATCH] descargas 0.4.0 + prueba final de unidad --- docs/descargas/SHA256SUMS.txt | 2 +- docs/descargas/hbox-v5-bringup-README.md | 26 ++++-- ...up_0.2.1.bin => hbox-v5-bringup_0.4.0.bin} | Bin 70084 -> 75524 bytes docs/descargas/index.md | 20 +++-- docs/procedimientos/v5-ensamble.md | 2 +- docs/procedimientos/v5-prueba-final-unidad.md | 75 ++++++++++++++++++ docs/procedimientos/v5-prueba-y-flasheo.md | 8 +- mkdocs.yml | 1 + scripts/sync-docs.sh | 3 +- 9 files changed, 119 insertions(+), 18 deletions(-) rename docs/descargas/{hbox-v5-bringup_0.2.1.bin => hbox-v5-bringup_0.4.0.bin} (50%) create mode 100644 docs/procedimientos/v5-prueba-final-unidad.md diff --git a/docs/descargas/SHA256SUMS.txt b/docs/descargas/SHA256SUMS.txt index 46e308a..eef56a1 100644 --- a/docs/descargas/SHA256SUMS.txt +++ b/docs/descargas/SHA256SUMS.txt @@ -1 +1 @@ -78b34f4603550c05fd4fd739a13fc20556d5e04816324271b9ef0f85b49ce092 hbox-v5-bringup_0.2.1.bin +a8de74b3d7768e9d5656ae0bff05475445c0cd2599ecfdc4ab081e517ed3d6ef hbox-v5-bringup_0.4.0.bin diff --git a/docs/descargas/hbox-v5-bringup-README.md b/docs/descargas/hbox-v5-bringup-README.md index 29e31fc..9eb1cbe 100644 --- a/docs/descargas/hbox-v5-bringup-README.md +++ b/docs/descargas/hbox-v5-bringup-README.md @@ -1,7 +1,7 @@ # hbox_v5_bringup — EinarBoard v5 first-flash bring-up firmware Bench-proves a newly assembled v5 board over USB-C **J11** only. Never powers the RTK stack. -Bench mode: `P`+`Y` stack ON/OFF, `n` NMEA monitor (fix 4 = RTK FIX). Console (0.2.1): CR+LF lines, `EVT` on every state change, named `STAT` every 5 s, `$PHLG` every 10 s in the fleet v3.x layout (server-parseable). +0.4.0 field-minimum: AUTO by default (stack self-powers with 5 V on P2, kept on through 5 V loss), watchdog, fan, link recovery, LEDs; charge OFF. Bench mode: `P`+`Y` stack ON/OFF, `n` NMEA monitor (fix 4 = RTK FIX). Console (0.2.1): CR+LF lines, `EVT` on every state change, named `STAT` every 5 s, `$PHLG` every 10 s in the fleet v3.x layout (server-parseable). Checks: HSE 25 MHz + USB CDC · LSE Y4 · I2C: PCF8574 0x20 / SHT40 0x44 / TMP102 0x48 / SC16IS752 0x4D · gauge + RGB LED walk · ADC · digital inputs. Prints PASS/FAIL, then a `STAT` line every 2 s. Console commands: `r` rerun · `g` gauge walk · `i` I2C scan · `h` help. @@ -23,19 +23,35 @@ generic variant defaults to HSI, which is not accurate enough for USB. ## Flash (DFU, J11) Hold **SW2** (BOOT0) → tap **SW1** (RESET) → release SW2 → device `0483:DF11` appears. ```bash -dfu-util -a 0 -s 0x08000000:leave -D release/hbox-v5-bringup_0.2.1.bin +dfu-util -a 0 -s 0x08000000:leave -D release/hbox-v5-bringup_0.4.0.bin ``` -or STM32CubeProgrammer → USB → Connect → Download `release/hbox-v5-bringup_0.2.1.bin` @ `0x08000000`. +or STM32CubeProgrammer → USB → Connect → Download `release/hbox-v5-bringup_0.4.0.bin` @ `0x08000000`. ## Release | File | Version | SHA-256 (first 16) | Size | |---|---|---|---| -| **`release/hbox-v5-bringup_0.2.1.bin`** | **0.2.1 (2026-09-17) — USE THIS** | `78b34f4603550c05` | 70 084 B | -| `release/superseded/hbox-v5-bringup_0.2.1.bin` | 0.2.0 — superseded (LF-only console, no EVT/$PHLG) | `78b34f46494f9ee1` | 64 780 B | +| **`release/hbox-v5-bringup_0.4.0.bin`** | **0.4.0 (2026-09-17) — USE THIS (field-minimum, AUTO by default)** | `a8de74b3d7768e9d` | 75 524 B | +| `release/superseded/hbox-v5-bringup_0.3.0.bin` | 0.3.0 — superseded (AUTO opt-in, no watchdog/fan/recovery) | `d4608c739cef2661` | 72 860 B | +| `release/superseded/hbox-v5-bringup_0.2.1.bin` | 0.2.1 — superseded (no AUTO mode; stack OFF on 5 V loss) | `78b34f4603550c05` | 70 084 B | +| `release/superseded/hbox-v5-bringup_0.2.0.bin` | 0.2.0 — superseded (LF-only console, no EVT/$PHLG) | `8491625d494f9ee1` | 64 780 B | | `release/hbox-v5-bringup_0.1.1.bin` | 0.1.1 — superseded (no bench mode) | `91ca6f87a86686be` | 55 104 B | | `release/hbox-v5-bringup_0.1.0.bin` | 0.1.0 — SUPERSEDED (no float printf, ETH_CS driven) | `1a9a77ae479c8f86` | 41 040 B | ## Changelog +- **0.4.0** (2026-09-17) — **field-minimum ("-fm")**: what a unit needs to be left on a machine for days **without the production + charge governor**. **AUTO is now the default** (only the flash byte `0x5A` means MANUAL; a virgin board powers the stack by itself). + IWDG 16 s watchdog · fan policy = v3.0.3 (vehicle 5 V+ign → 100 %; battery → thermostat 48/45 C on the hottest sensor) · + link recovery (no valid NMEA 60 s after a 90 s grace → 5 s stack cycle, max 1/5 min; RTK lost 15 min after having it → one cycle, + max 1/30 min; 3 NMEA-loss cycles → LIMP, stack stays ON) · gauge DB1-4 (3.60/3.75/3.90/3.97 V, −0.10 hyst) + RGB state via PCF8574 + (green RTK · blue on/no RTK · magenta on/no NMEA · yellow battery · red off) · thermal cut tbat/tntc ≥ 60 C, re-arm < 55 C, warning 50 C · + low battery cut 3.40 V, re-arm 3.70 V or 5 V return · `$PHLG` now carries `recoveries`, `limp`, `fan_pwm`, `state` PWRCYC/SLEEP, `link` LIMP + (verified against `retranslator._parse_phlg` + web_monitor badges). **CHARGE STAYS OFF — the pack is one-shot until the production port.** +- **0.3.0** (2026-09-17): **AUTO mode** (`A` toggles, persisted in flash via STM32duino EEPROM emulation — survives reset and + power loss; factory default = MANUAL). In AUTO the stack powers itself 3 s after 5 V is present on P2, no console needed. + **Battery-backup test:** in AUTO, losing the 5 V input keeps the stack ON from the pack and logs `EVT BACKUP inicio` / + `BACKUP fin dur= nmea_durante= vbat=` (NMEA continuity through the dropout = LTC4040 backup proven); stack dropped at + vbat < 3.40 V or tbat/tntc > 50 C (`AUTO(pausa)` until 5 V is re-plugged). MANUAL keeps 0.2.x behaviour (stack OFF on 5 V loss). + `STAT` adds `modo=` and `backup=`. Charge stays OFF in every mode. RAM +8 KB (EEPROM sector buffer). - **0.2.1** (2026-09-17): console made monitorable — every line ends CR+LF (no more PuTTY staircase); `EVT up=…` line on every state change (stack ON/OFF with reason and the expected voltages, ignition edge, 5 V present/lost, charger status/fault edges, first NMEA frame / NMEA lost >5 s, GGA fix-quality change, stack refused/cancelled); `STAT` every 5 s with named values diff --git a/docs/descargas/hbox-v5-bringup_0.2.1.bin b/docs/descargas/hbox-v5-bringup_0.4.0.bin similarity index 50% rename from docs/descargas/hbox-v5-bringup_0.2.1.bin rename to docs/descargas/hbox-v5-bringup_0.4.0.bin index d520dd8ca23214f6effcb217ba7d2e791f069959..7939648ece7287ee885cf1d3dc98387ac003a02e 100644 GIT binary patch delta 18655 zcma)k30PA{*Z%b7tnucFviZ zGZQ{MD&P2p+)4<`t*Rl)_x=lz|M=_5L&-Eef75?2N7H6Mj&wi~U>RT)psW0S*!pk8 z|EP~VL>W9pls~Q|%5}gDpf?~EFahx1c%r-nxC;0U(8W0S8I%K1euq0Np75G4et#YB z)r|5HX~8L!A@KbfXt;~%{djjvAQRSa1X$irtwNP8Xoed=bM)(VKR;j2+UJ;GRqPL5 zetnQyrI!eV1&f+G|m8A54%Nw;a7pYT)%sqxr) z#9X>1OU-YuoObD!BFS%u40-&72R!`G-G;;|g-4xH<*Z&QR5%42ssD8-;d-1VXX>jp z$AqY9c6mI*vtaqDolovQNEsxYv8#m7ocz4*an>i$fYLK^T{j)0dyi8IW1Itx{VXcs zHRk|hn5o}8{SoVL7?4e3LV!a|`GPlDW$Kp=K}%+o9j5ygjW6>foCRP4lK|OzwA3`zASuBVRX_KFepLr{JnU@$r`5I6!5#4yTXw}kvhti}^}0v-u7 zd&P~;hYc7sMimwQYM>DBU1y}!b0vFnb&TsCoxP+ ziQySLxlv;1V}7@V^w0<&RLT-HZD%W&8J1_0_^^7FZkaK%oWyH{w=0V~LuV?@Myoly zU%A;x62j^ObxX1jH<_0brf>6( zh_8`0Kc_2giwr%~EdZf;wsk3ut=kJp6w{}tq%F=)2-)TNyv8Nt9{J_!bJPp>< zrJ~oHrdA-^jw$)HDzII;t^Qo|Cl!aA^3a5?>TfPZQF)){9fl#dZ?5&P`6P0(zQIn8 z==7wVsPQ%T*^z~CZ|VC~Q;&*Ex0K=iUQ_H0f9=w(5DmsSIjBBgAc6V9qCo4VTkvPL-4K(Q3GGSbgSp-OSghvx^zoryVTUZ;!>0UoIqir=M#1JD+6DP(M9X_ zXu})HGXsweH~bJa1rsyFGv!sU*zD(^9 zuzXxFfNDo5um;$RKdK#7zy!1cgsIk4qI?zLJa~Nyu!ggY@+AbGQZULlfZqh50HM-J zZP|J5$?EE6qVkHt?y~$fxtp7a>O;;)@ppg3Z9-fn%(2S`gw-=Kemg=qC9e{u+7&yh zot4f|Sd<*Q*?1W;5K-<=X|DX+b0YF@KM+ach_K6AdAMmoMLTAh&hO{-%pfx81#MbG zKg)x8^NbK96&1|^Fe9R!)dlM2=tm&D*-aAGHK>FK?Ef(SBQMPK4RPVe8U=PH_v0w45>o93 z@X=03&< z6FMc0m!h*dgy|16^=HR6Tfb}$6$iRE+c3)-Yf4I>hDst8LTWZsQc5-Pkcnu(Ou%#q z4K>A!0MztSlS)l%DblEL?%O+CGXcW69zX>(1@uh_FJAn(hFZLfh>t}4h}7&S8xQ9n zG19U8s)=kp+;qr_0sUQ?`>*S(o6TFRo0n`o-TcW`Dh=mbPgd&WrK{sta@K2(HLYfsPR^S0WH7$ zUinw4qOA|q7UG*xJFYzC z9aw4ei+{+1mKqOa4ZOM(Yk;~YIwJ4x{Fr@OP3w%R>-Il?I%FqFPu49$&d8dDhF>Ch zt?KFmL(g(HR?`|)#l)EOPa_93#x);&$JJ@^jj1!@8(5c*?-avzduUa!@>%)U?ba7} zQaxN*wZ{&_5~mT0tLP%JxN4lVSS+YYk+23faxa)3)%I*qo1d@~jYmxOQiUW5M0l`D zeNW6X(eHO$nMUQ_i1Mx4fQE33-@f#0tx>BdamxB|h~9CR2BSJPOVt2{wH{IIrxj|d z#%E73OhDm-t_et<<4dmgmr_%!#$=B)j6v$tE;KZW#IJ9N$%%o+ls5zjb3HNUl$`Ss z(dAeXQ})mmaWFHO#1%K}(Jr|<%$TT;FwegMX*Vri+)G1+lv+z_DG9OawS^!MlC3!c zDWwukh(-G;!V9Eup5_w5gv`~FN~7j3!qhD50R!c}HJxr&w$EosDDZf|bzV+Vfz?Q- zTC*I`(~nVZfOgSM3f+jDK%AQ4F;=LD7Vr@W)HW9&>_NC3VQQ~?!z|Nv;W5M?G=`hK zVt3bI3!NMyoTv;CuDfSL4$emq_4(G9D*vG;G2<+O)#v_XpTshh4;eUny=hv7e{--3 zx*+M9RZKtW5odS;b*wHo+uHEk^`_i=(ygsGK&B%srkl)&&rXF{^oE{hW<*cZWJ9P4 zwrusD8ZM&R)!HiK$c_w5#|5WWQmo&dOia3AoJD@;z%*q_i0Q+d|3t1oY!e`EBz{u+ zxs%jZlDJ9jZ=W1%d?8|=)_S-0WSU-PHOJJXW&aZKq}JPh>|}ybZVE?*;ign$-dz(H zX+Gr=T9Z-HF6W5si?(NBI9i%n+FYqG{@+odq>Ib`I%*wz-H5|z{2HOT`&P;Ut#EZ{ zHdVEKPOmuCMFrW`c<|=orkHz1Jg44D7o1%;2cn9F&X;cv$R22T_vXOt{)US;?+xR2 zQco?P8IXtRxb*pQ%_vM0A>$?4q023u_tlv1vj8d^bmN){IQ&jGk_N1KD3S^m_de2P znBJ5WUNar^AS)t^7eA+Y4p;}KM!;IE{dDZ12WLD#wgceddjO^c6*rFBbwc-jF)Z&Gc>%wU4lutbgLIbW#;|L6~-005#=k4 zBrdGJzs|bcxB~lDL}P>Mck1?Ho46eD0^-9Ft?<1)mTNpW7cUsr5|<*uN6IBKFv z%YjOtVIJ;Q=z8cD!eDvCSoZ?sb-U@O2y>y4x0CbJjqJ1k#5x*QUkXFrJ?3CjuZP2q zDfvFf{H=WGF>JN4VEWZ!yS3!UTfy|Cv+t=U^6)fisodn4DhbijhA9#@Hx@{EQDeR_ zKRcp4A3dRlCC`{|2t%wtr3?$J577~Rv?13xGB?sp)XMreoe`5f&tX7mV~xRR&_`lN zV69m7OGK@!rNt{wag34}$2Vjdvkc+pEMqS-%~D}0jHq!5Em{r#q|Jc*mi+Nmt<;`s1>9J&RPi~J(182;x>e-u`%IvL!~+pjOf}= z*ZaW;Q%grRff}Y{#0LRWsSX3Ag)_=$P@Zl`^N>bQNK{MKgSHBB0 z{R|;yCWYbp&8{b0h)H>l)K`KTZK>sqKFUuQj;ym>B&siPhl{S=*S&IGK~0FBjn+po z!Z!|9t!N0A*o2tKAWmmF7lgb&I}|z<@HGejXP-gVE~dd}f^fd2^`CM?>EyugyUzU{ ztfA)NXuYp;sNCdA$Z#g-j`E5(y$YSVCWs3V2D_5<{f^zLBQJ`G5Btac2w!25ZL0#x~&>4*PS@kAF(QjKaNL-oBCH=Z|cwQ z@0)M!cF!VxUH=Kx3!ChUV>lvoHJ^~-8N_Ry43C4B5GR2CUC^S*>2G0k{&@ALoJZ{A zz20cTc2t~i z_Qx)Fd&TJH%@txZS^6>XVQi!x!Up}x-0Suu8$LqQ8Zau`99s<6o1WmG4IA9M()da9 z(4}TwTXXk{wau?oz)V$K;2Xn2tY3JD`q2ime@#B~npro_}+cN!gX{_7~3$-I1`p*CYq(h!F`6_ zBlh*qFwV%m-ZXP*kI&fS8-MRXrW@kRpP|hiLZUOAY|E$q?SC>A11>+*eDhv)IrR(& zcL7ox>SAs)vhW+$>rIm@a%_{0R@?QaEUCX)#?7|F2%oTxHGFF8YCjG>DEgBvFys4E zOtL)gQe(Vjykw0=HsFMTW~Maae3}z!mc{q}A;v6wrywf6JS|ry^pJ&T#FtkIUine2 zUqh6RgGA?fNKJx8QGG7$ccF^zl77c7>2XI4_6fcn(zPpG)OA~cu>L;UH&--Kmu|v!4s7fd`{A06nm;ui>V1=bjmYw&`P~Be9OH!bqbmQ1@eldzZl@ZD~PVDl7nuL|av>;u)H2n%z97sBOJ{Hl}A^|mvSbXa$}oe=!X zc4|ICJ%2$zPoc-30W3oZ*L7e%nfFHi8~W?^oX6^_Nlc1qoXI0T>p5;Xo*iPIZa&WE zM?_j*HgK=1gkRib7!gKQ(Jl1Isw;L9{Jil(M7lOTeSgkjaIn9?y-o&u#C%V{voXsv zgvx0#i(;0`fCKn|{c_^r1Wx(}!n-cif?`%7xo7McdKR)9yhf zPaDXyAGT@aF*;M!wp`ANA}_h4bX)b@>mHHw^tcpsyvK*nLd>bCKc1T}_yu%pNmACe zFaa82Y}E#+M6O#o=*B6WSiNC2R!opboaKH<&!jTKMt6BaOXI`HGtRAg)hqt9gV7N+ z5yn*=Y*K9v!`9Oyp0}4tZY)z2?YMP`+tnbt~af`7l$4}Yq{5#g5{U) zz}G0#Yn@DcR|W2&Y(3&`J3VCk*zdHP?qi?!AKV?4(B%8MTP60>!TzW_7ZZC8R!Sq> zuAE}Xjq$axubVa?4>_K3=i++js1RK67z~Wg0NN(EN9^sTM{~Wj>&Zuh6pT&^ zXCo|UGNo{a)KIMyo?uT$L#>4IRr6~HoIOz!z-&HTDN4cQt!%9? zp6;#GT?8)h8nJ<5E3vW28e#D9cpp55>zOEzIKiE49%CK`ZreJN%n8N>gU_M`W3r6y zFwiW^e~9sH^zq#eWs6ez@=X%; z^UZL>Pr%)5eGNgjzItjriri^Yp)dz)ydhToOCYTB($#;ui>nLHrc(KwTVYEBrPeLi zse#{c=VB{LG^VHkNnLw%yx8)RY_@iGdfUwk^l%H{6o6WlKY`tVE+eqLS}DBck?RgY z0Y%p#SS;)^?>MbJzRGWRuCbnW-MQl@Fn*f^hDqQ;O-f;yCsua>GaT#LmEZTqF1Yd! zbeun>QjaTV8@fR_msTm_1Fmk*B}1C0$CnR^pWg6P*ER$vzAeZ<-$~RzH*S%t`Xrvc z8Vb8}!M&-o>Iy6SRj7#`%{SzwSj)e!slq;%`Xu_mCy`>Y8m;C-Q>6>jZ4?1 z$1Q5iGB7c{V7E!^0}ZP9f=0i+GhtD=Dn+zP2(WfcGpP2E7=D#f2=>76nyR%>v<5}u zbM+dWT*%I8_8~hI>gVdmBi4Ronw>imxJM~C-IDkfB17g_zQe)^$HpAJk}i)HZd$5n^ZJ zXKL2j5@MP9?yoU_JjO67>2`I(VVf%cXaj7zp;tLQItRT$kJ15e^y!=?wV_Wgrl}wr zro}CWdgyVZm(f2v(j0?}7mxUqv-Kub-!f?1UVwTe+;zZVR!FP`f#rZbfL#C%v@0q` zNf+kn_wD8Bem^{rQJRrw5rAH&%tyXZ(CJy>QG`>0)qq_H)3X3Q7j&I~>ABzx=!Epr z(0$DAhSzhg@z|5_jgWS?+O*xaHh$9G=TFY*H`el^p<(*|n=k4W!Zk?$I<@MDS?XRt zq+>BTUs-_fjmk;*j;Pv?9G~DIajUV%J*zf5jZ?Q?VUA+5gtmCxEyn(@VEtbcAB!W( zaS24Z9k`3Zd!6APpm)(IegyP)0Izjc_Sb!7XajIJfGr%B%eXCcD5^lKFjPLm`w9UXzX`Pl*G ztZsJAy!?6k`PtX)=iehcF5P0*KZxur9R}On{JGg`-Em!;?SXu)eq8xu0wWt|nSIaY z&InIB#*}AktAshsr>8X7x&=DYVD~CPono9~n5s|D^4*Ae#5s;=TZYjZSw5{M7mg#3 zxYnVAMgySDan4ZNI3o@Z(x$;Jp6uxK^+>w}>TLA83>iPBLBmElJU1u7yQ8#B)XVSm zn-V;NG0}CjkE8YG7(+;TMh&$KNru$y5DSBPw2m)qqx9o#Ow33_ik14QGC26DQjDp3 zs)PfKgW%=h;N|FQX{-HX4@S8g5QwAtY{0Q#E2DHGu(YS|?uYJ)!=WNwx0pYG-gRTybzUEc z^a4OaFGjf>u!drkqfV)RA{>N-Mi-&7KkPX!% zg2(&2ZL#qr;5guQn{~1ARRmrJylA6?a@=`dx>9rFcuZYqVH+O1cg^M&{c*0JS1~Vt z3uxFgOQ(Ar7-OifS1D|B&N9x%9T*)`gOf--O|sCD&2Uc7ou1=6{HQH-jK?~qm^Fa2 zz^eKXpzj*BYSzxL7-{ z%_GC9mo7bDYoN|SW&LPfV!0-lB!7-G?xY+VPM|wpT+ouy)B=nHQ?)k=-zIFm zCp+9?n-|v3>rb6(`5rOo?Ud|P!+SWJ(GBe*R6PObZ?rLFP&=V2n>moNN_(~=k28cW ziBzu(k!dkt8NdQq16T*38&!IfMUTGIp=$K#OWkeM%|>;f4P}(2fNVfMU_M|1U_D?b z;57iL@D4l+{0krgp0+1KCNawR-q;=ks6UUo$+~=bU4A_3zoUM<50QsH8n}we2$oiA z54Q0mhOP=#3OgMn=9faQm<%4gF}Ox4JmKKq9Ga|nVgyk>naVd0{Zdhn;NcPc$Le{C zUl9CY1RobWiY@i<3u3pb%CRzIFqHCv{N30gYU)w)V z8uA$PTwq<0kmBYO;}el%shu~)uV+1O{#tx=ub6X|$uiyf;;@>CZ6qo{h&;#lN-!(c zI70agksf|Sf?65uW)P8i_)`hd>{lNCn}h+0A9$DvKQw-A-$ML_-#TL9OS5bIg>TN0 zn8;%9H4?MG&}Fm3F_?oce;&?94|}ewYwr#l(v9xA>01oHci|@ETZZ+G_7gs~&(HSP zaV!0V_v|=>4kyB?N`ei;8Za&!F| zq211{ltsyf5#AdsC?4kJzZ-s>{nN{DNt!cfmXi#+Y)?9((8)($vXdi5omMwSr$!Z< zsXw!k2$P)~BNrtIR~6jA8_IWxFv+PvIxGBS=hOiW3lsdWz*m4gl=hvSsD%a^x@_mi zk4Tg=!Za)gFy<=+?)o5={(c2?~Vu2&pK{!scY8ur&czW;)s6i#Ddm5=W*%J(D3 zrbtR#D)FVEB0JwNIk6Wbd|zjo%+-X~FiYe~jPP|GKR4L`6F0gJZ%?8ZF5YP0$rY|F z8!;l2)5&Ab{ch1P!lF9<trUnR!PWY5>_$w{o z8I0#mUaKg0!Tdoyy{e}~%bCaFo?&r+OH%xvVPgCdlEtt*u1GqHbDXb_{EMhXOB~eEeu-geaAaF?_mLY>?{U;JJ&b;f&9> zJi=P{X-8jy-#3E#eF01DaAA_@PntI`m2=mdA}SU)zp}LP6mc?b`%fX?*tc=V6{4dK zSSGpaiB0nl-=9*%hg|7E8m?W&%4(Q#L58f>83iA-14C`*}|VmG4?7$CK{vjO$|Cy)q{ydemZ8Q&O{Lb8r_yCOH?_i8YyQmXu%SV1+5aaK;&%n^S`W;s0^rh;J2D` zea2sL*-xT!pt8u@)sO^Yg^wA%B60P&Mww$`Tec+6F`casD?Z-?qdS?lHilV}B{PH+ zX9y%Cq)?(tz36GQoFUP2-FJmvF`%PIu0r>R`8!$A*MFG5_s_(R;t$jB=HPaR#lHb> zY~UV|-6-tW)DToB<1FXAqTs5GJfi*0dR4R~VCrZ^^a5gF-X2}bqfER%-VlcBM&iJl z(^`;}vKGEFZ*|?j>cZ}u0y+)9p3+JakYJ(tyy6)zu5pTEaH>F4V^Y>)A+KVF%Nw6R zrH1P#+53l$MJx(t&?|;}f3;bobs18`?YU-SIorL){M%d$a?CO2{5FZ!wpS)c6#7P{ z+kK5;V|UdDu=(wpRjLe{H(IcFmN`!}0!zXqnfbeHD6X(~`t`70jxa}4Q8GoCAyNw{ zMqI*@h?!K#IMuI*l&`XrUOCm5&xg?@(7Wbz*e!d;b^ET$J@&99Cf*NsP?I`GaSJG3 zaWLG0N9y43P8ny4H(Qzb&_?xoueinQ8^Au^-qHZdWpZ5zX7;$3#L$8qT~Z%AX})ex z+i@AsR6;UqwSQfWU7v)3T;EyN?zw6YPKptnvQL47YbKiHx*u)KsGBx+5FV*vis@9# z4O5C4t?~@pP*5o2&yAhL{>xeG8Qa0I4Gz9z{0?@rgMWI$JoX=s+U5z-3>3BJq(F-L zYc{ccJz~B47aIr5KOu?Q|A|R=us^f#b=oy-yMs^4$O{_k4nB8enXJewe&XP_W~^28 zbU$xbPuCeHXK>D&L}JLh-wdi!SHzST{ojX*I-&UT_XPI=I0s1SdD`(Hx6JU9sC|6 z#}0JxXN~h%#=%GAJk35;z`vezoW*)ND|arNVy}HOHz+XpPuKc9KV6D>zwDE*-QsU9 z{>xdZ-7mTnx_I+p*~^#R;)gCibau|fgRU9St$0{s|I6{_Xb87mmT~)iS-h##=EfVA z%1BoI*VR{S5hk~|*=3M;9`?81DS89WF&BSmcAw-@mj>k0lKuXZ?#uvrnM;F0cdu@= zePFLlbc+jJX;L~ZmWA{OT>Q=1T6TJSSm*+?C$CB@L|t z%g@l%4rgVgCQH298!fu)zI?*J+MdS6x;Zp9@x%)=HOS)oy*>Y`JUT{{m#MvK36{@ zG{WcERo`d#si#+N^fT-?f6%re=Bv3fT*F+^Kryhu1a;=`O4p|Rm-O0A5B`glImEa5 zf0#zd9pWJmzs-~;?+|Z$YcH4}h*#YLT2_m#nHCyLdel z7@X{fum^3(}COK5nX=X@Q-p&mYLZH|ia#|}_~ zI##Zo8de>Nhf5eWm-zcXEt8dJT;i1umw3s`Us-z~d<7o7o$}hnms~Qv3-*UTk7k9l zXU+Um4~=H`45|J2p;63$Jt&@b#xLi^J4e=pj_3M2#X;`lT1R6V*7GYvYa`Z8W!TTd zYgbmBlm(q}ab{}CT;k6zUj1ml;O8a63t*k5afzS5Q#<|98%*MBPK|D29lbCj>QFol zqmK8LaIcx{cWragVkO{Lh}wC;m7)BC%BTIV;7C};->DqkO^yQ+JtWbLW&D_`7#3OP zRYmurS*YEPg`x-PoZ==g|4h{m&MA)bo~O$$JKwv}OgXvV*}@Y)TdW>QkxnQl6{ z?(G_{ILCXWj-Eh%TjUbYI(FHMh`&+ZvY4SW$wYg^a3@Xm_31#JZy;#--cos{Xa`bV z;z0-h#fCx3^_>}b=Z1&@v>tuUV=I^xMdJ>85ywJ0qKQX5j7>MXk^I<>Oud7}4vfx) zTfB)8#%tm;Lok8k9WvuAb6AZpVeVx*o~uD zpw%0Pus_7{`!-G-@c5v}^WCAClQ*e4tE?TbVi`4UlXegU3ogeh)3N|ZkV)9^9SLSE$a zc11+=26-}|5I~bC97VY9Xzhkw(JZS;tbO^pZy5Ok3HVeisbmq+mL@4d-pCi1WEOQz`BzQu~nM8XwB@P_>-`)JT|c?_cuth7uX zk1)|&CaY8U?gthO7=&mv08_1F^|EX{Xmm4r<+=HN7^OOufBHbgSam9%-XZ!7;O}f# zrEI69Z1)$xB+HRF|9Ln;(dkGTaOBZmp&a$8{B1Urk^IRcXW5>| z`K8Zmqp8OU0*&$d#zB>f2zTq0XWnQdl_DK-(lQqQrI&{GY?l$32?o!hSs@Ve*3SRbn4ZmRP z>BRJF(56-@27Ph24d>d0D6FJW{4*!iGBk`ocfttlsSP~2j$zFl|M(lHY4t9CV)X$8 z9&+&4s^fy&@t%-GV^1qJxZKT$)$~K^dN-d|!-cfthXq7EyU~Puz9jg0+QpmvvYIhL z?ey6!8rv>*cktCUYf%ErdfcgrliI~JC+&2BZZ=Y1wfETfX|eMm1QY^H&xgw?HT>p#(1-=CdQO@4%w!@AKi^+>vFiX^HuMU z>wW+Rr3+3+*Is;o2uu6x;@dx*YHbxKd6!A@)h4#umr9{laWo!Aa*)L~@lpGd&eUI| z- zO7@R0*r$K%~4?o!;K5tFkkBCjxJ%DOE>>G4X>W1Ao*ra%v9rRQa`*5@EmcQ~c zRk&|ZeXIB$f98`|d8>HL%m4hzAPh!;lUH4cj%pP*di@U3(o8CcZiaX%$5wHjcQMqv zRjlW8FZ4zEYIn3QUPtp`&>Zw#(XI{AI=>c@LF;G}FY=o&j1F$aHjyg2ue&wayIsgc zr9HiTpHEY*oSi;{ZWYJ6$$t8b`(XG0lr2E%z1TLjit9aHMxs?zyOUCBZUuf>=BqUu zwXSZYt?P*^)>g5vo2Ivk6QtI>S$R@BseR=epfM_6%RNfzu{epQEo>Fvn(Cp9KDPNx zqBQ1{2pOayq#qy@aAT6MfiHN-esYjDF(tD%?`xu7YGS-6DV6@hfYMsUZ}`ZIk@2nK zryX4lr;|j~iyA4P6H+tl?o0cTFTB_v^7nw$l6P$65bX{ftXA=1Z=2|~`-AJxZr>E> zrQz_UZtd`INeUtdFdUz~{D(Y9eqd1+tuv*uReZFA=BGb(Z4=+MpRc1aP8W;VcDu61 z<=^9LX0IN*(y6%l2-%myyDyFlh5Sj&5T16$P$ShQ&a>C%e0D&t_)L;QzWHCzuyaS% zZfMvbQ(=vR5HiXi`qp;;dI7_J*0*-`J)UJt zaqsc-(`>w*Kl?MsM%eiue%{#YRv4pf15|xPl*Ye^@~^Pk)xW&S^q`jC3A%r{v@G(Y zf6HdtYpZ@sVdR3C;NjoCxlJaBzw(o91A)Kdi*39Ajn|ZRiC3@R;RR~vN8Xx`@3XgJ zsG&N0>t~7%-5x;EySF#6JED(j|6sv*nU~i!B@7Y7pE?BbEqJ>GaY2Vaq*K5Nl1?8r zB7zv<62w=%wR@V>vc$!U7ef#&ntglMX&w%JRKpQMl3}1TfhPj%fhW_I0(eRv{+h6n z@7Wd>m_B2AKFLkbn~|Qw7kg}0j{c=jSW&X5grjN0eQBJ!&|I>*a4a{tG=VEE;+Cu_ zT)n7}D_Y4dUS3#g9>*;z;uaS!SY5oZkeeVCjOBi=+$DvOYhiKGO5|9M5@m&!LawxA zc?tLwujCe%tVEZvYAIYk0o5Yog2J+*)y0L}I*=EZtSwr-PDL`aCQl{Pre^3# z!9S*E%+4TFXXFuWRvrjRiK&T6!xpdL4Q+G!6im&UmX$X>ixgx{&CJfsCnd|s$`XE6 z%Q&kxJ;OMofLn}u7p+-6Ves-brQFIDMTPSb!*xv&rEqIe`GmoV$&0yR6FXb=?~R(4 zKW+Mqnfdp6Lps?OuPk0zTykG|Ism@@PMvN>w#6mj`^=wPXDFuJ;_&Y7N(nv|Nv zEhs4|E#p!XM~~rV#*V|_tS&1;L5b&h+9tAg1lbr0_0*KxkZej64^j;F2yxgpGNyL03 zylPDm-eYv$+^L*EF-lND>9iw^RX@ zKp)qUTq&m>ykf+_gOD6oyA5AS;3W8(`2TN^V&vBXB5yMhpJW~=!B@ItW96b`BF*G!0G&i%h*}hpm zDK|eeUz!`A`NhD1X{P}$Em^R-Xl?OY+Vj$)GMG-EGE!MyS+sgdabYZ9=Dy1pc-7W_ zpH0a){pXCPK=NUyENgs1PZj9i1Y?poOX2E5&bKx|AgQIpRHLT9od@3DO_G z*&EOA@CNiE(~2zIh|yefQt~LD5$8Yj4pt^7jZGRoHYt^F@mBl9V{qx;Q398fm08Ly zDO|IpXgFpzp>udr5@B{{a>Kb%NnA!Emyteoa(ZU|R4%?AI%rFLW%}QzI z;?|Uw#3r6O!j#FZ#Ew0V7vKTV-+Rfh#s&g<1Hu6Jr*Vj@JJYZXOMd|)vEcw*O2YqK z0d@d0c$*RlSU8#}ivhzBo&op?X(y1U1$bR5{8dRx9JiA3k6K3T-X~{PMhEc742S|` z?IOw*!0P~G5Z(!Vm47SFkNMbdnBy4UX&%QvqyY{;NtCs~?lU^Jmm1OThqU;Ii z4Y+fNC=VXmeW(XBYGl>xXgVMOosI%rLO2WfLBL*wRVYn?{>cFJ7@I-=KhD72>R{&l t=n>dAKKYxkJv)3Z9?6wL-6{VE>>k*YnGs^gMw2rB`)o{h3xUjp{|CDaIT8Q> delta 13141 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 50 °C. `A` de nuevo regresa a MANUAL. El cargador sigue apagado en todos los modos. + !!! warning "Solo para la tarjeta v5" Este firmware **no** es el de producción: solo prueba la tarjeta (reloj, USB, cristales, I²C, LEDs, ADC) sin encender la etapa RTK ni el cargador. **Nunca flashear `blackpillrtkcode_v3` diff --git a/docs/procedimientos/v5-ensamble.md b/docs/procedimientos/v5-ensamble.md index 5de17e8..c4bc6f0 100644 --- a/docs/procedimientos/v5-ensamble.md +++ b/docs/procedimientos/v5-ensamble.md @@ -53,7 +53,7 @@ si el módulo ya está asignado. | Ítem | Notas | |---|---| | Gabinete HBOX con panel perforado (GX16-5, 3 × SMA, RJ45, prensaestopas) | según el diseño mecánico vigente | -| EinarBoard **V5-NN** aprobada, con firmware de bring-up **0.2.1 o superior** | ver acta de tarjeta | +| EinarBoard **V5-NN** aprobada, con firmware de bring-up **0.4.0 o superior** | ver acta de tarjeta | | simpleRTK2B Pro **ARD-NNN** y módem 4G NTRIP Master **RTK-NNNN** aprobados e integrados | con sus bolsas | | Fuente **Mean Well SD-15B-05** (24 V → 5 V) | va dentro del HBOX | | Pack de batería **1S4P** con NTC (3 hilos → P4) | conectar al final | diff --git a/docs/procedimientos/v5-prueba-final-unidad.md b/docs/procedimientos/v5-prueba-final-unidad.md new file mode 100644 index 0000000..f06fd9b --- /dev/null +++ b/docs/procedimientos/v5-prueba-final-unidad.md @@ -0,0 +1,75 @@ +# HBOX v5 — Prueba final de unidad ensamblada con firmware 0.4.0 (field-minimum) + +**Alcance:** unidad completa (EinarBoard V5 + ArduSimple + módem 4G + batería + antenas) dentro del HBOX, antes de embarcar. +**Firmware:** `hbox-v5-bringup_0.4.0.bin` (SHA-256 `a8de74b3…`) — descarga en . +**Duración:** ~45 min por unidad (P1–P6). Registrar todo en el acta de ensamble (`HBOX5-Exx-Axxx-Rxxxx`). + +!!! warning "Lo que 0.4.0 NO hace" + **No carga la batería** (cargador apagado). El paquete es de un solo uso: sostiene la unidad cuando se va el 5 V del vehículo + hasta 3.40 V y después la unidad solo funciona con alimentación del vehículo. Las unidades regresan a laptop (DFU en J11, 2 min) + cuando salga el firmware de producción. Anotar en el acta: *«fw 0.4.0-fm, cargador OFF»*. + +## 0. Preparación +- Consola: cable USB-C en **J11**, PuTTY/CoolTerm **115200**. Cada línea es `STAT`, `EVT` o `$PHLG`; teclear `l` para la leyenda. +- Fuente: **24 V** en P1 (entrada + ignición) a través del arnés GX16 real; el SD-15B interno da el 5 V. Batería en P4. NTC en P12 si la unidad lo lleva. +- Antenas GNSS y LTE conectadas; SIM instalada; módem en su socket. +- Guardar el log completo de la consola: `HBOX5-Exx-Axxx-Rxxxx_prueba-final.txt` (adjuntarlo al acta). + +## P1 — Arranque autónomo (2 min) +Energizar 24 V (con ignición) y **no tocar la consola**. + +| Esperado | Si falla | +|---|---| +| Banner `hbox-v5-bringup 0.4.0` · `modo=AUTO` · `inputs at boot: v5=5.2–5.4V(ok) ign=ON` | otra versión → re-flashear; `ign=OFF` → arnés pin 3 / divisor 22k-10k | +| `---- RESULT: 12 PASS / 0 FAIL ----` · `>>> BOARD OK` | cualquier `[FAIL]` → tarjeta a revisión, no embarcar | +| `EVT … STACK ON reason=auto` **sin teclear nada** (≈10 s tras el banner) | no enciende → `STAT` muestra `v5=` bajo 4.5 o `modo=MAN` (teclear `A`) | +| `EVT … NMEA primera trama` < 3 s después · `EVT FAN ON (vehiculo: 5V+ign)` | sin NMEA → ArduSimple no arranca: medir SW_5V (MOD1 pin 5) ≈ 5 V | +| LED RGB **azul** (etapa ON sin RTK) o **verde** (RTK); gauge DB1–DB4 según `vbat` | RGB rojo con `stack=ON` → PCF8574 / cableado LEDs | + +## P2 — Riel y módem (10 min) +Dejar la unidad 10 min encendida con el módem registrándose (LEDs del módem / la unidad aparece en el servidor). + +| Esperado | Si falla | +|---|---| +| `STAT … v5=5.2x–5.3x(ok)` **todo el tiempo**; nunca `(BAJO)` ni `EVT V5 BAJO` | `BAJO` → el riel cae con la ráfaga LTE: SD-15B ajustado a ~5.3 V en P2 (memo 24-Jul, PFI LTC4040) | +| `tbat`/`tair`/`tmcu` estables (< 45 °C en banco) · `i2cerr=0` | `i2cerr` subiendo → bus I²C / soldadura U3/U4/U13 | +| `$PHLG,0.4.0-fm,RUN,…` cada 10 s, `rec=0`, sin `LIMP` | `rec` > 0 sin causa → NMEA intermitente: revisar MOD1 / UART1 F9P | + +## P3 — Respaldo de batería (6 min) — **la prueba que nunca se había hecho en v5** +Con la etapa ON: **desconectar el 24 V** (se va el 5 V del SD-15B). Esperar 5 min. Reconectar. + +| Esperado | Si falla | +|---|---| +| `EVT V5 PERDIDO` → `EVT BACKUP inicio vbat=4.0x` (la etapa **sigue ON**) · RGB **amarillo** | la etapa se apaga / la tarjeta se reinicia (`reset=POR`) → el LTC4040 no sostiene: medir MAIN5V (C32) durante el corte, esperado 4.79 V | +| `STAT … stack=ON backup=Ns nmea=` **sigue contando** 5 min · `fan` según termostato (normalmente OFF) | `nmea` se detiene → SW_BAT/L6 (pista 0.3 mm, auditoría EMC) o paquete flojo en P4 | +| al reconectar: `EVT V5 PRESENTE` → `EVT BACKUP fin dur≈300s nmea_durante=N … SOSTUVO` | — | + +## P4 — Cielo abierto: primer RTK (10 min) +Con antena GNSS con cielo despejado y base activa (`$$$AS+` configurado): + +| Esperado | Si falla | +|---|---| +| `EVT GGA fix … -> RTK FLOAT(5)` y luego `-> RTK FIX(4)`; `STAT … gga=RTK_FIX sats≥10 hdop<1.5` · RGB **verde** | se queda en `GPS(1)`: correcciones no llegan → módem/NTRIP (`$$$AS+`), no el F9P | +| `$PHLG … RUN,OK,4,…` | `link=DEGR` permanente = NMEA sí, RTK no | + +## P5 — Recuperación de enlace (4 min, solo 1 unidad de muestra por lote) +Con la etapa ON y > 90 s de encendida: **retirar el ArduSimple del socket** (o su UART1) y cronometrar. + +| Esperado | Si falla | +|---|---| +| `EVT NMEA PERDIDO >5 s` → a los 60 s `EVT RECOVERY #1 sin NMEA 60s -> ciclo de etapa 5 s` → `STACK OFF reason=no_nmea` → 5 s → `STACK ON reason=recovery` · RGB **magenta** | no cicla → `modo=MAN` o < 90 s de gracia | +| Reinsertar el ArduSimple → `NMEA primera trama`; `STAT … rec=1` | — | + +## P6 — Apagado y acta (2 min) +- Quitar ignición: `EVT IGN OFF`, `EVT FAN OFF (bateria: termostato)`; la etapa sigue ON mientras haya 5 V (el SD-15B sigue con 24 V). +- Quitar 24 V: si la batería está, entra `BACKUP` (P3); dejarla hasta `SLEEP` **no** es necesario — reconectar y apagar con `P`. +- Guardar el log. En el acta: versión (`0.4.0-fm`), `uid=` del banner, resultado P1–P5, `vbat` final, y la nota *cargador OFF*. + +## Lectura rápida del LED RGB (para el técnico de campo) +| Color | Significado | +|---|---| +| **verde** | etapa ON, RTK fix | +| **azul** | etapa ON, NMEA sí, sin RTK (normal bajo techo / al arrancar) | +| **magenta** | etapa ON pero el F9P no habla (revisar ArduSimple) | +| **amarillo** | funcionando desde la batería (sin 5 V del vehículo) | +| **rojo** | etapa OFF (sin 5 V, batería < 3.40 V, > 60 °C, o apagada por operador) | diff --git a/docs/procedimientos/v5-prueba-y-flasheo.md b/docs/procedimientos/v5-prueba-y-flasheo.md index 4ee63dd..e3f1c64 100644 --- a/docs/procedimientos/v5-prueba-y-flasheo.md +++ b/docs/procedimientos/v5-prueba-y-flasheo.md @@ -37,7 +37,7 @@ y dejarla flasheada con el firmware de arranque entregado por ingeniería. | 1 | Fuente de banco 0–30 V con límite de corriente ajustable | | 1 | Cable USB-C ↔ USB-C (o USB-A ↔ USB-C) **con datos** (no solo carga) | | 1 | Laptop con **STM32CubeProgrammer** instalado (o `dfu-util` en terminal) | -| 1 | Archivo de firmware: **`hbox-v5-bringup_0.2.1.bin`** — descarga: **https://drogheda.helgen.online/descargas/** (repo: `04-Source-Code/firmware/hbox_v5_bringup/release/`, SHA-256 inicia `78b34f46`) | +| 1 | Archivo de firmware: **`hbox-v5-bringup_0.4.0.bin`** — descarga: **https://drogheda.helgen.online/descargas/** (repo: `04-Source-Code/firmware/hbox_v5_bringup/release/`, SHA-256 inicia `a8de74b3`) | | 1 | Jumper 2.54 mm para P11 (interruptor de corte) | | 1 | Lupa o lámpara con aumento | | — | Hoja de registro (sección 7) | @@ -183,7 +183,7 @@ Solo para tarjetas que pasaron las secciones 1 a 4. 2. Arriba a la derecha, en el selector de conexión elegir **USB**. Pulsar el botón de refrescar; debe aparecer `USB1`. Pulsar **Connect**. 3. Ir a la pestaña **Erasing & Programming** (icono de flecha hacia abajo, lado izquierdo). -4. **File path** → seleccionar `hbox-v5-bringup_0.2.1.bin`. +4. **File path** → seleccionar `hbox-v5-bringup_0.4.0.bin`. 5. **Start address** = `0x08000000`. Marcar **Verify programming** y **Run after programming**. 6. Pulsar **Start Programming**. Esperar "File download complete" y "Verify… successful". 7. Pulsar **Disconnect**. @@ -192,7 +192,7 @@ Solo para tarjetas que pasaron las secciones 1 a 4. ```bash dfu-util -l # debe listar [0483:df11] -dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.2.1.bin +dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.4.0.bin ``` ### 5d. Verificación después del flasheo @@ -206,7 +206,7 @@ dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.2.1.bin | **D17** (LED azul) + LED de panel en P8 (si hay) | **Parpadean** a 1 Hz (MCU ejecutando el firmware) | | **DB1 → DB4** (LEDs del indicador de batería) | Se encienden **en secuencia** una vez, luego se apagan; después R, G, B en P14 si hay LED RGB conectado | | Laptop | Aparece un **puerto serie** nuevo ("STMicroelectronics Virtual COM Port" / `usbmodem…`) | -| Terminal serie a **115200 baud** | Encabezado `hbox-v5-bringup 0.2.1` (si dice 0.1.1 o 0.2.0, re-flashear), luego líneas `[PASS]` / `[FAIL]`, y al final **`>>> BOARD OK`** | +| Terminal serie a **115200 baud** | Encabezado `hbox-v5-bringup 0.4.0` (cualquier otra version: re-flashear), luego líneas `[PASS]` / `[FAIL]`, y al final **`>>> BOARD OK`** | 3. Si el terminal se abrió tarde y no se vio el reporte: teclear **`r`** en el terminal → repite todas las pruebas (y vuelve a encender los LEDs en secuencia). diff --git a/mkdocs.yml b/mkdocs.yml index 9d7cccb..23a0cd0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -53,6 +53,7 @@ nav: - "EinarBoard v5 — Prueba y flasheo (lote 15 pzas)": procedimientos/v5-prueba-y-flasheo.md - "HBOX v5 — Módulos RTK/4G e integración (antes del ensamble)": procedimientos/v5-modulos-integracion.md - "HBOX v5 — Ensamble de la unidad y energizado final": procedimientos/v5-ensamble.md + - "HBOX v5 — Prueba final de unidad (fw 0.4.0, antes de embarcar)": procedimientos/v5-prueba-final-unidad.md - "EinarBoard 1.0 — Bring-up runbook": procedimientos/einarboard-1.0-bringup.md - "FW v3.0.3 — Prueba de banco (política de ventilador)": procedimientos/fan-policy-bench-test.md - "Histórico — Proto bench v3": procedimientos/historico-proto-bench-v3.md diff --git a/scripts/sync-docs.sh b/scripts/sync-docs.sh index 18c2764..b468443 100644 --- a/scripts/sync-docs.sh +++ b/scripts/sync-docs.sh @@ -10,6 +10,7 @@ declare -a MAP=( "06-Testing-Validation/2026-09-15_Drogheda_EinarBoard-v5_Procedimiento-Prueba-y-Flasheo_ES_v1.0.md|docs/procedimientos/v5-prueba-y-flasheo.md" "06-Testing-Validation/2026-09-17_Drogheda_HBOX-v5_Modulos-e-Integracion_ES_v1.0.md|docs/procedimientos/v5-modulos-integracion.md" "06-Testing-Validation/2026-09-17_Drogheda_HBOX-v5_Procedimiento-Ensamble_ES_v1.0.md|docs/procedimientos/v5-ensamble.md" + "06-Testing-Validation/2026-09-18_Drogheda_HBOX-v5_Prueba-Final-Unidad-FW-0.4.0_ES_v1.0.md|docs/procedimientos/v5-prueba-final-unidad.md" "06-Testing-Validation/2026-07-08_Drogheda_EinarBoard-1.0_BringUp-Runbook_v1.0.md|docs/procedimientos/einarboard-1.0-bringup.md" "06-Testing-Validation/2026-08-18_Drogheda_FW-v3.0.3_Fan-Policy_Bench-Test_v1.0.md|docs/procedimientos/fan-policy-bench-test.md" "03-Architecture-Hardware/watchdog-proto-bench-bringup-v3.md|docs/procedimientos/historico-proto-bench-v3.md" @@ -21,7 +22,7 @@ declare -a MAP=( "03-Architecture-Hardware/kicad/docs/GIT-GUIDE_Colaboradores-Externos_ES.md|docs/git/guia-git-es.md" "03-Architecture-Hardware/kicad/docs/GIT-GUIDE_External-Collaborators_EN.md|docs/git/git-guide-en.md" # Descargas para técnicos (firmware de bring-up v5) - "04-Source-Code/firmware/hbox_v5_bringup/release/hbox-v5-bringup_0.2.1.bin|docs/descargas/hbox-v5-bringup_0.2.1.bin" + "04-Source-Code/firmware/hbox_v5_bringup/release/hbox-v5-bringup_0.4.0.bin|docs/descargas/hbox-v5-bringup_0.4.0.bin" "04-Source-Code/firmware/hbox_v5_bringup/release/SHA256SUMS|docs/descargas/SHA256SUMS.txt" "04-Source-Code/firmware/hbox_v5_bringup/README.md|docs/descargas/hbox-v5-bringup-README.md" )