hbox-docs/docs/formularios/prueba-v56v57.js
Leopoldo Rodríguez 6e4178cb51 Lote 2026-10-27_fw070pre-banco-ardusimple: 0.7.0-pre en Descargas (prueba), procedimientos y actas V5.6/V5.7, faltan ArduSimple
- Descargas: hbox-tarjetaV56_0.7.0-pre.bin en prueba/ (112 456 B, SHA-256 8dd26047…), fila V5.6/V5.7 y aviso
  «solo banco»; notas de versión 0.7.0-pre; README del firmware al día (sync).
- Procedimientos (borrador, T43): prueba y flasheo V5.6/V5.7 (con la revisión del firmware: 4 flancos, 180 s,
  DIN_4G en 0 V en Q, DE de U7 y R48 en banco) y ensamble V5.6/V5.7.
- Actas nuevas: prueba-v56 / prueba-v57, ensamble V5.6 / V5.7, banco del piloto; series ARD/RTK hasta 100,
  V56/V57; expediente, actas, producción y admin conocen los tipos nuevos.
- Bitácora 27-oct: firmware, procedimientos y actas, faltan ArduSimple.
- Tablero (lote aplicado): t-compras-ardusimple, D-27-7, notas en t-fw-070, t-banco-v5-procedimiento-t43,
  t-v56-banco-piloto, t-v57-banco-prototipos, t-inventario-inicial, t-compras-prioridad, t-plan-570.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QCy5VHMVLkAmftYM6swWmx
2026-10-27 20:33:16 -06:00

209 lines
18 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Acta de prueba por tarjeta — EinarBoard V5.6 y V5.7 con firmware 0.7.0-pre (27-oct-2026).
Tipos 'prueba-v56' (V56-NN) y 'prueba-v57' (V57-NN); una por serie. Las dos tarjetas comparten casi todo:
este archivo arma la configuración y v56.html / v57.html solo eligen la versión.
Procedimiento: procedimientos/v56-v57-prueba-y-flasheo.md (designadores de T43, los de la serigrafía).
- Las claves llevan el prefijo sNN_MM_ para que ver.html las muestre en orden, por sección.
- Cada etapa termina con «¿pasó?». Si no pasó, las secciones siguientes se ocultan (sus obligatorios dejan de
contar) y el acta se envía como FALLA desde el Cierre. */
window.actaV5x = function (ver) {
const v57 = ver === '5.7';
const V = v57 ? 'V5.7' : 'V5.6', P = v57 ? 'V57' : 'V56';
const empieza = (v, k, t) => String(v[k] || '').startsWith(t);
const NO = 'No pasó — me detengo (explico en Cierre)';
const FIN = ['s01_99_fin', 's02_99_fin', 's03_99_fin', 's04_99_fin', 's05_99_fin', 's06_99_fin', 's07_99_fin', 's08_99_fin'];
const hasta = n => v => FIN.slice(0, n).every(k => empieza(v, k, 'Pasó')); // pasaron las n etapas anteriores
const fin = (n, txt) => ({ tipo: 'radio', clave: FIN[n - 1], req: true, txt: '¿Pasó esta etapa?', opciones: [txt || 'Pasó — sigo', NO] });
const ohm = (k, txt, esp) => ({ tipo: 'medida', clave: k, txt, esperado: esp || '> 1 kΩ', u: 'Ω', ph: 'p.ej. 3.2k' });
const volt = (k, txt, esp, aviso) => Object.assign({ tipo: 'medida', clave: k, txt, esperado: esp, u: 'V' }, aviso ? { aviso } : {});
// ---------------- §4: rieles con fuente (MCU virgen) — lo único que cambia entre V5.6 y V5.7 ----------------
const rieles = v57 ? [
{ tipo: 'nota', txt: 'Puente de banco en <b>J2</b>. Fuente a <b>24.0 V</b>, límite <b>300 mA</b>, en <b>J15</b> (pin 1 = +, pin 2 = GND). Sin USB. J15 pin 3 al aire.' },
{ tipo: 'medida', clave: 's04_00_i', txt: 'Corriente en J15 a 24 V', esperado: '< 100 mA (típico 30–60 mA, a confirmar)', u: 'mA' },
volt('s04_01_veh', 'J3 pin 1 (VEH5V por JP1) contra TP1', '5.20–5.45 V (nominal 5.32)'),
volt('s04_02_main', 'J2 pin 1 (MAIN5V)', 'J3 pin 1 menos ≈ 20 mV'),
volt('s04_03_sys', 'J2 pin 2 (SYS5V)', 'igual que J2 pin 1'),
volt('s04_04_3v3', 'TP2 (3V3)', '3.23–3.37 V'),
volt('s04_05_sw5v', 'MOD1 pin 5 (SW_5V)', '0 V (obligatorio)', 'Con 5 V aquí: FALLA (la etapa RTK no arranca apagada).'),
volt('s04_06_3v3m', 'J8 pin 1 (3V3_MODEM)', '0 V (obligatorio)', 'Con 3.3 V aquí: FALLA (el módem no arranca apagado).'),
{ tipo: 'radio', clave: 's04_07_tp6', req: true, txt: 'TP6 (PFO) con 10 kΩ a TP2', opciones: ['Alto (≈ 3.3 V)', 'Bajo'] },
{ tipo: 'check', clave: 's04_08_frio', txt: 'U15, D21 y L4 fríos o tibios; K1 sin clic.' },
volt('s04_09_veh12', 'J3 pin 1 con la fuente a 12.0 V', '5.20–5.45 V'),
] : [
{ tipo: 'nota', txt: 'Puente de banco en <b>J2</b>. Fuente a <b>5.30 V</b>, límite <b>500 mA</b>, en <b>J16</b> (pin 1 = +5 V, pin 2 = GND). Sin USB.' },
{ tipo: 'medida', clave: 's04_00_i', txt: 'Corriente en J16', esperado: '< 300 mA (típico 100–250 mA, a confirmar)', u: 'mA' },
volt('s04_02_main', 'J2 pin 1 (MAIN5V) contra TP1', '5.20–5.35 V'),
volt('s04_03_sys', 'J2 pin 2 (SYS5V)', 'igual que J2 pin 1'),
volt('s04_04_3v3', 'TP2 (3V3)', '3.23–3.37 V'),
volt('s04_05_sw5v', 'MOD1 pin 5 (SW_5V)', '0 V (obligatorio)', 'Con 5 V aquí: FALLA (la etapa RTK no arranca apagada).'),
volt('s04_06_3v3m', 'J8 pin 1 (3V3_MODEM)', '0 V (obligatorio)', 'Con 3.3 V aquí: FALLA (el módem no arranca apagado).'),
{ tipo: 'radio', clave: 's04_07_tp6', req: true, txt: 'TP6 (PFO) con 10 kΩ a TP2', opciones: ['Alto (≈ 3.3 V)', 'Bajo'] },
{ tipo: 'check', clave: 's04_08_frio', txt: 'U14 y U9 fríos o tibios; K1 sin clic.' },
{ tipo: 'nota', txt: 'Apaga J16. Ahora <b>24.0 V</b>, límite <b>200 mA</b>, en <b>J15</b> (pin 1 = +, pin 2 = GND), J15 pin 3 al aire, J16 sin fuente: en la V5.6 el 24 V solo alimenta el buck del ventilador (U15).' },
{ tipo: 'medida', clave: 's04_10_i24', txt: 'Corriente en J15', esperado: '< 50 mA (sin ventilador)', u: 'mA' },
volt('s04_11_fan', 'J3 pin 1 contra TP1 (no contra J3 pin 2)', '4.85–5.15 V'),
{ tipo: 'check', clave: 's04_12_d12', txt: 'D12 apagado (sin J16 ni USB la tarjeta no tiene 5 V: correcto); U15 frío o tibio.' },
];
rieles.push(fin(4));
const cfg = {
tipo: v57 ? 'prueba-v57' : 'prueba-v56',
prefijo: P,
series: v57 ? 370 : 140, // piloto (5) + volumen (365 / 135)
tecnicoDesdeUsuario: true,
nombres: { leo: 'Leo Rodríguez', jesus: 'Jesús Romero', gibranlp: 'Gibran Ortega', daniel: 'Daniel Martínez' },
etiquetaSerie: 'Tarjeta ' + V,
titulo: 'Acta de prueba — EinarBoard ' + V + ' con firmware 0.7.0-pre',
subtitulo: 'Un acta por tarjeta (' + P + '-01 …) · ≈ 1 h con el juego de módulos de banco',
textoOK: 'APROBADA',
borrador: true,
intro: 'Llénala mientras avanzas por el procedimiento '
+ '<a href="../procedimientos/v56-v57-prueba-y-flasheo/">' + 'V5.6 y V5.7 — prueba y flasheo (0.7.0-pre)</a>. '
+ 'Designadores de T43 (los de la serigrafía): <b>SW1 = BOOT0 y SW2 = RESET</b>, al revés que en la V5.5. '
+ 'Si una etapa no pasa, marca «me detengo»: lo que sigue se oculta, llenas el Cierre y envías como <b>FALLA</b>. '
+ 'La serie PRUEBA sirve para practicar.',
secciones: [
{ titulo: '0 · Datos',
items: [
{ tipo: 'fecha', clave: 's00_00_fecha', req: true, guardaEn: 'fecha', txt: 'Fecha' },
{ tipo: 'check', clave: 's00_01_sha', req: true, txt: 'SHA-256 de <code>hbox-tarjetaV56_0.7.0-pre.bin</code> verificado contra <code>SHA256SUMS.txt</code> de Descargas.' },
{ tipo: 'texto', clave: 's00_02_ard', rows: '1', txt: 'simpleRTK2B de banco (ARD-NNN)', ph: 'ARD-004' },
{ tipo: 'texto', clave: 's00_03_rtk', rows: '1', txt: '4G NTRIP Master de banco (RTK-NNNN)', ph: 'RTK-0021' },
{ tipo: 'texto', clave: 's00_04_fuente', rows: '1', txt: 'Fuente de banco (marca y modelo)', ph: 'p.ej. Korad KA3005D' },
] },
{ titulo: '1 · Recepción e inspección (sin energía)',
sub: 'Con lupa. Un U14 dudoso no se energiza.',
items: [
{ tipo: 'check', clave: 's01_00_u14', req: true, txt: '<b>U14</b> (LTC4040, QFN): sin puentes entre pines ni bolitas de soldadura alrededor.' },
{ tipo: 'foto', clave: 's01_01_f_u14', req: true, etiqueta: 'u14-lupa', txt: 'U14 con lupa (de frente y de lado)' },
{ tipo: 'radio', clave: 's01_02_rx', req: true, txt: 'Radiografía de U14 de JLC', opciones: ['Llegó, sin defectos', 'No llegó', 'Llegó con defectos'] },
{ tipo: 'foto', clave: 's01_03_f_rx', etiqueta: 'u14-rayos-x', txt: 'Radiografía de U14', si: v => empieza(v, 's01_02_rx', 'Llegó') },
{ tipo: 'check', clave: 's01_04_ics', req: true, txt: 'Sin puentes en <b>U3</b> (MCU), <b>U2</b> (W5500), <b>U5</b> (SC16IS752) y <b>U13</b> (fuente del módem).' },
{ tipo: 'check', clave: 's01_05_pol', req: true, txt: 'Polaridad: «+» de C68, C30, C14, C73 y C1; banda de D2, D4, D8, D9 y D11'
+ (v57 ? '; banda de <b>D21</b> (B560C) y punto de <b>L4</b>.' : '.') },
{ tipo: 'check', clave: 's01_06_jp', req: true, txt: 'Puentes de soldadura de fábrica: <b>JP3 2-3</b> (LFP), <b>JP5 1-2</b>, <b>JP4 1-2</b> (3.50 V), '
+ (v57 ? '<b>JP1 cerrado</b>' : '<b>JP1 abierto</b> (no se cierra nunca en la V5.6)') + ', JP2 abierto, JP6 abierto.' },
{ tipo: 'check', clave: 's01_07_xtal', req: true, txt: 'Y2 y Y1 <code>25.000</code>; Y3 <code>3.6864</code> o <code>36.864</code>; Y4 de 32.768 kHz.' },
{ tipo: 'check', clave: 's01_08_mec', req: true, txt: 'SW1, SW2 y SW3 con clic; J7, J8, J9, J15' + (v57 ? '' : ', J16') + ' asentados; sin piezas faltantes ni quemadas.' },
fin(1),
] },
{ titulo: '2 · Cortos a tierra (sin energía)', si: hasta(1),
sub: 'Multímetro en ohms, punta negra en <b>TP1</b>. Lectura fija de 0–20 Ω = corto.',
items: [
ohm('s02_00_3v3', 'TP2 — 3V3'),
ohm('s02_01_veh', v57 ? 'J3 pin 1 — VEH5V' : 'J16 pin 1 — VEH5V'),
ohm('s02_02_main', 'J2 pin 1 — MAIN5V'),
ohm('s02_03_sys', 'J2 pin 2 — SYS5V'),
ohm('s02_04_in', 'J15 pin 1 — entrada del vehículo', '> 10 kΩ'),
ohm('s02_05_sw5v', 'MOD1 pin 5 — SW_5V (etapa RTK)'),
ohm('s02_06_3v3m', 'J8 pin 1 — 3V3_MODEM'),
ohm('s02_07_bat', 'J5 pin 1 — BAT_PLUS'),
fin(2),
] },
{ titulo: '3 · Riel de 3.3 V por USB (J7)', si: hasta(2),
sub: 'USB-C en J7. Solo energiza el MCU y la lógica de 3.3 V.',
items: [
{ tipo: 'check', clave: 's03_00_d12', txt: '<b>D12</b> (PWR, verde) encendido.' },
volt('s03_01_tp2', 'TP2 respecto a TP1', '3.23–3.37 V'),
{ tipo: 'check', clave: 's03_02_u4', txt: '<b>U4</b> tibio tras 1 min (si quema: FALLA).' },
fin(3),
] },
{ titulo: '4 · Rieles de 5 V con fuente (MCU virgen)', si: hasta(3),
sub: 'Con el MCU virgen el hardware debe dejar todo apagado: etapa RTK (R8), módem (R57), W5500 (R5) y K1.',
items: rieles },
{ titulo: '5 · Flasheo por USB DFU (J7)', si: hasta(4),
sub: 'Solo el USB en J7. Mantén <b>SW1 (BOOT0)</b>, pulsa y suelta <b>SW2 (RESET)</b>, suelta SW1 → STM32 BOOTLOADER (0483:DF11). Binario en 0x08000000.',
items: [
{ tipo: 'radio', clave: 's05_00_dfu', req: true, txt: 'Modo DFU', opciones: ['A la primera', 'Al segundo intento o con otro cable'] },
{ tipo: 'radio', clave: 's05_01_herr', req: true, txt: 'Con qué se flasheó', opciones: ['dfu-util', 'STM32CubeProgrammer'] },
{ tipo: 'check', clave: 's05_02_ok', req: true, txt: '«download complete» (o «File download complete») y verificación correcta.' },
fin(5, 'Pasó — flasheada y verificada'),
] },
{ titulo: '6 · Autoprueba (consola en J7, 115200)', si: hasta(5),
sub: 'Abre el terminal y pulsa SW2 (RESET); si llegaste tarde, teclea <code>r</code>.',
items: [
{ tipo: 'check', clave: 's06_00_enc', req: true, txt: 'Encabezado <code>hbox-v5-bringup 0.7.0-pre</code> y <code>board=EinarBoard V5.6/V5.7</code>.' },
{ tipo: 'radio', clave: 's06_01_flash', req: true, txt: '<code>flash=</code> en el encabezado', opciones: ['256KB (RCT6, piloto)', '512KB (RET6)'] },
{ tipo: 'check', clave: 's06_02_efcr', req: true, txt: '<code>RS-485: EFCR_A de U5 = 0x30 … bus libre</code>.' },
{ tipo: 'check', clave: 's06_03_mdm', req: true, txt: '<code>modem apagado: LED PC2=0 RTCM PC7=0</code> (0/0).' },
{ tipo: 'check', clave: 's06_04_leds', req: true, txt: 'D10 y el LED de panel parpadean; <b>D17 → D14</b> encienden en secuencia una vez.' },
{ tipo: 'medida', clave: 's06_05_temp', modo: 'text', txt: 'TMP102 U12 / TMP102 U8 / SHT40 (°C)', esperado: 'a menos de 5 °C entre sí', ph: '27.5 / 27.8 / 27.9' },
volt('s06_05b_de', 'U7 pin 3 (DE del RS-485) contra TP1, en reposo', '0 V', '≈ 3.3 V: el transmisor sostiene el bus (E-4): FALLA, avisa a ingeniería.'),
{ tipo: 'radio', clave: 's06_06_res', req: true, txt: 'Resultado de la autoprueba', opciones: ['>>> BOARD OK (18 PASS / 0 FAIL)', 'BOARD CHECK FAILED'] },
{ tipo: 'texto', clave: 's06_07_fails', req: true, txt: 'Líneas [FAIL] completas', ph: '[FAIL] ACCEL U1 @0x18 WHO_AM_I=0x00 …', si: v => empieza(v, 's06_06_res', 'BOARD CHECK') },
{ tipo: 'archivo', clave: 's06_08_cons', etiqueta: 'consola-autoprueba', txt: 'Captura de la consola desde el encabezado (opcional)' },
fin(6, 'Pasó — >>> BOARD OK'),
] },
{ titulo: '7 · Etapa RTK y módem con el juego de banco', si: hasta(6),
sub: 'Sin energía: simpleRTK2B de banco en <b>MOD1</b>, 4G NTRIP Master de banco en <b>J8/J9</b>, antena GNSS al cielo y 2 antenas LTE. Fuente: '
+ (v57 ? '<b>24.0 V en J15, límite 1.5 A</b>.' : '<b>5.30 V en J16, límite 3 A</b> (o la SD-15B ajustada a 5.30 V).') + ' Puente de banco en J2, USB en J7.',
items: [
{ tipo: 'medida', clave: 's07_00_nmea', txt: 'STACK ON → primera trama NMEA', esperado: '< 2 s', u: 's' },
{ tipo: 'check', clave: 's07_01_on', req: true, txt: '<code>MODEM ON (nmea)</code> y luego <code>MODEM_RST modem_on … 500 ms</code> en la consola.' },
{ tipo: 'medida', clave: 's07_02_vivo', txt: 'MODEM ON → MODEM VIVO', esperado: '< 60 s (el MCU espera hasta 180 s por escalón)', u: 's' },
{ tipo: 'radio', clave: 's07_03_por', req: true, txt: '<code>MODEM VIVO por</code>', opciones: ['led', 'rtcm'] },
{ tipo: 'check', clave: 's07_04_k1', req: true, txt: '<code>MODOB ON</code>: K1 hizo clic.' },
volt('s07_05_sw5v', 'MOD1 pin 5 (SW_5V)', '5.0–5.4 V'),
volt('s07_06_3v3m', 'J8 pin 1 (3V3_MODEM)', '3.25–3.40 V'),
{ tipo: 'medida', clave: 's07_07_rtcm', txt: 'MODEM ON → primer STAT con rtcm > 0', esperado: '< 60 s (registro + NTRIP)', u: 's' },
{ tipo: 'medida', clave: 's07_08_tipo', modo: 'text', txt: 'STAT: tipo= y B/s', ph: '1077 · 320 B/s' },
{ tipo: 'radio', clave: 's07_09_d13', req: true, txt: 'D13 (LED del módem) con el módem vivo', opciones: ['Parpadea', 'Fijo', 'Apagado'] },
{ tipo: 'medida', clave: 's07_10_led', modo: 'text', txt: 'led= de tres STAT seguidos (flancos por 30 s)', ph: '121 / 119 / 120' },
volt('s07_10b_r48', 'Solo si D13 parpadea y led=0: PC2 en el lado del MCU de R48, con el LED del módem encendido', 'anota (≥ 1.8 V se lee como alto)'),
{ tipo: 'medida', clave: 's07_11_fix', txt: 'Encendido → fix=4 (RTK FIX), tecla n', esperado: '< 10 min con cielo', u: 'min' },
{ tipo: 'medida', clave: 's07_12_sats', txt: 'Satélites con fix=4', esperado: '≥ 10', u: 'sat' },
{ tipo: 'check', clave: 's07_13_m', txt: 'Tecla <code>M</code>: pulso de RESET; el módem vuelve a VIVO (normalmente < 60 s).' },
{ tipo: 'check', clave: 's07_14_q', txt: 'Tecla <code>Q</code>: K1 se suelta, MODEM OFF, K1 hace clic 5 s (DIN_4G en 0 V), se suelta, MODEM ON (pwrcyc) y el módem vuelve a VIVO.' },
volt('s07_14b_q3v3', 'J8 pin 1 durante los 5 s de Q', '< 0.3 V', '≈ 1 V: algo alimenta al módem apagado (E-13): anótalo y avisa a ingeniería.'),
{ tipo: 'check', clave: 's07_15_off', txt: 'Tecla <code>P</code>: STACK OFF en orden — K1 suelto, MODEM OFF y luego la etapa.' },
{ tipo: 'medida', clave: 's07_16_i', txt: 'Corriente de la fuente con la etapa y el módem encendidos', esperado: 'anota (se fija con el piloto)', u: 'mA' },
{ tipo: 'check', clave: 's07_17_u13', txt: 'U13 y L2 tibios tras 5 min.' },
fin(7),
] },
{ titulo: '8 · Batería y respaldo', si: hasta(7),
sub: 'Con el juego de banco. <code>P</code> apaga la etapa; conecta el paquete en <b>J5</b> (1 = BAT+, 2 = GND, 3 = NTC); <code>P</code> + <code>Y</code> la enciende.',
items: [
volt('s08_00_voc', 'Paquete LFP en vacío', '2.8–3.6 V'),
{ tipo: 'medida', clave: 's08_01_vbat', modo: 'text', txt: 'STAT vbat / tcel', esperado: 'vbat ≈ paquete; tcel ≈ cuarto (n/c = NTC sin conectar: FALLA)', ph: '3.28 / 25.1' },
{ tipo: 'check', clave: 's08_02_carga', req: true, txt: '<code>carga=ON ltc=CARGANDO</code> unos 150 s después de STACK ON.' },
{ tipo: 'medida', clave: 's08_03_ichg', txt: 'Corriente de carga (pinza de CD en el cable de J5 pin 1)', esperado: '1.2–1.4 A (paquete abajo de ≈ 3.4 V)', u: 'A' },
volt('s08_04_tp7', 'V(TP7) con la carga encendida', 'anota'),
{ tipo: 'medida', clave: 's08_05_r68', txt: 'V(R68) en sus pads, escala de 200 mV', esperado: '≥ 10 mV', u: 'mV' },
{ tipo: 'medida', clave: 's08_06_kelvin', txt: '(V(TP7) / 32) / V(R68)', esperado: '1.0–1.1', ph: '1.04' },
{ tipo: 'tabla', clave: 's08_07_cortes', txt: 'Respaldo: apaga y prende la fuente (' + (v57 ? 'J15' : 'J16') + ') tres veces, 30 s cada vez',
etiquetaFilas: 'Corte', filas: ['1', '2', '3'],
columnas: [
{ k: 'reset', txt: '¿El MCU reinició?', opciones: ['no', 'sí'] },
{ k: 'modem', txt: 'Módem en batería', opciones: ['VIVO', 'se cayó'] },
{ k: 'nmea', txt: 'nmea= sigue subiendo', opciones: ['sí', 'no'] },
{ k: 'vuelta', txt: 'Al volver los 5 V', opciones: ['sin reset, módem vivo', 'reinició', 'módem mudo'] },
] },
{ tipo: 'check', clave: 's08_08_tp6', txt: 'TP6 bajo durante el respaldo (con 10 kΩ a TP2).' },
fin(8),
] },
{ titulo: '9 · Ignición y ventilador', si: hasta(8),
sub: 'Ventilador de 5 V en J3' + (v57 ? '' : ' y 24 V en J15 pin 1 para su buck (además de J16)') + '. Segunda fuente (límite 50 mA) entre J15 pin 3 (+) y J15 pin 2 (GND).',
items: [
{ tipo: 'tabla', clave: 's09_00_ign', txt: 'Ignición por ADC: ON a partir de ≈ 6.9 V, OFF abajo de ≈ 4.8 V',
etiquetaFilas: 'J15 pin 3', filas: ['0 V', '12.0 V', '24.0 V', '3.0 V'],
columnas: [
{ k: 'ign', txt: 'STAT ign=', ph: 'ON(12.1V)', ancho: '110px' },
{ k: 'fan', txt: 'Ventilador', opciones: ['gira', 'detenido'] },
] },
{ tipo: 'radio', clave: 's09_99_fin', req: true, txt: '¿Pasó esta etapa?', opciones: ['Pasó', NO] },
] },
{ titulo: '10 · Cierre',
items: [
{ tipo: 'check', clave: 's10_00_ret', txt: 'Sin energía: paquete y módulos de banco retirados (a sus bolsas «BANCO»); puente de banco fuera de J2.' },
{ tipo: 'check', clave: 's10_01_etq', txt: 'Etiqueta ' + P + '-NN con la fecha cerca de MH3, sin tapar la serigrafía.' },
{ tipo: 'radio', clave: 's10_02_clasif', req: true, guardaEn: 'clasificacion', txt: 'Clasificación',
opciones: ['Pasó todo', 'FALLA: inspección', 'FALLA: cortos', 'FALLA: 3V3 por USB', 'FALLA: rieles de 5 V', 'FALLA: flasheo',
'FALLA: autoprueba', 'FALLA: etapa o módem', 'FALLA: batería o respaldo', 'FALLA: ignición'] },
{ tipo: 'texto', clave: 's10_03_obs', txt: 'Observaciones (qué falló, valores, lo raro)', ph: 'ninguna / describir' },
{ tipo: 'check', clave: 's10_04_bolsa', txt: 'En bolsa antiestática (FALLA en bolsa aparte, con nota).' },
] },
],
};
return cfg;
};