From 7b8fb4f9d1ba5b54570b7a8ac9463ce94ecb82d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leopoldo=20Rodr=C3=ADguez?= Date: Mon, 28 Sep 2026 20:05:32 -0600 Subject: [PATCH] =?UTF-8?q?sitio:=20reorganizaci=C3=B3n=20por=20tareas,=20?= =?UTF-8?q?b=C3=BAsqueda,=20estilo=20Helgen,=20todo=20en=20espa=C3=B1ol,?= =?UTF-8?q?=20procedimientos=20KISS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DESPLIEGUE.md | 2 +- backend/actas-hbox.service | 2 +- backend/app.py | 2 +- docs/actas/index.md | 90 +- docs/campo/index.md | 20 + docs/cuenta.html | 3 +- docs/descargas/hbox-v5-bringup-README.md | 59 +- docs/descargas/index.md | 409 ++--- .../procedimiento-diagnostico-campo.md | 266 ++- .../protocolo-diagnostico-remoto.md | 242 ++- docs/formularios/ardusimple.html | 26 +- docs/formularios/banco.html | 142 +- docs/formularios/dano.html | 50 +- docs/formularios/diagnostico.html | 252 ++- docs/formularios/ensamble.html | 48 +- docs/formularios/envio.html | 52 +- docs/formularios/ethernet-serie.html | 102 ++ docs/formularios/integracion.html | 30 +- docs/formularios/modem4g.html | 36 +- docs/formularios/prueba-bateria.html | 45 +- docs/formularios/recepcion.html | 109 +- docs/formularios/reflasheo.html | 104 +- docs/formularios/v4.html | 174 +- docs/formularios/v5.html | 58 +- docs/git/git-guide-en.md | 21 +- docs/git/guia-git-es.md | 36 +- docs/guia-ingeniero.md | 63 + docs/hardware/index.md | 28 + docs/hardware/v56-cambios-esquematico.md | 254 +++ docs/hardware/v56-datasheet.md | 346 ++++ docs/hardware/v56-eco.md | 159 ++ docs/hardware/v56-layout-instrucciones.md | 97 ++ docs/hardware/v56-pinout.md | 332 ++++ docs/hardware/v6-auditoria-completa.md | 1544 +++++++++++++++++ docs/hardware/v6-auditoria-prefab.md | 144 +- docs/hardware/v6-cambios-esquematico.md | 448 +++++ docs/hardware/v6-pinmap.md | 251 +++ docs/hardware/v6-prefab-audit.md | 97 +- docs/hardware/v6-revision-lecciones-v55.md | 251 +++ docs/img/favicon.png | Bin 0 -> 12461 bytes docs/img/helgen-logo-white.png | Bin 0 -> 12800 bytes docs/img/helgen-logo.png | Bin 0 -> 38343 bytes docs/index.md | 206 +-- .../manuales/Drogheda-HBOX-Datasheet_v2.0.pdf | Bin 0 -> 49225 bytes ...heda-Manual-Instalacion-Operacion_v2.0.pdf | Bin 0 -> 72135 bytes docs/manuales/index.md | 29 + docs/manuales/manual-cliente.md | 21 + docs/manuales/manual-tarjeta-V3.md | 101 ++ docs/manuales/manual-tarjeta-V4.md | 118 ++ docs/manuales/manual-tarjeta-V5.md | 174 ++ docs/manuales/manual-tarjeta-v6.md | 22 + docs/montaje/assembly-guide.md | 19 +- docs/montaje/bom-split.md | 153 +- docs/montaje/guia-ensamble-qc.md | 84 +- docs/montaje/pinout-arneses.md | 85 +- docs/procedimientos/ciclo-de-vida.md | 173 +- docs/procedimientos/diagnostico-banco.md | 286 ++- docs/procedimientos/einarboard-1.0-bringup.md | 144 +- docs/procedimientos/fan-policy-bench-test.md | 77 +- .../historico-proto-bench-v3.md | 254 ++- docs/procedimientos/historico-protoboard.md | 188 +- docs/procedimientos/prueba-bateria-modem.md | 238 +-- docs/procedimientos/reflasheo-unidades.md | 197 +-- docs/procedimientos/v4-prueba-fw-0.5.6.md | 260 +-- .../v5-checklist-puesta-en-marcha.md | 94 + .../procedimientos/v5-configuracion-unidad.md | 120 ++ docs/procedimientos/v5-ensamble.md | 245 ++- docs/procedimientos/v5-modulos-integracion.md | 272 ++- .../v5-prueba-ethernet-serie.md | 195 +++ docs/procedimientos/v5-prueba-final-unidad.md | 127 +- docs/procedimientos/v5-prueba-y-flasheo.md | 393 ++--- docs/produccion/index.md | 19 + docs/stylesheets/extra.css | 163 ++ docs/tablero.html | 2 +- docs/taller/index.md | 18 + mkdocs.yml | 185 +- scripts/sync-docs.sh | 25 + 77 files changed, 7692 insertions(+), 3389 deletions(-) create mode 100644 docs/campo/index.md create mode 100644 docs/formularios/ethernet-serie.html create mode 100644 docs/guia-ingeniero.md create mode 100644 docs/hardware/index.md create mode 100644 docs/hardware/v56-cambios-esquematico.md create mode 100644 docs/hardware/v56-datasheet.md create mode 100644 docs/hardware/v56-eco.md create mode 100644 docs/hardware/v56-layout-instrucciones.md create mode 100644 docs/hardware/v56-pinout.md create mode 100644 docs/hardware/v6-auditoria-completa.md create mode 100644 docs/hardware/v6-cambios-esquematico.md create mode 100644 docs/hardware/v6-pinmap.md create mode 100644 docs/hardware/v6-revision-lecciones-v55.md create mode 100644 docs/img/favicon.png create mode 100644 docs/img/helgen-logo-white.png create mode 100644 docs/img/helgen-logo.png create mode 100644 docs/manuales/Drogheda-HBOX-Datasheet_v2.0.pdf create mode 100644 docs/manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf create mode 100644 docs/manuales/index.md create mode 100644 docs/manuales/manual-cliente.md create mode 100644 docs/manuales/manual-tarjeta-V3.md create mode 100644 docs/manuales/manual-tarjeta-V4.md create mode 100644 docs/manuales/manual-tarjeta-V5.md create mode 100644 docs/manuales/manual-tarjeta-v6.md create mode 100644 docs/procedimientos/v5-checklist-puesta-en-marcha.md create mode 100644 docs/procedimientos/v5-configuracion-unidad.md create mode 100644 docs/procedimientos/v5-prueba-ethernet-serie.md create mode 100644 docs/produccion/index.md create mode 100644 docs/stylesheets/extra.css create mode 100644 docs/taller/index.md mode change 100644 => 100755 scripts/sync-docs.sh diff --git a/DESPLIEGUE.md b/DESPLIEGUE.md index 80fadf1..96e196a 100644 --- a/DESPLIEGUE.md +++ b/DESPLIEGUE.md @@ -54,7 +54,7 @@ El backend la deduce sola de `ACTAS_DIR`; si prefieres fijarla, agrega a Environment=ADJUNTOS_DIR=/srv/projects/drogheda/adjuntos Environment=ADJUNTO_MAX_MB=8 Environment=ARCHIVO_MAX_MB=20 -Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem +Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem,prueba-ethernet-serie ``` ### 4 · nginx — subida de fotos e identidad del técnico (una sola vez) diff --git a/backend/actas-hbox.service b/backend/actas-hbox.service index 5834112..8aa50c6 100644 --- a/backend/actas-hbox.service +++ b/backend/actas-hbox.service @@ -10,7 +10,7 @@ Environment=ACTAS_DIR=/srv/projects/drogheda/actas Environment=ADJUNTOS_DIR=/srv/projects/drogheda/adjuntos Environment=ADJUNTO_MAX_MB=8 Environment=ARCHIVO_MAX_MB=20 -Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem +Environment=ACTAS_REPETIBLES=diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem,prueba-ethernet-serie Environment=ACTAS_ADMINS=leo Environment=HTPASSWD_FILE=/etc/nginx/hbox-docs.htpasswd Environment=PASS_MIN=8 diff --git a/backend/app.py b/backend/app.py index b781692..b5c7bc6 100644 --- a/backend/app.py +++ b/backend/app.py @@ -36,7 +36,7 @@ ADMINS = {u.strip().lower() for u in os.environ.get("ACTAS_ADMINS", "leo").split TIPOS_UNICOS = {"ensamble"} # tipos en los que un componente solo puede usarse en un acta real # Tipos REPETIBLES: una misma serie puede tener varias actas (cada visita a campo es un evento nuevo). TIPOS_REPETIBLES = {t.strip() for t in os.environ.get( - "ACTAS_REPETIBLES", "diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem").split(",") if t.strip()} + "ACTAS_REPETIBLES", "diagnostico-campo,diagnostico-banco,instalacion-campo,reflasheo,dano,envio,recepcion,prueba-bateria-modem,prueba-ethernet-serie").split(",") if t.strip()} # Subida de fotos MAX_MB = int(os.environ.get("ADJUNTO_MAX_MB", "8")) diff --git a/docs/actas/index.md b/docs/actas/index.md index 190f601..82e819e 100644 --- a/docs/actas/index.md +++ b/docs/actas/index.md @@ -1,8 +1,14 @@ -# Actas y control de calidad +--- +title: "Actas — índice y uso" +tags: [project-drogheda, hbox, actas, formularios, qc] +date: 2026-09-19 +project: Project Drogheda +author: Helgen Technologies +--- -Formularios que el técnico llena **en pantalla mientras prueba o ensambla**. Al terminar se -firman (nombre + conformidad) y se envían al servidor, donde quedan registrados por número de -serie. Un acta real se envía **una sola vez** por serie; para rehacerla, Leo la borra. +# Actas — índice y uso + +Formularios que se llenan en pantalla mientras pruebas o ensamblas. Al terminar se firman y se envían al servidor, donde quedan por número de serie. Un acta se envía una sola vez por serie; para rehacerla, Leo la borra. Excepción: diagnóstico en campo (una por visita). ## Flujo de una unidad HBOX v5 @@ -14,62 +20,38 @@ ArduSimple ARD-NNN ────► Acta módulo ArduSimple ─┤ └──────────────────────────────────────────────────┘ ``` -El acta de ensamble **no deja seleccionar** un módulo que no esté aprobado, que no tenga su -integración, o que ya esté montado en otra unidad. El número de la unidad se calcula solo a partir -de los tres módulos elegidos: `HBOX5-E07-A010-R0006` = EinarBoard V5-07 + ArduSimple ARD-010 + módem 4G RTK-0006. +El acta de ensamble no deja elegir un módulo sin aprobar, sin integración o ya montado en otra unidad. El número de unidad se calcula de los tres módulos: `HBOX5-E07-A010-R0006` = V5-07 + ARD-010 + RTK-0006. -## Formularios +## Producción y taller -**[▶ Acta de prueba — EinarBoard V5](../formularios/v5.html)** -Lote de 15 tarjetas (V5-01 … V5-15; 30 seleccionables). Procedimiento: [Prueba y flasheo v5](../procedimientos/v5-prueba-y-flasheo.md). - -**[▶ Acta de módulo — simpleRTK2B Pro / ArduSimple (ARD-001 … ARD-030)](../formularios/ardusimple.html)** -Un acta por receptor: visual, fix GNSS, configuración Helgen. Procedimiento: [Módulos e integración §2](../procedimientos/v5-modulos-integracion.md). - -**[▶ Acta de módem — 4G NTRIP Master (RTK-0001 … RTK-0030)](../formularios/modem4g.html)** -Un acta por módem: IMEI/ICCID, configuración, registro en red. Procedimiento: [Módulos e integración §3](../procedimientos/v5-modulos-integracion.md). - -**[▶ Acta de integración — ArduSimple + 4G](../formularios/integracion.html)** -La pareja que irá junta: RTK FIX con correcciones NTRIP. Procedimiento: [Módulos e integración §4](../procedimientos/v5-modulos-integracion.md). - -**[▶ Acta de ensamble — unidad HBOX v5](../formularios/ensamble.html)** -Selecciona los tres módulos aprobados → número de unidad automático → armado, energizado desde 24 V, -batería y respaldo. Procedimiento: [Ensamble de la unidad](../procedimientos/v5-ensamble.md). - -**[▶ Acta de prueba — EinarBoard V4 con firmware 0.5.6](../formularios/v4.html)** -Una por tarjeta (V4-01 … V4-15): puente de reset del módem, flasheo y pruebas con 24 V, en batería y regreso de 24 V. -Procedimiento: [V4 — preparación y prueba con 0.5.6](../procedimientos/v4-prueba-fw-0.5.6.md). - ---- +| Acta | Qué registra | Procedimiento | +|---|---|---| +| [Tarjeta V5](../formularios/v5.html) | Lote de 15 (V5-01 … V5-15; 30 seleccionables) | [Prueba y flasheo](../procedimientos/v5-prueba-y-flasheo.md) | +| [ArduSimple](../formularios/ardusimple.html) | Un receptor ARD-001 … ARD-030: visual, fix, configuración | [Módulos §1](../procedimientos/v5-modulos-integracion.md#1-simplertk2b-pro-acta-ardusimple) | +| [Módem 4G](../formularios/modem4g.html) | Un módem RTK-0001 … RTK-0030: IMEI/ICCID, configuración, registro | [Módulos §2](../procedimientos/v5-modulos-integracion.md#2-modem-4g-ntrip-master-acta-modem-4g) | +| [Integración](../formularios/integracion.html) | La pareja: RTK FIX con NTRIP | [Módulos §3](../procedimientos/v5-modulos-integracion.md#3-integracion-ardusimple-4g-acta-de-integracion) | +| [Ensamble](../formularios/ensamble.html) | Tres módulos aprobados → número de unidad → armado, 24 V, batería y respaldo | [Ensamble](../procedimientos/v5-ensamble.md) | +| [Prueba V4](../formularios/v4.html) | V4-01 … V4-15: puente de reset del módem, flasheo, 24 V, batería y regreso de 24 V | [Preparación y prueba V4](../procedimientos/v4-prueba-fw-0.5.6.md) | +| [Módem en batería](../formularios/prueba-bateria.html) | Cargador, aceptación y corridas en batería | [Módem 4G en batería](../procedimientos/prueba-bateria-modem.md) | +| [Ethernet y serie](../formularios/ethernet-serie.html) | W5500, P15, P16 | [Ethernet y puertos serie](../procedimientos/v5-prueba-ethernet-serie.md) | +| [Reflasheo](../formularios/reflasheo.html) | Firmware antes/después, capturas | [Reflasheo](../procedimientos/reflasheo-unidades.md) | +| [Diagnóstico en banco](../formularios/banco.html) | Inspección, continuidad, rieles, capturas | [Diagnóstico en banco](../procedimientos/diagnostico-banco.md) | ## Campo -**[▶ Acta de diagnóstico en campo — unidades instaladas](../formularios/diagnostico.html)** -Para revisar una unidad que falló en la máquina. A diferencia de las actas de banco, **esta se -puede llenar varias veces por unidad**: cada visita es un registro nuevo y el técnico ve las -visitas anteriores antes de empezar. Permite **subir fotos** desde el teléfono. -Procedimiento: [Diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) · -Seguimiento: [Tablero de campo](../diagnostico/tablero-campo.html). +| Acta | Qué registra | Procedimiento | +|---|---|---| +| [Diagnóstico en campo](../formularios/diagnostico.html) | Una por visita; muestra las visitas anteriores y admite fotos desde el teléfono | [Diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) · [Tablero de campo](../diagnostico/tablero-campo.html) | +| [Envío](../formularios/envio.html) · [Recepción](../formularios/recepcion.html) | El tramo entre el banco y el puerto | [Ciclo de vida](../procedimientos/ciclo-de-vida.md) | +| [Daño o incidente](../formularios/dano.html) | Cualquier serie; la marca en todos los formularios. «Reparada» la levanta, «Baja» la hace permanente | [Ciclo de vida](../procedimientos/ciclo-de-vida.md#dano-o-incidente) | -**[▶ Acta de daño o incidente](../formularios/dano.html)** — cualquier serie. **Marca** la serie: todos los -formularios avisan al elegirla. Se levanta con «Reparada»; «Baja» la hace permanente. +## Cómo se llenan -**[▶ Acta de envío](../formularios/envio.html)** · **[▶ Acta de recepción](../formularios/recepcion.html)** — el -tramo entre el banco y el puerto. Mapa completo: [Ciclo de vida](../procedimientos/ciclo-de-vida.md). +1. Abre el formulario y elige la serie (o los módulos, en integración y ensamble). +2. Llena cada sección conforme avanzas. Se guarda solo en el navegador: al reabrir con la misma serie recuperas lo escrito. +3. Marca el resultado (Aprobada / Falla), escribe tu nombre y confirma que seguiste el procedimiento. +4. Pulsa Enviar acta firmada. Queda en el servidor y en el [tablero](../tablero.html). -## Cómo se usan +La serie PRUEBA sirve para practicar: no cuenta y se puede reenviar. -1. Abre el formulario y **elige el número de serie** (o los módulos, en integración y ensamble). -2. Ve llenando cada sección conforme avanzas. El formulario **se guarda solo** en el navegador: si se - cierra, al reabrir con la misma serie recuperas lo escrito. -3. Al final marca el **resultado** (Aprobada / Falla), escribe tu **nombre** y confirma que seguiste - el procedimiento. -4. Pulsa **Enviar acta firmada**. Queda registrada en el servidor y aparece en el - [tablero de estado](../tablero.html). - -La serie **PRUEBA** sirve para practicar: no cuenta y se puede reenviar. - -!!! note "Para ingeniería" - Los envíos se guardan en el servidor por tipo y número de serie (`…/actas//`). Las actas de - integración y ensamble llevan `componentes` con los módulos elegidos. Listado completo en - [`/api/actas`](/api/actas){:target="_blank"}. +Para ingeniería: los envíos se guardan por tipo y serie (`…/actas//`); integración y ensamble llevan `componentes` con los módulos elegidos. Listado en [`/api/actas`](/api/actas){:target="_blank"}. diff --git a/docs/campo/index.md b/docs/campo/index.md new file mode 100644 index 0000000..60a55b1 --- /dev/null +++ b/docs/campo/index.md @@ -0,0 +1,20 @@ +--- +title: "Campo" +--- + +# Campo + +Unidad en la máquina, envíos y recepciones. Regla: no reinicies ni desconectes nada antes de capturar la evidencia ([por qué](../diagnostico/procedimiento-diagnostico-campo.md)). + +| Situación | Procedimiento | Acta | +|---|---|---| +| Falla en la máquina | [Diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) | [Diagnóstico en campo](../formularios/diagnostico.html) | +| Instalar en el puerto | [Checklist de puesta en marcha](../procedimientos/v5-checklist-puesta-en-marcha.md) | Impreso, al expediente | +| Sale una unidad | [Ciclo de vida §6](../procedimientos/ciclo-de-vida.md#6-envio) | [Envío](../formularios/envio.html) | +| Llega una unidad | [Ciclo de vida §7](../procedimientos/ciclo-de-vida.md#7-recepcion-e-inspeccion) | [Recepción e inspección](../formularios/recepcion.html) | +| Algo se dañó | [Ciclo de vida: daño](../procedimientos/ciclo-de-vida.md#dano-o-incidente) | [Daño o incidente](../formularios/dano.html) | + +- [Expediente de una unidad](../unidad.html): cada acta, foto y log por serie. +- [Tablero de campo](../diagnostico/tablero-campo.html): todas las visitas. +- [Índice de actas](../actas/index.md) +- Para el cliente: [manual del cliente](../manuales/manual-cliente.md) · [PDF](../manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf) diff --git a/docs/cuenta.html b/docs/cuenta.html index 7f78b1c..3dc8dc4 100644 --- a/docs/cuenta.html +++ b/docs/cuenta.html @@ -42,7 +42,7 @@
-
Mientras más larga, mejor. Una frase con espacios funciona y se recuerda.
+
Mientras más larga, mejor; una frase con espacios sirve.
@@ -72,7 +72,6 @@

Si olvidaste tu contraseña

No hay recuperación por correo: pídele a Leo que te la restablezca desde esta misma página. - Es cosa de un minuto.

diff --git a/docs/descargas/hbox-v5-bringup-README.md b/docs/descargas/hbox-v5-bringup-README.md index 84a3ac7..a277bc2 100644 --- a/docs/descargas/hbox-v5-bringup-README.md +++ b/docs/descargas/hbox-v5-bringup-README.md @@ -1,10 +1,18 @@ +--- +title: "README del firmware hbox_v5_bringup (inglés)" +tags: [project-drogheda, firmware, hbox_v5_bringup, readme, en] +date: 2026-09-27 +--- + # hbox_v5_bringup — EinarBoard v5 first-flash bring-up firmware +> **Nota (sitio de documentación):** este es el README del código fuente del firmware `hbox_v5_bringup`, en inglés, para quien compila. La tabla de binarios vigentes y sus SHA-256 es la de [Descargas](index.md); la tabla «Release» de abajo se quedó en 0.5.1 y solo documenta cómo se nombran los archivos. + Bench-proves a newly assembled v5 board over USB-C **J11** only. Never powers the RTK stack. -0.5.0: Modo B in-band $PHLG (server Salud column) on top of the 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 / +0.5.0: Modo B in-band $PHLG (server Salud column) on top of the 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. +`STAT` line every 2 s. Console commands: `r` rerun · `g` gauge walk · `i` I2C scan · `h` help. Procedure for technicians (ES): `06-Testing-Validation/2026-09-15_Drogheda_EinarBoard-v5_Procedimiento-Prueba-y-Flasheo_ES_v1.0.md` @@ -17,10 +25,9 @@ arduino-cli compile \ --output-dir out hbox_v5_bringup ``` `rtlib=nanofp` is required — the default newlib-nano build prints nothing for `%f`, so every voltage -and temperature line would be blank. `SystemClock_Config()` is overridden in the sketch (HSE 25 MHz → 96 MHz, USB 48 MHz) because the +and temperature line would be blank. `SystemClock_Config()` is overridden in the sketch (HSE 25 MHz → 96 MHz, USB 48 MHz) because the generic variant defaults to HSI, which is not accurate enough for USB. - ### EinarBoard v4 (socketed Blackpill) — same sketch, `board_v4.h` The v4 board is this design on a Blackpill (verified pad-by-pad against `hbox-watchdog-v4.kicad_pcb`); only `ETH_INT` moves to **PB2**. Build with the Blackpill variant and the board switch: @@ -43,7 +50,7 @@ arduino-cli compile --fqbn "$FQBN_V5" \ --output-dir out-v5-eth hbox_v5_bringup # V4: --fqbn "$FQBN_V4" --build-property "build.extra_flags=-DHBOX_BOARD_V4 -DENABLE_ETH=1" --output-dir out-v4-eth ``` -Sin PoE (J10 solo datos). Con 5 V presente el W5500 sale del reset, pide DHCP o cae a `192.168.7.2/24` y abre un +Sin PoE (J10 solo datos). Con 5 V presente el W5500 sale del reset, pide DHCP o cae a `192.168.7.2/24` y abre un TCP a `192.168.7.1:5010` (portátil con `nc -lk 5010`), por donde salen en espejo NMEA + `$PHLG` + `$PHEV` + `$PHID`. Cable directo al portátil (Auto-MDIX) o cualquier switch. Overrides: `-DETH_IP=a,b,c,d -DETH_SERVER_IP=a,b,c,d -DETH_SERVER_PORT=n -DETH_DHCP=0`. Tecla `E` = on/off. Ver CHANGELOG 0.6.0-eth. @@ -58,7 +65,7 @@ U13 pin 12 (P7) ──|<── SW4G1 pad 1 (MODEM_RST) diodo Schottky B cátodo ánodo ``` -- Verificar con `M` en consola (etapa ON): `SW4G1` pad 1 debe caer a < 0.4 V durante 0.5 s y el módem reinicia +- Verificar con `M` en consola (etapa ON): `SW4G1` pad 1 debe caer a < 0.4 V durante 0.5 s y el módem reinicia (LEDs del módulo apagan y vuelven). `STAT` cuenta los pulsos en `mrst=`. - Sin el puente, el firmware es idéntico salvo que el pulso no llega a nada. @@ -76,22 +83,22 @@ or STM32CubeProgrammer → USB → Connect → Download `release/hbox-v5-bringup | `release/superseded/hbox-v5-bringup_0.5.0.bin` | 0.5.0 — superseded (24-field $PHLG, no $PHEV) | `98656ddcc4e209e2` | 77 312 B | | `release/superseded/hbox-v5-bringup_0.4.0.bin` | 0.4.0 — superseded (no in-band telemetry) | `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.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.5.1** (2026-09-18) — **diagnostics in band.** `$PHLG` gains 5 append-only fields (25..29): `up_s`, `pwr` (VEH|BATT), - `v5min`, `vbat_min` (lowest single-shot ADC reading in the 30 s window, sampled every loop iteration — catches the ms-scale + `v5min`, `vbat_min` (lowest single-shot ADC reading in the 30 s window, sampled every loop iteration — catches the ms-scale LTE-burst sags that trip the LTC4040 PFI), `bkp_n`. New `$PHEV,,,*CS` event sentence on every state change (STACK_ON/OFF+reason, BACKUP_START/END, RECOVERY, LIMP/LIMP_END, TEMP_CUT/REARM, V5_LOW/LOST/OK, IGN_ON/OFF, SLEEP/SLEEP_END, MODOB_ON/OFF, BOOT), queued (6 deep) and sent in idle gaps ahead of `$PHLG`; STACK_OFF/MODOB_OFF are flushed synchronously - (≤ 120 ms) before K1 releases. `STAT` adds `v5min= vbatmin= bkp=`. Server side: `02-Architecture-Software/htracker-patches/` + (≤ 120 ms) before K1 releases. `STAT` adds `v5min= vbatmin= bkp=`. Server side: `02-Architecture-Software/htracker-patches/` (retranslator: 29-field parser, `$PHEV` store + `events` in status JSON, 5 diagnostic rules) — old parsers ignore the extras. -- **0.5.0** (2026-09-18) — **Modo B: `$PHLG` in band.** Once the stack is on and the F9P has been talking for 10 s, USART1 +- **0.5.0** (2026-09-18) — **Modo B: `$PHLG` in band.** Once the stack is on and the F9P has been talking for 10 s, USART1 (PA10 tap / PA9) is started **before** K1 (PB5) is energised; the F9P TX2 stream then flows F9P → PA10 → MCU → PA9 → K1 NO → modem DIN - byte for byte, and a `$PHLG` (same 24 fields) is injected every 30 s only after > 8 ms of line idle (a GGA is never split). + byte for byte, and a `$PHLG` (same 24 fields) is injected every 30 s only after > 8 ms of line idle (a GGA is never split). Corrections modem → F9P stay on their direct wire. Fail-safe is hardware: PB5 low (reset, IWDG, any stack-off) = K1 NC = direct path. Prerequisites shipped with it: **256-byte UART rings** (`build_opt.h`, `static_assert`ed at compile), **non-blocking SHT40** (two-phase kick/poll), console STAT/`$PHLG` deferred to line-idle gaps, K1 released before `EEPROM.write` (flash erase stalls the core) @@ -99,29 +106,29 @@ or STM32CubeProgrammer → USB → Connect → Download `release/hbox-v5-bringup Server: no change needed — `retranslator._parse_phlg` already accepts the sentence; units get the **Salud** column. - **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, + 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 + 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` / + 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). + 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 - (`ign=ON`, `chrg=idle`, `flt=none`, `tntc=n/c`, `i2cerr=`, `t_on=`, `nmea=`/`bad=`); `$PHLG` every 10 s + after each stack change, + 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 + (`ign=ON`, `chrg=idle`, `flt=none`, `tntc=n/c`, `i2cerr=`, `t_on=`, `nmea=`/`bad=`); `$PHLG` every 10 s + after each stack change, **same 24-field layout + XOR checksum as fleet fw v3.x** (verified against `htracker/retranslator.py::_parse_phlg`; `fw=0.2.1-bu`, - `state=BENCH|RUN`, `link=SRCH|DEGR|OK`); NMEA checksum verified (bad frames counted as `rxbad`); `P` arms non-blocking (10 s window), + `state=BENCH|RUN`, `link=SRCH|DEGR|OK`); NMEA checksum verified (bad frames counted as `rxbad`); `P` arms non-blocking (10 s window), `Y` confirms; new commands `t` ($PHLG now), `l` (field legend), `v` (multimeter checkpoints for the stack gate: SYS5V/PWR_CTRL/GATE_LS/SW_5V); - stack auto-OFF if 5 V is lost; `v5=…(BAJO)` + EVT when VEH5V drops under 4.6 V (LTC4040 PFI zone: PFI divider R51 270k/R52 100k - → 4.44 V falling, backup VSYS 4.79 V via R53 499k/R54 100k) — the 24-Jul modem-hiccup mechanism, now visible in the log. Build: no-op ctags + explicit definition order (arduino/ctags unreachable from the build host). -- **0.2.0** (2026-09-17): bench mode for the assembled unit — `P`+`Y` powers the RTK stack (only with 5 V on P2), - `P` again turns it off; `n` streams `$GxGGA` from the simpleRTK2B UART1 (PA3, 115200) for 20 s with fix/sats/HDOP; + stack auto-OFF if 5 V is lost; `v5=…(BAJO)` + EVT when VEH5V drops under 4.6 V (LTC4040 PFI zone: PFI divider R51 270k/R52 100k + → 4.44 V falling, backup VSYS 4.79 V via R53 499k/R54 100k) — the 24-Jul modem-hiccup mechanism, now visible in the log. Build: no-op ctags + explicit definition order (arduino/ctags unreachable from the build host). +- **0.2.0** (2026-09-17): bench mode for the assembled unit — `P`+`Y` powers the RTK stack (only with 5 V on P2), + `P` again turns it off; `n` streams `$GxGGA` from the simpleRTK2B UART1 (PA3, 115200) for 20 s with fix/sats/HDOP; `STAT` shows `stack=` and the last GGA. Charge stays disabled, K1 released. Uses the core's `Serial2` (USART2). - **0.1.1** (2026-09-16, audit): build with `rtlib=nanofp` (floats printed blank in 0.1.0); `ETH_CS` now `INPUT_PULLUP` instead of driving HIGH into the unpowered W5500; reset cause reports `PIN` only when diff --git a/docs/descargas/index.md b/docs/descargas/index.md index 7713a84..3ae9d53 100644 --- a/docs/descargas/index.md +++ b/docs/descargas/index.md @@ -1,322 +1,167 @@ +--- +title: "Descargas" +tags: [project-drogheda, hbox, descargas, firmware, v3, v4, v5, modem, zed-f9p] +date: 2026-09-27 +project: Project Drogheda +author: Helgen Technologies +version: "1.9" +--- + # Descargas -Archivos que el técnico necesita en el banco. Verificar el SHA-256 antes de flashear -(`shasum -a 256 archivo` en macOS, `sha256sum archivo` en Linux, `certutil -hashfile archivo SHA256` en Windows). - -## Qué archivo va a qué cosa - -Una unidad HBOX tiene **tres cerebros distintos** y cada uno se carga por su propio camino. Antes de -descargar nada, ubica cuál vas a tocar: - -| Qué | Qué se le carga | Cómo | Dónde está | +| Qué | Qué se le carga | Cómo | Sección | |---|---|---|---| -| **Tarjeta HBOX** (Blackpill / EinarBoard) | Firmware `.bin` | DFU por USB | [§ Firmware del HBOX](#firmware-del-hbox-que-binario-va-en-que-tarjeta) | -| **Módem 4G NTRIP Master** | Archivo de **parámetros** `$$$AS+…` | Terminal serie por el USB *XBEE* | [§ Módem 4G](#parametros-del-modem-4g-ntrip-master) | -| **simpleRTK2B Pro (ZED-F9P)** | Configuración u-center **y** firmware u-blox | u-center por el USB *POWER+GPS* | [§ ZED-F9P](#firmware-y-configuracion-del-simplertk2b-pro-zed-f9p) | +| Tarjeta HBOX (Blackpill / EinarBoard) | Firmware `.bin` | DFU por USB | [Firmware](#firmware-del-hbox-que-binario-va-en-que-tarjeta) | +| Módem 4G NTRIP Master | Parámetros `$$$AS+…` | Terminal serie por el USB XBEE | [Módem 4G](#parametros-del-modem-4g-ntrip-master) | +| simpleRTK2B Pro (ZED-F9P) | Configuración u-center y firmware u-blox | u-center por el USB POWER+GPS | [ZED-F9P](#firmware-y-configuracion-del-simplertk2b-pro-zed-f9p) | -Cada carga se registra en el **[acta de reflasheo](../formularios/reflasheo.html)**, y queda en el -[expediente de esa unidad](../unidad.html) junto con las capturas de antes y después. +Cada carga se registra en el [acta de reflasheo](../formularios/reflasheo.html) y queda en el [expediente](../unidad.html) con las capturas de antes y después. -!!! warning "Verifica el SHA-256 antes de flashear" - Un binario incompleto o de otra generación puede dejar la tarjeta inservible. - `shasum -a 256 archivo` (macOS) · `sha256sum archivo` (Linux) · `certutil -hashfile archivo SHA256` (Windows). +## Verifica el SHA-256 + +Antes de flashear. Un binario incompleto o de otra tarjeta puede dejarla inservible. + +```bash +shasum -a 256 archivo.bin # macOS / Linux (o sha256sum) +certutil -hashfile archivo.bin SHA256 # Windows (cmd) +Get-FileHash .\archivo.bin -Algorithm SHA256 # Windows (PowerShell) +``` + +Debe coincidir carácter por carácter con [`SHA256SUMS.txt`](SHA256SUMS.txt). Si no coincide, descarga otra vez; si sigue sin coincidir, no lo uses y avisa. ## Firmware del HBOX — qué binario va en qué tarjeta -**Regla: un binario por tarjeta.** La versión del firmware no dice nada de la tarjeta (`0.4.0` no es -"para V4": es una versión vieja del firmware de V5). El binario lleva la tarjeta en el nombre y eso es lo que manda. +Un binario por tarjeta. El nombre lleva la tarjeta y eso manda; el número de versión no dice nada de la tarjeta (`0.4.0` no es "para V4": es una versión vieja del firmware de V5). -| Tarjeta | MCU | Código fuente | **Binario vigente** | Estado | +| Tarjeta | MCU | Código fuente | Binario vigente | Estado | |---|---|---|---|---| -| **V3** — EinarBoard 1.0, las 3 unidades en campo | Blackpill en zócalo (F411CE) | `blackpillrtkcode_v4` (4.0.0) | [`hbox-tarjetaV3_4.0.0.bin`](hbox-tarjetaV3_4.0.0.bin) | ⚠ compilado, **sin prueba de banco** | -| **V4** — `hbox-watchdog-v4` | Blackpill en zócalo + PCF8574 · W5500 · SC16IS752 | `hbox_v5_bringup` + `board_v4.h` | [`hbox-tarjetaV4_0.6.0.bin`](hbox-tarjetaV4_0.6.0.bin) | ⚠ compilado 27-sep, **sin prueba de banco**. **0.6.0 CAMPO: 0.5.9 + gobernador de carga (la batería por fin se recarga en la unidad)**; puente U13-P7 → SW4G1 opcional — [preparación y prueba V4](../procedimientos/v4-prueba-fw-0.5.6.md) | -| **V5** — `hbox-watchdog-v5`, lote de 15 | STM32F411RET6 soldado | `hbox_v5_bringup` (0.6.0) | [`hbox-v5-bringup_0.6.0.bin`](hbox-v5-bringup_0.6.0.bin) | ⚠ **vigente desde 27-sep (0.6.0 CAMPO)** — **cargador con gobernador** (hasta 0.5.9 estaba apagado: paquete de un solo uso); en batería la etapa y el módem **siguen encendidos y reportando igual que en 24 V** (sin ciclo de 10 min ni ahorro: la V5.5 no arranca el módem en frío sobre el boost); **ningún ciclo de etapa en batería**; corte a 3.40 V; **reset del MCU al volver el 5 V tras ≥ 10 s de respaldo, siempre**; vigilancia del módem solo diagnóstica (`modem=` en STAT); 0.5.1 fue la última en campo | +| V3 — EinarBoard 1.0, 3 unidades en campo ([manual](../manuales/manual-tarjeta-V3.md)) | Blackpill en zócalo (F411CE) | `blackpillrtkcode_v4` (4.0.0) | [`hbox-tarjetaV3_4.0.0.bin`](hbox-tarjetaV3_4.0.0.bin) · 64 352 B · `a68a87ff…` | Compilado 19-sep, sin prueba de banco | +| V4 — `hbox-watchdog-v4` ([manual](../manuales/manual-tarjeta-V4.md)) | Blackpill + PCF8574 · W5500 · SC16IS752 | `hbox_v5_bringup` + `board_v4.h` (`-DHBOX_BOARD_V4`) | [`hbox-tarjetaV4_0.6.0.bin`](hbox-tarjetaV4_0.6.0.bin) · 88 556 B · `1458470bbdd95b49…` | Compilado 27-sep, sin prueba de banco. DFU solo con USB; puente U13-P7 → SW4G1 opcional ([procedimiento V4](../procedimientos/v4-prueba-fw-0.5.6.md)) | +| V5 — `hbox-watchdog-v5`, lote de 15 ([manual](../manuales/manual-tarjeta-V5.md)) | STM32F411RET6 soldado | `hbox_v5_bringup` (0.6.0) | [`hbox-v5-bringup_0.6.0.bin`](hbox-v5-bringup_0.6.0.bin) · `8a0ee4839763eae8…` | Vigente desde 27-sep, sin prueba de banco. Uso: [prueba y flasheo §5](../procedimientos/v5-prueba-y-flasheo.md) y [ensamble §5](../procedimientos/v5-ensamble.md) | -Los tres reportan al servidor **la misma trama**: `$PHLG` de 29 campos cada 30 s y un `$PHEV` por cada -cambio de estado, en banda por el módem (Modo B). Es exactamente lo que el monitor desplegado parsea hoy -(`retranslator.py`: 20 campos base + 4 de v3 + 5 de 0.5.1, y `$PHEV`), así que las tres tarjetas se ven -igual en la columna *Salud*. +0.6.0 CAMPO (V4 y V5): cargador con gobernador (hasta 0.5.9 estaba apagado, paquete de un solo uso); en batería la etapa y el módem siguen encendidos y reportando igual que en 24 V (la V5.5 no arranca el módem en frío sobre el boost, ver [módem en batería](../procedimientos/prueba-bateria-modem.md#3-hallazgos-2527-sep)); ningún ciclo de etapa en batería; corte a 3.40 V; reset del MCU al volver el 5 V tras ≥ 10 s de respaldo; vigilancia del módem solo diagnóstica (`modem=` en `STAT`); teclas `C`/`M`/`R`. 0.5.1 fue la última embarcada antes de 0.6.0. -!!! warning "0.5.x (V4 y V5) cambia cómo se ve la unidad en el monitor cuando está en batería" - Desde 0.5.2 la unidad **apaga el módem entre reportes** mientras está en batería: enciende ~120–180 s cada - 10 min, manda posición y `$PHLG` con `pwr=BATT`, avisa `DUTY_SLEEP next=` y se calla. Para que ese - silencio **no aparezca como desconexión** (ni dispare el correo del notifier, ni cuente como caída), el - `retranslator.py` del servidor debe llevar el soporte `DUTY` (24-sep). **Desplegar primero el servidor, - después flashear.** Con la V3 (4.0.0) no cambia nada: sigue reportando continuo en batería. +!!! warning "No se cruzan" + - `hbox-v5-bringup_…` (F411RE soldado) en una V3 o V4: otro MCU y otro mapa de pines. La V4 usa `hbox-tarjetaV4_…`. + - `hbox-tarjetaV3_…` o `blackpillrtkcode_v3` en una V4 o V5: manejan los LEDs de carga en PB12–PB15, que ahí son el SPI del W5500. + - Nada de `superseded/`: se guarda solo por trazabilidad. + - Nada que no esté publicado aquí con su SHA-256. Los `.bin` de V3 y V4 no viven en el repositorio; se compilan, se prueban en banco y se publican ([reflasheo §5](../procedimientos/reflasheo-unidades.md#5-para-ingenieria-generar-y-publicar-un-binario)). - **0.5.9 CAMPO** no apaga el módem ni calla en batería: reporta continuo con `pwr=BATT`, igual que 0.5.1 (el monitor muestra ⚡ - sin badge de silencio). El soporte `DUTY` sigue haciendo falta para las versiones de banco con ciclo o ahorro. +Las tres tarjetas mandan la misma trama: `$PHLG` de 29 campos cada 30 s y un `$PHEV` por cambio de estado, en banda por el módem (Modo B). El monitor la parsea igual (`retranslator.py`: 20 campos base + 4 de v3 + 5 de 0.5.1, y `$PHEV`) y las tres se ven igual en Salud. -!!! success "0.6.0 — el cargador por fin: gobernador de carga (port de flota v3.0.1)" - Hasta 0.5.9 el cargador estaba **apagado por firmware** («paquete de un solo uso»): tras la primera noche en batería el paquete - quedaba gastado y la unidad ya no tenía respaldo (H0008 amaneció a 3.50 V y en 24 V seguía «sin cargar»). No se puede encender sin - más: en V5.5/V4 `RS1` 8 mΩ → límite de entrada del LTC4040 ≈ 3.1 A, por encima de los 3 A del SD-15B, y `R50` 825 Ω → 2.4 A de - carga; paquete vacío + etapa + ráfaga LTE hunden el riel al PFI 4.60 V y la unidad entra en bucle (incidente de flota 10-ago). - **El gobernador** carga solo con etapa ON en 24 V, nunca en los primeros 120 s tras boot o STACK ON, arranca tras 30 s de riel - ≥ 5.05 V, **corta al instante bajo 4.90 V** con enfriamiento 60 s → 30 min, inhibe con celda ≥ 45 °C y rearma el safety timer del - LTC4040. En fuente débil la carga es por ciclos: más lenta, pero el módem nunca paga por ella. Eventos `CHG_ON/CHG_SHED/CHG_OFF/ - CHG_HOT/CHG_COOL/CHG_PULSE`, `STAT` → `carga=FASE … ltc=CARGANDO|no cortes=`, tecla `C` = veto. El monitor muestra **🔌 CARGANDO** - (columna *Energía* y detalle) solo cuando el LTC4040 carga de verdad (`chg=1` en `$PHLG`). `PHLG_FW` = `0.6.0` (sin «-fm»). +!!! warning "V3 4.0.0: todavía no en unidades de campo" + Compila y pasa el simulador, pero no ha corrido en una EinarBoard 1.0 real. Solo en la mesa de ingeniería hasta que se pruebe en banco (RTK-003 o RTK-006) y se quite este aviso. 4.0.0 activa Modo B por omisión (el MCU queda en línea con el enlace de correcciones), así que la primera prueba es en par: el binario publicado y uno sin Modo B sobre la misma unidad. Si el fix RTK cae al energizar K1, o `v5min` se hunde en ese instante, sospecha de la bobina de K1 llevando el riel al PFI del LTC4040. - **Prueba de banco** (unidad con paquete bajo, consola abierta, 24 V): a los ~120 s `carga=PROVING n/30s` → `EVT CARGA ON` → - `ltc=CARGANDO` y 🔌 en el monitor. Multímetro en P2 durante una ráfaga LTE: si baja de 4.90 V debe verse `CARGA cortada … - enfriamiento 60 s` y reintento. Anotar `cortes=` por hora y si `vbat` sube. Si corta sin parar (enfriamiento en 30 min), la fuente - no puede con 2.4 A + etapa: V5.6 (`RS1` 10 mΩ, `R50` 1.5 kΩ) o fuente de 4 A. - -!!! danger "0.5.9 — la noche con 0.5.8: el recovery en batería mató al módem; sin ciclos de etapa en batería y reset al volver el 5 V siempre" - Noche 26/27-sep con 0.5.8 (V5.5 toda la noche en batería): amaneció con `vbat` 3.50 V, F9P vivo, **módem oscuro**, los 4 LEDs de - carga apagados (correcto: DB1 enciende a 3.60 V). Al volver los 24 V el módem siguió oscuro; solo un reset (SW1/P10) o `SW4G1` lo levantó. - Causa más probable: el recovery de enlace seguía armado en batería — el silencio del ahorro dejó al caster sin GGA → sin correcciones → - «RTK perdido 15 min» → `RECOVERY rtk_lost` → etapa OFF/ON **en batería** → el módem no arranca (brown-out del boost, abajo) → oscuro - hasta los 24 V; y 0.5.8 no reseteaba al volver el 5 V si la etapa venía encendida desde 24 V (regla falsa: el estado del módem no se - puede saber en V4/V5). **0.5.9:** ningún ciclo de etapa en batería (un ciclo en curso al perder el 5 V se aborta con la etapa apagada, - `RECOVERY_ABORT`); reset del MCU al volver el 5 V tras cualquier respaldo ≥ 10 s (`NRST` solo llega al MCU: es el botón P10); - **ahorro fuera del build de campo** hasta medirlo en banco (continuo como 0.5.1, ~10–13 h); y **vigilancia del módem solo - diagnóstica**: `STAT` añade `rtcm_age= sta= rtcm_last= sag5= sagb= flat= modem=vivo|SOSPECHOSO|?` (correcciones RTCM vistas por el - F9P + caída del riel por ráfagas LTE), eventos `MODEM_DARK` / `MODEM_BACK` / `MODEM_WATCH`. Con esos números se calibra 0.5.10. - -!!! danger "0.5.8 — diagnóstico cerrado: la V5.5/V4 NO arranca el módem en frío sobre la batería; por eso el build de campo no lo apaga" - Banco 26-sep (0.5.7): en batería **ningún** encendido de etapa arranca el módem (ni `P`, ni el despertar, ni un reset del MCU con - `R` o P10); **con 24 V cualquiera lo arranca**; y en batería **`SW4G1`** pulsado con la etapa ya encendida sí lo arranca. Causa: al - encender la etapa, simpleRTK2B y módem arrancan a la vez sobre el boost del LTC4040 (4.6 V en `SW_IN` solo con el F9P); la ráfaga - de arranque del módem (~2 A) hunde el riel, el buck de `3V3_MODEM` (MP1584, mínimo 4.5 V) cae y el PMIC del módem aborta y **no - reintenta** (todos los LEDs apagados). `SW4G1` lo reinicia solo, sobre un riel ya estable. No tiene arreglo por firmware en V4/V5; - se corrige en **V5.6** (buck del módem alimentado antes de Q1, reset y enable del módem en el MCU). - - **Por eso 0.5.8 CAMPO nunca apaga el módem en batería:** un módem que ya está encendido sí aguanta el paso de 24 V a batería. - La etapa sigue encendida hasta el corte de 3.40 V y el MCU (Modo B) recorta el tráfico: ráfaga de posición de ~8 s cada 10 min y - `$PHLG` cada 3 min (`SAVER_ON`, `DUTY_SLEEP`/`DUTY_WAKE`; `STAT` → `ahorro=`). Autonomía estimada ~30–35 h. Al volver el 5 V solo - hay reset del MCU si la etapa estaba apagada o arrancó en batería (el módem puede estar oscuro); si venía encendida desde 24 V, no se - toca. Reset por SW1/P10 en batería: la etapa **no** se reenciende hasta que vuelva el 5 V. Sigue disponible el puente (0.5.6+, ahora - el pulso va 5 s después de STACK ON): - - ``` - U13 pin 12 (P7) ──|<── SW4G1 pad 1 (MODEM_RST) diodo Schottky de señal BAT54 (o BAT85/BAT43/1N5711) — no 1N5819 - cátodo ánodo - ``` - - Verificar con la tecla **`M`** en consola (etapa ON): `SW4G1` pad 1 cae a < 0.4 V durante 0.5 s y los LEDs del módem - apagan y vuelven. Sin el puente el pulso `MODEM_RST` no llega a nada. Anotar el puente en el acta de la unidad. Detalle en el [procedimiento de batería](../procedimientos/prueba-bateria-modem.md). - -!!! note "V4 = la V5 en un Blackpill" - Cotejada pad por pad en `hbox-watchdog-v4.kicad_pcb` contra `board_v5.h`: mismas redes, mismos pines - del MCU, mismas direcciones I2C (PCF8574 `0x20`, SHT40 `0x44`, TMP102 `0x48`, SC16IS752 `0x4D`), mismo - W5500 en SPI2 y misma K1 en `PB5`. **Una sola diferencia:** `ETH_INT` es `PB2` (J1.16) en vez de `PC0`. - Por eso la V4 no necesita firmware propio: es `hbox_v5_bringup` compilado para Blackpill con - `board_v4.h`. La V4 **se flashea por DFU solo con USB** (sin 24 V y con la batería desconectada). Ojo: en la V4 - ese USB también alimenta el riel de 5 V de la tarjeta y, con él, al W5500, cuya `INTn` llega a `PB2` = `BOOT1`. - Si no aparece *STM32 BOOTLOADER*, se flashea la Blackpill fuera del zócalo - ([procedimiento V4](../procedimientos/v4-prueba-fw-0.5.6.md)). - -!!! danger "Lo que NO se puede cruzar" - - `hbox-v5-bringup_0.5.x.bin` (compilado para el F411RE soldado) en una **V3 o V4**: otro MCU y otro - mapa de pines. La V4 usa **su propio binario** `hbox-tarjetaV4_…`, compilado para Blackpill. - - `hbox-tarjetaV3_…` en una **V4**: maneja los LEDs de carga en PB12–PB15, que en la V4 son el SPI del W5500. - - Cualquier binario de la carpeta `superseded/`: se conservan solo por trazabilidad. - -### Versiones superadas - -No se flashean. Están para identificar lo que una tarjeta vieja pueda traer y para volver atrás si una prueba de banco lo pide. - -| Archivo | Por qué se retiró | -|---|---| -| [`superseded/hbox-tarjetaV3_3.0.4.bin`](superseded/hbox-tarjetaV3_3.0.4.bin) | Misma lógica que las unidades en campo (3.0.3) pero **sin telemetría en banda**: el monitor no ve nada en *Salud*. Sustituida por 4.0.0. | -| [`superseded/hbox-v5-bringup_0.5.9.bin`](superseded/hbox-v5-bringup_0.5.9.bin) · [`superseded/hbox-tarjetaV4_0.5.9.bin`](superseded/hbox-tarjetaV4_0.5.9.bin) | Correcta pero **sin cargador** (paquete de un solo uso). Sustituida por 0.6.0, que añade el gobernador de carga y no cambia nada más. | -| [`superseded/hbox-v5-bringup_0.5.8.bin`](superseded/hbox-v5-bringup_0.5.8.bin) · [`superseded/hbox-tarjetaV4_0.5.8.bin`](superseded/hbox-tarjetaV4_0.5.8.bin) | **No usar.** El recovery de enlace seguía activo en batería: el silencio del ahorro provocaba «RTK perdido» y un ciclo de etapa en batería que dejaba el módem oscuro hasta un reset manual (noche 26/27-sep). Sustituida por 0.5.9. | -| [`superseded/hbox-v5-bringup_0.5.7.bin`](superseded/hbox-v5-bringup_0.5.7.bin) · [`superseded/hbox-tarjetaV4_0.5.7.bin`](superseded/hbox-tarjetaV4_0.5.7.bin) | Despertar de batería por reset del MCU: en banco **no** enciende el módem en batería (brown-out del boost al encender la etapa); solo servía al volver el 5 V. Sustituida por 0.5.8 CAMPO (respaldo continuo con ahorro; conserva el reset al volver el 5 V cuando hace falta). | -| [`superseded/hbox-v5-bringup_0.5.6.bin`](superseded/hbox-v5-bringup_0.5.6.bin) · [`superseded/hbox-tarjetaV4_0.5.6.bin`](superseded/hbox-tarjetaV4_0.5.6.bin) | Pulso `MODEM_RST` por U13-P7 (solo con puente); sin puente el módem seguía sin encender en las ventanas, y un reset en batería dejaba la etapa apagada. Sustituida por 0.5.7 (despertar por reset del MCU; conserva el pulso). | -| [`superseded/hbox-v5-bringup_0.5.5.bin`](superseded/hbox-v5-bringup_0.5.5.bin) · [`superseded/hbox-tarjetaV4_0.5.5.bin`](superseded/hbox-tarjetaV4_0.5.5.bin) | **No usar.** Poner el UART del GNSS en alta impedancia no bastó: en reposo `3V3_MODEM` sigue en ~1 V y el módem no rearranca. Sustituida por 0.5.6, que resetea el módem desde el MCU (puente U13-P7 → SW4G1). | -| [`superseded/hbox-v5-bringup_0.5.4.bin`](superseded/hbox-v5-bringup_0.5.4.bin) · [`superseded/hbox-tarjetaV4_0.5.4.bin`](superseded/hbox-tarjetaV4_0.5.4.bin) | **No usar.** Su ciclo de etapa al volver el 5 V no apagaba de verdad al módem: el UART del GNSS seguía sosteniendo su riel, así que el módem no rearrancaba ni en batería ni al volver el vehículo (solo con reset). Sustituida por 0.5.5. | -| [`superseded/hbox-v5-bringup_0.5.3.bin`](superseded/hbox-v5-bringup_0.5.3.bin) · [`superseded/hbox-tarjetaV4_0.5.3.bin`](superseded/hbox-tarjetaV4_0.5.3.bin) | Ventana de 2 min, pero al volver el 5 V tras batería el módem podía quedarse en *latch* (oscuro hasta un reset). Sustituida por 0.5.4, que cicla la etapa al volver el 5 V. | -| [`superseded/hbox-v5-bringup_0.5.2.bin`](superseded/hbox-v5-bringup_0.5.2.bin) · [`superseded/hbox-tarjetaV4_0.5.2.bin`](superseded/hbox-tarjetaV4_0.5.2.bin) | Primera versión con reporte cada 10 min en batería, ventana mínima de 90 s: **insuficiente para que el módem entregara la posición**. Sustituida por 0.5.3 (120 s). | -| [`superseded/hbox-v5-bringup_0.5.1.bin`](superseded/hbox-v5-bringup_0.5.1.bin) · [`superseded/hbox-tarjetaV4_0.5.1.bin`](superseded/hbox-tarjetaV4_0.5.1.bin) | Última versión de campo antes del reporte cada 10 min en batería (en batería dejaba la etapa encendida hasta vaciar el paquete). Sirve para volver atrás si 0.5.3 da problemas en banco. | -| [`superseded/hbox-v5-bringup_0.4.0.bin`](superseded/hbox-v5-bringup_0.4.0.bin) | Versión de V5 sin `$PHLG` en banda. Sustituida por 0.5.1. | - -### Firmware de bring-up — EinarBoard v5 - -| Archivo | Versión | SHA-256 | Uso | -|---|---|---|---| -| [**hbox-v5-bringup_0.6.0.bin**](hbox-v5-bringup_0.6.0.bin) | **0.6.0 CAMPO** (2026-09-27) — **0.5.9 + gobernador de carga (riel ≥ 5.05 V / corte < 4.90 V / celda < 45 °C); Modo B; respaldo continuo en batería; sin ciclos de etapa en batería; reset del MCU al volver el 5 V; vigilancia del módem; teclas `C`/`M`/`R`** — ⚠ sin prueba de banco | `8a0ee4839763eae8…` | Sección 5 del [procedimiento de prueba y flasheo v5](../procedimientos/v5-prueba-y-flasheo.md) y sección 5 del [ensamble](../procedimientos/v5-ensamble.md) (modo de banco `P` / `n`) | - -Flasheo por DFU en **J11** (mantener **SW2**, pulsar y soltar **SW1**, soltar SW2): - -```bash -dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.6.0.bin -``` - -o con **STM32CubeProgrammer** → USB → Connect → Download del `.bin` en `0x08000000`. - -!!! success "A/B 0.4.0 vs 0.5.1 — cerrado el 19-sep" - El 18-sep por la tarde se reportó que con 0.5.1 la etapa RTK no encendía. **Resuelto:** 0.5.1 ensambla, - enciende y reporta telemetría completa en el monitor desplegado. **Se embarcó con 0.5.1; desde el 27-sep la vigente es 0.6.0.** `0.4.0` - queda en `superseded/` solo como referencia. - -!!! note "Tarjetas ya flasheadas con cualquier versión anterior" - Re-flashear con **0.6.0** por el mismo procedimiento DFU. **La primera línea de la consola tras reset dice la versión** - (`hbox-v5-bringup 0.6.0 built …`): si la línea `STAT` no termina en `stack=…`, la tarjeta sigue con 0.1.1. - -!!! tip "Consola 0.5.x" - Líneas `EVT` en cada cambio (stack, ignición, 5 V, cargador, NMEA, fix), `STAT` con nombres cada 5 s y `$PHLG` cada 10 s - (misma trama de salud que lee el servidor). Teclear `l` para la leyenda y `v` para los puntos de medición de la etapa RTK. - Para encender la etapa RTK: `P` y luego `Y` (requiere 5 V en P2). - -!!! warning "0.5.x = firmware de campo mínimo + telemetría y eventos en banda — AUTO de fábrica" - Desde 0.4.0 el modo AUTO es el **de fábrica**: la etapa RTK se enciende sola 3 s después de ver 5 V en P2 — no hace falta consola - ni teclear `A`. Incluye watchdog 16 s, ventilador (política v3.0.3), recuperación de enlace (ciclo de etapa si el F9P deja de - hablar 60 s; LIMP tras 3 ciclos), LEDs de carga y color de estado, corte térmico 60 °C y corte de batería 3.40 V. - **Cargador: apagado hasta 0.5.9 (paquete de un solo uso); desde 0.6.0 carga con gobernador** (ver la caja verde). Anotar la versión en el acta. - - **0.6.0 CAMPO:** gobernador de carga: carga solo con etapa ON en 24 V tras 120 s, riel ≥ 5.05 V por 30 s, corte < 4.90 V con enfriamiento - 60 s → 30 min, celda < 45 °C, pulso de rearranque del LTC4040. `STAT` → `carga=`; tecla `C`. Lo demás igual que 0.5.9. - - **0.5.9 CAMPO:** sin ciclo de 10 min ni ahorro en batería (`ENABLE_DUTY 0`, `ENABLE_BATT_SAVER 0`): la etapa y el módem siguen - encendidos y reportando hasta el corte de 3.40 V; **ningún ciclo de etapa en batería** (`RECOVERY_ABORT` si uno estaba en curso); - reset del MCU al volver el 5 V tras ≥ 10 s de respaldo. Un reset en batería deja la etapa apagada hasta que vuelva el 5 V. - Vigilancia del módem solo diagnóstica (`modem=` en `STAT`, `MODEM_DARK`/`MODEM_BACK`/`MODEM_WATCH` en banda). - - **0.5.8 CAMPO (retirada):** igual pero con ahorro (ráfaga cada 10 min) y con el recovery aún activo en batería — ver la caja roja. - - **0.5.7:** cada despertar de batería (≥ 10 min tras la última ventana) y cada regreso del 5 V tras batería es un **reset del - MCU** (`NVIC_SystemReset`, lo mismo que el botón P10): arranca en ~4 s; sin 5 V la ventana abre de inmediato, con 5 V AUTO - enciende la etapa a los 3 s. Se pierden uptime y contadores. Tecla `R` = ese reset ahora. Un reset por SW1/P10 en batería - abre ventana en 60 s (antes dejaba la etapa apagada hasta que volviera el 5 V) y `P` se acepta en batería con vbat ≥ 3.60 V. - - **0.5.6:** 3 s después de cada encendido de etapa el MCU pulsa el reset del módem 500 ms por `U13` P7 (evento `MODEM_RST`, - contador `mrst=` en `STAT`, tecla `M` = pulso manual). Con la etapa apagada PA9/PA10 quedan en alta impedancia sin pull-up. - - **0.5.5:** con la etapa apagada el UART del GNSS queda en alta impedancia (antes PA2 sostenía el riel del simpleRTK2B y, a través de él, el del módem: el módem - nunca veía un power-on reset y quedaba oscuro hasta un reset de la tarjeta). Al volver el 5 V tras batería la etapa se cicla 10 s (`PWR_RETURN_CYCLE`). - - **0.5.2–0.5.7 — batería (ciclo retirado en 0.5.8 para V5.5/V4; queda con `-DENABLE_DUTY=1`):** con 5 V perdidos la etapa ya no queda encendida hasta vaciar el paquete: ventana de reporte de 120–180 s - cada 10 min (`DUTY_WAKE` / `DUTY_SLEEP next=` / `DUTY_SKIP` / `DUTY_END`), ventilador y LEDs apagados en reposo, protecciones - de batería (< 3.40 V) y temperatura (≥ 60 °C) por encima del ciclo. El MCU sigue despierto: el ahorro es la etapa (~2.3 W). - - **0.5.1 — diagnóstico:** `$PHLG` lleva además `up_s`, `pwr` (VEH/BATT), `v5min`/`vbat_min` (mínimos de la ventana de 30 s) - y `bkp_n`; cada cambio de estado sale como `$PHEV,,,` al servidor (misma línea de tiempo que los `EVT`). - - **0.5.0 — Modo B:** 10 s después de que el F9P empieza a hablar, el MCU conmuta K1 y la trama `$PHLG` viaja al servidor - cada 30 s junto con el NMEA (columna **Salud** del monitor). En consola: `STAT … modoB=ON relay=… phlg_aire=…` (debe subir de - 1 en 1 cada 30 s). Si el MCU falla, K1 regresa solo al paso directo F9P→módem. `B` lo bloquea/permite para pruebas. Si se pierde el 5 V, la etapa **sigue encendida desde la batería** - y la consola registra `EVT BACKUP inicio` / `BACKUP fin` con duración y tramas NMEA: esa es la prueba de respaldo. - Se apaga sola si vbat < 3.40 V o temperatura > 50 °C. `A` de nuevo regresa a MANUAL. El cargador (0.6.0) solo carga en AUTO/MANUAL con la etapa ON y 24 V, según el gobernador. - -!!! 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` - (v3.0.3) en una v5.** - -**Novedades de 0.5.x:** el `$PHLG` gana 5 campos nuevos (`up_s`, `pwr`, `v5min`, `vbat_min`, `bkp_n` — `vbat_min` caza los hundimientos de 50-200 ms de las ráfagas LTE que una foto cada 30 s nunca ve) y aparece `$PHEV`, una trama por cada cambio de estado. Los analizadores viejos ignoran los campos extra. - -Notas de compilación y cambios: [README del firmware de bring-up](hbox-v5-bringup-README.md). - -### Firmware de campo — tarjeta V3 (detalle) - -!!! danger "Estos binarios todavía NO se flashean en una unidad de campo" - Compilaron limpio el 19-sep y pasan el simulador, pero **ninguno ha corrido sobre una - EinarBoard 1.0 real**. Hasta que ingeniería los pruebe en banco (RTK-003 o RTK-006) y quite - este aviso, solo se usan en la mesa de ingeniería. Esto aplica sobre todo al **4.0.0**, que pone - el MCU en línea con el enlace que lleva las correcciones RTK. - -!!! tip "Prueba de banco del 4.0.0: en par" - El 4.0.0 activa el Modo B por omisión. Aunque el A/B de V5 ya cerró bien, la primera prueba en - una V3 real se hace **en par**: el binario publicado y uno compilado con `-DENABLE_MODOB=0`, - sobre la misma unidad. Si el fix RTK cae al energizar K1, o `v5min` se hunde en ese instante, - el sospechoso es la bobina de K1 llevando el riel al PFI del LTC4040. ```bash arduino-cli compile --fqbn "$FQBN" --build-property "compiler.cpp.extra_flags=-DENABLE_MODOB=0" \ --output-dir build/v4-sinB blackpillrtkcode_v4 ``` -Es el firmware que gobierna la unidad en la máquina, distinto del de bring-up del v5. Se usa en el -[reflasheo en taller](../procedimientos/reflasheo-unidades.md). +### Gobernador de carga (0.6.0) -| Tarjeta | Archivo | Estado | -|---|---|---| -| **V3** — flota desplegada | [`hbox-tarjetaV3_4.0.0.bin`](hbox-tarjetaV3_4.0.0.bin) · 64 352 B · `a68a87ff…` | ⚠ compilado 19-sep, falta prueba de banco. El «4» es la versión del firmware, **no** la tarjeta | -| **V4** | [`hbox-tarjetaV4_0.6.0.bin`](hbox-tarjetaV4_0.6.0.bin) · 88 556 B · `1458470bbdd95b49…` | ⚠ compilado 27-sep, falta prueba de banco. Es 0.6.0 CAMPO (con cargador) para Blackpill (`-DHBOX_BOARD_V4`), DFU **solo con USB**; puente U13-P7 → SW4G1 opcional (respaldo) — [procedimiento V4](../procedimientos/v4-prueba-fw-0.5.6.md) | +No se podía encender el cargador sin más: en V5.5/V4 `RS1` 8 mΩ → límite de entrada del LTC4040 ≈ 3.1 A (más que los 3 A del SD-15B) y `R50` 825 Ω → 2.4 A de carga; paquete vacío + etapa + ráfaga LTE hunden el riel al PFI 4.60 V y la unidad entra en bucle (incidente de flota 10-ago). H0008 amaneció a 3.50 V tras una noche en batería y seguía "sin cargar" en 24 V. -!!! danger "Mientras diga «pendiente», no hay binario aprobado" - No flashees una unidad V3 o V4 con un archivo que no esté publicado aquí con su SHA-256. Los - binarios de estas generaciones **no viven en el repositorio** (están en `.gitignore`): tienen que - compilarse, probarse en banco y publicarse. El procedimiento de generación está en el - [reflasheo §6](../procedimientos/reflasheo-unidades.md). +El gobernador carga solo con etapa ON en 24 V; nunca en los primeros 120 s tras boot o STACK ON; arranca tras 30 s de riel ≥ 5.05 V; corta al instante bajo 4.90 V con enfriamiento de 60 s a 30 min; inhibe con celda ≥ 45 °C; rearma el safety timer del LTC4040. En fuente débil carga por ciclos: más lento, pero el módem nunca paga. Eventos `CHG_ON/CHG_SHED/CHG_OFF/CHG_HOT/CHG_COOL/CHG_PULSE`; `STAT` → `carga=FASE … ltc=CARGANDO|no cortes=`; tecla `C` = veto. El monitor muestra 🔌 CARGANDO (columna Energía) solo con `chg=1` en `$PHLG`. `PHLG_FW` = `0.6.0` (sin "-fm"). Prueba de banco: [módem en batería §1](../procedimientos/prueba-bateria-modem.md#1-cargador-060). Si corta sin parar: V5.6 (`RS1` 10 mΩ, `R50` 1.5 kΩ) o fuente de 4 A. -!!! warning "Un binario no sirve para otra generación" - La polaridad del control de carga está **invertida** entre la tarjeta de producción y la de - protoboard. Flashear el binario equivocado puede dejar la batería cargando justo cuando el - firmware cree estarla protegiendo por temperatura — la falla #1 del RCA de junio. +### Monitor con builds de ciclo + +Builds con ciclo o ahorro en batería (0.5.2–0.5.8, o compilados con `-DENABLE_DUTY=1`) apagan el módem entre reportes: ~120–180 s cada 10 min con `pwr=BATT` y `DUTY_SLEEP next=`. Para que ese silencio no cuente como caída ni dispare el correo del notifier, `retranslator.py` debe llevar el soporte `DUTY` (24-sep): despliega primero el servidor, después flashea. 0.5.9+ y la V3 4.0.0 reportan continuo en batería (el monitor muestra ⚡ sin badge de silencio). + +### V4 = V5 en un Blackpill + +Cotejada pad por pad (`hbox-watchdog-v4.kicad_pcb` contra `board_v5.h`): mismas redes, pines, direcciones I²C (PCF8574 `0x20`, SHT40 `0x44`, TMP102 `0x48`, SC16IS752 `0x4D`), W5500 en SPI2 y K1 en `PB5`. Única diferencia: `ETH_INT` en `PB2` (J1.16) en vez de `PC0`. Se flashea por DFU solo con USB (sin 24 V, batería desconectada); ese USB alimenta el 5 V y el W5500, cuya `INTn` llega a `PB2` = `BOOT1`. Sin `STM32 BOOTLOADER`, se flashea la Blackpill fuera del zócalo ([procedimiento V4](../procedimientos/v4-prueba-fw-0.5.6.md)). + +### Flasheo y consola (V5) + +DFU por J11 (mantén SW2, pulsa y suelta SW1, suelta SW2): + +```bash +dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.6.0.bin +``` + +o STM32CubeProgrammer → USB → Connect → Download en `0x08000000`. Tarjetas con cualquier versión anterior se reflashean igual. La primera línea tras reset dice la versión (`hbox-v5-bringup 0.6.0 built …`); si `STAT` no termina en `stack=…`, la tarjeta sigue con 0.1.1. + +Consola: `EVT` en cada cambio (etapa, ignición, 5 V, cargador, NMEA, fix), `STAT` cada 5 s y `$PHLG` cada 10 s. `l` = leyenda, `v` = puntos de medición de la etapa RTK, `P` y luego `Y` = encender la etapa (requiere 5 V en P2). + +El nombre "bring-up" viene de 0.1.x, que solo probaba la tarjeta; desde 0.4.0 es el firmware de campo de la V5. Compilación y cambios: [README del firmware](hbox-v5-bringup-README.md). + +### Versiones superadas + +No se flashean. Sirven para identificar lo que trae una tarjeta vieja o para volver atrás si una prueba de banco lo pide. + +| Archivo | Por qué se retiró | +|---|---| +| [`superseded/hbox-tarjetaV3_3.0.4.bin`](superseded/hbox-tarjetaV3_3.0.4.bin) | Lógica de campo (3.0.3) sin telemetría en banda: el monitor no ve Salud. Sustituida por 4.0.0. | +| [`superseded/hbox-v5-bringup_0.5.9.bin`](superseded/hbox-v5-bringup_0.5.9.bin) · [`superseded/hbox-tarjetaV4_0.5.9.bin`](superseded/hbox-tarjetaV4_0.5.9.bin) | Sin cargador (paquete de un solo uso). 0.6.0 añade el gobernador y nada más. | +| [`superseded/hbox-v5-bringup_0.5.8.bin`](superseded/hbox-v5-bringup_0.5.8.bin) · [`superseded/hbox-tarjetaV4_0.5.8.bin`](superseded/hbox-tarjetaV4_0.5.8.bin) | No usar. Recovery activo en batería: el silencio del ahorro provocaba "RTK perdido" y un ciclo de etapa que dejaba el módem oscuro hasta un reset (noche 26/27-sep). | +| [`superseded/hbox-v5-bringup_0.5.7.bin`](superseded/hbox-v5-bringup_0.5.7.bin) · [`superseded/hbox-tarjetaV4_0.5.7.bin`](superseded/hbox-tarjetaV4_0.5.7.bin) | Despertar de batería por reset del MCU: en banco no enciende el módem en batería (brown-out del boost); solo servía al volver el 5 V. | +| [`superseded/hbox-v5-bringup_0.5.6.bin`](superseded/hbox-v5-bringup_0.5.6.bin) · [`superseded/hbox-tarjetaV4_0.5.6.bin`](superseded/hbox-tarjetaV4_0.5.6.bin) | Pulso `MODEM_RST` por U13-P7 (solo con puente); sin puente el módem no encendía en las ventanas y un reset en batería dejaba la etapa apagada. | +| [`superseded/hbox-v5-bringup_0.5.5.bin`](superseded/hbox-v5-bringup_0.5.5.bin) · [`superseded/hbox-tarjetaV4_0.5.5.bin`](superseded/hbox-tarjetaV4_0.5.5.bin) | No usar. UART del GNSS en alta impedancia no bastó: `3V3_MODEM` queda en ~1 V y el módem no rearranca. | +| [`superseded/hbox-v5-bringup_0.5.4.bin`](superseded/hbox-v5-bringup_0.5.4.bin) · [`superseded/hbox-tarjetaV4_0.5.4.bin`](superseded/hbox-tarjetaV4_0.5.4.bin) | No usar. El ciclo de etapa al volver el 5 V no apagaba el módem (el UART del GNSS sostenía su riel): no rearrancaba sin reset. | +| [`superseded/hbox-v5-bringup_0.5.3.bin`](superseded/hbox-v5-bringup_0.5.3.bin) · [`superseded/hbox-tarjetaV4_0.5.3.bin`](superseded/hbox-tarjetaV4_0.5.3.bin) | Ventana de 2 min; al volver el 5 V el módem podía quedar en latch hasta un reset. | +| [`superseded/hbox-v5-bringup_0.5.2.bin`](superseded/hbox-v5-bringup_0.5.2.bin) · [`superseded/hbox-tarjetaV4_0.5.2.bin`](superseded/hbox-tarjetaV4_0.5.2.bin) | Primer reporte cada 10 min en batería; ventana de 90 s insuficiente para entregar la posición. | +| [`superseded/hbox-v5-bringup_0.5.1.bin`](superseded/hbox-v5-bringup_0.5.1.bin) · [`superseded/hbox-tarjetaV4_0.5.1.bin`](superseded/hbox-tarjetaV4_0.5.1.bin) | Última de campo antes del ciclo de 10 min (en batería dejaba la etapa encendida hasta vaciar el paquete). | +| [`superseded/hbox-v5-bringup_0.4.0.bin`](superseded/hbox-v5-bringup_0.4.0.bin) | Sin `$PHLG` en banda. Sustituida por 0.5.1. | + +??? note "Historial por versión, 0.4.0 → 0.6.0" + - Desde 0.4.0: AUTO de fábrica (la etapa RTK enciende sola 3 s después de ver 5 V en P2); watchdog 16 s; ventilador (política v3.0.3); recuperación de enlace (ciclo de etapa si el F9P calla 60 s; LIMP tras 3 ciclos); LEDs de carga y color de estado; corte térmico 60 °C; corte de batería 3.40 V. Anota la versión en el acta. + - 0.6.0 CAMPO: 0.5.9 + gobernador de carga (arriba). + - 0.5.9 CAMPO: sin ciclo ni ahorro en batería (`ENABLE_DUTY 0`, `ENABLE_BATT_SAVER 0`); ningún ciclo de etapa en batería (`RECOVERY_ABORT`); reset del MCU al volver el 5 V tras ≥ 10 s; un reset en batería deja la etapa apagada hasta que vuelva el 5 V; vigilancia del módem: `STAT` con `rtcm_age= sta= rtcm_last= sag5= sagb= flat= modem=vivo|SOSPECHOSO|?`, eventos `MODEM_DARK`/`MODEM_BACK`/`MODEM_WATCH`. Con esos números se calibra 0.5.10. + - 0.5.8 CAMPO (retirada): nunca apaga el módem en batería (un módem ya encendido aguanta el paso de 24 V a batería); ráfaga de posición de ~8 s cada 10 min y `$PHLG` cada 3 min (`SAVER_ON`, `DUTY_SLEEP`/`DUTY_WAKE`, `ahorro=`); autonomía estimada ~30–35 h; recovery aún activo en batería. + - 0.5.7: cada despertar de batería (≥ 10 min tras la última ventana) y cada regreso del 5 V es un reset del MCU (`NVIC_SystemReset`, igual que P10): arranque en ~4 s; se pierden uptime y contadores. Tecla `R`. Un reset por SW1/P10 en batería abre ventana en 60 s y `P` se acepta en batería con vbat ≥ 3.60 V. + - 0.5.6: 3 s tras cada encendido de etapa, pulso de 500 ms al reset del módem por U13 P7 (`MODEM_RST`, `mrst=`, tecla `M`); requiere el puente U13 pin 12 → diodo BAT54 → SW4G1 pad 1. Con la etapa apagada PA9/PA10 en alta impedancia sin pull-up. + - 0.5.5: con la etapa apagada el UART del GNSS queda en alta impedancia (PA2 sostenía el riel del simpleRTK2B y, por él, el del módem); al volver el 5 V la etapa se cicla 10 s (`PWR_RETURN_CYCLE`). + - 0.5.2–0.5.7: en batería, ventana de reporte de 120–180 s cada 10 min (`DUTY_WAKE` / `DUTY_SLEEP next=` / `DUTY_SKIP` / `DUTY_END`), ventilador y LEDs apagados en reposo; protecciones de batería (< 3.40 V) y temperatura (≥ 60 °C) por encima del ciclo. El MCU sigue despierto; el ahorro es la etapa (~2.3 W). Retirado en 0.5.8 para V5.5/V4; queda con `-DENABLE_DUTY=1`. + - 0.5.1: `$PHLG` suma `up_s`, `pwr` (VEH/BATT), `v5min`/`vbat_min` (mínimos de la ventana de 30 s; cazan hundimientos LTE de 50–200 ms) y `bkp_n`; cada cambio de estado sale como `$PHEV,,,`. Los analizadores viejos ignoran los campos extra. El 18-sep se reportó que la etapa no encendía; resuelto el 19-sep: 0.5.1 ensambla, enciende y reporta completo. + - 0.5.0: Modo B. 10 s después de que habla el F9P, el MCU conmuta K1 y `$PHLG` viaja cada 30 s con el NMEA (`STAT … modoB=ON relay=… phlg_aire=…`, sube 1 cada 30 s). Si el MCU falla, K1 vuelve al paso directo. `B` lo bloquea para pruebas. Sin 5 V la etapa sigue desde la batería (`EVT BACKUP inicio` / `BACKUP fin` con duración y tramas); se apaga con vbat < 3.40 V o > 50 °C. `A` regresa a MANUAL. ## Parámetros del módem 4G NTRIP Master -La configuración se envía por el puerto USB **XBEE** del simpleRTK2B Pro a 115200 baudios, línea por -línea (solo las que empiezan con `$$$AS+`). Cada una debe contestar `OK`. +Se envían por el USB XBEE del simpleRTK2B a 115200, línea por línea (solo las que empiezan con `$$$AS+`); cada una contesta `OK`. -| Archivo | Qué es | -|---|---| -| [**4G_NTRIP_HelgenSRV-NMEA.example.txt**](4G_NTRIP_HelgenSRV-NMEA.example.txt) | **Plantilla** con todos los parámetros y sus nombres, con los valores sensibles en blanco | +[`4G_NTRIP_HelgenSRV-NMEA.example.txt`](4G_NTRIP_HelgenSRV-NMEA.example.txt): plantilla con todas las claves y los valores sensibles en blanco. -!!! danger "El archivo con los valores reales no está aquí, y es a propósito" - El archivo lleno contiene **usuario y contraseña del caster NTRIP y de la APN**. Publicarlo en el - sitio sería ponerlo al alcance de cualquiera que tenga una cuenta de técnico, y meterlo al - repositorio rompe un invariante del proyecto (*sin secretos en el repo, nunca*). +| Clave | Configura | En la plantilla | +|---|---|---| +| `AS+I=1111` | Entra a modo configuración | Fijo | +| `AS+A` · `AS+Q` · `AS+q` | APN: host, usuario, contraseña | `` `` `` | +| `AS+S` · `AS+P` | Caster NTRIP: host y puerto | `` `` | +| `AS+U` · `AS+M` | Caster: `usuario:contraseña` y mountpoint | `:` `` | +| `AS+B=115200` | Velocidad hacia el F9P | Fijo | +| `AS+r` · `AS+h` · `AS+k=2` | Servidor secundario (monitor Helgen): IP, puerto, modo | `` `` | +| `AS+K` | ID de estación = `H00xx` de la unidad; se anota en el acta | `` | - **Cómo se obtiene:** pídelo a ingeniería para la unidad que vas a configurar. Llega por un canal - directo, se usa y no se guarda en el equipo ni se reenvía. - -Referencia rápida de los parámetros que más se consultan: - -| Comando | Qué configura | -|---|---| -| `AS+I=1111` | Entra a modo configuración | -| `AS+A` · `AS+Q` · `AS+q` | APN: host, usuario, contraseña | -| `AS+S` · `AS+P` | Caster NTRIP: host y puerto | -| `AS+U` · `AS+M` | Caster: `usuario:contraseña` y mountpoint | -| `AS+B` | Velocidad del puerto (115200) | -| `AS+K` | **ID de estación** del módulo — se anota en el acta | -| `AS+r` · `AS+h` | Servidor secundario: IP y puerto | +!!! warning "Credenciales" + El archivo con los valores reales (usuario y contraseña del caster y de la APN) no está en el sitio ni en el repositorio: sin secretos en el repo, nunca. Pídelo a ingeniería para la unidad que vas a configurar; llega por canal directo, se usa y no se guarda ni se reenvía. Nunca lo escribas en un acta. ## Firmware y configuración del simpleRTK2B Pro (ZED-F9P) -Aquí hay que separar dos cosas que se confunden: - -| Qué | De dónde sale | Estado | +| Qué | Origen | Estado | |---|---|---| -| **Firmware del ZED-F9P** | **Estándar de u-blox**, no es nuestro: [u-blox → ZED-F9P → Documentation & resources → Firmware Update](https://www.u-blox.com/en/product/zed-f9p-module). Serie **HPG**. Se carga con **u-center** (solo Windows) a 115200 | ✅ disponible en el sitio de u-blox | -| **Configuración de Helgen** (`.txt` de u-center) | **Nuestra.** Define UART1 a 115200 (que es lo que lee la tarjeta), UART2 a la velocidad del módem y qué mensajes NMEA salen | ⬜ **pendiente de publicar — este es el que de verdad falta** | +| Firmware del ZED-F9P | Estándar de u-blox, serie HPG: [u-blox → ZED-F9P → Documentation & resources → Firmware Update](https://www.u-blox.com/en/product/zed-f9p-module). Se carga con u-center (solo Windows) a 115200 | Disponible en u-blox | +| Configuración Helgen (`.txt` de u-center) | Nuestra: UART1 a 115200 (lo que lee la tarjeta), UART2 a la velocidad del módem, mensajes NMEA | Pendiente de publicar | -!!! warning "No actualices el firmware del F9P sin una razón concreta" - El firmware de u-blox **no tiene nada que ver con nuestras fallas**: las correcciones llegan por - el módem 4G, no por el GNSS, y en las capturas de junio los receptores estaban sanos. Actualizarlo - es un proceso solo-Windows que puede dejar el receptor a medias, y **borra o invalida la - configuración**, que es justo la parte que sí importa. +!!! warning "No actualices el firmware del F9P sin razón concreta" + Las correcciones llegan por el módem, no por el GNSS, y en las capturas de junio los receptores estaban sanos. Actualizar es solo-Windows, puede dejar el receptor a medias y borra la configuración. Anota la versión (u-center → View → Messages → UBX-MON-VER) y déjala. Solo se actualiza por un arreglo de u-blox a un problema que estemos viendo, en banco, nunca en una unidad instalada. - Primero anota qué versión trae (**u-center → View → Messages → UBX-MON-VER**) y déjala así. - Solo se actualiza si u-blox publica un arreglo para un problema que estemos viendo, y siempre en - banco, nunca en una unidad instalada. +Leer o cargar la configuración: u-center → Tools → Receiver Configuration. Después, guarda en FLASH y reconecta para confirmar que sobrevive al reinicio; una configuración solo en RAM se pierde al primer corte (así se perdió tiempo en junio). -Para leer o cargar la configuración: u-center → *Tools → Receiver Configuration*. Después de cargar, -**guardar en FLASH** y reconectar para confirmar que sobrevive al reinicio — una configuración que -solo quedó en RAM se pierde al primer corte de energía, y así perdimos tiempo en junio. +## Publicar un firmware nuevo -## Cómo se publica un firmware nuevo - -Para que un archivo pueda aparecer en esta página tiene que pasar por aquí. No es burocracia: un -binario mal compilado deja unidades muertas en el patio. - -- [ ] Compilado con el `TARGET_` correcto para esa generación de tarjeta. -- [ ] **Probado en banco sobre hardware real**, no solo compilado sin errores. -- [ ] Verificada la polaridad del control de carga sobre la tarjeta. -- [ ] Nombre con **tarjeta y versión**: `hbox-tarjetaV3_X.Y.Z.bin`. La versión del firmware nunca se infiere de la tarjeta ni al revés. -- [ ] Su línea en `SHA256SUMS.txt`. -- [ ] Anotado en el `CHANGELOG.md` del repositorio de firmware, con fecha y quién lo probó. -- [ ] Actualizada la tabla de esta página. - -Los archivos viven en `docs/descargas/` del repositorio `hbox-docs` y se publican con -`./scripts/deploy.sh`. Los `.bin` de firmware de campo están en `.gitignore` por tamaño y por -control de versiones: se copian a mano a esa carpeta antes de publicar. +Lista y comandos: [reflasheo §5](../procedimientos/reflasheo-unidades.md#5-para-ingenieria-generar-y-publicar-un-binario). ## Herramientas -- **STM32CubeProgrammer** (Windows/macOS/Linux): https://www.st.com/en/development-tools/stm32cubeprog.html -- **dfu-util** (macOS: `brew install dfu-util`; Linux: `apt install dfu-util`) -- Terminal serie: CoolTerm, `screen /dev/tty.usbmodem* 115200`, o el monitor serie de Arduino IDE +- STM32CubeProgrammer (Windows/macOS/Linux): https://www.st.com/en/development-tools/stm32cubeprog.html +- dfu-util (macOS: `brew install dfu-util`; Linux: `apt install dfu-util`) +- Terminal serie: CoolTerm, `screen /dev/tty.usbmodem* 115200` o el monitor serie de Arduino IDE + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.x | 2026-09-19 → 2026-09-27 | Cada binario nuevo (0.4.0 → 0.6.0) añadió su nota. | +| 1.8 | 2026-09-29 | Historial por versión en cajas plegables; enlaces a manuales. | +| 1.9 | 2026-09-29 | Edición breve. Una sola tabla de binarios vigentes; verificación SHA-256 con encabezado propio; tabla de parámetros del módem completa (antes en la configuración de la unidad); lista de publicación → reflasheo §5. | + +Versiones anteriores en git. diff --git a/docs/diagnostico/procedimiento-diagnostico-campo.md b/docs/diagnostico/procedimiento-diagnostico-campo.md index c1038f0..6b8102c 100644 --- a/docs/diagnostico/procedimiento-diagnostico-campo.md +++ b/docs/diagnostico/procedimiento-diagnostico-campo.md @@ -1,74 +1,55 @@ -# Diagnóstico de unidades HBOX en campo — procedimiento - -**Para:** técnicos de campo (Alan, Daniel) · **Versión:** 1.0 · 18-sep-2026 · **Responsable:** Leo Rodríguez - -El acta se llena en el teléfono, en la máquina: -**[▶ Abrir el acta de diagnóstico en campo](../formularios/diagnostico.html)** - +--- +title: "Diagnóstico de unidades HBOX en campo" +tags: [project-drogheda, hbox, procedimiento, diagnostico, campo, v3, icave] +date: 2026-09-18 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 --- -## 1. Qué se espera de ti (y qué no) +# Diagnóstico de unidades HBOX en campo -**No** se espera que encuentres la causa de la falla. Eso se determina en el banco de -Querétaro, con instrumentos que no existen en el patio. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de campo (Alan y Daniel). + - Cuándo: una unidad V3 instalada (EinarBoard 1.0 con Blackpill, ICAVE) dejó de reportar; antes de desmontarla. + - Tiempo: 2–3 h con permiso, acceso a la máquina y captura de 3 min. + - Necesitas: teléfono con cámara y datos, multímetro, laptop con cable micro-USB (muy recomendada), desarmadores o llave del gabinete, etiquetas y plumón, bolsa antiestática, termómetro infrarrojo (deseable, mide la hipótesis térmica) y el [acta de diagnóstico en campo](../formularios/diagnostico.html), que se llena en el teléfono en la máquina. -Lo que sí depende de ti, y que nadie más puede hacer, es **traer la evidencia completa del -estado en que estaba la unidad**. Esa es toda tu misión, y es más valiosa de lo que parece: +No se espera que encuentres la causa; eso se hace en el banco de Querétaro. Tu trabajo es traer la evidencia completa del estado en que estaba la unidad. -!!! danger "La regla que más se rompe y más caro sale" - **Una unidad reiniciada antes de leerla ya no se puede diagnosticar.** - El HBOX guarda en su memoria la **temperatura máxima** que ha alcanzado, **cuántas veces - se ha tenido que recuperar** y **por qué arrancó la última vez**. Todo eso se borra al - cortarle la corriente. Si llegas y lo primero que haces es desconectarlo "a ver si así - revive", destruiste el único dato que explicaba la falla — y la unidad vuelve a fallar - dentro de un mes sin que sepamos por qué. +!!! warning "No cortes la energía antes del paso 5" + El HBOX guarda en RAM la temperatura máxima, cuántas veces se recuperó y por qué arrancó la última vez. Cortar la energía lo borra. Una unidad reiniciada antes de leerla ya no se puede diagnosticar y vuelve a fallar sin que sepamos por qué. - Por eso el procedimiento dice: **no cortes la energía hasta terminar el paso 5.** +## 1. Antes de ir -## 2. Antes de ir — permiso de acceso y de qué máquina hablamos +### Máquina -Dos cosas tienen que estar resueltas **antes** de salir. Sin ellas la visita no se hace. +En ICAVE el equipo se conoce por la máquina (`FL-JUN-060`, `RT-ZPMC-20`, `HS-WES-62`), no por el HBOX. El permiso, el operador y el acta van por máquina. -### 2.1 De qué máquina estamos hablando - -En ICAVE nadie conoce el equipo por el número del HBOX: lo conocen por la **máquina** -(`FL-JUN-060`, `RT-ZPMC-20`, `HS-WES-62`). El permiso se pide por máquina, el operador te -lleva a una máquina y el acta se cruza por máquina. - -Las tres unidades v3 desplegadas y en qué máquina va cada una: - -| Máquina (como la nombra ICAVE) | Equipo | Unidad HBOX | Estado hoy | +| Máquina (ICAVE) | Equipo | Unidad | Estado | |---|---|---|---| -| `FL-JUN-060` | Montacargas | **RTK-014** | **Instalada.** Dejó de reportar el 17-sep. Nadie la ha tocado — evidencia intacta | -| `RT-ZPMC-20` | RTG | **RTK-003** | Desmontada, en el escritorio del taller | -| `HS-WES-62` | Tractoplana | **RTK-006** | Desmontada, en el escritorio del taller | +| `FL-JUN-060` | Montacargas | RTK-014 | Instalada. Dejó de reportar el 17-sep; nadie la ha tocado | +| `RT-ZPMC-20` | RTG | RTK-003 | Desmontada, en el taller | +| `HS-WES-62` | Tractoplana | RTK-006 | Desmontada, en el taller | -Solo `FL-JUN-060` necesita permiso de acceso: las otras dos ya están en el taller y se revisan en banco. +Solo `FL-JUN-060` necesita permiso; las otras dos se revisan en [banco](../procedimientos/diagnostico-banco.md). Estas unidades son `RTK-006` (tres dígitos); los módems 4G del HBOX v5 son `RTK-0006` (cuatro) y van en otra acta. -!!! warning "No confundir los números" - Estas unidades de campo son **`RTK-006`** (tres dígitos). Los módems 4G del HBOX v5 son - **`RTK-0006`** (cuatro dígitos) y viven en otra acta. Son cosas distintas. +Confirma en qué máquina está la unidad antes de pedir acceso; si hay duda, pregúntalo a ICAVE en el mismo correo. Si al llegar está en otra máquina, anótalo en el acta: el registro estaba mal. -Por eso, antes de pedir el acceso hay que **saber en qué máquina está montada la unidad** que -queremos revisar. Si el registro no lo dice o hay duda, se confirma con ICAVE en el mismo correo. -Y si al llegar la unidad resulta estar en **otra** máquina de la que dice la lista, eso se anota -en el acta: el registro estaba mal y hay que corregirlo. +### Correo de acceso -### 2.2 El correo de solicitud de acceso +Lo manda Operaciones (Adriana) al contacto de ICAVE, con copia a Agustín Alfonseca, Leon David Piña, Leo y los técnicos. Una máquina por correo; solo cambian la unidad y, si aplica, los técnicos. -Lo manda **Operaciones (Adriana)** al contacto de ICAVE, con copia a Agustín Alfonseca, -Leon David Piña, Leo y los técnicos que van a subir. Modelo: - -> **Asunto:** Solicitud de acceso a la unidad `FL-JUN-060` — revisión de equipo HBOX +> Asunto: Solicitud de acceso a la unidad `FL-JUN-060` — revisión de equipo HBOX > -> Estimado **[nombre]**: +> Estimado [nombre]: > > Buen día. > > Por medio del presente, solicito de tu apoyo para que se nos proporcione acceso a la unidad > **`FL-JUN-060`**, con la finalidad de realizar una revisión del equipo HBOX instalado en dicha unidad. > -> La actividad será llevada a cabo por los técnicos **Alán Basurto y Daniel Martínez**, quienes +> La actividad será llevada a cabo por los técnicos Alán Basurto y Daniel Martínez, quienes > realizarán las verificaciones correspondientes para asegurar el correcto funcionamiento del sistema. > > Quedamos atentos a tus comentarios y al apoyo para coordinar el acceso en el horario que mejor @@ -76,147 +57,114 @@ Leon David Piña, Leo y los técnicos que van a subir. Modelo: > > Muchas gracias. Saludos cordiales. -Lo único que cambia entre visitas es **el número de la unidad** y, si aplica, **los nombres de -los técnicos**. Una máquina por correo: mezclar dos en el mismo correo enreda la autorización. - -### 2.3 La regla - -| Situación | ¿Se sube a la máquina? | +| Situación | Se sube a la máquina | |---|---| -| Correo contestado y horario acordado | **Sí**, con la máquina detenida y bloqueada (LOTO) | -| Autorización de palabra del supervisor en sitio | Sí, pero se anota quién autorizó y a qué hora | -| Sin respuesta al correo | **No.** Se revisa desde el piso lo que se alcance y se reagenda | -| La unidad ya está desmontada, en el taller | No aplica: no hay máquina de por medio | +| Correo contestado y horario acordado | Sí, con la máquina detenida y bloqueada (LOTO) | +| Autorización de palabra del supervisor en sitio | Sí; anota quién y a qué hora | +| Sin respuesta | No. Revisa desde el piso lo que alcances y reagenda | -Una revisión incompleta se repite la semana que entra. Un accidente en un patio de maniobras, no. +## 2. Seguridad -## 3. Qué llevar +1. Nunca trabajes sobre un RTG o equipo energizado sin permiso y LOTO. Si está operando, no subas; agenda con el supervisor de ICAVE. +2. Batería de litio hinchada, caliente o con olor: deja de desarmar, no la perfores, sepárala de la electrónica, foto y aviso el mismo día. Una batería hinchada no viaja en avión. +3. No abras el gabinete bajo lluvia ni mojado por fuera. +4. El gabinete tiene 24 V: un corto quema la tarjeta. Mide con la máquina apagada siempre que puedas. -| Herramienta | Para qué | ¿Obligatoria? | +## 3. Pasos + +| Paso | Acción | Para qué | |---|---|---| -| Teléfono con cámara y datos | El acta y las fotos | **Sí** | -| Multímetro | Decidir si la falla es del gabinete o del HBOX | **Sí** | -| Laptop + cable USB (micro-USB) | La captura serial: el dato más valioso de la visita | Muy recomendada | -| Desarmadores / llave del gabinete | Abrir | Sí | -| Etiquetas y plumón | Marcar la unidad que se desmonta | Sí | -| Bolsa antiestática | Transportar la unidad desmontada | Sí | -| Termómetro infrarrojo | Medir la temperatura interior del gabinete | Deseable — cuesta poco y mide la hipótesis térmica | +| 0 | Permiso de acceso y máquina confirmada | Sin permiso no hay visita | +| 1 | Anota por qué vienes y qué dijo el operador | La hora en que dejó de reportar acota la causa | +| 2 | Fotos con el gabinete cerrado: máquina, gabinete, antenas | Sol, altura, antena floja o robada | +| 3 | Cuenta los destellos del LED en 10 s (§4) | Diagnóstico inmediato | +| 4 | Abre, huele, toca, revisa la batería | Calor y agua dejan rastro | +| 5 | Captura por USB a 115200, 3 min (§6) | Saca la memoria antes de perderla | +| 6 | Ahora sí: corta la energía y mide (§5) | La evidencia ya está guardada | +| 7 | Clasifica (§7), decide cómo queda y firma | Una visita comparable | -## 4. Seguridad +## 4. LED -1. **Nunca** trabajes sobre un RTG o equipo energizado sin el permiso y el bloqueo (LOTO) del - terminal. Si el equipo está operando, **no subas**: agenda con el supervisor de ICAVE. -2. **Batería de litio.** Hinchada, caliente o con olor: no sigas desarmando, no la perfores, - sepárala de la electrónica, foto y aviso el mismo día. **Una batería hinchada no viaja en avión.** -3. **No abras el gabinete bajo lluvia** ni si está mojado por fuera. -4. El gabinete puede tener **24 V**: no es peligroso para la vida, pero un corto sí puede - quemar la tarjeta. Mide con la máquina apagada siempre que puedas. +Cuenta con reloj durante 10 s; 5 y 10 destellos significan cosas opuestas. -## 5. Los pasos, en orden - -| Paso | Qué haces | Por qué importa | -|---|---|---| -| **0** | **Permiso de acceso a la máquina** y confirmar en cuál está montada | Sin autorización no hay visita; sin máquina no hay permiso | -| 1 | Anotas **por qué vienes** y qué dijo el operador | La hora en que dejó de reportar acota la causa | -| 2 | Fotos con el gabinete **cerrado**: máquina, gabinete, antenas | Sol, altura, antena floja o robada se ven aquí | -| 3 | **Cuentas los destellos del LED** en 10 segundos | Es el diagnóstico gratis que la unidad te está dando | -| 4 | Abres, hueles, tocas, revisas la batería | Calor y agua dejan rastro visible | -| 5 | **Captura por USB** a 115200 baudios, 3 minutos | Saca la memoria de la unidad antes de perderla | -| 6 | *Ahora sí* puedes cortar la energía y probar | Ya está toda la evidencia guardada | -| 7 | Clasificas, decides cómo queda y firmas | Convierte tu visita en un dato comparable | - -## 6. Tabla del LED — qué te está diciendo la unidad - -Mira el LED **10 segundos con el reloj** y **cuenta cuántas veces prende**. No lo estimes: -5 destellos y 10 destellos en 10 segundos significan cosas **opuestas**. - -| Lo que ves | Destellos en 10 s | Estado interno | Qué significa | +| Se ve | Destellos en 10 s | Estado | Significa | |---|---|---|---| -| **Apagado**, nunca prende | 0 | sin energía o MCU muerto | No le llega corriente, **o** el HBOX ya no enciende. El multímetro decide cuál. | -| **Fijo encendido** | — | `RUN` + vehículo + enlace OK | La unidad está sana. Si no la ves en el sistema, el problema está en el servidor. | -| Destello **muy cortito** cada 4 s | ~2, muy breves | `SLEEP` | Se durmió por batería baja. Lleva tiempo sin corriente de la máquina. | -| Prende 1 s / apaga 1 s (**latido**) | **5** | `RUN` **sin energía de vehículo** | El HBOX vive pero está en su batería: la máquina no le da 24 V. La falla está aguas arriba. | -| Parpadeo parejo 1 por segundo | **10** | `RUN` + enlace degradado | Las correcciones llegan a ratos. Antenas, señal, SIM. | -| **Dos destellos** juntos y pausa | ~7 | `RUN` + enlace en las últimas | Prácticamente sin correcciones. | -| Parpadeo **rápido continuo** | no se cuentan | arrancando o reiniciándose | Puede estar reiniciándose en bucle. **Solo la captura USB lo confirma.** | +| Apagado | 0 | Sin energía o MCU muerto | El multímetro decide cuál | +| Fijo | — | `RUN` + vehículo + enlace OK | Unidad sana; si no aparece en el sistema, es el servidor | +| Destello muy corto cada 4 s | ~2 | `SLEEP` | Dormida por batería baja; lleva tiempo sin corriente de la máquina | +| 1 s encendido / 1 s apagado | 5 | `RUN` sin vehículo | Vive en batería; la máquina no le da 24 V | +| Parejo, 1 por segundo | 10 | `RUN` + enlace degradado | Correcciones a ratos: antenas, señal, SIM | +| Doble destello y pausa | ~7 | `RUN` + enlace casi perdido | Prácticamente sin correcciones | +| Rápido continuo | — | Arrancando o reiniciando | Posible bucle; solo la captura USB lo confirma | -## 7. Medidas esperadas +## 5. Medidas -Con la punta negra en el chasis/negativo del gabinete: +Punta negra en el chasis/negativo del gabinete. -| Dónde mides | Esperado | Si sale mal | +| Punto | Esperado | Si sale mal | |---|---|---| -| Entrada de la máquina al gabinete | 12 V o 24 V según el equipo | La máquina no está alimentando el gabinete | -| Salida de la fuente Mean Well | **23 – 26 V** | Fuente muerta o entrada ausente | -| **GX16 pines 1-2** (lo que le llega al HBOX) | **23 – 26 V** | *Esta es la medida clave — ver abajo* | -| GX16 pin 3 (ignición), máquina encendida | 12 – 24 V | Señal de ignición perdida | +| Entrada de la máquina al gabinete | 12 o 24 V según el equipo | La máquina no alimenta el gabinete | +| Salida de la Mean Well | 23–26 V | Fuente muerta o sin entrada | +| GX16 pines 1-2 (lo que llega al HBOX) | 23–26 V | Medida clave, abajo | +| GX16 pin 3 (ignición), máquina encendida | 12–24 V | Ignición perdida | -!!! tip "La medida que parte el diagnóstico en dos" - **Hay 24 V en el GX16 y el LED sigue apagado** → la falla es **del HBOX** → se desmonta y se envía. - **No hay 24 V en el GX16** → la falla es **del gabinete o de la máquina** (breaker, fusible, - fuente, cable) → el HBOX probablemente está sano; no lo desmontes. +24 V en el GX16 y LED apagado: falla del HBOX; se desmonta y se envía. Sin 24 V en el GX16: falla del gabinete o la máquina (breaker, fusible, fuente, cable); el HBOX probablemente está sano, no lo desmontes. -## 8. La captura por USB +## 6. Captura por USB -Es el paso que más nos sirve y el que más se salta. Vale la pena cargar la laptop. - -``` -1. Conecta el USB del Blackpill a la laptop. -2. Abre el puerto serie nuevo a 115200 baudios (PuTTY, TeraTerm o el monitor de Arduino). -3. Activa "guardar a archivo" (log to file). -4. Déjalo correr 3 minutos. -5. Presiona RESET y graba también el arranque. -6. Guarda el archivo con el nombre de la unidad. -``` - -Verás líneas así: +1. USB del Blackpill a la laptop. +2. Puerto serie a 115200 (PuTTY, TeraTerm o monitor de Arduino), guardando a archivo. +3. Graba 3 min. +4. Pulsa RESET y graba también el arranque. +5. Guarda con el nombre de la unidad. ``` BOOT,1240,fw=3.0.3,reset=WDG TLM,182000,RUN,DEGR,1,11,4210,1HZ,3.92,5.02,1,1,58,81,0,3,1,900,44,38,57,… ``` -Los cuatro campos que debes anotar aunque no puedas copiar la línea completa: +Si no puedes copiar la línea, anota al menos: -| Campo | Qué es | Por qué importa | +| Campo | Qué es | Sirve para | |---|---|---| -| `tmax` | La **temperatura máxima** que ha visto la unidad | Confirma o descarta la hipótesis térmica de un plumazo | -| `rec` | Cuántas veces se ha tenido que **recuperar** sola | Un número alto = falla intermitente, no muerte súbita | -| `vbat` | Voltaje de la batería | Diferencia "batería agotada" de "batería dañada" | -| `veh` | 1 = le llega corriente de la máquina, 0 = no | Resuelve solo la mitad de los casos | +| `tmax` | Temperatura máxima vista | Confirma o descarta la hipótesis térmica | +| `rec` | Recuperaciones | Alto = falla intermitente, no muerte súbita | +| `vbat` | Voltaje de batería | Agotada vs dañada | +| `veh` | 1 = le llega corriente de la máquina | Resuelve la mitad de los casos | +| `reset=` (línea `BOOT`) | Por qué arrancó la última vez (corte, watchdog, brownout) | La causa escrita por la unidad | -Y de la línea `BOOT`, el campo `reset=` dice **por qué arrancó la última vez** -(corte de energía, watchdog, brownout). Es la causa de muerte escrita por la propia unidad. +## 7. Clasificación -## 9. Catálogo de clasificaciones +Elige lo que observaste, no lo que supones. "No está claro" es una respuesta válida. -Elige lo que **observaste**, no lo que supones. *No está claro* es una respuesta válida y útil; -inventar una causa nos hace perder semanas. - -| Clasificación | Qué la sustenta | Qué pasa después | +| Clasificación | Evidencia | Después | |---|---|---| | Sin corriente desde la máquina o el gabinete | 0 V en el GX16 | Se corrige en sitio (breaker, fusible, cable) | -| El HBOX no enciende aunque le llega 24 V | 24 V en el GX16 + LED apagado | Desmontar y enviar a QRO | -| Enlace 4G: no hay datos ni correcciones | LED 1 Hz o doble destello | Se revisa SIM, antenas y servidor antes de tocar hardware | +| El HBOX no enciende con 24 V | 24 V en GX16 + LED apagado | Desmontar y enviar a QRO | +| Enlace 4G sin datos ni correcciones | LED 1 Hz o doble destello | SIM, antenas y servidor antes de tocar hardware | | Antena suelta, rota o faltante | Foto del conector | Se corrige en sitio | -| Batería dañada | Hinchada, caliente o con fuga | Aislar hoy; **no** enviar por avión | -| Daño por calor | Quemado, derretido, decolorado | Evidencia directa para el rediseño térmico | -| Agua adentro del gabinete | Encharcado o empañado | Se revisa sellado y prensaestopas | -| Daño mecánico o golpe | Foto | Se revisa el montaje | -| La unidad se ve sana — parece el servidor | LED fijo y captura sana | **No desmontar.** Ingeniería revisa el backend | -| No está claro — se necesita banco | Todo lo demás | Desmontar y enviar | +| Batería dañada | Hinchada, caliente o con fuga | Aislar hoy; no enviar por avión | +| Daño por calor | Quemado, derretido, decolorado | Evidencia para el rediseño térmico | +| Agua en el gabinete | Encharcado o empañado | Sellado y prensaestopas | +| Golpe o daño mecánico | Foto | Revisar el montaje | +| Parece el servidor | LED fijo y captura sana | No desmontar; ingeniería revisa el backend | +| No está claro | Todo lo demás | Desmontar y enviar | -## 10. Qué pasa cuando envías el acta +## 8. Después de enviar el acta -1. Queda guardada en el servidor con tu nombre, la hora y las fotos. -2. Aparece en el **[tablero de campo](tablero-campo.html)**, que ingeniería revisa en Querétaro. -3. La siguiente persona que abra el acta de esa unidad **verá tu visita** antes de empezar. +- Queda en el servidor con tu nombre, hora y fotos, y aparece en el [tablero de campo](tablero-campo.html). +- Quien abra el acta de esa unidad verá tu visita antes de empezar. +- Sin señal, el acta se guarda sola en el teléfono; fotos y envío necesitan datos. Si falla, reintenta desde el mismo formulario. +- Unidad desmontada: sigue en [diagnóstico en banco](../procedimientos/diagnostico-banco.md). Tarjeta: [manual V3](../manuales/manual-tarjeta-V3.md). -Puedes llenar el acta **sin señal**: se guarda sola en el teléfono. Las fotos y el envío -necesitan datos — si falla, vuelve a intentar desde el mismo formulario cuando tengas señal, -no vuelvas a empezar. +Para ingeniería: cada visita es un registro independiente (`ACTAS_REPETIBLES`). Fotos en `/srv/projects/drogheda/adjuntos/diagnostico-campo//`; índice en `/srv/projects/drogheda/actas/diagnostico-campo/_indice.csv`. -!!! note "Para ingeniería" - Cada visita es un registro independiente (`ACTAS_REPETIBLES`), no se bloquea por serie. - Las fotos se guardan en `/srv/projects/drogheda/adjuntos/diagnostico-campo//`. - El índice por tipo está en `/srv/projects/drogheda/actas/diagnostico-campo/_indice.csv`. +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-18 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme; enlaces al banco y al manual V3. | +| 1.2 | 2026-09-29 | Edición breve; material dentro del encabezado. | + +Versiones anteriores en git. diff --git a/docs/diagnostico/protocolo-diagnostico-remoto.md b/docs/diagnostico/protocolo-diagnostico-remoto.md index b4522b6..adaddbf 100644 --- a/docs/diagnostico/protocolo-diagnostico-remoto.md +++ b/docs/diagnostico/protocolo-diagnostico-remoto.md @@ -1,180 +1,142 @@ -# Remote Diagnostic Protocol — Pulled HBOX Units - -**Date:** 2026-06-19 · **Owner:** Leo Rodriguez -**Situation:** all HBOX units were **removed from the machines**. We have **4 units -in hand: 3 not working, 1 working-ish.** They are **physically in Veracruz**; the -team is in **Querétaro** → debugging is **remote** until they're shipped or someone -on-site acts as our hands. -**Firmware on these units = v1** (no MCU thermal log) → thermal evidence must come -from **physical inspection + a bench power test**, not from the firmware. - -> The single working-ish unit is the **control**. Every measurement below should be -> taken on it too, so "bad" readings on the dead units have a baseline to compare -> against. - +--- +title: "Protocolo de diagnóstico remoto — unidades HBOX retiradas" +tags: [project-drogheda, hbox, diagnostico, remoto, v1, veracruz, historico, procedimiento] +date: 2026-06-19 +project: Project Drogheda +author: Helgen Technologies +status: HISTÓRICO — jun-2026, unidades con firmware v1 retiradas de las máquinas en Veracruz --- -## 0. Decision gate (make this call first) +# Protocolo de diagnóstico remoto — unidades HBOX retiradas -**Recommendation: ship all 4 units to Querétaro.** They are small, and remote- -debugging *dead* electronics is slow and rarely conclusive — a 1–2 day courier buys -full bench access (PSU with current limit, scope, u-center, reflash, thermal soak, -teardown). Bring the working-ish unit too; it's the reference. +Tarjeta: unidades de la primera generación con firmware **v1** (Blackpill + PowerBoost, jun-2026). El orden de trabajo sigue valiendo para cualquier unidad desmontada. -Choose remote-hands **only if** shipping is blocked (client chain-of-custody, the -units must stay on-site, or courier delay is unacceptable). Confirm with ICAVE who -**owns** the units and whether they may leave the terminal. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: ingeniería en Querétaro y un técnico «manos remotas» en Veracruz + - Cuándo: unidades retiradas de las máquinas que no pueden llegar al banco de inmediato. Hoy el procedimiento vigente es [diagnóstico en campo](procedimiento-diagnostico-campo.md) → [diagnóstico en banco](../procedimientos/diagnostico-banco.md) + - Tiempo: nivel 0: 20 min por unidad; nivel 1: +10 min; nivel 2: 1 h por unidad + - Necesitas: fuente de banco con límite de corriente, teléfono con cámara, cable USB y laptop (nivel 1), escritorio remoto (nivel 2) -| Path | When | Cost | +Traducido del original en inglés (19-jun-2026). + +Fecha: 2026-06-19 · Responsable: Leo Rodríguez +Situación: todas las unidades HBOX fueron retiradas de las máquinas. Hay **4 unidades en mano: 3 no funcionan, 1 funciona a medias.** Están físicamente en Veracruz; el equipo está en Querétaro → la depuración es remota hasta que se envíen o alguien en sitio actúe como nuestras manos. +**Firmware en estas unidades = v1** (sin registro térmico del MCU) → la evidencia térmica tiene que salir de la inspección física + una prueba de energizado en banco, no del firmware. + +!!! note "La unidad de control" + La única unidad que funciona a medias es el control. Cada medición de abajo debe tomarse también en ella, para que las lecturas «malas» de las unidades muertas tengan una línea base contra la cual comparar. + +## 0. Compuerta de decisión (tomar esta decisión primero) + +**Recomendación: enviar las 4 unidades a Querétaro.** Son pequeñas, y depurar a distancia electrónica *muerta* es lento y rara vez concluyente — una mensajería de 1–2 días compra acceso completo al banco (fuente con límite de corriente, osciloscopio, u-center, reflasheo, prueba térmica prolongada, desarmado). Traer también la unidad que funciona a medias; es la referencia. + +Elegir manos remotas **solo si** el envío está bloqueado (cadena de custodia del cliente, las unidades deben quedarse en sitio, o el retraso de la mensajería es inaceptable). Confirmar con ICAVE quién es dueño de las unidades y si pueden salir de la terminal. + +| Camino | Cuándo | Costo | |---|---|---| -| **Ship to QRO** *(recommended)* | units may leave Veracruz | courier + 1–2 days | -| **Remote-hands in Veracruz** | units must stay; cooperative on-site tech exists | needs the protocol below + their time | +| Enviar a QRO *(recomendado)* | las unidades pueden salir de Veracruz | mensajería + 1–2 días | +| Manos remotas en Veracruz | las unidades deben quedarse; hay un técnico cooperativo en sitio | necesita el protocolo de abajo + su tiempo | -Either way, **start §2 (backend analysis) now from Querétaro** — it needs no units. +De cualquier forma, **empezar §2 (análisis del backend) ahora desde Querétaro** — no necesita unidades. ---- +## 1. Qué se puede y qué no se puede saber a distancia -## 1. What we can / cannot learn remotely - -| Question | Remote-hands? | How | +| Pregunta | ¿Manos remotas? | Cómo | |---|---|---| -| Is the LiPo swollen / burnt / leaking? | ✅ | photo checklist (§3 Tier 0) | -| Connectors/SMA loose, solder cracked? | ✅ | photos + wiggle test | -| Does it draw current / boot on power? | ✅ | bench PSU **current reading** (§3) | -| LED state on power-up? | ✅ | film the LED, decode (§4) | -| Battery V, fix quality, state, packets | ✅ (Tier 1) | USB dashboard capture | -| Does the 4G modem attach / get a fix? | ✅ (Tier 1–2) | dashboard / u-center / remote desktop | -| Does it reach our gateway when powered? | ✅ | watch htracker for that unit's `cell_id` | -| Exact failed component / thermal soak | ❌ (needs bench) | **ship to QRO** | +| ¿La LiPo está inflada / quemada / con fuga? | ✅ | checklist de fotos (§3 nivel 0) | +| ¿Conectores/SMA flojos, soldadura agrietada? | ✅ | fotos + prueba de meneo | +| ¿Consume corriente / arranca al energizar? | ✅ | lectura de corriente de la fuente de banco (§3) | +| ¿Estado del LED al encender? | ✅ | grabar el LED, decodificar (§4) | +| V de batería, calidad de fix, estado, paquetes | ✅ (nivel 1) | captura del tablero por USB | +| ¿El módem 4G se registra / obtiene fix? | ✅ (niveles 1–2) | tablero / u-center / escritorio remoto | +| ¿Llega a nuestro gateway cuando está energizada? | ✅ | observar htracker para el `cell_id` de esa unidad | +| Componente exacto fallado / prueba térmica prolongada | ❌ (necesita banco) | enviar a QRO | -So ~80% of triage is remotely achievable; only component-level confirmation and -thermal reproduction strictly require the units in QRO. +Así que ~80 % del triaje se puede hacer a distancia; solo la confirmación a nivel de componente y la reproducción térmica requieren estrictamente las unidades en QRO. ---- +## 2. Hacer esto ahora desde Querétaro (sin unidades) -## 2. Do this NOW from Querétaro (no units needed) +El backend está en nuestro propio servidor — totalmente depurable desde QRO, y según `02-Architecture-Software/backend-review.md` puede sacar de Wialon unidades sanas por sí solo. -The backend is on our own server — fully debuggable from QRO, and per -`02-Architecture-Software/backend-review.md` it can take healthy units off Wialon by itself. +1. Separación histórica online/offline. Para los días antes del retiro, comparar el registro de cada unidad en htracker (online al recibir UDP) contra Wialon (online por posiciones recibidas). Una unidad que estaba online en htracker pero offline en Wialon fue una víctima del backend (bloqueo anti-salto / atasco HOL), *no* hardware muerto — eso replantea cuáles unidades «muertas» son en realidad fallas de hardware. +2. Logs del gateway alrededor de la ventana de muerte: buscar el aviso anti-salto (`¡Filtro Anti-Salto Activado!`) repitiéndose para un `cell_id` (→ bloqueo), y caídas del buffer de recepción UDP con `netstat -su` (→ atasco HOL). +3. Reproducir en banco con la unidad que funciona a medias una vez energizada (en VER por manos remotas, o en QRO): apuntarla al gateway y observar si el retranslator la reenvía limpiamente o dispara el filtro. +4. Disponibilidad del caster (HelgenSRV) + saldo de datos / suspensión por SIM en la ventana. -1. **Historical online-vs-offline split.** For the days before removal, compare each - unit's **htracker** record (online on UDP receipt) against **Wialon** (online on - positions received). A unit that was **online in htracker but offline in Wialon** - was a **backend victim** (anti-jump lock-out / HOL stall), *not* dead hardware — - that reframes which "dead" units are actually hardware failures. -2. **Gateway logs around the death window:** look for the anti-jump warning - (`¡Filtro Anti-Salto Activado!`) spamming one `cell_id` (→ lock-out), and for - `netstat -su` UDP receive-buffer drops (→ HOL stall). -3. **Bench-reproduce with the working-ish unit** once it's powered (in VER via - remote-hands, or in QRO): point it at the gateway and watch whether the - retranslator forwards it cleanly or trips the filter. -4. Caster (HelgenSRV) uptime + **per-SIM data balance/suspension** for the window. +Este es el trabajo de mayor apalancamiento que se puede hacer hoy y no necesita a nadie en Veracruz. -This is the highest-leverage work we can do today and it needs nobody in Veracruz. +## 3. Protocolo de manos remotas (por niveles según lo que tenga la persona en sitio) ---- +Darle al técnico en sitio el nivel que le corresponda. Las instrucciones listas para enviar están en §6b. -## 3. Remote-hands protocol (tiered by what the on-site person has) +### Nivel 0 — energía + cámara de teléfono (mínimo) -Give the on-site tech the matching tier. A ready-to-send Spanish version is in §6. +Para cada unidad, antes de energizar: -### Tier 0 — power + a phone camera (minimum) -For **each** unit, before powering: -1. **Photograph**: the whole inside, then close-ups of the **LiPo** (any swelling, - bulging, brown/black marks, leaks?), the **PowerBoost**, every **connector/Dupont**, - the **SMA antenna** joints, and any **discoloured/burnt** components. -2. **Wiggle test** (gently): do any Dupont/terminal/SMA connectors move or fall off? -3. **Bench power-on with a current-limited PSU** at the unit's normal voltage - (12 V or 24 V), current limit ~2 A: - - Read **inrush** then **steady current**. Record the number. - - **0 mA / trips at 0:** open circuit / dead input stage / blown fuse. - - **Hits the current limit / very hot:** short → **power off immediately**. - - **~50–150 mA steady, nothing else:** MCU only, stack not powering (load switch - / boost / modem). - - **Normal-ish draw + LED activity:** boots — go to Tier 1. - - Compare every reading to the **working-ish unit**. -4. **Film the LED** for ~60 s from power-up (decode in §4). +1. Fotografiar: todo el interior, después acercamientos de la LiPo (¿inflada, abombada, marcas cafés/negras, fugas?), del PowerBoost, de cada conector/Dupont, de las uniones de las antenas SMA y de cualquier componente decolorado/quemado. +2. Prueba de meneo (suave): ¿algún conector Dupont/terminal/SMA se mueve o se cae? +3. Energizado en banco con fuente con límite de corriente al voltaje normal de la unidad (12 V o 24 V), límite de corriente ~2 A: + - Leer la corriente de arranque y después la estable. Anotar el número. + - **0 mA / se dispara en 0:** circuito abierto / etapa de entrada muerta / fusible fundido. + - Llega al límite de corriente / muy caliente: corto → apagar de inmediato. + - **~50–150 mA estables, nada más:** solo el MCU, la etapa no se energiza (interruptor de carga / boost / módem). + - Consumo más o menos normal + actividad del LED: arranca — pasar al nivel 1. + - Comparar cada lectura con la unidad que funciona a medias. +4. Grabar el LED ~60 s desde el encendido (decodificar en §4). -### Tier 1 — Tier 0 + USB cable + a laptop -5. Plug the Blackpill **USB** into the laptop; open **PuTTY/TeraTerm at 115200**. - The v1 watchdog prints a live dashboard. **Capture 3–5 min** (log to file) and - send it. Read off: **BATTERY V**, **SYSTEM STATE**, **RTK FIX**, **PACKETS TX'd**, - PWR/IGN inputs. (No MCU-temp line — these are v1.) -6. Note whether **PACKETS TX'd increments** (GNSS+serial alive) and whether **RTK - FIX** ever reaches 4/5 (corrections arriving = 4G/NTRIP working). +### Nivel 1 — nivel 0 + cable USB + laptop -### Tier 2 — Tier 1 + remote-desktop (AnyDesk/TeamViewer) into the laptop -7. We drive from QRO: read the live dashboard, run **u-center** on the ZED-F9P - (fix, sat levels, config), issue **AT commands** to the 4G modem (attach, signal), - and if useful **reflash v2** to gain thermal logging + better recovery. +5. Conectar el USB del Blackpill a la laptop; abrir **PuTTY/TeraTerm a 115200**. El watchdog v1 imprime un tablero en vivo. **Capturar 3–5 min** (grabar a archivo) y enviarlo. Leer: **BATTERY V**, **SYSTEM STATE**, **RTK FIX**, PACKETS TX'd, entradas PWR/IGN. (No hay línea de temperatura del MCU — son v1.) +6. Anotar si PACKETS TX'd incrementa (GNSS+serie vivos) y si **RTK FIX** llega alguna vez a 4/5 (correcciones llegando = 4G/NTRIP funcionando). ---- +### Nivel 2 — nivel 1 + escritorio remoto (AnyDesk/TeamViewer) a la laptop -## 4. LED quick-decode (v1) +7. Se opera desde QRO: leer el tablero en vivo, correr u-center en el ZED-F9P (fix, niveles de satélites, configuración), enviar comandos AT al módem 4G (registro, señal) y, si es útil, **reflashear v2** para obtener registro térmico + mejor recuperación. -| LED | State | Read as | +## 4. Decodificación rápida del LED (v1) + +| LED | Estado | Léelo como | |---|---|---| -| Fast blink | BOOTING | powered, waiting for 4G/GNSS | -| Solid ON | RUNNING, vehicle power, RTK fixed | healthy | -| Heartbeat (1 s) | RUNNING on battery | on LiPo, 30 s rate | -| Slow blink | searching / no corrections | 4G/NTRIP not delivering | -| Off (with power applied) | SLEEP / dead | battery-critical logic **or** not booting | +| Parpadeo rápido | BOOTING | energizada, esperando 4G/GNSS | +| Fijo encendido | RUNNING, energía de vehículo, RTK fijo | sana | +| Latido (1 s) | RUNNING en batería | en LiPo, cadencia de 30 s | +| Parpadeo lento | buscando / sin correcciones | 4G/NTRIP no entrega | +| Apagado (con energía aplicada) | SLEEP / muerta | lógica de batería crítica o no arranca | -"Off while powered from a good bench supply" on a unit that should boot = a strong -**no-boot / power-stage** signal — correlate with the current reading. +«Apagado con energía de una buena fuente de banco» en una unidad que debería arrancar = señal fuerte de **no arranque / etapa de potencia** — correlacionar con la lectura de corriente. ---- - -## 5. Per-unit triage decision tree +## 5. Árbol de decisión de triaje por unidad ``` -Power on bench PSU (current-limited) -├─ 0 mA ............................. dead input / blown fuse / open → ship to QRO -├─ hits limit / hot ................ SHORT (power off!) ............... → ship to QRO -└─ draws current - ├─ no LED, no USB dashboard ...... MCU/boot dead .................... → ship to QRO - └─ boots (LED + dashboard) - ├─ PACKETS not incrementing ... GNSS/serial dead ................ Tier 2 / ship - ├─ FIX stuck 0/1 (never 4/5) .. 4G/NTRIP not delivering ......... check modem/SIM/antenna - └─ FIX 4/5 + packets OK ........ HARDWARE IS FINE ............... → backend victim (§2) +Energizar con fuente de banco (con límite de corriente) +├─ 0 mA ............................. entrada muerta / fusible fundido / abierto → enviar a QRO +├─ llega al límite / caliente ....... CORTO (¡apagar!) ......................... → enviar a QRO +└─ consume corriente + ├─ sin LED, sin tablero USB ....... MCU/arranque muerto ...................... → enviar a QRO + └─ arranca (LED + tablero) + ├─ PACKETS no incrementa ....... GNSS/serie muertos ....................... nivel 2 / enviar + ├─ FIX atorado en 0/1 (nunca 4/5) 4G/NTRIP no entrega ..................... revisar módem/SIM/antena + └─ FIX 4/5 + paquetes OK ....... EL HARDWARE ESTÁ BIEN .................... → víctima del backend (§2) ``` -The last branch is the important one: a pulled unit that **boots, fixes, and -transmits on the bench is not the failure** — its disappearance from Wialon is then -backend (§2), and re-installing it unchanged would just repeat the problem. +La última rama es la importante: una unidad retirada que **arranca, obtiene fix y transmite en el banco no es la falla** — su desaparición de Wialon es entonces del backend (§2), y reinstalarla sin cambios solo repetiría el problema. ---- +## 6. Seguridad — LiPo dañada por calor (decírselo al técnico en sitio) -## 6. Safety — heat-damaged LiPo (tell the on-site tech) +!!! danger "Batería de litio" + Una LiPo inflada/abombada o caliente es un riesgo de incendio. **No** cargarla, no perforarla ni seguir energizando una unidad cuya batería esté visiblemente inflada. Desconectarla, ponerla en una bolsa LiPo-safe / ignífuga o un recipiente metálico, mantenerla lejos de cualquier cosa inflamable y ventilar. Fotografiar primero, después aislar. Si está caliente, venteada o huele: detenerse y aislar de inmediato. -A swollen/puffy or hot LiPo is a **fire risk**. Do **not** charge it, puncture it, or -keep powering a unit whose battery is visibly swollen. Disconnect it, place it in a -**LiPo-safe / fireproof bag or a metal container**, keep it away from anything -flammable, and ventilate. Photograph first, then isolate. If it's hot, vented, or -smells: stop and isolate immediately. +## 6b. Instrucciones para el técnico en sitio (niveles 0/1) — texto listo para enviar ---- +> Para cada unidad: (1) Fotos del interior y de cerca de la batería LiPo (¿inflada, manchas cafés/negras, fuga?), del PowerBoost, de cada conector Dupont, de las antenas SMA, y de cualquier componente quemado/decolorado. (2) Prueba de movimiento suave: ¿algún conector se mueve o se cae? (3) Enciéndela con una fuente de banco a su voltaje normal (12 V/24 V), límite de corriente ~2 A, y anota la corriente (arranque y estable). Si llega al límite o se calienta, apágala de inmediato (corto). (4) Graba el LED ~60 s desde el encendido. (5) Si hay laptop: conecta el USB del Blackpill, abre **PuTTY/TeraTerm a 115200** y **graba 3–5 min** del tablero (BATERÍA V, ESTADO, RTK FIX, PAQUETES). Seguridad: una batería inflada o caliente es riesgo de incendio — no la cargues ni la perfores; aíslala en bolsa/recipiente seguro y ventila. -## 6b. Spanish — instrucciones para el técnico en sitio (Tier 0/1) +## 7. Qué enviar de regreso a Querétaro (checklist de captura) -> Para **cada** unidad: (1) **Fotos** del interior y de cerca de la **batería LiPo** -> (¿inflada, manchas cafés/negras, fuga?), del **PowerBoost**, de **cada conector -> Dupont**, de las **antenas SMA**, y de cualquier componente **quemado/decolorado**. -> (2) Prueba de **movimiento** suave: ¿algún conector se mueve o se cae? (3) Enciéndela -> con una **fuente de banco** a su voltaje normal (12 V/24 V), límite de corriente ~2 A, -> y anota la **corriente** (arranque y estable). Si llega al límite o se calienta, -> **apágala de inmediato** (corto). (4) **Graba el LED** ~60 s desde el encendido. -> (5) Si hay laptop: conecta el **USB** del Blackpill, abre **PuTTY/TeraTerm a 115200** -> y **graba 3–5 min** del tablero (BATERÍA V, ESTADO, RTK FIX, PAQUETES). **Seguridad:** -> una batería **inflada o caliente** es riesgo de incendio — no la cargues ni la -> perfores; aíslala en bolsa/recipiente seguro y ventila. +Por unidad, etiquetado con su `cell_id`/máquina: las fotos, la lectura de corriente (arranque + estable), el video del LED, la **captura del tablero USB de 3–5 min** y una nota de una línea (¿arranca? ¿fix? ¿paquetes?). Con eso se pueden clasificar las 4 unidades contra el árbol de §5 y la evidencia del backend de §2 — y decidir cuáles de verdad necesitan desarmado en QRO. ---- +## Historial de revisiones -## 7. What to send back to Querétaro (capture checklist) - -Per unit, labeled with its `cell_id`/machine: the **photos**, the **current reading** -(inrush + steady), the **LED video**, the **3–5 min USB dashboard capture**, and a -one-line note (boots? fix? packets?). With that, we can classify all 4 units against -the tree in §5 and the backend evidence in §2 — and decide which truly need teardown -in QRO. +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-06-19 | Protocolo original (inglés). | +| 1.1 | 2026-09-29 | Traducción al español, encabezado uniforme y enlaces a los procedimientos vigentes. Sin cambios técnicos. | diff --git a/docs/formularios/ardusimple.html b/docs/formularios/ardusimple.html index 889ef6b..4d01ca9 100644 --- a/docs/formularios/ardusimple.html +++ b/docs/formularios/ardusimple.html @@ -13,37 +13,37 @@ Acta.render({ tipo: 'modulo-ard', prefijo: 'ARD', desde: 1, series: 30, pad: 3, // ARD-001 … ARD-030 - etiquetaSerie: 'Número de serie del módulo (etiqueta ARD-NNN)', + etiquetaSerie: 'Módulo (ARD-NNN)', titulo: 'Acta de módulo — simpleRTK2B Pro (ZED-F9P)', - subtitulo: 'Un acta por receptor. Procedimiento: "Módulos e integración" §2. Sin EinarBoard.', + subtitulo: 'Un acta por receptor, sin EinarBoard. Procedimiento: Módulos e integración §1.', secciones: [ - { titulo: '2a · Inspección visual (sin energía)', + { titulo: '1a · Inspección (sin energía)', items: [ - { tipo:'medida', txt:'Etiqueta de fábrica ArduSimple (código impreso en el módulo)', modo:'text', ph:'p.ej. SRTK2B-…' }, - { tipo:'check', txt:'Etiqueta ARD-NNN puesta y legible, sin tapar SMA ni zócalo XBee.' }, + { tipo:'medida', txt:'Etiqueta de fábrica ArduSimple', modo:'text', ph:'p.ej. SRTK2B-…' }, + { tipo:'check', txt:'Etiqueta ARD-NNN legible, sin tapar SMA ni zócalo XBee.' }, { tipo:'check', txt:'Pines del zócalo XBee (2 × 10) rectos; conector SMA firme.' }, { tipo:'check', txt:'Tiras tipo Arduino (las que entran en MOD1) rectas y completas.' }, ] }, - { titulo: '2b · Energizado y fix GNSS', + { titulo: '1b · Fix GNSS', sub: 'Antena GNSS al SMA con vista al cielo. USB-C en POWER+GPS. u-center conectado.', items: [ { tipo:'check', txt:'LED POWER encendido; la laptop ve un puerto serie u-blox.' }, - { tipo:'medida', txt:'Versión de firmware del ZED-F9P (UBX-MON-VER)', modo:'text', ph:'p.ej. HPG 1.32' }, + { tipo:'medida', txt:'Firmware ZED-F9P (UBX-MON-VER)', modo:'text', ph:'p.ej. HPG 1.32' }, { tipo:'medida', txt:'Tiempo hasta fix 3D', esperado:'< 2 min a cielo abierto', u:'min' }, - { tipo:'medida', txt:'Satélites en uso con fix 3D', esperado:'≥ 10', u:'sat' }, + { tipo:'medida', txt:'Satélites en uso', esperado:'≥ 10', u:'sat' }, { tipo:'check', txt:'LED GPS FIX parpadea con el fix.' }, ] }, - { titulo: '2c · Configuración de Helgen', + { titulo: '1c · Configuración Helgen', sub: 'u-center → Tools → Receiver Configuration → Load → Transfer file → GNSS. Luego UBX-CFG-CFG → Save.', items: [ - { tipo:'medida', txt:'Nombre del archivo de configuración cargado', modo:'text', ph:'p.ej. HBOX_F9P_115200_v1.txt' }, - { tipo:'check', txt:'Configuración transferida sin errores y guardada (CFG-CFG Save).' }, - { tipo:'check', txt:'Tras desconectar/reconectar USB, conecta a 115200 y sigue mostrando fix y $GNGGA.' }, + { tipo:'medida', txt:'Archivo de configuración cargado', modo:'text', ph:'p.ej. HBOX_F9P_115200_v1.txt' }, + { tipo:'check', txt:'Transferida sin errores y guardada (CFG-CFG Save).' }, + { tipo:'check', txt:'Tras reconectar el USB: 115200, fix y $GNGGA.' }, { tipo:'texto', txt:'Observaciones', ph:'ninguna / describir' }, ] }, { titulo: 'Cierre', items: [ - { tipo:'check', txt:'Módulo en bolsa antiestática con su etiqueta ARD-NNN.' }, + { tipo:'check', txt:'En bolsa antiestática con su etiqueta.' }, ] }, ] }); diff --git a/docs/formularios/banco.html b/docs/formularios/banco.html index 44737c7..866f061 100644 --- a/docs/formularios/banco.html +++ b/docs/formularios/banco.html @@ -23,73 +23,65 @@ Acta.render({ unidades: window.FLOTA, etiquetaSerie: 'Unidad que estás revisando', titulo: 'Acta de diagnóstico en banco — HBOX', - subtitulo: 'Helgen Technologies · unidad sobre la mesa, con fuente de banco y multímetro.', + subtitulo: 'Unidad sobre la mesa, con fuente de banco y multímetro.', textoOK: 'QUEDA FUNCIONAL', - intro: 'Antes de empezar. En una unidad ya desmontada se perdieron la temperatura máxima, ' - + 'la cuenta de recuperaciones y la causa del último arranque: el firmware v3 las guarda en ' - + 'memoria y se borraron al desconectarla. Aquí no vamos a poder probar la historia térmica con ' - + 'datos del equipo — solo con lo que se vea. Lo que sí sale de este banco: si hay corto, cuánto ' - + 'consume, si arranca, si el módem registra, si el GNSS ve cielo y en qué estado está la batería. ' - + 'Procedimiento completo: Diagnóstico en banco.', + intro: 'Al desmontar se perdieron temperatura máxima, recuperaciones y causa del último arranque (RAM del firmware v3). ' + + 'Procedimiento: Diagnóstico en banco.', secciones: [ { titulo: '0 · Identificación', items: [ - { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha de la revisión' }, + { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, { tipo:'texto', clave:'maquina_id', rows:'1', guardaEn:'maquina_id', - txt:'¿De qué máquina venía esta unidad?', ph:'RT-ZPMC-20 · HS-WES-62 · FL-JUN-060' }, - { tipo:'radio', clave:'llego', txt:'¿Cómo llegó a la mesa?', + txt:'Máquina de origen', ph:'RT-ZPMC-20 · HS-WES-62 · FL-JUN-060' }, + { tipo:'radio', clave:'llego', txt:'Quién la desmontó', opciones:['Desmontada por nosotros','Desmontada por personal de ICAVE','No sé quién la desmontó'] }, { tipo:'texto', clave:'antecedente', rows:'2', - txt:'¿Qué se sabe de su falla?', ph:'Dejó de reportar a fines de agosto; se desmontó el 15-sep.' }, - { tipo:'nota', txt:'
Orden obligatorio: inspección → continuidad → ' - + 'energizado. Nunca energices antes de medir continuidad. Si hay un corto, la fuente ' - + 'lo encuentra quemando algo.
' }, + txt:'Antecedente de la falla', ph:'Dejó de reportar a fines de agosto; se desmontó el 15-sep.' }, + { tipo:'nota', txt:'
Orden: inspección → continuidad → energizado. Nunca energices antes de medir continuidad.
' }, ] }, { titulo: '1 · Inspección sin energía', - sub:'Con la unidad desconectada de todo y antes de mover cables.', + sub:'Desconectada de todo, antes de mover cables.', items: [ - { tipo:'foto', clave:'f_ext', req:true, etiqueta:'exterior', txt:'Exterior de la caja (varios lados).' }, - { tipo:'foto', clave:'f_int', req:true, etiqueta:'interior', txt:'Interior completo, antes de tocar nada.' }, - { tipo:'radio', clave:'olor', req:true, txt:'¿Huele a quemado o hay partes oscurecidas o derretidas?', + { tipo:'foto', clave:'f_ext', req:true, etiqueta:'exterior', txt:'Exterior, varios lados.' }, + { tipo:'foto', clave:'f_int', req:true, etiqueta:'interior', txt:'Interior completo, antes de tocar.' }, + { tipo:'radio', clave:'olor', req:true, txt:'Olor a quemado o daño por calor', opciones:['No','Sí, leve','Sí, evidente'] }, { tipo:'foto', clave:'f_dano', etiqueta:'dano', si:v=>String(v.olor||'').startsWith('Sí'), req:true, - txt:'Foto del daño por calor.' }, - { tipo:'radio', clave:'agua', req:true, txt:'¿Agua, marcas de agua, sarro o corrosión verde?', + txt:'Daño por calor.' }, + { tipo:'radio', clave:'agua', req:true, txt:'Agua, sarro o corrosión', opciones:['No','Marcas o humedad','Corrosión evidente'] }, - { tipo:'radio', clave:'bateria_fisica', req:true, txt:'Estado físico de la batería', + { tipo:'radio', clave:'bateria_fisica', req:true, txt:'Batería', opciones:['Normal','Hinchada o abombada','Con manchas o fuga','Caliente','La unidad no trae batería'], - aviso:'Hinchada, con fuga o caliente: desconéctala antes de energizar y trabaja sin ella. No la cargues, no la perfores, no viaja en avión.' }, + aviso:'Hinchada, con fuga o caliente: desconéctala antes de energizar y trabaja sin ella. No la cargues ni la perfores; no viaja en avión.' }, { tipo:'foto', clave:'f_bat', etiqueta:'bateria', si:v=>['Hinchada','Con manchas','Caliente'].some(t=>String(v.bateria_fisica||'').startsWith(t)), req:true, - txt:'Foto de la batería, dos ángulos.' }, - { tipo:'check', clave:'wiggle', txt:'Prueba de meneo en cada conector, Dupont y SMA. Anoto abajo lo que esté flojo.' }, - { tipo:'texto', clave:'nota_visual', rows:'2', txt:'¿Qué encontraste?' }, + txt:'Batería, dos ángulos.' }, + { tipo:'check', clave:'wiggle', txt:'Meneo de conectores, Dupont y SMA (lo flojo, abajo).' }, + { tipo:'texto', clave:'nota_visual', rows:'2', txt:'Hallazgos' }, ] }, - { titulo: '2 · Continuidad a tierra — antes de energizar', - sub:'Multímetro en ohms, punta negra en el negativo/chasis. La lectura sube despacio: es normal, espera a que se estabilice.', + { titulo: '2 · Continuidad a tierra (sin energía)', + sub:'Multímetro en ohms, punta negra en el chasis. Espera a que la lectura se estabilice.', items: [ { tipo:'medida', clave:'r_24v', txt:'Entrada 24 V (GX16 pines 1-2)', esperado:'> 10 kΩ', u:'Ω' }, { tipo:'medida', clave:'r_5v', txt:'Riel de 5 V (salida Mean Well)', esperado:'> 1 kΩ', u:'Ω' }, { tipo:'medida', clave:'r_3v3', txt:'Riel de 3.3 V', esperado:'> 1 kΩ', u:'Ω' }, { tipo:'medida', clave:'r_rtk', txt:'Alimentación del simpleRTK2B (riel conmutado)', esperado:'> 1 kΩ', u:'Ω' }, - { tipo:'medida', clave:'v_bat_vacio', txt:'Voltaje de la batería en vacío (desconectada)', esperado:'3.0 – 4.2 V', u:'V' }, - { tipo:'radio', clave:'continuidad', req:true, txt:'¿Alguna lectura se quedó fija entre 0 y 20 Ω?', + { tipo:'medida', clave:'v_bat_vacio', txt:'Batería en vacío', esperado:'3.0 – 4.2 V', u:'V' }, + { tipo:'radio', clave:'continuidad', req:true, txt:'Lectura fija en 0–20 Ω', opciones:['No, todas suben o están altas','Sí — hay un corto'] }, - { tipo:'nota', si:corto, txt:'
Hay un corto: no energices. Fotografía la zona, ' - + 'marca la unidad, complétala como FALLA y déjala aparte para enviar a Querétaro. ' - + 'Energizar un corto convierte una reparación en una tarjeta perdida.
' }, - { tipo:'foto', clave:'f_corto', etiqueta:'corto', si:corto, req:true, txt:'Foto de la zona donde mediste el corto.' }, + { tipo:'nota', si:corto, txt:'
Corto: no energices. Foto de la zona, marca la unidad, cierra como FALLA y apártala para Querétaro.
' }, + { tipo:'foto', clave:'f_corto', etiqueta:'corto', si:corto, req:true, txt:'Zona del corto.' }, ] }, { titulo: '3 · Energizado con rampa de corriente', si:v=>!corto(v), - sub:'Fuente a 24.0 V, límite de corriente 500 mA, sin antenas todavía. Mira el amperímetro los primeros 3 segundos.', + sub:'Fuente 24.0 V, límite 500 mA, sin antenas. Mira el amperímetro los primeros 3 s.', items: [ { tipo:'medida', clave:'i_pico', txt:'Corriente de arranque (pico)', u:'mA' }, - { tipo:'medida', clave:'i_estable', txt:'Corriente estable a los 60 segundos', esperado:'150 – 400 mA con la etapa RTK encendida', u:'mA' }, - { tipo:'radio', clave:'rampa', req:true, txt:'¿Qué hizo al energizar?', + { tipo:'medida', clave:'i_estable', txt:'Corriente estable a 60 s', esperado:'150 – 400 mA con la etapa RTK encendida', u:'mA' }, + { tipo:'radio', clave:'rampa', req:true, txt:'Respuesta al energizar', opciones:[ 'A · 0 mA, la fuente no entrega nada', 'B · Se pega al límite y el voltaje se cae (corto)', @@ -97,77 +89,71 @@ Acta.render({ 'D · 150–400 mA y el LED parpadea', 'E · Sube despacio y algo se calienta'] }, { tipo:'nota', si:v=>/^[BE]/.test(String(v.rampa||'')), - txt:'
Apaga la fuente ahora. Busca con el dorso de la mano qué componente ' - + 'se calienta, tómale foto y no vuelvas a energizar.
' }, + txt:'
Apaga la fuente ahora. Localiza con el dorso de la mano qué se calienta, foto, y no vuelvas a energizar.
' }, { tipo:'foto', clave:'f_calor', etiqueta:'sobrecalentamiento', si:v=>String(v.rampa||'').startsWith('E'), req:true, - txt:'Foto del componente que se calienta.' }, + txt:'Componente que se calienta.' }, ] }, { titulo: '4 · Rieles', si:enciende, - sub:'Con la unidad energizada y estable.', + sub:'Energizada y estable.', items: [ { tipo:'medida', clave:'v_24', txt:'Entrada 24 V', esperado:'23 – 26 V', u:'V' }, { tipo:'medida', clave:'v_5', txt:'Riel 5 V (salida Mean Well)', esperado:'4.8 – 5.2 V', u:'V' }, { tipo:'medida', clave:'v_3v3',txt:'Riel 3.3 V', esperado:'3.20 – 3.40 V', u:'V' }, - { tipo:'medida', clave:'v_rtk_arranque', txt:'Alimentación del simpleRTK2B al arrancar', esperado:'0 V (obligatorio)', u:'V', - aviso:'Si hay 5 V aquí en el instante de arrancar es un defecto: apagado es el estado seguro, la etapa RTK solo debe encender cuando el MCU lo pide.' }, - { tipo:'medida', clave:'v_bat_on', txt:'Batería con la unidad encendida', u:'V' }, + { tipo:'medida', clave:'v_rtk_arranque', txt:'simpleRTK2B al arrancar', esperado:'0 V (obligatorio)', u:'V', + aviso:'5 V aquí al arrancar es un defecto: la etapa RTK solo enciende cuando el MCU lo pide.' }, + { tipo:'medida', clave:'v_bat_on', txt:'Batería, unidad encendida', u:'V' }, ] }, - { titulo: '5 · Captura del Blackpill (la principal)', si:enciende, + { titulo: '5 · Captura del Blackpill', si:enciende, sub:'USB del Blackpill · 115200 baudios · guardar a archivo · 3 minutos, luego RESET.', items: [ { tipo:'archivo', clave:'log_blackpill', etiqueta:'blackpill', req:true, - txt:'Sube el archivo de la captura del Blackpill', - ayuda:'Nómbralo RTK-0NN_blackpill_AAAA-MM-DD.log. Súbelo aunque no entiendas lo que dice.' }, - { tipo:'texto', clave:'linea_boot', rows:'2', txt:'Pega la línea BOOT (dice qué firmware trae)', ph:'BOOT,1240,fw=3.0.3,reset=PIN' }, - { tipo:'texto', clave:'linea_tlm', rows:'3', txt:'Pega una línea TLM ya estabilizada', ph:'TLM,182000,RUN,DEGR,1,11,…' }, - { tipo:'radio', clave:'estado_fw', txt:'¿A qué estado llegó después de 10 minutos con antenas?', + txt:'Captura del Blackpill', + ayuda:'Nombre: RTK-0NN_blackpill_AAAA-MM-DD.log.' }, + { tipo:'texto', clave:'linea_boot', rows:'2', txt:'Línea BOOT', ph:'BOOT,1240,fw=3.0.3,reset=PIN' }, + { tipo:'texto', clave:'linea_tlm', rows:'3', txt:'Línea TLM estable', ph:'TLM,182000,RUN,DEGR,1,11,…' }, + { tipo:'radio', clave:'estado_fw', txt:'Estado a 10 min con antenas', opciones:['RUN con link OK','RUN pero link DEGR o LIMP','Se queda en BOOT','Se reinicia solo una y otra vez','SLEEP'] }, ] }, - { titulo: '6 · Captura del módem 4G NTRIP Master', si:enciende, - sub:'Puerto USB "XBEE" del simpleRTK2B Pro · 115200 baudios · 3 minutos desde el arranque.', + { titulo: '6 · Captura del módem 4G', si:enciende, + sub:'USB XBEE del simpleRTK2B · 115200 · 3 min desde el arranque.', items: [ - { tipo:'nota', txt:'Ojo con esta consola: una unidad sana imprime casi lo mismo que una ' - + 'averiada. No prueba que las correcciones lleguen ni que los datos se envíen — eso solo lo ' - + 'dicen el link del Blackpill, un fix ≥4 en el ArduSimple o el tráfico en el servidor. ' - + 'Sirve para saber si el módem enciende, si registra en Telcel y con qué configuración quedó.' }, - { tipo:'archivo', clave:'log_4g', etiqueta:'modem4g', txt:'Sube la captura del módem 4G', - ayuda:'Nómbralo RTK-0NN_modem4g_AAAA-MM-DD.log.' }, - { tipo:'radio', clave:'led_4g', txt:'LED de red del módulo 4G', + { tipo:'nota', txt:'Esta consola no prueba el enlace: un módem sano y uno averiado imprimen casi lo mismo. Las correcciones se confirman con el link del Blackpill, fix ≥ 4 o el servidor.' }, + { tipo:'archivo', clave:'log_4g', etiqueta:'modem4g', txt:'Captura del módem', + ayuda:'Nombre: RTK-0NN_modem4g_AAAA-MM-DD.log.' }, + { tipo:'radio', clave:'led_4g', txt:'LED de red del módem', opciones:['Parpadeo lento o fijo (registrado)','Parpadeo rápido (buscando, no registra)','Apagado'] }, - { tipo:'texto', clave:'id_estacion', rows:'1', txt:'ID de estación (AS+K) y mountpoint, si pudiste leerlos' }, - { tipo:'texto', clave:'imei_iccid', rows:'1', txt:'IMEI del módem e ICCID de la SIM, si están a la vista' }, + { tipo:'texto', clave:'id_estacion', rows:'1', txt:'ID de estación (AS+K) y mountpoint' }, + { tipo:'texto', clave:'imei_iccid', rows:'1', txt:'IMEI del módem e ICCID de la SIM' }, ] }, - { titulo: '7 · Captura del simpleRTK2B Pro (ArduSimple)', si:enciende, - sub:'USB POWER+GPS · 115200 baudios · antena GNSS CON VISTA AL CIELO (dentro del taller no habrá fix).', + { titulo: '7 · Captura del simpleRTK2B', si:enciende, + sub:'USB POWER+GPS · 115200 · antena con cielo (dentro del taller no hay fix).', items: [ - { tipo:'archivo', clave:'log_ard', etiqueta:'ardusimple', txt:'Sube la captura de NMEA o el log de u-center', - ayuda:'Nómbralo RTK-0NN_ardusimple_AAAA-MM-DD.nmea.' }, + { tipo:'archivo', clave:'log_ard', etiqueta:'ardusimple', txt:'NMEA o log de u-center', + ayuda:'Nombre: RTK-0NN_ardusimple_AAAA-MM-DD.nmea.' }, { tipo:'medida', clave:'sats', txt:'Satélites vistos', esperado:'≥ 8 a cielo abierto' }, - { tipo:'radio', clave:'calidad', txt:'Calidad del fix (sexto campo de $GNGGA, o Fix Mode en u-center)', + { tipo:'radio', clave:'calidad', txt:'Calidad de fix ($GNGGA campo 6)', opciones:['0 — sin posición','1 — GPS solo, sin correcciones','2 — corregido básico','4 — RTK fijo','5 — RTK flotante'], - aviso:'Un receptor en 1 con buenos satélites no está roto: dice que las correcciones no le llegan. Eso apunta al módem o al servidor, no al GNSS.' }, - { tipo:'texto', clave:'fw_f9p', rows:'1', txt:'Versión de firmware del ZED-F9P (u-center → UBX-MON-VER)' }, + aviso:'Calidad 1 con buenos satélites no es falla del GNSS: no llegan correcciones (módem o servidor).' }, + { tipo:'texto', clave:'fw_f9p', rows:'1', txt:'Firmware ZED-F9P (UBX-MON-VER)' }, ] }, - { titulo: '8 · Reflasheo — solo si ya subiste la captura', si:enciende, - sub:'El flasheo borra la memoria del equipo y cambia el firmware que estaba fallando. Por eso va después de la evidencia, no antes.', + { titulo: '8 · Reflasheo', si:enciende, + sub:'Solo después de subir la captura: el flasheo borra la memoria del equipo.', items: [ { tipo:'nota', si:v=>!listoParaFlashear(v), - txt:'
⛔ Todavía no puedes reflashear. Sube primero la captura del ' - + 'Blackpill en el paso 5. Sin ella, reflashear destruye la única evidencia del estado en que ' - + 'estaba la unidad.
' }, - { tipo:'radio', clave:'reflash', si:listoParaFlashear, txt:'¿Reflasheaste la unidad?', + txt:'
Todavía no reflashees. Sube primero la captura del Blackpill (paso 5).
' }, + { tipo:'radio', clave:'reflash', si:listoParaFlashear, txt:'Reflasheo', opciones:['No','Sí, con el binario publicado en Descargas'] }, { tipo:'texto', clave:'fw_nuevo', si:v=>String(v.reflash||'').startsWith('Sí'), rows:'1', - txt:'Versión que quedó (línea BOOT después del flasheo)', ph:'fw=3.0.3' }, + txt:'Firmware después (línea BOOT)', ph:'fw=3.0.3' }, { tipo:'archivo', clave:'log_post', etiqueta:'post-flasheo', si:v=>String(v.reflash||'').startsWith('Sí'), - txt:'Captura DESPUÉS del flasheo', ayuda:'Las dos capturas juntas son la prueba de si el firmware cambió algo.' }, + txt:'Captura de después', ayuda:'Antes y después juntas dicen si el firmware cambió algo.' }, { tipo:'radio', clave:'reflash_result', si:v=>String(v.reflash||'').startsWith('Sí'), - txt:'¿Cambió algo?', opciones:['Sí, ahora arranca y se estabiliza','No, repite la misma falla','Empeoró: ya no arranca'] }, + txt:'Efecto del reflasheo', opciones:['Sí, ahora arranca y se estabiliza','No, repite la misma falla','Empeoró: ya no arranca'] }, ] }, { titulo: '9 · Veredicto', @@ -192,8 +178,8 @@ Acta.render({ 'Se envía a Querétaro', 'Baja definitiva'] }, { tipo:'texto', clave:'observaciones', rows:'4', req:true, - txt:'Cuenta qué viste y qué hiciste', - ph:'Escríbelo como se lo contarías a un compañero. Esto es lo que va a leer ingeniería.' }, + txt:'Observaciones', + ph:'Qué viste y qué hiciste, como se lo contarías a un compañero.' }, ] }, ] }); diff --git a/docs/formularios/dano.html b/docs/formularios/dano.html index e0d22e6..aedf103 100644 --- a/docs/formularios/dano.html +++ b/docs/formularios/dano.html @@ -23,26 +23,22 @@ Acta.render({ unidades: window.SERIES, etiquetaSerie: 'Tarjeta, módulo o unidad dañada', titulo: 'Acta de daño o incidente', - subtitulo: 'Helgen Technologies · cualquier cosa con número de serie: tarjeta, módulo o unidad completa.', - intro: 'Para qué sirve. Hoy una tarjeta con un corto puede acabar dentro de un ensamble sin que nadie ' - + 'lo sepa, porque no queda registro. Esta acta marca la serie: desde que se envía, cualquier ' - + 'formulario que la elija muestra el aviso, y su expediente cuenta qué pasó. La marca se levanta con ' - + 'otra acta de daño cuya disposición sea «Reparada», o se vuelve permanente con «Baja». ' - + 'No es para asignar culpas: es para que el daño no se pierda de vista.', + subtitulo: 'Cualquier cosa con número de serie. Procedimiento: Ciclo de vida, daño.', + intro: 'Esta acta marca la serie: todo formulario que la elija muestra el aviso. «Reparada» levanta la marca; «Baja» la hace permanente. No asigna culpas.', secciones: [ { titulo: '0 · Qué se dañó y dónde', items: [ - { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha del daño (o de cuando se detectó)' }, - { tipo:'radio', clave:'que', req:true, txt:'¿Qué es?', + { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha (daño o detección)' }, + { tipo:'radio', clave:'que', req:true, txt:'Pieza', opciones:['Tarjeta EinarBoard','Módulo ArduSimple','Módem 4G','Unidad HBOX completa','Otro (cable, antena, gabinete…)'] }, - { tipo:'radio', clave:'donde', req:true, txt:'¿Dónde ocurrió?', + { tipo:'radio', clave:'donde', req:true, txt:'Dónde ocurrió', opciones:['En el banco (prueba o flasheo)','Durante el ensamble','En transporte o almacén','En campo, instalada','No se sabe — así se encontró'] }, - { tipo:'texto', clave:'quien_detecto', rows:'1', txt:'¿Quién lo detectó y cómo?', ph:'Daniel, al medir continuidad antes de energizar' }, + { tipo:'texto', clave:'quien_detecto', rows:'1', txt:'Quién lo detectó y cómo', ph:'Daniel, al medir continuidad antes de energizar' }, ] }, { titulo: '1 · Qué pasó', - sub:'Cuenta lo que viste, no lo que supones. "No se sabe" es una respuesta válida.', + sub:'Lo que viste, no lo que supones. "No se sabe" es válido.', items: [ { tipo:'radio', clave:'clasificacion', req:true, guardaEn:'clasificacion', txt:'Tipo de daño', opciones:[ @@ -55,13 +51,13 @@ Acta.render({ 'Error de ensamble o soldadura', 'Falla sin causa aparente', 'Otro'] }, - { tipo:'radio', clave:'energizada', req:true, txt:'¿Estaba energizada cuando ocurrió?', + { tipo:'radio', clave:'energizada', req:true, txt:'Energizada al ocurrir', opciones:['Sí','No','No se sabe'] }, - { tipo:'texto', clave:'fuente', si:energizada, rows:'1', txt:'¿Con qué fuente y a cuánto?', ph:'Fuente de banco 24 V, límite 500 mA' }, - { tipo:'texto', clave:'haciendo', rows:'2', txt:'¿Qué se estaba haciendo en ese momento?', + { tipo:'texto', clave:'fuente', si:energizada, rows:'1', txt:'Fuente y voltaje', ph:'Fuente de banco 24 V, límite 500 mA' }, + { tipo:'texto', clave:'haciendo', rows:'2', txt:'Qué se estaba haciendo', ph:'Se conectaba el arnés del GX16 con la fuente encendida.' }, { tipo:'texto', clave:'resumen', req:true, guardaEn:'resumen', rows:'2', - txt:'Resumen en una línea (es lo que verán los demás formularios como aviso)', + txt:'Resumen en una línea (aviso en otros formularios)', ph:'Corto VEH5V a GND en la zona de Q10; no energizar.' }, { tipo:'texto', clave:'descripcion', req:true, rows:'4', txt:'Descripción completa', ph:'Qué se midió, qué se vio, qué se olió, en qué orden pasó.' }, @@ -69,17 +65,17 @@ Acta.render({ { titulo: '2 · Evidencia', items: [ - { tipo:'foto', clave:'f_dano', req:true, etiqueta:'dano', txt:'El daño, de cerca.' }, - { tipo:'foto', clave:'f_general', etiqueta:'general', txt:'La pieza completa, para ubicar el daño.' }, - { tipo:'medida', clave:'r_corto', txt:'Si fue corto: resistencia medida a tierra', u:'Ω' }, - { tipo:'texto', clave:'componentes', rows:'2', txt:'Componentes afectados (designadores si los conoces)', ph:'Q10, D5, pista bajo U6' }, - { tipo:'archivo', clave:'log', etiqueta:'dano', txt:'Captura o log relacionado, si lo hay' }, + { tipo:'foto', clave:'f_dano', req:true, etiqueta:'dano', txt:'Daño de cerca.' }, + { tipo:'foto', clave:'f_general', etiqueta:'general', txt:'Pieza completa.' }, + { tipo:'medida', clave:'r_corto', txt:'Corto: resistencia a tierra', u:'Ω' }, + { tipo:'texto', clave:'componentes', rows:'2', txt:'Componentes afectados', ph:'Q10, D5, pista bajo U6' }, + { tipo:'archivo', clave:'log', etiqueta:'dano', txt:'Captura o log (si hay)' }, ] }, - { titulo: '3 · Disposición — esto es lo que MARCA la serie', - sub:'Lo último que se registre aquí es lo que vale. Para levantar una marca, registra una nueva acta con «Reparada».', + { titulo: '3 · Disposición (marca la serie)', + sub:'Vale la última registrada. Para levantar una marca, registra otra acta con «Reparada».', items: [ - { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'¿Cómo queda?', + { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Disposición', opciones:[ 'Marcada como dañada — en espera de diagnóstico o reparación', 'Enviada a Querétaro para evaluación', @@ -88,11 +84,11 @@ Acta.render({ 'Baja definitiva (marca permanente)'], aviso:'Reparada quita el aviso de los formularios. Baja lo vuelve permanente y la serie no debe volver a usarse ni instalarse.' }, { tipo:'texto', clave:'reparacion', si:v=>String(v.accion||'').startsWith('Reparada'), rows:'2', req:true, - txt:'¿Qué se reparó y quién lo verificó?' }, + txt:'Qué se reparó y quién lo verificó' }, { tipo:'texto', clave:'modulos_rescatados', si:v=>String(v.accion||'').startsWith('Canibalizada'), rows:'2', - txt:'¿Qué módulos se rescataron y a dónde fueron?', ph:'ARD-010 y RTK-0006 quedan libres para otro ensamble' }, - { tipo:'check', clave:'etiquetada', txt:'La pieza quedó etiquetada físicamente como dañada (cinta roja o marcador) y separada de las buenas.' }, - { tipo:'texto', clave:'leccion', rows:'2', txt:'¿Qué habría evitado esto?', + txt:'Módulos rescatados y destino', ph:'ARD-010 y RTK-0006 quedan libres para otro ensamble' }, + { tipo:'check', clave:'etiquetada', txt:'Pieza etiquetada como dañada (cinta roja) y separada.' }, + { tipo:'texto', clave:'leccion', rows:'2', txt:'Qué lo habría evitado', ph:'Medir continuidad antes de energizar; la acta de banco ya lo pide en el paso 2.' }, ] }, ] diff --git a/docs/formularios/diagnostico.html b/docs/formularios/diagnostico.html index 3e4b31a..5388ff2 100644 --- a/docs/formularios/diagnostico.html +++ b/docs/formularios/diagnostico.html @@ -23,98 +23,87 @@ Acta.render({ unidades: window.FLOTA, etiquetaSerie: 'Unidad que vas a revisar', titulo: 'Acta de diagnóstico en campo — HBOX', - subtitulo: 'Helgen Technologies · llénala EN LA MÁQUINA, mientras revisas. No la llenes de memoria después.', + subtitulo: 'Se llena en la máquina, mientras revisas; no de memoria después.', textoOK: 'QUEDA OPERATIVA', - intro: 'Para qué sirve esta acta. Nadie espera que tú encuentres la causa de la falla: eso se ' - + 'determina en el banco de Querétaro. Lo que sí depende de ti es que la evidencia llegue completa. ' - + 'Una unidad mal diagnosticada se puede volver a revisar; una unidad que reiniciaste antes de mirarla ' - + 'ya no se puede diagnosticar nunca, porque el estado en que la encontraste se borró.', + intro: 'La causa se encuentra en el banco de Querétaro; tu trabajo es traer la evidencia completa. ' + + 'Una unidad reiniciada antes de leerla ya no se puede diagnosticar.', secciones: [ - { titulo: '⚠ Reglas de oro — léelas antes de tocar la unidad', + { titulo: 'Reglas', items: [ { tipo:'nota', txt:'
1 · No reinicies, no desconectes, no abras nada hasta el paso 3. ' - + 'El estado en que encontraste la unidad es la evidencia. Cortarle la energía borra la temperatura ' - + 'máxima, la cuenta de reinicios y la causa del último arranque — justo lo que necesitamos.
' }, - { tipo:'nota', txt:'
2 · Seguridad de la máquina primero. No trabajes sobre un RTG o ' - + 'un equipo energizado sin el permiso y el bloqueo (LOTO) del terminal. Si el equipo está operando, ' - + 'no subas: agenda con el supervisor de ICAVE y regresa.
' }, - { tipo:'nota', txt:'
3 · Batería. Si ves la batería hinchada, si quema al ' - + 'tacto o si huele a quemado: no sigas desarmando, no la perfores, sepárala de la electrónica, tómale foto ' - + 'y avisa de inmediato. Una batería de litio hinchada no viaja en avión.
' }, - { tipo:'nota', txt:'
4 · Si está lloviendo o el gabinete está mojado, no lo abras. ' - + 'Anótalo y regresa en seco.
' }, - { tipo:'check', clave:'reglas', req:true, txt:'Leí las cuatro reglas y voy a seguir el procedimiento en orden.' }, + + 'Cortar la energía borra la temperatura máxima, los reinicios y la causa del último arranque.' }, + { tipo:'nota', txt:'
2 · Máquina. Nada sobre un RTG o equipo energizado sin permiso y LOTO. ' + + 'Si está operando, no subas: agenda con el supervisor de ICAVE.
' }, + { tipo:'nota', txt:'
3 · Batería. Hinchada, caliente o con olor a quemado: deja de desarmar, no la perfores, ' + + 'sepárala de la electrónica, foto y aviso inmediato. Hinchada no viaja en avión.
' }, + { tipo:'nota', txt:'
4 · Lluvia o gabinete mojado: no lo abras. Anótalo y regresa en seco.
' }, + { tipo:'check', clave:'reglas', req:true, txt:'Leí las cuatro reglas y sigo el procedimiento en orden.' }, ] }, - { titulo: '0 · Permiso de acceso y máquina — antes de subirte a nada', - sub:'En ICAVE el equipo no se identifica por el HBOX sino por la MÁQUINA, y no se sube a una máquina sin autorización por escrito.', + { titulo: '0 · Permiso y máquina', + sub:'En ICAVE el equipo se identifica por la máquina, y no se sube sin autorización por escrito.', items: [ - { tipo:'nota', txt:'Cómo funciona. Operaciones (Adriana) manda a ICAVE un correo pidiendo acceso a la ' - + 'máquina por su número, nombrando a los técnicos que van a subir. Hasta que ICAVE contesta y se acuerda ' - + 'el horario, no hay visita. Si llegaste sin ese correo contestado, no subas: avisa y reagenda.' }, - { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha de la revisión', - ayuda:'Arranca con la de hoy. Cámbiala si estás capturando una visita de otro día.' }, + { tipo:'nota', txt:'Operaciones (Adriana) pide a ICAVE acceso a la máquina por correo, con los técnicos que suben. ' + + 'Sin correo contestado y horario acordado, no subas: avisa y reagenda.' }, + { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha', + ayuda:'Hoy por omisión; cámbiala si capturas una visita de otro día.' }, { tipo:'texto', clave:'maquina_id', req:true, guardaEn:'maquina_id', rows:'1', - txt:'Número de la máquina donde está instalado el HBOX, tal como lo nombra ICAVE', + txt:'Máquina (como la nombra ICAVE)', ph:'FL-JUN-060 · RT-ZPMC-20 · HS-WES-62' }, - { tipo:'radio', clave:'coincide', req:true, txt:'¿Coincide con la máquina que aparece arriba, junto a la unidad que elegiste?', + { tipo:'radio', clave:'coincide', req:true, txt:'Coincide con la máquina de arriba', opciones:['Sí, es la misma','No — la unidad está en otra máquina (explícalo abajo)','La lista no dice la máquina'], - aviso:'Si NO coincide, avisa a ingeniería: el registro de qué unidad está en qué máquina quedó mal y hay que corregirlo.' }, + aviso:'Si no coincide, avisa a ingeniería: el registro está mal.' }, { tipo:'radio', clave:'permiso', req:true, guardaEn:'permiso', - txt:'¿Hay autorización de acceso a esa máquina?', + txt:'Autorización de acceso', opciones:['Sí, autorizada por correo','Sí, autorizada en sitio por el supervisor','No — solo la reviso desde afuera, sin subir','No aplica — la unidad ya está en el taller'] }, { tipo:'texto', clave:'permiso_quien', si:v=>String(v.permiso||'').startsWith('Sí'), rows:'1', - txt:'¿Quién autorizó y a qué hora?', ph:'Abraham (ICAVE) — correo del 18-sep, acceso 09:40' }, + txt:'Quién autorizó y hora', ph:'Abraham (ICAVE) — correo del 18-sep, acceso 09:40' }, { tipo:'check', clave:'loto', si:v=>String(v.permiso||'').startsWith('Sí'), - txt:'La máquina está detenida y bloqueada (LOTO), o el supervisor confirmó que es seguro trabajar en ella.' }, + txt:'Máquina detenida y bloqueada (LOTO), o el supervisor confirmó que es seguro.' }, { tipo:'nota', si:v=>String(v.permiso||'').startsWith('No —'), - txt:'
Sin autorización no te subas al equipo. Haz lo que se pueda desde el piso ' - + '(fotos de lejos, patrón del LED si se alcanza a ver) y déjalo anotado. Una revisión incompleta ' - + 'es aceptable; un accidente no.
' }, - { tipo:'texto', clave:'operador', rows:'1', txt:'¿Quién te acompañó o te dio acceso? (operador o supervisor)' }, + txt:'
Sin autorización no subas. Haz lo posible desde el piso (fotos, LED si se ve) y anótalo.
' }, + { tipo:'texto', clave:'operador', rows:'1', txt:'Acompañante (operador o supervisor)' }, ] }, - { titulo: '1 · Por qué vienes a esta unidad', - sub:'Contesta con lo que te dijeron, aunque suene vago. La versión del operador vale.', + { titulo: '1 · Motivo', + sub:'Lo que te dijeron, aunque suene vago.', items: [ - { tipo:'radio', clave:'motivo', req:true, guardaEn:'motivo', txt:'Motivo de la visita', + { tipo:'radio', clave:'motivo', req:true, guardaEn:'motivo', txt:'Motivo', opciones:['Dejó de reportar','Reporta pero con posición mala o saltos','Nunca ha reportado desde que se instaló', 'La máquina se quedó sin la unidad / se desmontó','Revisión preventiva','Otro (explícalo abajo)'] }, - { tipo:'texto', clave:'reporte', rows:'2', txt:'¿Quién avisó y qué dijo exactamente?', + { tipo:'texto', clave:'reporte', rows:'2', txt:'Quién avisó y qué dijo', ph:'Ej.: el operador del montacargas dice que ayer en la tarde dejó de verse en el sistema.' }, - { tipo:'texto', clave:'ultima_vez', txt:'¿Cuándo se vio reportando por última vez? (fecha y hora aproximadas)', + { tipo:'texto', clave:'ultima_vez', txt:'Último reporte (fecha y hora aprox.)', ph:'17-sep, como a las 3 de la tarde' }, - { tipo:'radio', clave:'estado_maquina', txt:'¿Cómo está la máquina ahora?', + { tipo:'radio', clave:'estado_maquina', txt:'Estado de la máquina', opciones:['Trabajando normal','Encendida pero parada','Apagada','En taller / fuera de servicio','No sé'] }, ] }, - { titulo: '2 · Antes de abrir nada — cómo la encontraste', - sub:'Todo este paso se hace con el gabinete CERRADO y sin cortar la energía.', + { titulo: '2 · Cómo la encontraste', + sub:'Gabinete cerrado, sin cortar la energía.', items: [ { tipo:'foto', clave:'f_maquina', req:true, etiqueta:'maquina', - txt:'La máquina completa, de lejos, donde se vea dónde está montado el gabinete.', - ayuda:'Sirve para saber qué sol le pega y a qué altura está. Una sola foto basta.' }, + txt:'Máquina completa con el gabinete a la vista.', + ayuda:'Para ver sol y altura. Una foto basta.' }, { tipo:'foto', clave:'f_gabinete', req:true, etiqueta:'gabinete-cerrado', - txt:'El gabinete cerrado, de cerca, tal como lo encontraste.' }, + txt:'Gabinete cerrado, de cerca.' }, { tipo:'foto', clave:'f_antenas', req:true, etiqueta:'antenas', - txt:'Las antenas (la de GPS y las dos de celular) con su cable.', - ayuda:'Acércate al conector: buscamos cables pellizcados, conectores flojos, antenas rotas o faltantes.' }, - { tipo:'check', clave:'ext_golpes', txt:'Revisé el exterior: golpes, tapas flojas, tornillos faltantes, prensaestopas sueltos.' }, - { tipo:'radio', clave:'ext_estado', txt:'¿El gabinete por fuera está…?', + txt:'Antenas (GPS y dos de celular) con su cable.', + ayuda:'De cerca al conector: cables pellizcados, conectores flojos, antenas rotas o faltantes.' }, + { tipo:'check', clave:'ext_golpes', txt:'Exterior revisado: golpes, tapa, tornillos, prensaestopas.' }, + { tipo:'radio', clave:'ext_estado', txt:'Gabinete por fuera', opciones:['Bien, sin daños','Golpeado','Con agua o marcas de agua','Con la tapa mal cerrada','Falta alguna antena'] }, - { tipo:'radio', clave:'sol', txt:'¿Le pega el sol directo a esa hora?', opciones:['Sí, de lleno','Parcial','No, está en sombra'] }, - { tipo:'medida', clave:'hora_revision', txt:'Hora a la que estás haciendo esta revisión', ph:'14:30', modo:'text' }, + { tipo:'radio', clave:'sol', txt:'Sol directo a esta hora', opciones:['Sí, de lleno','Parcial','No, está en sombra'] }, + { tipo:'medida', clave:'hora_revision', txt:'Hora de la revisión', ph:'14:30', modo:'text' }, ] }, - { titulo: '3 · El LED de estado — el dato más importante de toda la visita', - sub:'La unidad te está diciendo qué le pasa con el parpadeo del LED. Todavía SIN cortarle la energía.', + { titulo: '3 · LED de estado', + sub:'Todavía sin cortar la energía.', items: [ - { tipo:'nota', txt:'Cómo se hace bien: mira el LED 10 segundos completos con el reloj y ' - + 'cuenta cuántas veces prende. No lo adivines: 5 veces en 10 s y 10 veces en 10 s significan ' - + 'cosas opuestas (una es que la máquina no le da corriente, la otra es que no tiene enlace).' }, - { tipo:'medida', clave:'destellos', txt:'¿Cuántas veces prendió el LED en 10 segundos?', ph:'5', u:'destellos' }, - { tipo:'radio', clave:'led', req:true, txt:'¿Cuál de estos patrones es? (elige el que más se parezca)', + { tipo:'nota', txt:'Cuenta los destellos durante 10 s con reloj. 5 y 10 destellos significan cosas opuestas (sin corriente de la máquina vs sin enlace).' }, + { tipo:'medida', clave:'destellos', txt:'Destellos en 10 s', ph:'5', u:'destellos' }, + { tipo:'radio', clave:'led', req:true, txt:'Patrón del LED', opciones:[ 'A · Apagado — no prende ni una vez en 30 segundos', 'B · Fijo encendido, sin parpadear', @@ -124,130 +113,125 @@ Acta.render({ 'F · Dos destellos juntos, pausa, y se repite', 'G · Parpadeo rápido continuo, no alcanzo a contarlo', 'H · No puedo ver el LED desde afuera' ] }, - { tipo:'foto', clave:'f_led', etiqueta:'led', txt:'Opcional pero muy útil: foto del LED encendido.' }, + { tipo:'foto', clave:'f_led', etiqueta:'led', txt:'LED encendido (opcional).' }, ] }, - { titulo: '🔴 Lectura A — la unidad está muerta o sin corriente', si:v=>led(v).startsWith('A'), - sub:'El LED apagado significa una de dos: no le llega energía, o el HBOX ya no enciende. El multímetro lo decide.', + { titulo: 'Lectura A — sin energía o muerta', si:v=>led(v).startsWith('A'), + sub:'No le llega energía o el HBOX no enciende; el multímetro decide.', items: [ - { tipo:'nota', txt:'Abre el gabinete (máquina apagada) y mide en este orden. Si en algún punto ya no hay voltaje, ahí está el corte.' }, - { tipo:'medida', clave:'v_maquina', txt:'1) Voltaje que entrega la máquina al gabinete', esperado:'12 V o 24 V según el equipo', u:'V' }, + { tipo:'nota', txt:'Máquina apagada, gabinete abierto. Mide en orden; donde deje de haber voltaje está el corte.' }, + { tipo:'medida', clave:'v_maquina', txt:'1) Máquina → gabinete', esperado:'12 V o 24 V según el equipo', u:'V' }, { tipo:'radio', clave:'breaker', txt:'2) Breaker / fusible del gabinete', opciones:['Cerrado y con continuidad','Botado (disparado)','Fusible abierto (quemado)','No pude revisarlo'] }, - { tipo:'radio', clave:'meanwell_led', txt:'3) LED verde de la fuente Mean Well', opciones:['Encendido','Apagado','No tiene / no se ve'] }, - { tipo:'medida', clave:'v_meanwell', txt:'4) Salida de la fuente Mean Well', esperado:'23 – 26 V', u:'V' }, - { tipo:'medida', clave:'v_gx16', txt:'5) En el conector GX16 del HBOX, pines 1-2', esperado:'23 – 26 V', u:'V', - aviso:'Esta es la medida que parte el diagnóstico en dos: con 24 V aquí y el LED apagado, la falla es del HBOX. Sin 24 V aquí, la falla es del gabinete o de la máquina.' }, - { tipo:'medida', clave:'v_ign', txt:'6) GX16 pin 3 (ignición), con la máquina encendida', esperado:'12 – 24 V con ignición', u:'V' }, - { tipo:'foto', clave:'f_interior_a', req:true, etiqueta:'interior', txt:'Interior del gabinete completo, antes de mover cables.' }, + { tipo:'radio', clave:'meanwell_led', txt:'3) LED verde de la Mean Well', opciones:['Encendido','Apagado','No tiene / no se ve'] }, + { tipo:'medida', clave:'v_meanwell', txt:'4) Salida de la Mean Well', esperado:'23 – 26 V', u:'V' }, + { tipo:'medida', clave:'v_gx16', txt:'5) GX16 del HBOX, pines 1-2', esperado:'23 – 26 V', u:'V', + aviso:'Con 24 V aquí y LED apagado: falla del HBOX. Sin 24 V: gabinete o máquina.' }, + { tipo:'medida', clave:'v_ign', txt:'6) GX16 pin 3 (ignición), máquina encendida', esperado:'12 – 24 V con ignición', u:'V' }, + { tipo:'foto', clave:'f_interior_a', req:true, etiqueta:'interior', txt:'Interior del gabinete, antes de mover cables.' }, ] }, - { titulo: '🟡 Lectura D — el HBOX vive, pero la máquina no le está dando corriente', si:v=>led(v).startsWith('D'), - sub:'Latido lento = el equipo está funcionando con su propia batería. Aguanta poco: por eso "dejó de reportar".', + { titulo: 'Lectura D — vive en batería, sin corriente de la máquina', si:v=>led(v).startsWith('D'), + sub:'Latido lento = funciona con su batería, que aguanta poco.', items: [ - { tipo:'nota', txt:'La falla no está en el HBOX, está aguas arriba: breaker, fusible, fuente, cable o ignición.' }, - { tipo:'medida', clave:'v_maquina_d', txt:'Voltaje que entrega la máquina al gabinete', esperado:'12 V o 24 V', u:'V' }, + { tipo:'nota', txt:'La falla está aguas arriba del HBOX: breaker, fusible, fuente, cable o ignición.' }, + { tipo:'medida', clave:'v_maquina_d', txt:'Máquina → gabinete', esperado:'12 V o 24 V', u:'V' }, { tipo:'radio', clave:'breaker_d', txt:'Breaker / fusible del gabinete', opciones:['Cerrado y con continuidad','Botado (disparado)','Fusible abierto (quemado)','No pude revisarlo'] }, { tipo:'medida', clave:'v_gx16_d', txt:'GX16 pines 1-2 (lo que llega al HBOX)', esperado:'23 – 26 V', u:'V' }, - { tipo:'texto', clave:'nota_d', txt:'¿Encontraste el punto donde se corta?', ph:'Ej.: hay 24 V a la salida de la fuente pero 0 V en el GX16 → cable o conector.' }, + { tipo:'texto', clave:'nota_d', txt:'Punto donde se corta', ph:'Ej.: hay 24 V a la salida de la fuente pero 0 V en el GX16 → cable o conector.' }, { tipo:'foto', clave:'f_interior_d', req:true, etiqueta:'interior', txt:'Interior del gabinete y el punto donde se corta el voltaje.' }, ] }, - { titulo: '🟠 Lectura E / F / G — el HBOX vive pero no tiene enlace', si:v=>/^[EFG]/.test(led(v)), - sub:'Parpadeo de 1 por segundo, doble destello o parpadeo rápido continuo = está buscando o perdiendo el enlace de datos.', + { titulo: 'Lectura E / F / G — vive, sin enlace', si:v=>/^[EFG]/.test(led(v)), + sub:'Buscando o perdiendo el enlace de datos.', items: [ - { tipo:'nota', txt:'Las correcciones y los datos viajan por el módem 4G, no por el GPS. Revisa la cadena del celular.' }, - { tipo:'check', clave:'ant_lte', txt:'Las dos antenas de celular están atornilladas y firmes (no flojas, no rotas).' }, - { tipo:'check', clave:'ant_gnss', txt:'La antena de GPS está firme, con vista al cielo y el cable sin aplastar.' }, - { tipo:'radio', clave:'senal_tel', txt:'Con tu teléfono, parado junto a la máquina, ¿cuánta señal Telcel hay?', + { tipo:'nota', txt:'Correcciones y datos viajan por el módem 4G, no por el GPS: revisa la cadena celular.' }, + { tipo:'check', clave:'ant_lte', txt:'Dos antenas de celular firmes y sanas.' }, + { tipo:'check', clave:'ant_gnss', txt:'Antena GPS firme, con cielo, cable sin aplastar.' }, + { tipo:'radio', clave:'senal_tel', txt:'Señal Telcel en tu teléfono junto a la máquina', opciones:['Llena','Media','Una rayita','Nada'] }, - { tipo:'texto', clave:'nota_efg', txt:'¿Algo cambió cerca? (estructura metálica nueva, contenedores apilados, el gabinete se movió)' }, - { tipo:'foto', clave:'f_ant_cerca', req:true, etiqueta:'antenas-detalle', txt:'Detalle de los conectores de antena, bien de cerca.' }, - { tipo:'nota', txt:'Si el parpadeo era rápido y continuo (patrón G), puede ser que la unidad se esté ' - + 'reiniciando sola una y otra vez. Eso solo se confirma con la captura por USB del paso 5: hazla sí o sí.' }, + { tipo:'texto', clave:'nota_efg', txt:'Cambios cerca (estructuras, contenedores, gabinete movido)' }, + { tipo:'foto', clave:'f_ant_cerca', req:true, etiqueta:'antenas-detalle', txt:'Conectores de antena de cerca.' }, + { tipo:'nota', txt:'Patrón G (rápido continuo): posible bucle de reinicio. Solo la captura USB del paso 5 lo confirma; hazla.' }, ] }, - { titulo: '🔵 Lectura B — la unidad se ve sana', si:v=>led(v).startsWith('B'), - sub:'LED fijo = está trabajando, con corriente de la máquina y con enlace. Entonces el problema no está aquí.', + { titulo: 'Lectura B — se ve sana', si:v=>led(v).startsWith('B'), + sub:'LED fijo = trabajando, con corriente y enlace.', items: [ - { tipo:'nota', txt:'No la desmontes. Si el sistema no la ve pero el equipo está sano, lo más probable es que el ' - + 'problema esté en el servidor, en la SIM o en la plataforma. Haz la captura por USB del paso 5 y avisa a ingeniería.' }, + { tipo:'nota', txt:'No la desmontes. Probablemente es el servidor, la SIM o la plataforma. Haz la captura USB del paso 5 y avisa a ingeniería.' }, { tipo:'check', clave:'b_aviso', txt:'Entendido: la dejo instalada y reporto a ingeniería.' }, ] }, - { titulo: '🟣 Lectura C — la unidad está dormida por batería agotada', si:v=>led(v).startsWith('C'), - sub:'Destello cortito cada 4 s = se durmió para no dañar la batería. Casi siempre es consecuencia, no causa: lleva tiempo sin corriente de la máquina.', + { titulo: 'Lectura C — dormida por batería agotada', si:v=>led(v).startsWith('C'), + sub:'Destello corto cada 4 s. Casi siempre es consecuencia: lleva tiempo sin corriente de la máquina.', items: [ { tipo:'medida', clave:'v_gx16_c', txt:'GX16 pines 1-2 (lo que llega al HBOX)', esperado:'23 – 26 V', u:'V' }, { tipo:'medida', clave:'v_ign_c', txt:'GX16 pin 3 (ignición), máquina encendida', esperado:'12 – 24 V', u:'V' }, { tipo:'foto', clave:'f_interior_c', req:true, etiqueta:'interior', txt:'Interior del gabinete.' }, ] }, - { titulo: '⚪ No se ve el LED', si:v=>led(v).startsWith('H'), + { titulo: 'LED no visible', si:v=>led(v).startsWith('H'), items: [ - { tipo:'nota', txt:'Sin el LED no hay atajo: el paso 5 (captura por USB con la laptop) pasa de recomendado a obligatorio.' }, + { tipo:'nota', txt:'Sin LED, la captura USB del paso 5 es obligatoria.' }, ] }, - { titulo: '4 · Por dentro — temperatura, olor y batería', - sub:'Solo si ya abriste el gabinete y la máquina está apagada.', + { titulo: '4 · Por dentro', + sub:'Gabinete abierto y máquina apagada.', items: [ - { tipo:'radio', clave:'abrir', req:true, txt:'¿Abriste el gabinete?', opciones:['Sí','No — no fue posible (explica al final)'] }, - { tipo:'radio', clave:'tacto', si:abrio, txt:'Con el dorso de la mano, la caja del HBOX se siente…', + { tipo:'radio', clave:'abrir', req:true, txt:'Gabinete abierto', opciones:['Sí','No — no fue posible (explica al final)'] }, + { tipo:'radio', clave:'tacto', si:abrio, txt:'Caja del HBOX al tacto (dorso de la mano)', opciones:['Fría o al tiempo','Tibia','Caliente pero se aguanta','Quema — no se puede tocar'] }, - { tipo:'medida', clave:'t_ir', si:abrio, txt:'Si traes termómetro infrarrojo: temperatura dentro del gabinete', esperado:'anota también la del aire afuera', u:'°C' }, + { tipo:'medida', clave:'t_ir', si:abrio, txt:'Temperatura dentro del gabinete (IR)', esperado:'anota también la del aire afuera', u:'°C' }, { tipo:'medida', clave:'t_amb', si:abrio, txt:'Temperatura ambiente a la sombra', u:'°C' }, - { tipo:'radio', clave:'olor', si:abrio, req:true, txt:'¿Huele a quemado o a plástico derretido?', opciones:['No','Sí, leve','Sí, fuerte'] }, - { tipo:'radio', clave:'agua', si:abrio, txt:'¿Hay agua, humedad o condensación adentro?', opciones:['No','Gotas o empañado','Encharcado'] }, - { tipo:'radio', clave:'bateria', si:abrio, req:true, txt:'La batería se ve…', + { tipo:'radio', clave:'olor', si:abrio, req:true, txt:'Olor a quemado', opciones:['No','Sí, leve','Sí, fuerte'] }, + { tipo:'radio', clave:'agua', si:abrio, txt:'Agua o condensación', opciones:['No','Gotas o empañado','Encharcado'] }, + { tipo:'radio', clave:'bateria', si:abrio, req:true, txt:'Batería', opciones:['Normal','Hinchada o abombada','Con manchas cafés o negras','Con líquido o fuga','Caliente','No tiene batería / no la vi'], - aviso:'Si marcaste hinchada, con fuga o caliente: deja de desarmar, sepárala de la electrónica, no la perfores y avisa hoy mismo.' }, + aviso:'Hinchada, con fuga o caliente: deja de desarmar, sepárala, no la perfores y avisa hoy.' }, { tipo:'foto', clave:'f_bateria', etiqueta:'bateria', si:v=>['Hinchada','Con manchas','Con líquido','Caliente'].some(t=>String(v.bateria||'').startsWith(t)), - req:true, txt:'Foto de la batería desde dos ángulos.' }, + req:true, txt:'Batería, dos ángulos.' }, { tipo:'foto', clave:'f_quemado', etiqueta:'dano', si:v=>String(v.olor||'').startsWith('Sí'), - req:true, txt:'Foto de lo que se ve quemado, oscurecido o derretido.' }, - { tipo:'check', clave:'wiggle', si:abrio, txt:'Prueba de meneo: moví suavemente cada conector y cable. Anoto abajo si alguno estaba flojo.' }, - { tipo:'texto', clave:'nota_interior', si:abrio, rows:'2', txt:'¿Qué encontraste flojo, quemado, mojado o fuera de lugar?' }, + req:true, txt:'Lo quemado, oscurecido o derretido.' }, + { tipo:'check', clave:'wiggle', si:abrio, txt:'Meneo suave de conectores y cables (lo flojo, abajo).' }, + { tipo:'texto', clave:'nota_interior', si:abrio, rows:'2', txt:'Hallazgos' }, ] }, - { titulo: '5 · Captura por USB — lo que la unidad tiene guardado', - sub:'Este paso vale más que todos los demás juntos: la unidad guarda su temperatura máxima, cuántas veces se reinició y por qué arrancó la última vez. Eso se pierde al cortarle la corriente.', + { titulo: '5 · Captura por USB', + sub:'Temperatura máxima, reinicios y causa del último arranque; se pierden al cortar la corriente.', items: [ - { tipo:'nota', txt:'Cómo: conecta el cable USB del Blackpill a la laptop → abre el puerto serie nuevo a ' - + '115200 baudios → guarda a archivo → déjalo correr 3 minutos → después presiona RESET y ' - + 'graba también el arranque. Al final guarda el archivo y pega abajo las dos últimas líneas.' }, - { tipo:'radio', clave:'usb', req:true, txt:'¿Pudiste hacer la captura?', + { tipo:'nota', txt:'USB del Blackpill → puerto serie a 115200 guardando a archivo → 3 min → RESET y graba el arranque. Pega abajo las líneas BOOT y TLM.' }, + { tipo:'radio', clave:'usb', req:true, txt:'Captura', opciones:['Sí, con archivo guardado','Sí, pero solo pude ver la pantalla','No traía laptop','No, la unidad no enciende','No, no hay acceso físico al USB'] }, { tipo:'texto', clave:'linea_boot', si:conUsb, rows:'2', - txt:'Pega la línea que empieza con BOOT,', ph:'BOOT,1234,fw=3.0.3,reset=…' }, + txt:'Línea BOOT', ph:'BOOT,1234,fw=3.0.3,reset=…' }, { tipo:'texto', clave:'linea_tlm', si:conUsb, rows:'3', - txt:'Pega la última línea que empieza con TLM,', ph:'TLM,…,RUN,OK,4,14,…' }, + txt:'Última línea TLM', ph:'TLM,…,RUN,OK,4,14,…' }, { tipo:'nota', si:conUsb, - txt:'Si no puedes copiar y pegar, no importa: llena a mano los cuatro datos de abajo, que son los que más nos dicen.' }, - { tipo:'medida', clave:'tlm_tmax', si:conUsb, txt:'Campo tmax (temperatura máxima que ha visto)', u:'°C' }, - { tipo:'medida', clave:'tlm_rec', si:conUsb, txt:'Campo rec (veces que se ha tenido que recuperar)' }, - { tipo:'medida', clave:'tlm_vbat', si:conUsb, txt:'Campo vbat (voltaje de la batería)', u:'V' }, - { tipo:'medida', clave:'tlm_veh', si:conUsb, txt:'Campo veh (1 = le llega corriente de la máquina, 0 = no)' }, + txt:'Si no puedes pegar, llena a mano los cuatro campos de abajo.' }, + { tipo:'medida', clave:'tlm_tmax', si:conUsb, txt:'tmax (temperatura máxima)', u:'°C' }, + { tipo:'medida', clave:'tlm_rec', si:conUsb, txt:'rec (recuperaciones)' }, + { tipo:'medida', clave:'tlm_vbat', si:conUsb, txt:'vbat (batería)', u:'V' }, + { tipo:'medida', clave:'tlm_veh', si:conUsb, txt:'veh (1 = hay corriente de la máquina)' }, { tipo:'archivo', clave:'log_blackpill', etiqueta:'captura-blackpill', si:v=>String(v.usb||'').startsWith('Sí, con archivo'), req:true, - txt:'Sube aquí el archivo de la captura del Blackpill', - ayuda:'El .txt o .log que guardó PuTTY / TeraTerm. Es el registro más valioso de la visita: ' - + 'súbelo aunque no hayas entendido lo que dice.' }, + txt:'Captura del Blackpill', + ayuda:'El .txt o .log de PuTTY / TeraTerm.' }, { tipo:'foto', clave:'f_pantalla', etiqueta:'captura-usb', si:conUsb, - txt:'Foto de la pantalla de la laptop con las líneas visibles (respaldo por si falla el copiado).' }, + txt:'Pantalla de la laptop con las líneas (respaldo).' }, ] }, - { titulo: '6 · Reinicio controlado — hasta ahora sí puedes cortar la energía', - sub:'Solo cuando ya terminaste los pasos 2 al 5. Antes no.', + { titulo: '6 · Reinicio controlado', + sub:'Solo después de los pasos 2 a 5.', items: [ - { tipo:'check', clave:'evidencia_lista', req:true, txt:'Ya tomé las fotos y (si se pudo) la captura por USB. La evidencia está completa.' }, - { tipo:'radio', clave:'reinicio', txt:'Corté la energía 30 segundos, la volví a dar y esperé 2 minutos. ¿Qué pasó?', + { tipo:'check', clave:'evidencia_lista', req:true, txt:'Fotos y captura USB (si se pudo) tomadas: evidencia completa.' }, + { tipo:'radio', clave:'reinicio', txt:'Energía cortada 30 s y devuelta; resultado a 2 min', opciones:['Revivió y quedó con LED fijo','Revivió pero volvió a fallar','Sigue igual','No lo intenté'] }, ] }, - { titulo: '7 · Cómo la dejas y qué crees que tiene', - sub:'Elige lo que observaste, no lo que supones. "No está claro" es una respuesta válida y útil.', + { titulo: '7 · Clasificación y resultado', + sub:'Lo que observaste, no lo que supones. "No está claro" es válido.', items: [ - { tipo:'radio', clave:'clasificacion', req:true, guardaEn:'clasificacion', txt:'Clasificación de la falla', + { tipo:'radio', clave:'clasificacion', req:true, guardaEn:'clasificacion', txt:'Clasificación', opciones:[ 'Sin corriente desde la máquina o el gabinete', 'El HBOX no enciende aunque le llega 24 V', @@ -259,7 +243,7 @@ Acta.render({ 'Daño mecánico o golpe', 'La unidad se ve sana — el problema parece ser del servidor', 'No está claro — se necesita banco' ] }, - { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'¿Cómo queda la unidad al terminar tu visita?', + { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Resultado', opciones:[ 'Instalada y reportando', 'Instalada, pero sin resolver — pendiente de ingeniería', @@ -267,11 +251,11 @@ Acta.render({ 'Desmontada y enviada a Querétaro', 'Reemplazada por otra unidad (anota cuál abajo)' ] }, { tipo:'texto', clave:'unidad_repuesto', si:v=>String(v.accion||'').startsWith('Reemplazada'), - txt:'Número de serie de la unidad que quedó instalada' }, + txt:'Serie de la unidad instalada' }, { tipo:'texto', clave:'observaciones', rows:'4', req:true, - txt:'Cuenta con tus palabras qué viste y qué hiciste', - ph:'Escribe como se lo contarías a un compañero. Lo que aquí escribas es lo que va a leer ingeniería.' }, - { tipo:'foto', clave:'f_final', etiqueta:'final', txt:'Foto de cómo quedó al terminar (instalada o empacada).' }, + txt:'Observaciones', + ph:'Qué viste y qué hiciste, como se lo contarías a un compañero.' }, + { tipo:'foto', clave:'f_final', etiqueta:'final', txt:'Cómo quedó (instalada o empacada).' }, ] }, ] }); diff --git a/docs/formularios/ensamble.html b/docs/formularios/ensamble.html index 1d472a3..f3f7323 100644 --- a/docs/formularios/ensamble.html +++ b/docs/formularios/ensamble.html @@ -13,8 +13,8 @@ Acta.render({ tipo: 'ensamble', titulo: 'Acta de ensamble — unidad HBOX v5', - subtitulo: 'Una unidad a la vez. Procedimiento: "Ensamble de la unidad y energizado final".', - intro: 'Primero el acta, luego el desarmador. Selecciona los tres módulos: el sitio verifica que cada uno esté aprobado, que la pareja ArduSimple+4G tenga su integración y que ninguno esté ya en otra unidad. El número de serie de la unidad se calcula solo.', + subtitulo: 'Una unidad a la vez. Procedimiento: Ensamble de la unidad y energizado.', + intro: 'Primero el acta, luego el desarmador. Elige los tres módulos: el sitio verifica que estén aprobados, que la pareja tenga integración y que ninguno esté en otra unidad. El número de unidad se calcula solo.', componentes: [ { clave:'einar', etiqueta:'EinarBoard v5', prefijo:'V5', desde:1, hasta:30, pad:2, tipoActa:'prueba-v5' }, { clave:'ard', etiqueta:'simpleRTK2B Pro (ArduSimple)', prefijo:'ARD', desde:1, hasta:30, pad:3, tipoActa:'modulo-ard' }, @@ -31,56 +31,56 @@ Acta.render({ secciones: [ { titulo: '2 · Preparación de la tarjeta (sin energía)', items: [ - { tipo:'check', txt:'La EinarBoard física es la seleccionada arriba (etiqueta cerca de MH4).' }, + { tipo:'check', txt:'La EinarBoard física es la elegida arriba (etiqueta cerca de MH4).' }, { tipo:'radio', txt:'JP2 (F2)', opciones:['1 = Li-ion','0 = LiFePO4'] }, { tipo:'radio', txt:'JP3 (F1)', opciones:['0','1'] }, { tipo:'radio', txt:'JP4 (F0)', opciones:['1','0'] }, - { tipo:'check', txt:'Posición esperada para el pack Li-ion 4.00 V: JP2 = 1 · JP3 = 0 · JP4 = 1. JP1 (0R) presente.' }, - { tipo:'check', txt:'P11 sin jumper (el interruptor de panel va ahí). Tarjeta fijada con separadores, sin flexión.' }, + { tipo:'check', txt:'JP2 = química del paquete (V5.5 Li-ion = 1, V5.6 LFP = 0) · JP3 = 0 · JP4 = 1. JP1 (0R) presente.' }, + { tipo:'check', txt:'P11 sin jumper (ahí va el interruptor). Tarjeta fija sin flexión.' }, ] }, { titulo: '3 · Módulos enchufables (sin energía)', items: [ - { tipo:'check', txt:'simpleRTK2B Pro en MOD1: pin "5V" alineado, cuatro tiras a fondo, ninguna clavija fuera.' }, - { tipo:'check', txt:'4G NTRIP Master en J7/J8 de la EinarBoard (no en el simpleRTK2B), silueta coincide con la serigrafía.' }, + { tipo:'check', txt:'simpleRTK2B en MOD1: pin "5V" alineado, tiras a fondo, ninguna clavija fuera.' }, + { tipo:'check', txt:'Módem en J7/J8 de la EinarBoard, silueta sobre la serigrafía.' }, { tipo:'check', txt:'SIM presente. Nada roza la tapa ni componentes altos (K1, C10, L6).' }, ] }, { titulo: '4 · Panel y arnés interno (sin energía)', items: [ - { tipo:'check', txt:'P1 ← GX16: 1 = +24 V, 2 = GND, 3 = ignición, 4 = GND. Polaridad verificada con multímetro.' }, - { tipo:'medida', txt:'Salida de la SD-15B-05 ajustada en banco', esperado:'5.00 V', u:'V' }, - { tipo:'check', txt:'P2 ← SD-15B (pin 1 = +5 V). Entrada de la SD-15B al +24 V/GND del GX16.' }, + { tipo:'check', txt:'P1 ← GX16: 1 = +24 V, 2 = GND, 3 = ignición, 4 = GND. Polaridad medida.' }, + { tipo:'medida', txt:'Salida SD-15B-05 ajustada', esperado:'5.00 V', u:'V' }, + { tipo:'check', txt:'P2 ← SD-15B (pin 1 = +5 V); entrada de la SD-15B al GX16.' }, { tipo:'check', txt:'P6 ventilador (flujo hacia afuera) · P8 LED panel · P10 reset · P11 interruptor de corte · P12 NTC punto caliente.' }, { tipo:'check', txt:'Antena GNSS: bulkhead SMA → SMA del simpleRTK2B, con fijador de rosca.' }, - { tipo:'check', txt:'2 antenas LTE: bulkheads SMA → u.FL del módulo 4G (clic), sin dobleces cerrados.' }, + { tipo:'check', txt:'2 antenas LTE: bulkheads SMA → u.FL del módem (clic), sin dobleces cerrados.' }, { tipo:'check', txt:'P4 (batería) todavía NO conectado. Cables sujetos; nada expuesto cerca de 24 V.' }, ] }, { titulo: '5 · Energizado desde 24 V (sin batería)', sub: 'Fuente 24.0 V, límite 1.0 A al GX16. Interruptor de corte ON. USB en J11, terminal 115200.', items: [ - { tipo:'medida', txt:'Corriente con la etapa RTK apagada', esperado:'< 150 mA', u:'mA' }, + { tipo:'medida', txt:'Corriente, etapa RTK apagada', esperado:'< 150 mA', u:'mA' }, { tipo:'check', txt:'D18 verde encendido · D17 azul y LED de panel parpadean · ventilador gira.' }, { tipo:'check', txt:'Consola: encabezado hbox-v5-bringup con 12 PASS.' }, { tipo:'medida', txt:'STAT v5', esperado:'4.8 – 5.1 V', u:'V' }, { tipo:'medida', txt:'STAT tmp102 / sht40', modo:'text', ph:'p.ej. 31.2 / 30.8 °C' }, - { tipo:'check', txt:'Comando P + Y → STACK ON. simpleRTK2B POWER encendido; 4G se registra (< 2 min).' }, - { tipo:'medida', txt:'Corriente con la etapa RTK encendida', esperado:'250 – 600 mA', u:'mA' }, - { tipo:'medida', txt:'Comando n: tiempo hasta fix=4 (RTK FIX)', esperado:'< 10 min con antena al cielo', u:'min' }, - { tipo:'medida', txt:'Satélites reportados en n', esperado:'≥ 10', u:'sat' }, - { tipo:'check', txt:'Comando P de nuevo → STACK OFF; corriente vuelve a < 150 mA.' }, + { tipo:'check', txt:'P + Y → STACK ON; POWER del simpleRTK2B encendido; módem registra en < 2 min.' }, + { tipo:'medida', txt:'Corriente, etapa RTK encendida', esperado:'250 – 600 mA', u:'mA' }, + { tipo:'medida', txt:'n: tiempo hasta fix=4', esperado:'< 10 min con antena al cielo', u:'min' }, + { tipo:'medida', txt:'Satélites en n', esperado:'≥ 10', u:'sat' }, + { tipo:'check', txt:'P → STACK OFF; corriente < 150 mA.' }, ] }, { titulo: '6 · Batería y respaldo', - sub: 'Etapa RTK apagada. Pack en P4 (1 = BAT+, 2 = GND, 3 = NTC).', + sub: 'Etapa RTK apagada. Paquete en P4 (1 = BAT+, 2 = GND, 3 = NTC).', items: [ - { tipo:'medida', txt:'Voltaje del pack antes de conectar (BAT+ a GND)', esperado:'3.0 – 4.2 V', u:'V' }, - { tipo:'medida', txt:'STAT vbat con el pack conectado', esperado:'≈ voltaje del pack', u:'V' }, - { tipo:'check', txt:'Respaldo: al cortar 24 V la consola y los LEDs siguen vivos, sin reinicio (el encabezado no se reimprime). STAT v5 = 0.0.' }, + { tipo:'medida', txt:'Paquete en vacío (BAT+ a GND)', esperado:'Li-ion 3.0 – 4.2 V · LFP 2.8 – 3.6 V', u:'V' }, + { tipo:'medida', txt:'STAT vbat, paquete conectado', esperado:'≈ voltaje del paquete', u:'V' }, + { tipo:'check', txt:'Respaldo: al cortar 24 V la consola y los LEDs siguen vivos, sin reinicio. STAT v5 = 0.0.' }, { tipo:'check', txt:'Al regresar 24 V, STAT v5 ≈ 5.0 sin reinicio.' }, - { tipo:'texto', txt:'Observaciones (reinicios, calentamiento, corriente fuera de rango)', ph:'ninguna / describir' }, + { tipo:'texto', txt:'Observaciones', ph:'reinicios, calentamiento, corriente fuera de rango…' }, ] }, { titulo: '7 · Cierre y etiquetado', items: [ - { tipo:'check', txt:'Etiqueta exterior con el número de la unidad junto al GX16; etiqueta interior en la tapa.' }, - { tipo:'check', txt:'Interruptor de corte en OFF para almacenar. Tapa cerrada con sello, tornillos en cruz, prensaestopas apretados.' }, + { tipo:'check', txt:'Etiqueta exterior junto al GX16 e interior en la tapa.' }, + { tipo:'check', txt:'Corte en OFF para almacenar. Tapa con sello, tornillos en cruz, prensaestopas apretados.' }, ] }, ] }); diff --git a/docs/formularios/envio.html b/docs/formularios/envio.html index 3184adc..12c4ab2 100644 --- a/docs/formularios/envio.html +++ b/docs/formularios/envio.html @@ -23,56 +23,54 @@ Acta.render({ unidades: window.SERIES, etiquetaSerie: 'Unidad que se envía', titulo: 'Acta de envío', - subtitulo: 'Helgen Technologies · se llena al cerrar la caja, no después.', - intro: 'Para qué sirve. Fija el estado exacto en que salió la unidad: qué firmware traía, qué SIM, ' - + 'qué iba en la caja y cómo se veía. Cuando llegue, el acta de recepción se compara contra ' - + 'esta. Si algo falta o llegó golpeado, se sabe en qué tramo pasó.', + subtitulo: 'Se llena al cerrar la caja. Procedimiento: Ciclo de vida §6.', + intro: 'Fija cómo salió la unidad (firmware, SIM, contenido, fotos). La recepción se compara contra esta acta.', secciones: [ { titulo: '0 · Qué se manda y a dónde', items: [ - { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha de envío' }, + { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, { tipo:'radio', clave:'destino', req:true, guardaEn:'clasificacion', txt:'Destino', opciones:['ICAVE (Veracruz)','TIMSA','EIT','LCT','Taller Veracruz','Querétaro (regreso)','Otro'] }, - { tipo:'texto', clave:'maquina_destino', rows:'1', guardaEn:'maquina_id', txt:'Máquina a la que va, si ya se sabe', ph:'FL-JUN-060' }, - { tipo:'radio', clave:'medio', req:true, txt:'¿Cómo viaja?', + { tipo:'texto', clave:'maquina_destino', rows:'1', guardaEn:'maquina_id', txt:'Máquina destino (si se sabe)', ph:'FL-JUN-060' }, + { tipo:'radio', clave:'medio', req:true, txt:'Medio de envío', opciones:['Paquetería (guía abajo)','La lleva alguien de Helgen','La recoge el cliente'] }, - { tipo:'texto', clave:'guia', rows:'1', txt:'Número de guía o quién la lleva' }, + { tipo:'texto', clave:'guia', rows:'1', txt:'Guía o quién la lleva' }, ] }, - { titulo: '1 · Antes de cerrar la caja — requisitos', - sub:'Si alguno de estos no se cumple, la unidad NO se envía.', + { titulo: '1 · Requisitos', + sub:'Si alguno no se cumple, la unidad no se envía.', items: [ - { tipo:'check', clave:'prueba_final', req:true, txt:'Tiene acta de prueba final aprobada en el sitio (no vale "ya la probé").' }, - { tipo:'check', clave:'sin_marca', req:true, txt:'Al elegir la serie arriba no apareció aviso de daño.' }, - { tipo:'texto', clave:'fw', rows:'1', req:true, txt:'Firmware que trae (línea BOOT o banner de consola)', ph:'fw=4.0.0' }, - { tipo:'texto', clave:'iccid', rows:'1', req:true, txt:'ICCID de la SIM instalada' }, + { tipo:'check', clave:'prueba_final', req:true, txt:'Prueba final aprobada en el sitio.' }, + { tipo:'check', clave:'sin_marca', req:true, txt:'Sin aviso de daño al elegir la serie.' }, + { tipo:'texto', clave:'fw', rows:'1', req:true, txt:'Firmware (línea BOOT o banner)', ph:'fw=4.0.0' }, + { tipo:'texto', clave:'iccid', rows:'1', req:true, txt:'ICCID de la SIM' }, { tipo:'texto', clave:'imei', rows:'1', txt:'IMEI del módem' }, - { tipo:'texto', clave:'id_estacion', rows:'1', txt:'ID de estación del módem (AS+K)' }, - { tipo:'check', clave:'config_flash', txt:'Configuración del ZED-F9P guardada en FLASH (no solo RAM).' }, + { tipo:'texto', clave:'id_estacion', rows:'1', txt:'ID de estación (AS+K)' }, + { tipo:'check', clave:'config_flash', txt:'Configuración ZED-F9P guardada en FLASH.' }, ] }, - { titulo: '2 · Lo que va en la caja', + { titulo: '2 · Contenido de la caja', items: [ - { tipo:'check', clave:'c_unidad', req:true, txt:'Unidad HBOX cerrada y etiquetada con su serie.' }, + { tipo:'check', clave:'c_unidad', req:true, txt:'Unidad cerrada y etiquetada.' }, { tipo:'check', clave:'c_ant_gnss', txt:'Antena GNSS con su cable.' }, { tipo:'check', clave:'c_ant_lte', txt:'2 antenas LTE.' }, { tipo:'check', clave:'c_gx16', txt:'Arnés GX16 hacia el gabinete.' }, { tipo:'check', clave:'c_fuente', txt:'Fuente Mean Well y material de gabinete (si aplica).' }, - { tipo:'check', clave:'c_docs', txt:'Hoja impresa con serie, máquina destino y contacto de Helgen.' }, - { tipo:'texto', clave:'extras', rows:'2', txt:'Otras cosas que van (tornillería, cinchos, repuestos…)' }, - { tipo:'radio', clave:'bateria', req:true, txt:'¿Viaja con batería instalada?', + { tipo:'check', clave:'c_docs', txt:'Hoja con serie, máquina y contacto.' }, + { tipo:'texto', clave:'extras', rows:'2', txt:'Otros (tornillería, cinchos, repuestos…)' }, + { tipo:'radio', clave:'bateria', req:true, txt:'Batería instalada', opciones:['Sí','No — se retiró','No tiene batería'], - aviso:'Una batería de litio no viaja en avión como carga normal. Si va por paquetería, confirma con ellos que va por tierra.' }, - { tipo:'medida', clave:'v_bat', si:conBateria, txt:'Voltaje de la batería al empacar', esperado:'3.6 – 4.0 V', u:'V' }, + aviso:'La batería de litio no viaja en avión como carga normal. Por paquetería, confirma envío terrestre.' }, + { tipo:'medida', clave:'v_bat', si:conBateria, txt:'Batería al empacar', esperado:'3.6 – 4.0 V', u:'V' }, ] }, { titulo: '3 · Evidencia', items: [ - { tipo:'foto', clave:'f_abierta', req:true, etiqueta:'caja-abierta', txt:'La caja abierta con todo adentro, antes de cerrar.' }, - { tipo:'foto', clave:'f_unidad', req:true, etiqueta:'unidad', txt:'La unidad con su etiqueta legible.' }, - { tipo:'foto', clave:'f_cerrada', etiqueta:'caja-cerrada', txt:'La caja cerrada y rotulada.' }, - { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Estado', + { tipo:'foto', clave:'f_abierta', req:true, etiqueta:'caja-abierta', txt:'Caja abierta con todo adentro.' }, + { tipo:'foto', clave:'f_unidad', req:true, etiqueta:'unidad', txt:'Unidad con etiqueta legible.' }, + { tipo:'foto', clave:'f_cerrada', etiqueta:'caja-cerrada', txt:'Caja cerrada y rotulada.' }, + { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Resultado', opciones:['Enviada','Lista pero detenida (explica abajo)'] }, { tipo:'texto', clave:'observaciones', rows:'3', txt:'Observaciones' }, ] }, diff --git a/docs/formularios/ethernet-serie.html b/docs/formularios/ethernet-serie.html new file mode 100644 index 0000000..ea6eab0 --- /dev/null +++ b/docs/formularios/ethernet-serie.html @@ -0,0 +1,102 @@ + + + + + +Prueba de banco — Ethernet y puertos serie (V5) + + + +
+ + + + + + diff --git a/docs/formularios/integracion.html b/docs/formularios/integracion.html index 5e02de2..33561bd 100644 --- a/docs/formularios/integracion.html +++ b/docs/formularios/integracion.html @@ -13,8 +13,8 @@ Acta.render({ tipo: 'integracion', titulo: 'Acta de integración — simpleRTK2B Pro + 4G NTRIP Master', - subtitulo: 'La pareja que irá junta en una unidad. Procedimiento: "Módulos e integración" §4.', - intro: 'Elige los dos módulos. Ambos deben estar aprobados en su propia acta; el sitio lo verifica al seleccionarlos.', + subtitulo: 'La pareja que irá junta en una unidad. Procedimiento: Módulos e integración §3.', + intro: 'Elige los dos módulos. Ambos deben estar aprobados en su acta; el sitio lo verifica.', componentes: [ { clave:'ard', etiqueta:'simpleRTK2B Pro (ArduSimple)', prefijo:'ARD', desde:1, hasta:30, pad:3, tipoActa:'modulo-ard' }, { clave:'modem', etiqueta:'4G NTRIP Master', prefijo:'RTK', desde:1, hasta:30, pad:4, tipoActa:'modulo-4g' }, @@ -24,26 +24,26 @@ Acta.render({ etiquetaSerie: 'Identificador de la pareja (automático)', exigirAprobados: true, secciones: [ - { titulo: '4 · Montaje', - sub: '4G sobre el zócalo XBee del simpleRTK2B, 2 antenas LTE, antena GNSS al cielo, USB POWER+GPS. u-center a 115200.', + { titulo: '3a · Montaje', + sub: 'Módem en el zócalo XBee del simpleRTK2B, 2 antenas LTE, GNSS al cielo, USB POWER+GPS. u-center a 115200.', items: [ - { tipo:'check', txt:'Montaje completo sin energía; antenas conectadas antes de energizar.' }, + { tipo:'check', txt:'Montado sin energía; antenas antes de energizar.' }, { tipo:'check', txt:'Fix 3D en u-center.' }, - { tipo:'check', txt:'LED de red del 4G registrado; LED NO RTK del simpleRTK2B empieza a parpadear (llegan correcciones).' }, + { tipo:'check', txt:'Módem registrado; LED NO RTK parpadea (llegan correcciones).' }, ] }, - { titulo: '4 · RTK FIX', + { titulo: '3b · RTK FIX', items: [ - { tipo:'medida', txt:'Tiempo desde encendido hasta RTK FIX (LED NO RTK apagado / Fix Mode FIXED)', esperado:'< 10 min', u:'min' }, + { tipo:'medida', txt:'Encendido → RTK FIX (NO RTK apagado)', esperado:'< 10 min', u:'min' }, { tipo:'medida', txt:'Satélites en uso', esperado:'≥ 10', u:'sat' }, - { tipo:'medida', txt:'Precisión estimada hAcc en FIX', esperado:'< 0.05 m', u:'m' }, - { tipo:'check', txt:'Se mantiene FIXED 5 min sin caer a FLOAT (antena quieta).' }, - { tipo:'radio', txt:'Confirmación en la plataforma Helgen (estación AS+K reportando)', opciones:['Confirmado por ingeniería','Pendiente de confirmar','No aparece'] }, - { tipo:'medida', txt:'Hora de la confirmación / a quién se avisó', modo:'text', ph:'p.ej. 12:40, Leo' }, - { tipo:'texto', txt:'Observaciones (FLOAT sin FIX, caídas, señal…)', ph:'ninguna / describir' }, + { tipo:'medida', txt:'hAcc en FIX', esperado:'< 0.05 m', u:'m' }, + { tipo:'check', txt:'FIXED 5 min sin caer a FLOAT (antena quieta).' }, + { tipo:'radio', txt:'Estación AS+K en la plataforma', opciones:['Confirmado por ingeniería','Pendiente de confirmar','No aparece'] }, + { tipo:'medida', txt:'Hora y a quién se avisó', modo:'text', ph:'p.ej. 12:40, Leo' }, + { tipo:'texto', txt:'Observaciones', ph:'FLOAT sin FIX, caídas, señal…' }, ] }, - { titulo: '4b · Cierre', + { titulo: '3c · Cierre', items: [ - { tipo:'check', txt:'Módulos separados con cuidado; cada uno en su bolsa. En la bolsa del ArduSimple anotada la pareja RTK-NNNN.' }, + { tipo:'check', txt:'Módulos separados, cada uno en su bolsa; en la del ArduSimple anotada la pareja RTK-NNNN.' }, ] }, ] }); diff --git a/docs/formularios/modem4g.html b/docs/formularios/modem4g.html index bdd0a5d..ff14c6d 100644 --- a/docs/formularios/modem4g.html +++ b/docs/formularios/modem4g.html @@ -13,37 +13,37 @@ Acta.render({ tipo: 'modulo-4g', prefijo: 'RTK', desde: 1, series: 30, pad: 4, // RTK-0001 … RTK-0030 (etiqueta del módem 4G) - etiquetaSerie: 'Número de serie del módem (etiqueta RTK-NNNN)', + etiquetaSerie: 'Módem (RTK-NNNN)', titulo: 'Acta de módulo — 4G NTRIP Master', - subtitulo: 'Un acta por módem. Procedimiento: "Módulos e integración" §3. Antenas LTE conectadas ANTES de energizar.', + subtitulo: 'Un acta por módem. Antenas LTE antes de energizar. Procedimiento: Módulos e integración §2.', secciones: [ - { titulo: '3a · Inspección visual (sin energía)', + { titulo: '2a · Inspección (sin energía)', items: [ - { tipo:'medida', txt:'IMEI (etiqueta del módem)', modo:'numeric', ph:'15 dígitos' }, - { tipo:'medida', txt:'ICCID de la SIM Telcel', modo:'numeric', ph:'19–20 dígitos' }, - { tipo:'check', txt:'Etiqueta RTK-NNNN puesta; SIM insertada con clic en la dirección correcta.' }, + { tipo:'medida', txt:'IMEI del módem', modo:'numeric', ph:'15 dígitos' }, + { tipo:'medida', txt:'ICCID de la SIM', modo:'numeric', ph:'19–20 dígitos' }, + { tipo:'check', txt:'Etiqueta RTK-NNNN puesta; SIM con clic, bien orientada.' }, { tipo:'check', txt:'Pines XBee (2 × 10, 2 mm) rectos; conectores u.FL sin daño.' }, ] }, - { titulo: '3b · Montaje sobre el simpleRTK2B y configuración', - sub: 'Sin energía: módulo en el zócalo XBee del simpleRTK2B. 2 antenas LTE + antena GNSS. USB POWER+GPS y USB XBEE conectados. Terminal en el puerto XBEE a 115200.', + { titulo: '2b · Montaje y configuración', + sub: 'Sin energía: módem en el zócalo XBee del simpleRTK2B, 2 antenas LTE y GNSS. USB POWER+GPS y XBEE. Terminal en XBEE a 115200.', items: [ - { tipo:'medida', txt:'simpleRTK2B usado como base para esta prueba', modo:'text', ph:'ARD-NNN' }, - { tipo:'check', txt:'Archivo 4G_NTRIP_HelgenSRV-NMEA.local.txt enviado línea por línea; ninguna línea con ERROR.' }, - { tipo:'medida', txt:'ID de estación programado ($$$AS+K)', modo:'text', ph:'según ingeniería' }, - { tipo:'check', txt:'Configuración verificada al releer (el módulo responde con los valores enviados).' }, + { tipo:'medida', txt:'simpleRTK2B usado (ARD-NNN)', modo:'text', ph:'ARD-NNN' }, + { tipo:'check', txt:'4G_NTRIP_HelgenSRV-NMEA.local.txt enviado; ninguna línea con ERROR.' }, + { tipo:'medida', txt:'ID de estación (AS+K)', modo:'text', ph:'según ingeniería' }, + { tipo:'check', txt:'Configuración releída: coincide con lo enviado.' }, ] }, - { titulo: '3c · Registro en la red', - sub: 'Esperar hasta 2 min con las antenas LTE conectadas.', + { titulo: '2c · Registro en la red', + sub: 'Hasta 2 min con las antenas LTE conectadas.', items: [ - { tipo:'check', txt:'LED de red del módulo pasa de parpadeo rápido a lento o fijo (registrado).' }, + { tipo:'check', txt:'LED de red de rápido a lento o fijo (registrado).' }, { tipo:'medida', txt:'Operador reportado', modo:'text', esperado:'Telcel', ph:'Telcel' }, - { tipo:'medida', txt:'Señal (RSSI/CSQ) si el módulo la reporta', modo:'text', ph:'p.ej. 18/31 o −75 dBm' }, - { tipo:'medida', txt:'Tiempo hasta registrarse', esperado:'< 2 min', u:'min' }, + { tipo:'medida', txt:'Señal (RSSI/CSQ), si la reporta', modo:'text', ph:'p.ej. 18/31 o −75 dBm' }, + { tipo:'medida', txt:'Tiempo hasta registrar', esperado:'< 2 min', u:'min' }, { tipo:'texto', txt:'Observaciones', ph:'ninguna / describir' }, ] }, { titulo: 'Cierre', items: [ - { tipo:'check', txt:'Módulo separado del simpleRTK2B sin doblar pines; en bolsa con su etiqueta RTK-NNNN.' }, + { tipo:'check', txt:'Separado sin doblar pines; en bolsa con su etiqueta.' }, ] }, ] }); diff --git a/docs/formularios/prueba-bateria.html b/docs/formularios/prueba-bateria.html index 07b3ac2..40c7f34 100644 --- a/docs/formularios/prueba-bateria.html +++ b/docs/formularios/prueba-bateria.html @@ -21,7 +21,7 @@ const COLS = [ { k:'uart', txt:'UART simpleRTK2B', opciones:['lento ~1/s','rápido','sin parpadeo'] }, { k:'k1', txt:'K1', opciones:['sin clic','clic (MODOB ON)','clic repetido'] }, { k:'vbat', txt:'vbat / vbatmin', ph:'3.92 / 3.71', ancho:'110px' }, - { k:'srv', txt:'¿Servidor?', opciones:['nada','$PHLG 🔋','posición','posición + $PHLG'] }, + { k:'srv', txt:'Servidor', opciones:['nada','$PHLG 🔋','posición','posición + $PHLG'] }, ]; const tabla = (clave, txt, sub) => ({ tipo:'tabla', clave, txt, sub, etiquetaFilas:'t', filas:FILAS, columnas:COLS }); const dioA = v => String(v.c2_resultado || '').startsWith('Sigue igual'); @@ -34,13 +34,12 @@ Acta.render({ nombres: { alan: 'Alán Basurto', daniel: 'Daniel Martínez', leo: 'Leo Rodríguez' }, unidades: window.SERIES, etiquetaSerie: 'Unidad bajo prueba', - titulo: 'Prueba de banco — módem 4G en modo batería', - subtitulo: 'Helgen Technologies · fw 0.5.3 · el procedimiento completo está en Procedimientos → 🔋 Prueba: módem 4G en batería.', + titulo: 'Acta: módem 4G en batería', + subtitulo: 'Corridas de diagnóstico 0–4 (fw 0.5.3–0.5.7). Procedimiento: Taller → Módem 4G en batería §4.', textoOK: 'PRUEBA COMPLETA', - intro: 'Qué se busca. En batería la unidad enciende la etapa 2 min cada 10, pero el módem no llega a transmitir. ' - + 'Esta acta separa dos causas: A el riel del boost se hunde con la ráfaga LTE, o B el camino por K1 (Modo B). ' - + 'Las lecturas de multímetro son obligatorias: en batería el firmware no ve el riel (v5 mide el 5 V del vehículo). ' - + 'Puntos: MAIN5V = U6 pin 1 / C32 / P11 pin 1 · SW_5V = MOD1 pin 5 / C3 · 3V3_MODEM = zócalo XBee pin 1 (J7 pin 1 / J8 pin 7) — esta es la que alimenta al módem · negro a GND. ' + intro: 'Separa dos causas de que el módem no transmita en batería: A riel del boost hundido por la ráfaga LTE, o B camino por K1 (Modo B). ' + + 'Multímetro obligatorio: en batería v5 mide el 5 V del vehículo, no el riel. ' + + 'Puntos: MAIN5V = U6 pin 1 / C32 / P11 pin 1 · SW_5V = MOD1 pin 5 / C3 · 3V3_MODEM (alimenta el módem) = J7 pin 1 / J8 pin 7 · negro a GND. ' + 'Consola HBOX a 115200 grabando a archivo; teclas s STAT · v puntos · B Modo B.', secciones: [ @@ -48,20 +47,20 @@ Acta.render({ items: [ { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, { tipo:'radio', clave:'tarjeta', req:true, guardaEn:'clasificacion', txt:'Tarjeta', opciones:['V5','V4','V3'] }, - { tipo:'texto', clave:'fw', rows:'1', req:true, txt:'Firmware (primera línea de la consola)', ph:'hbox-v5-bringup 0.5.5 built …' }, - { tipo:'texto', clave:'bateria', rows:'1', req:true, txt:'Batería: voltaje en vacío antes de empezar y temperatura ambiente', ph:'4.02 V · 27 °C' }, + { tipo:'texto', clave:'fw', rows:'1', req:true, txt:'Firmware (línea BOOT o banner)', ph:'hbox-v5-bringup 0.5.5 built …' }, + { tipo:'texto', clave:'bateria', rows:'1', req:true, txt:'Batería en vacío y temperatura ambiente', ph:'4.02 V · 27 °C' }, { tipo:'radio', clave:'cielo', req:true, txt:'Antena GNSS', opciones:['Cielo abierto','Ventana','Interior (sin fix)'] }, - { tipo:'check', clave:'usb', req:true, txt:'Ningún USB conectado al simpleRTK2B ni al módem: solo el USB de consola del HBOX.' }, - { tipo:'check', clave:'monitor', req:true, txt:'Monitor abierto con la unidad localizada (para ver si recibe).' }, + { tipo:'check', clave:'usb', req:true, txt:'Ningún USB en el simpleRTK2B ni en el módem; solo el de consola.' }, + { tipo:'check', clave:'monitor', req:true, txt:'Monitor abierto con la unidad.' }, ] }, { titulo: 'Corrida 0 · Referencia con 24 V', - sub:'Todo funcionando con 24 V. Si esto no sale limpio, detenerse: el problema no es la batería.', + sub:'Todo con 24 V. Si no sale limpio, detente: el problema no es la batería.', items: [ { tipo:'medida', clave:'c0_main5v', req:true, txt:'MAIN5V', esperado:'5.2 – 5.4 V', u:'V' }, { tipo:'medida', clave:'c0_sw5v', req:true, txt:'SW_5V', esperado:'≈ 5.0 V', u:'V' }, { tipo:'medida', clave:'c0_v3m', req:true, txt:'3V3_MODEM (zócalo XBee pin 1)', esperado:'3.25 – 3.35 V', u:'V' }, - { tipo:'texto', clave:'c0_ledm', rows:'1', req:true, txt:'LEDs del módem (cuál, color, patrón)', ph:'NET verde parpadeo lento; PWR rojo fijo' }, + { tipo:'texto', clave:'c0_ledm', rows:'1', req:true, txt:'LEDs del módem (cuál, color, ritmo)', ph:'NET verde parpadeo lento; PWR rojo fijo' }, { tipo:'radio', clave:'c0_uart', req:true, txt:'LEDs UART del simpleRTK2B', opciones:['rápido (correcciones + NMEA)','lento ~1/s','sin parpadeo'] }, { tipo:'check', clave:'c0_k1', req:true, txt:'Clic de K1 a los ~13 s y consola MODOB ON.' }, { tipo:'check', clave:'c0_srv', req:true, txt:'El monitor muestra la unidad con Salud ($PHLG) y ⚡.' }, @@ -69,9 +68,9 @@ Acta.render({ ] }, { titulo: 'Corrida 1 · Batería con Modo B (la falla)', - sub:'Quitar los 24 V y arrancar el cronómetro. La primera ventana arranca con el módem ya registrado; la que importa es el despertar #1 a los ~10 min.', + sub:'Quita 24 V y arranca el cronómetro. La que importa es el despertar #1 a los ~10 min.', items: [ - { tipo:'texto', clave:'c1_perdida', rows:'2', req:true, txt:'Al quitar 24 V: ¿qué se oyó y qué hizo el módem en los primeros 30 s?', ph:'clic de K1 inmediato; el módem se apagó y reencendió / siguió igual' }, + { tipo:'texto', clave:'c1_perdida', rows:'2', req:true, txt:'Al quitar 24 V: clic y módem en 30 s', ph:'clic de K1 inmediato; el módem se apagó y reencendió / siguió igual' }, { tipo:'medida', clave:'c1_reposo_sw5v', req:true, txt:'En reposo (tras DUTY reposo): SW_5V', esperado:'0 V', u:'V' }, { tipo:'medida', clave:'c1_reposo_v3m', req:true, txt:'En reposo: 3V3_MODEM', esperado:'0 V con 0.5.5 (con 0.5.4 y anteriores queda ≈2 V: es la falla)', u:'V' }, { tipo:'medida', clave:'c1_reposo_v3rtk', req:true, txt:'En reposo: 3V3 del simpleRTK2B (pin 3V3 del header UNO)', esperado:'0 V con 0.5.5', u:'V', @@ -79,7 +78,7 @@ Acta.render({ { tipo:'medida', clave:'c1_reposo_din', txt:'En reposo: DIN_4G (zócalo XBee pin 3)', esperado:'0 V', u:'V' }, { tipo:'radio', clave:'c1_reposo_modem', req:true, txt:'En reposo: el módem…', opciones:['Se apagó (LEDs apagados)','Sigue encendido'], aviso:'Si sigue encendido con SW_5V = 0 V, algo lo alimenta por otro lado. Anótalo y avisa antes de seguir.' }, - { tipo:'texto', clave:'c1_reposo_nota', si:modemOn, rows:'2', req:true, txt:'¿Qué está conectado al módem o al simpleRTK2B?' }, + { tipo:'texto', clave:'c1_reposo_nota', si:modemOn, rows:'2', req:true, txt:'Qué está conectado al módem o al simpleRTK2B' }, { tipo:'texto', clave:'c1_wake', rows:'1', req:true, txt:'Hora del cronómetro en DUTY despertar #1', ph:'10:02' }, tabla('c1', 'Registro del despertar #1 (los 2 minutos de ventana)', 'Anota el valor más bajo que alcances a leer en cada intervalo. Tecla s a los 0:30 y 1:30 para vbat/vbatmin.'), { tipo:'texto', clave:'c1_fin', rows:'2', req:true, txt:'Cómo terminó la ventana (línea DUTY reposo y qué decía el monitor)', ph:'DUTY reposo: ventana 120s fix=RTK_FIX phlg_aire=4 … monitor: nada' }, @@ -87,7 +86,7 @@ Acta.render({ ] }, { titulo: 'Corrida 2 · Batería SIN Modo B', - sub:'Con la unidad en reposo, teclear B → «MODO B BLOQUEADO por operador». Esperar el despertar #2 y registrar igual.', + sub:'En reposo, tecla B → «MODO B BLOQUEADO por operador». Registra el despertar #2 igual.', items: [ { tipo:'check', clave:'c2_b', req:true, txt:'La consola confirmó MODO B BLOQUEADO por operador antes del despertar.' }, { tipo:'texto', clave:'c2_wake', rows:'1', req:true, txt:'Hora del cronómetro en DUTY despertar #2' }, @@ -100,7 +99,7 @@ Acta.render({ { titulo: 'Corrida 3 · Solo si la 2 dio A: fuente de banco en lugar de la batería', si: dioA, - sub:'Con 24 V y la etapa apagada, desconectar la batería y poner la fuente de banco a 3.9 V, límite 3 A, en su conector (medir polaridad antes). Repetir la corrida 1.', + sub:'Con 24 V y etapa apagada, cambia la batería por fuente a 3.9 V, límite 3 A (mide polaridad). Repite la corrida 1.', items: [ { tipo:'medida', clave:'c3_vfuente', req:true, txt:'Fuente ajustada a', esperado:'3.90 V · límite 3 A', u:'V' }, { tipo:'texto', clave:'c3_wake', rows:'1', req:true, txt:'Hora del cronómetro en el despertar' }, @@ -113,22 +112,22 @@ Acta.render({ ] }, { titulo: 'Corrida 4 · Regreso de los 24 V (sin reset)', - sub:'Con la unidad en batería y el módem oscuro, volver a poner los 24 V SIN tocar el botón de reset. Esto es lo que pasa en campo cuando arranca el vehículo.', + sub:'En batería con el módem oscuro, vuelve a poner 24 V sin tocar reset (como al arrancar el vehículo).', items: [ { tipo:'radio', clave:'c4_modem', req:true, txt:'Al volver el 24 V, el módem…', opciones:['Arranca solo (LEDs, registra)','Sigue oscuro','Arranca pero no registra'] }, { tipo:'medida', clave:'c4_v3m', req:true, txt:'3V3_MODEM con el módem oscuro y 24 V puesto', u:'V', aviso:'Si marca ~3.3 V y el módem sigue oscuro, el módem está alimentado pero sin power-on reset (con 0.5.4 y anteriores: el UART del GNSS sostenía su riel). Con 0.5.5 la tarjeta suelta el UART y cicla la etapa 10 s al volver el 5 V.' }, - { tipo:'texto', clave:'c4_recupera', rows:'2', req:true, txt:'¿Qué lo revivió? (reset SW1, quitar batería, nada…)', ph:'Solo el reset de la tarjeta' }, + { tipo:'texto', clave:'c4_recupera', rows:'2', req:true, txt:'Qué lo revivió', ph:'Solo el reset de la tarjeta' }, { tipo:'texto', clave:'c4_consola', rows:'2', txt:'Líneas de consola al volver el 5 V', ph:'V5 PRESENTE … DUTY fin … PWR_RETURN_CYCLE … STACK ON reason=recovery' }, ] }, { titulo: 'Cierre', items: [ - { tipo:'archivo', clave:'log', req:true, etiqueta:'bateria-consola', txt:'Archivo completo de la consola (toda la sesión)' }, - { tipo:'foto', clave:'f_banco', etiqueta:'banco', txt:'Foto del banco con los multímetros conectados (para saber dónde se midió).' }, + { tipo:'archivo', clave:'log', req:true, etiqueta:'bateria-consola', txt:'Log completo de consola' }, + { tipo:'foto', clave:'f_banco', etiqueta:'banco', txt:'Banco con los multímetros conectados.' }, { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Conclusión', opciones:['A — riel: el paquete','A — riel: etapa de boost','B — camino por K1 (firmware)','No concluyente (explica)'] }, - { tipo:'texto', clave:'observaciones', rows:'4', txt:'Observaciones (todo lo que no cupo arriba)' }, + { tipo:'texto', clave:'observaciones', rows:'4', txt:'Observaciones' }, ] }, ] }); diff --git a/docs/formularios/recepcion.html b/docs/formularios/recepcion.html index 0c6def6..ba88ad2 100644 --- a/docs/formularios/recepcion.html +++ b/docs/formularios/recepcion.html @@ -26,117 +26,114 @@ Acta.render({ unidades: window.SERIES, etiquetaSerie: 'Unidad que se recibe', titulo: 'Acta de recepción e inspección', - subtitulo: 'Helgen Technologies · una por cada caja, al abrirla, ANTES de entrar al puerto.', + subtitulo: 'Una por unidad, al abrir la caja y antes de entrar al puerto. Procedimiento: Ciclo de vida §7.', textoOK: 'LISTA PARA ENTRAR', - intro: 'Para qué sirve. Es la última revisión antes de que la unidad cruce la puerta del puerto, donde ya ' - + 'no se puede regresar por un cable ni abrir la caja. Se hace a cada unidad, sin excepción: se compara ' - + 'contra el acta de envío (mismo firmware, misma SIM, mismo contenido), se busca daño de transporte y se ' - + 'comprueba con multímetro y fuente que la unidad enciende bien antes de que alguien la suba a una máquina. ' - + 'Kit: fuente de 24 V (≥ 1 A, con límite de corriente si la tiene), multímetro, cable USB con datos, laptop. ' - + 'Orden obligatorio: inspección → multímetro sin energía → energizar → prueba de vida.', + intro: 'Compara contra el acta de envío (firmware, SIM, contenido) y busca daño de transporte. ' + + 'Kit: fuente de 24 V (≥ 1 A; límite en 1 A si lo tiene), multímetro, cable USB con datos, laptop. ' + + 'Orden: inspección → multímetro sin energía → energizar → prueba de vida.', secciones: [ { titulo: '0 · Qué llega y dónde', items: [ - { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha de recepción' }, - { tipo:'radio', clave:'donde', req:true, guardaEn:'clasificacion', txt:'¿Dónde la recibes?', + { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, + { tipo:'radio', clave:'donde', req:true, guardaEn:'clasificacion', txt:'Dónde se recibe', opciones:['Taller Veracruz','Oficina ICAVE','Otra terminal','Querétaro'] }, - { tipo:'texto', clave:'guia', rows:'1', txt:'Número de guía o quién la entregó' }, - { tipo:'texto', clave:'maquina_destino', rows:'1', guardaEn:'maquina_id', txt:'Máquina a la que va', ph:'FL-JUN-060' }, + { tipo:'texto', clave:'guia', rows:'1', txt:'Guía o quién la entregó' }, + { tipo:'texto', clave:'maquina_destino', rows:'1', guardaEn:'maquina_id', txt:'Máquina destino', ph:'FL-JUN-060' }, ] }, { titulo: '1 · El paquete, antes de abrir', items: [ - { tipo:'foto', clave:'f_paquete', req:true, etiqueta:'paquete', txt:'La caja cerrada tal como llegó.' }, + { tipo:'foto', clave:'f_paquete', req:true, etiqueta:'paquete', txt:'Caja cerrada como llegó.' }, { tipo:'radio', clave:'paquete', req:true, txt:'Estado del paquete', opciones:['Intacto','Golpeado o aplastado','Abierto o con cinta distinta','Mojado'] }, { tipo:'foto', clave:'f_dano_paquete', etiqueta:'paquete-dano', si:v=>!String(v.paquete||'').startsWith('Intacto'), req:true, - txt:'Foto del daño del paquete, antes de abrirlo.' }, + txt:'Daño del paquete, antes de abrir.' }, ] }, { titulo: '2 · Contenido contra el acta de envío', - sub:'Abre el acta de envío de esta unidad (expediente, arriba) y compara punto por punto.', + sub:'Abre el acta de envío (expediente, arriba) y compara punto por punto.', items: [ - { tipo:'check', clave:'c_unidad', req:true, txt:'Unidad HBOX presente, etiqueta legible, la serie coincide con la del envío.' }, + { tipo:'check', clave:'c_unidad', req:true, txt:'Unidad presente; la serie coincide con el envío.' }, { tipo:'check', clave:'c_ant_gnss', txt:'Antena GNSS con cable.' }, { tipo:'check', clave:'c_ant_lte', txt:'2 antenas LTE.' }, { tipo:'check', clave:'c_gx16', txt:'Arnés GX16.' }, { tipo:'check', clave:'c_docs', txt:'Hoja con serie, máquina y contacto.' }, - { tipo:'texto', clave:'faltante', rows:'2', txt:'¿Falta algo o llegó algo de más?' }, - { tipo:'foto', clave:'f_contenido', req:true, etiqueta:'contenido', txt:'Todo el contenido desplegado.' }, + { tipo:'texto', clave:'faltante', rows:'2', txt:'Faltantes o sobrantes' }, + { tipo:'foto', clave:'f_contenido', req:true, etiqueta:'contenido', txt:'Contenido desplegado.' }, ] }, - { titulo: '3 · Inspección física de la unidad — daño de transporte', - sub:'Con la tapa abierta y SIN energía. Lo que se busca: golpes, cosas sueltas y módulos que se salieron de su zócalo con la vibración.', + { titulo: '3 · Inspección física', + sub:'Tapa abierta, sin energía. Golpes, piezas sueltas y módulos fuera de su zócalo por la vibración.', items: [ - { tipo:'check', clave:'i_sacudir', req:true, txt:'Sacudí la unidad cerrada junto al oído: nada suena suelto adentro.' }, + { tipo:'check', clave:'i_sacudir', req:true, txt:'Sacudida junto al oído: nada suelto.' }, { tipo:'radio', clave:'gabinete', req:true, txt:'Gabinete y prensaestopas', opciones:['Sin daño','Rayado o marcado (cosmético)','Golpeado, agrietado o deformado','Con humedad adentro'] }, - { tipo:'check', clave:'i_zocalos', req:true, txt:'Módulos bien asentados en sus zócalos: Blackpill (si la tarjeta lo lleva), simpleRTK2B en los headers UNO y módem 4G en el zócalo XBee. Empujé cada uno con el dedo: no se mueven ni quedan pines fuera.' }, - { tipo:'check', clave:'i_conectores', req:true, txt:'Prueba de meneo en cada conector, Dupont y SMA: los SMA de las antenas apretados, el GX16 con seguro, ningún cable con el aislante pelado o pellizcado por la tapa.' }, - { tipo:'radio', clave:'placa', req:true, txt:'Tarjeta a simple vista', + { tipo:'check', clave:'i_zocalos', req:true, txt:'Módulos asentados (Blackpill si lo lleva, simpleRTK2B, módem): empujados con el dedo, sin pines fuera.' }, + { tipo:'check', clave:'i_conectores', req:true, txt:'Meneo de conectores, Dupont y SMA: SMA apretados, GX16 con seguro, ningún cable pelado o pellizcado.' }, + { tipo:'radio', clave:'placa', req:true, txt:'Tarjeta', opciones:['Normal','Componente desprendido o pista levantada','Marca de quemado o decoloración','Corrosión o humedad'] }, - { tipo:'radio', clave:'bateria_fisica', req:true, txt:'Estado físico de la batería', + { tipo:'radio', clave:'bateria_fisica', req:true, txt:'Batería', opciones:['Normal','Hinchada o abombada','Con manchas o fuga','Caliente','La unidad no trae batería'], - aviso:'Hinchada, con fuga o caliente: desconéctala antes de energizar y la unidad no entra. Registra un acta de daño.' }, - { tipo:'foto', clave:'f_bat', etiqueta:'bateria', si:batMala, req:true, txt:'Foto de la batería, dos ángulos.' }, - { tipo:'foto', clave:'f_interior', req:true, etiqueta:'interior', txt:'El interior de la unidad, tapa abierta, con los módulos y conectores a la vista.' }, - { tipo:'foto', clave:'f_dano_unidad', etiqueta:'unidad-dano', txt:'Foto de cualquier daño que hayas encontrado (de cerca).', + aviso:'Hinchada, con fuga o caliente: desconéctala antes de energizar; la unidad no entra. Acta de daño.' }, + { tipo:'foto', clave:'f_bat', etiqueta:'bateria', si:batMala, req:true, txt:'Batería, dos ángulos.' }, + { tipo:'foto', clave:'f_interior', req:true, etiqueta:'interior', txt:'Interior con módulos y conectores a la vista.' }, + { tipo:'foto', clave:'f_dano_unidad', etiqueta:'unidad-dano', txt:'Daño encontrado, de cerca.', si:v=>['Golpeado','Con humedad'].some(t=>String(v.gabinete||'').startsWith(t)) || !String(v.placa||'').startsWith('Normal'), req:true }, - { tipo:'texto', clave:'nota_fisica', rows:'2', txt:'¿Qué encontraste?' }, + { tipo:'texto', clave:'nota_fisica', rows:'2', txt:'Hallazgos' }, ] }, - { titulo: '4 · Multímetro SIN energía — continuidad a tierra', - sub:'Multímetro en Ω, fuente apagada y desconectada, batería desconectada si se puede. Un corto que llegó del transporte se detecta aquí y no con humo.', + { titulo: '4 · Continuidad a tierra (sin energía)', + sub:'Multímetro en Ω, fuente desconectada, batería desconectada si se puede.', items: [ - { tipo:'nota', txt:'
Nunca energices antes de medir continuidad. Si hay un corto, la fuente lo va a alimentar y el daño ya no se puede rastrear al transporte.
' }, - { tipo:'medida', clave:'r_24v', req:true, txt:'Entrada 24 V a GND (GX16 pines 1-2)', esperado:'> 10 kΩ (la lectura sube mientras cargan los capacitores)', u:'Ω' }, - { tipo:'medida', clave:'r_5v', req:true, txt:'Riel de 5 V a GND (salida Mean Well / P2)', esperado:'> 1 kΩ', u:'Ω' }, - { tipo:'medida', clave:'r_3v3', txt:'Riel de 3.3 V a GND', esperado:'> 1 kΩ', u:'Ω' }, - { tipo:'radio', clave:'continuidad', req:true, txt:'¿Alguna lectura se quedó fija entre 0 y 20 Ω?', + { tipo:'nota', txt:'
Nunca energices antes de medir continuidad. Con corto, la fuente lo alimenta y el daño ya no se puede atribuir al transporte.
' }, + { tipo:'medida', clave:'r_24v', req:true, txt:'Entrada 24 V a GND (GX16 1-2)', esperado:'> 10 kΩ (sube mientras cargan los capacitores)', u:'Ω' }, + { tipo:'medida', clave:'r_5v', req:true, txt:'5 V a GND (Mean Well / P2)', esperado:'> 1 kΩ', u:'Ω' }, + { tipo:'medida', clave:'r_3v3', txt:'3.3 V a GND', esperado:'> 1 kΩ', u:'Ω' }, + { tipo:'radio', clave:'continuidad', req:true, txt:'Lectura fija en 0–20 Ω', opciones:['No — todo abierto','Sí — hay un corto'], - aviso:'Con corto no se energiza. La unidad no entra: registra un acta de daño con la lectura y la foto, y marca la serie.' }, - { tipo:'medida', clave:'v_bat_vacio', si:conBat, req:true, txt:'Voltaje de la batería en vacío', esperado:'3.0 – 4.2 V (compara con el del acta de envío)', u:'V', - aviso:'Menor a 3.0 V: la batería se descargó en el trayecto; anótalo. Mucho más baja que en el envío: sospecha de consumo con la unidad "apagada".' }, + aviso:'Con corto no se energiza y la unidad no entra: acta de daño con la lectura y la foto.' }, + { tipo:'medida', clave:'v_bat_vacio', si:conBat, req:true, txt:'Batería en vacío', esperado:'3.0 – 4.2 V (compara con el envío)', u:'V', + aviso:'< 3.0 V: se descargó en el trayecto; anótalo. Mucho menor que en el envío: consumo con la unidad "apagada".' }, ] }, { titulo: '5 · Energizar y medir', - sub:'Solo si el paso 4 salió limpio. Fuente de 24 V al GX16 (pines 1-2), antenas conectadas, tapa abierta para medir. Si la fuente tiene límite de corriente, ponlo en 1 A.', + sub:'Solo si el paso 4 salió limpio. 24 V al GX16 (pines 1-2), antenas puestas, tapa abierta, límite 1 A.', items: [ - { tipo:'radio', clave:'enciende', req:true, si:puedeEnergizar, txt:'Al energizar: ¿enciende y el LED de estado parpadea?', + { tipo:'radio', clave:'enciende', req:true, si:puedeEnergizar, txt:'Encendido y LED de estado', opciones:['Sí','No — LED apagado','Enciende pero se apaga','Enciende y la fuente entra en límite de corriente'], - aviso:'Si la fuente entra en límite o algo se calienta: apaga de inmediato. No entra; acta de daño.' }, + aviso:'Fuente en límite o algo caliente: apaga ya. No entra; acta de daño.' }, { tipo:'medida', clave:'v_24', si:enciende, req:true, txt:'Entrada 24 V', esperado:'23 – 26 V', u:'V' }, - { tipo:'medida', clave:'v_5', si:enciende, req:true, txt:'Riel 5 V (salida Mean Well / P2)', esperado:'4.9 – 5.4 V', u:'V', - aviso:'Por debajo de 4.8 V el módem se va a caer con cada ráfaga LTE (disparo PFI del LTC4040). No entra así.' }, + { tipo:'medida', clave:'v_5', si:enciende, req:true, txt:'Riel 5 V (Mean Well / P2)', esperado:'4.9 – 5.4 V', u:'V', + aviso:'Bajo 4.8 V el módem se cae con cada ráfaga LTE (PFI del LTC4040). No entra así.' }, { tipo:'medida', clave:'v_3v3', si:enciende, txt:'Riel 3.3 V', esperado:'3.20 – 3.40 V', u:'V' }, - { tipo:'medida', clave:'i_estable', si:enciende, txt:'Corriente a los 60 s (si la fuente la muestra)', esperado:'150 – 400 mA con la etapa RTK encendida', u:'mA' }, - { tipo:'medida', clave:'v_bat_on', si:v=>enciende(v)&&conBat(v), txt:'Batería con la unidad encendida', u:'V' }, + { tipo:'medida', clave:'i_estable', si:enciende, txt:'Corriente a 60 s (si la fuente la muestra)', esperado:'150 – 400 mA con la etapa RTK encendida', u:'mA' }, + { tipo:'medida', clave:'v_bat_on', si:v=>enciende(v)&&conBat(v), txt:'Batería, unidad encendida', u:'V' }, ] }, { titulo: '6 · Prueba de vida (5 minutos)', - sub:'Con la unidad encendida. Por la consola USB se lee la línea BOOT; el resto es a simple vista.', + sub:'Unidad encendida. La línea BOOT sale por la consola USB; lo demás es a simple vista.', items: [ - { tipo:'texto', clave:'fw', rows:'1', si:enciende, req:true, txt:'Firmware que reporta (línea BOOT o banner de consola)', ph:'fw=4.0.0' }, - { tipo:'check', clave:'fw_coincide', si:enciende, req:true, txt:'El firmware coincide con el del acta de envío.' }, - { tipo:'radio', clave:'modem', si:enciende, req:true, txt:'LED de red del módem 4G tras 3 minutos', + { tipo:'texto', clave:'fw', rows:'1', si:enciende, req:true, txt:'Firmware (línea BOOT o banner)', ph:'fw=4.0.0' }, + { tipo:'check', clave:'fw_coincide', si:enciende, req:true, txt:'Firmware igual al del envío.' }, + { tipo:'radio', clave:'modem', si:enciende, req:true, txt:'LED de red del módem a 3 min', opciones:['Lento o fijo (registró)','Rápido (no registra)','Apagado'] }, - { tipo:'check', clave:'sim_ok', si:enciende, txt:'La SIM es la del acta de envío (ICCID coincide).' }, + { tipo:'check', clave:'sim_ok', si:enciende, txt:'ICCID igual al del envío.' }, { tipo:'radio', clave:'gnss', si:enciende, txt:'GNSS (si hay cielo o ventana)', opciones:['Ve satélites / tiene fix','No ve satélites','No se pudo probar (techo)'] }, - { tipo:'check', clave:'servidor', si:enciende, txt:'La unidad aparece en el monitor (posición o Salud) — pídele a alguien con acceso que lo confirme.' }, - { tipo:'archivo', clave:'log', etiqueta:'recepcion', si:enciende, txt:'Captura de la consola (opcional, pero útil si algo se ve raro)' }, - { tipo:'check', clave:'cerrada', si:enciende, txt:'Apagué la fuente, cerré la tapa, apreté los prensaestopas y volví a poner la etiqueta a la vista.' }, + { tipo:'check', clave:'servidor', si:enciende, txt:'Aparece en el monitor (posición o Salud), confirmado por alguien con acceso.' }, + { tipo:'archivo', clave:'log', etiqueta:'recepcion', si:enciende, txt:'Captura de consola (opcional)' }, + { tipo:'check', clave:'cerrada', si:enciende, txt:'Fuente apagada, tapa cerrada, prensaestopas apretados, etiqueta a la vista.' }, ] }, { titulo: '7 · Veredicto', items: [ - { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'¿Entra al puerto?', + { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Resultado', opciones:[ 'Lista para entrar al puerto', 'Entra con observaciones (anótalas)', 'No entra — se queda en el taller para revisión', 'Rechazada — regresa a Querétaro'], - aviso:'Corto, no enciende, riel de 5 V bajo o firmware distinto al del envío: no entra. Instalarla y descubrirlo arriba de una máquina cuesta una visita más y un permiso más de ICAVE. Si no entra, registra además un acta de daño para que la serie quede marcada.' }, + aviso:'Corto, no enciende, 5 V bajo o firmware distinto al del envío: no entra, y se registra un acta de daño para marcar la serie.' }, { tipo:'texto', clave:'observaciones', rows:'3', txt:'Observaciones' }, ] }, ] diff --git a/docs/formularios/reflasheo.html b/docs/formularios/reflasheo.html index ffa7417..389233e 100644 --- a/docs/formularios/reflasheo.html +++ b/docs/formularios/reflasheo.html @@ -24,113 +24,103 @@ Acta.render({ unidades: window.FLOTA, etiquetaSerie: 'Unidad o módulo que vas a reflashear', titulo: 'Acta de reflasheo y configuración', - subtitulo: 'Helgen Technologies · solo en taller. Nunca sobre la máquina.', + subtitulo: 'Solo en taller, nunca sobre la máquina.', textoOK: 'QUEDÓ BIEN', - intro: 'Un reflasheo es una prueba, no una reparación. Sirve para contestar si el problema ' - + 'desaparece con firmware nuevo. Si la unidad tiene un corto, un conector roto o una batería ' - + 'hinchada, el firmware no va a arreglar nada. Y como el flasheo borra la memoria del equipo ' - + '(temperatura máxima, reinicios, causa del último arranque), la captura de antes es obligatoria: ' - + 'sin ella destruyes la evidencia que explicaba la falla. ' + intro: 'Un reflasheo es una prueba, no una reparación. El flasheo borra la memoria del equipo: la captura de antes es obligatoria. ' + 'Procedimiento: Reflasheo de unidades.', secciones: [ - { titulo: '0 · Qué vas a reflashear', + { titulo: '0 · Qué se reflashea', items: [ - { tipo:'nota', txt:'
Solo en taller, con la unidad en la mesa. Un flasheo ' - + 'interrumpido deja el equipo muerto: en la mesa se vuelve a intentar, arriba de un RTG hay que ' - + 'bajarlo otra vez.
' }, + { tipo:'nota', txt:'
Solo en taller, con la unidad en la mesa. Un flasheo interrumpido deja el equipo muerto.
' }, { tipo:'fecha', clave:'fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, - { tipo:'radio', clave:'objetivo', req:true, guardaEn:'clasificacion', txt:'¿Qué vas a cargar?', + { tipo:'radio', clave:'objetivo', req:true, guardaEn:'clasificacion', txt:'Qué se carga', opciones:[ 'A · Firmware del HBOX (Blackpill / EinarBoard)', 'B · Parámetros del módem 4G NTRIP Master', 'C · Firmware o configuración del ArduSimple (ZED-F9P)'] }, - { tipo:'radio', clave:'motivo', guardaEn:'motivo', txt:'¿Por qué?', + { tipo:'radio', clave:'motivo', guardaEn:'motivo', txt:'Motivo', opciones:['Falla en campo — a ver si cambia con firmware nuevo','Actualización planeada', 'Unidad nueva antes de instalar','Se perdió o corrompió la configuración','Otro'] }, - { tipo:'texto', clave:'nota_previa', rows:'2', txt:'¿Qué hacía la unidad antes de tocarla?' }, + { tipo:'texto', clave:'nota_previa', rows:'2', txt:'Síntoma antes de tocarla' }, ] }, - { titulo: '1 · Antes de tocar nada — la evidencia', - sub:'Este paso es la razón de ser del acta. Si no lo haces, el reflasheo no sirve como prueba de nada.', + { titulo: '1 · Evidencia de antes', + sub:'Sin esta captura el reflasheo no sirve como prueba.', items: [ { tipo:'archivo', clave:'log_antes', etiqueta:'antes', req:true, - txt:'Captura de ANTES del reflasheo', + txt:'Captura de antes', ayuda:'Terminal serie a 115200, guardar a archivo, 3 minutos. Nómbrala ' + 'SERIE_antes_AAAA-MM-DD.log.' }, { tipo:'texto', clave:'fw_antes', rows:'1', req:true, - txt:'Versión que traía (de la línea BOOT, o "no se pudo leer")', ph:'fw=3.0.3' }, + txt:'Firmware (línea BOOT o "no se pudo leer")', ph:'fw=3.0.3' }, { tipo:'nota', si:v=>!conEvidencia(v), - txt:'
⛔ No sigas todavía. Sube la captura de antes: el resto del ' - + 'formulario se abre cuando esté guardada en el servidor.
' }, + txt:'
No sigas todavía. Sube la captura de antes; el resto del formulario se abre cuando esté guardada.
' }, ] }, // ---------------------------------------------------------------- HBOX - { titulo: '🔵 A · Firmware del HBOX', si:v=>esHBOX(v)&&conEvidencia(v), - sub:'DFU por USB del Blackpill. El binario se descarga del sitio, nunca de un USB que ande circulando.', + { titulo: 'A · Firmware del HBOX', si:v=>esHBOX(v)&&conEvidencia(v), + sub:'DFU por USB. El binario sale de Descargas, nunca de una memoria USB que ande circulando.', items: [ { tipo:'texto', clave:'bin_nombre', rows:'1', req:true, - txt:'Archivo binario que usaste (nombre completo)', ph:'hbox-tarjetaV3_X.Y.Z.bin' }, - { tipo:'radio', clave:'bin_origen', req:true, txt:'¿De dónde lo sacaste?', + txt:'Binario (nombre completo)', ph:'hbox-tarjetaV3_X.Y.Z.bin' }, + { tipo:'radio', clave:'bin_origen', req:true, txt:'Origen del binario', opciones:['De la página de Descargas del sitio','Me lo pasó ingeniería directo','De otro lado'], - aviso:'Si no salió del sitio ni de ingeniería, detente: un binario de la generación equivocada puede dejar la batería cargando cuando debería estar cortada.' }, + aviso:'Si no salió del sitio ni de ingeniería, detente: un binario de otra tarjeta puede dejar la batería cargando cuando debería estar cortada.' }, { tipo:'check', clave:'sha_ok', req:true, - txt:'Verifiqué el SHA-256 del archivo y coincide con el publicado.' }, - { tipo:'check', clave:'dfu_ok', txt:'Entró en DFU: apareció STM32 BOOTLOADER (0483:DF11).' }, - { tipo:'check', clave:'grabado', txt:'Grabado en 0x08000000: «Download complete» y «Verify successful».' }, - { tipo:'texto', clave:'fw_despues', rows:'1', txt:'Versión que quedó (línea BOOT después)', ph:'fw=3.0.3' }, - { tipo:'radio', clave:'arranque', txt:'Después de 10 minutos con antenas, ¿a qué estado llegó?', + txt:'SHA-256 verificado contra el publicado.' }, + { tipo:'check', clave:'dfu_ok', txt:'DFU: STM32 BOOTLOADER (0483:DF11).' }, + { tipo:'check', clave:'grabado', txt:'Grabado en 0x08000000: Download complete y Verify successful.' }, + { tipo:'texto', clave:'fw_despues', rows:'1', txt:'Firmware después (línea BOOT)', ph:'fw=3.0.3' }, + { tipo:'radio', clave:'arranque', txt:'Estado a 10 min con antenas', opciones:['RUN con link OK','RUN pero link DEGR o LIMP','Se queda en BOOT','Se reinicia solo','Ya no arranca'] }, ] }, // ---------------------------------------------------------------- 4G - { titulo: '🟠 B · Parámetros del módem 4G', si:v=>es4G(v)&&conEvidencia(v), - sub:'Por el puerto USB "XBEE" del simpleRTK2B Pro, a 115200. Solo las líneas que empiezan con $$$AS+.', + { titulo: 'B · Parámetros del módem 4G', si:v=>es4G(v)&&conEvidencia(v), + sub:'Por el USB XBEE del simpleRTK2B a 115200. Solo las líneas $$$AS+.', items: [ - { tipo:'nota', txt:'
Cuidado con lo que subes. El archivo de parámetros ' - + 'lleno contiene usuario y contraseña del caster NTRIP y de la APN. Aquí sube la versión ' - + 'sin credenciales: borra los valores de AS+U, AS+q y ' - + 'AS+Q antes de subirlo. Lo que nos sirve guardar es qué quedó configurado, no las claves.
' }, + { tipo:'nota', txt:'
Sin credenciales. Antes de subir el archivo, borra los valores de AS+U, AS+q y AS+Q (usuario y contraseña del caster y de la APN).
' }, { tipo:'texto', clave:'imei', rows:'1', txt:'IMEI del módem' }, { tipo:'texto', clave:'iccid', rows:'1', txt:'ICCID de la SIM' }, - { tipo:'check', clave:'lineas_ok', txt:'Todas las líneas contestaron OK (ninguna con ERROR).' }, - { tipo:'texto', clave:'as_k', rows:'1', req:true, txt:'ID de estación (AS+K) que quedó' }, + { tipo:'check', clave:'lineas_ok', txt:'Todas las líneas con OK, ninguna ERROR.' }, + { tipo:'texto', clave:'as_k', rows:'1', req:true, txt:'ID de estación (AS+K)' }, { tipo:'texto', clave:'mountpoint', rows:'1', txt:'Mountpoint (AS+M)' }, { tipo:'archivo', clave:'params_4g', etiqueta:'parametros-4g', req:true, - txt:'Archivo de parámetros que cargaste, SIN credenciales', + txt:'Archivo de parámetros, sin credenciales', ayuda:'Nómbralo RTK-NNNN_parametros_AAAA-MM-DD.txt. Queda guardado en el expediente de este módem.' }, - { tipo:'radio', clave:'registro', txt:'¿Registró en la red?', + { tipo:'radio', clave:'registro', txt:'Registro en la red', opciones:['Sí, LED lento o fijo','No, sigue en parpadeo rápido','El LED no enciende'] }, - { tipo:'medida', clave:'rssi', txt:'RSSI, si el módulo lo reporta' }, + { tipo:'medida', clave:'rssi', txt:'RSSI, si lo reporta' }, { tipo:'archivo', clave:'log_4g', etiqueta:'consola-4g', txt:'Captura de la consola del módem (opcional)', - ayuda:'Recuerda: esta consola no prueba que las correcciones lleguen. Sirve para ver que enciende y registra.' }, + ayuda:'Esta consola no prueba que lleguen correcciones; solo que enciende y registra.' }, ] }, // ---------------------------------------------------------------- ArduSimple - { titulo: '🟢 C · ArduSimple / ZED-F9P', si:v=>esARD(v)&&conEvidencia(v), - sub:'Por el USB POWER+GPS con u-center. Antena con vista al cielo, o no habrá fix y parecerá falla.', + { titulo: 'C · ArduSimple / ZED-F9P', si:v=>esARD(v)&&conEvidencia(v), + sub:'USB POWER+GPS con u-center. Antena con cielo (sin cielo no hay fix y parece falla).', items: [ - { tipo:'radio', clave:'ard_que', req:true, txt:'¿Qué cargaste?', + { tipo:'radio', clave:'ard_que', req:true, txt:'Qué se cargó', opciones:['Solo la configuración (archivo .txt de Helgen)','Firmware del ZED-F9P','Las dos cosas'] }, - { tipo:'texto', clave:'f9p_antes', rows:'1', txt:'Versión del ZED-F9P ANTES (UBX-MON-VER)' }, - { tipo:'texto', clave:'f9p_despues', rows:'1', txt:'Versión DESPUÉS (UBX-MON-VER)' }, + { tipo:'texto', clave:'f9p_antes', rows:'1', txt:'ZED-F9P antes (UBX-MON-VER)' }, + { tipo:'texto', clave:'f9p_despues', rows:'1', txt:'ZED-F9P después (UBX-MON-VER)' }, { tipo:'texto', clave:'cfg_nombre', rows:'1', txt:'Archivo de configuración cargado' }, { tipo:'check', clave:'flash_ok', req:true, - txt:'Guardé la configuración en FLASH (no solo en RAM) y sobrevive al reinicio.', - aviso:'En junio perdimos tiempo por esto: una configuración que solo quedó en RAM se borra al primer corte de energía y el receptor vuelve a su estado anterior sin avisar.' }, - { tipo:'check', clave:'uart_ok', txt:'UART1 a 115200 (es lo que lee la tarjeta) y UART2 a la velocidad del módem.' }, - { tipo:'radio', clave:'fix', txt:'Calidad de fix alcanzada a cielo abierto', + txt:'Configuración en FLASH; sobrevive al reinicio.', + aviso:'Una configuración solo en RAM se borra al primer corte de energía, sin aviso.' }, + { tipo:'check', clave:'uart_ok', txt:'UART1 a 115200 (lo lee la tarjeta); UART2 a la velocidad del módem.' }, + { tipo:'radio', clave:'fix', txt:'Calidad de fix a cielo abierto', opciones:['0 — sin posición','1 — GPS solo','2 — corregido básico','4 — RTK fijo','5 — RTK flotante'] }, - { tipo:'archivo', clave:'log_ard', etiqueta:'ardusimple', txt:'Captura NMEA o log de u-center (opcional)' }, + { tipo:'archivo', clave:'log_ard', etiqueta:'ardusimple', txt:'NMEA o log de u-center (opcional)' }, ] }, // ---------------------------------------------------------------- cierre - { titulo: '2 · Después del reflasheo', si:conEvidencia, + { titulo: '2 · Después', si:conEvidencia, items: [ { tipo:'archivo', clave:'log_despues', etiqueta:'despues', req:true, - txt:'Captura de DESPUÉS del reflasheo', - ayuda:'Las dos capturas juntas — antes y después — son la prueba de si el firmware cambió algo. Por separado no dicen nada.' }, - { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'¿Cómo queda?', + txt:'Captura de después', + ayuda:'Antes y después juntas dicen si el firmware cambió algo.' }, + { tipo:'radio', clave:'accion', req:true, guardaEn:'accion', txt:'Resultado', opciones:[ 'Lista para reinstalar', 'En observación en el taller', @@ -138,9 +128,9 @@ Acta.render({ 'Empeoró: ya no arranca — se envía a Querétaro', 'Pendiente de más pruebas'] }, { tipo:'texto', clave:'observaciones', rows:'4', req:true, - txt:'¿Cambió algo? Cuéntalo con tus palabras', + txt:'Observaciones: qué cambió', ph:'Antes se reiniciaba cada 3 minutos; después de cargar 3.0.3 lleva 40 minutos en RUN sin reiniciarse.' }, - { tipo:'foto', clave:'f_final', etiqueta:'final', txt:'Foto de cómo quedó (opcional).' }, + { tipo:'foto', clave:'f_final', etiqueta:'final', txt:'Cómo quedó (opcional).' }, ] }, ] }); diff --git a/docs/formularios/v4.html b/docs/formularios/v4.html index d8c2ce2..ffeb680 100644 --- a/docs/formularios/v4.html +++ b/docs/formularios/v4.html @@ -27,8 +27,8 @@ const COLS_DESP = [ { k:'hora', txt:'Hora del despertar', ph:'14:15', ancho:'80px' }, { k:'trama', txt:'Primera trama NMEA', opciones:['$GNTXT u-blox','otra (GGA, RMC…)','no salió'] }, { k:'mrst', txt:'MODEM_RST stack_on a los 3 s', opciones:['sí','no salió'] }, - { k:'modem', txt:'¿El módem registró solo?', opciones:['sí','LEDs, sin registrar','oscuro'] }, - { k:'monitor', txt:'¿El monitor recibió 🔋?', opciones:['sí','no'] }, + { k:'modem', txt:'Módem registró solo', opciones:['sí','LEDs, sin registrar','oscuro'] }, + { k:'monitor', txt:'Monitor recibió (batería)', opciones:['sí','no'] }, { k:'reposo', txt:'Línea DUTY reposo al cerrar la ventana', ph:'ventana 150s fix=RTK_FIX phlg_aire=4 vbat=3.95', ancho:'240px' }, ]; const FILAS = ['0:15', '0:30', '0:45', '1:00', '1:30', '2:00']; @@ -48,207 +48,201 @@ Acta.render({ tecnicoDesdeUsuario: true, nombres: { alan: 'Alán Basurto', daniel: 'Daniel Martínez', leo: 'Leo Rodríguez', jesus: 'Jesús' }, etiquetaSerie: 'Tarjeta V4', - titulo: 'Acta de prueba — EinarBoard V4 con firmware 0.5.6', - subtitulo: 'Helgen Technologies · un acta por tarjeta (V4-01 … V4-15) · ~1 h', + titulo: 'Acta de prueba — EinarBoard V4 con firmware 0.6.0', + subtitulo: 'Un acta por tarjeta (V4-01 … V4-15) · ~1 h', textoOK: 'APROBADA', - intro: 'Llénala mientras avanzas por el procedimiento ' - + 'V4 — preparación y prueba con 0.5.6: ' - + 'puente de reset del módem, interruptores del simpleRTK2B, cable de consola sin 5 V y batería; ' - + 'flasheo; y las pruebas A (24 V), B (batería) y C (regreso de 24 V). ' - + 'Graba la consola a archivo desde el primer minuto: al final se sube completa.
' - + 'Si una etapa no pasa, marca «me detengo» en su última pregunta: lo que sigue se oculta, ' - + 'llenas el Cierre y envías con resultado FALLA. Si la tarjeta no tiene número, etiquétala ' - + 'con el siguiente V4 libre del tablero. La serie PRUEBA sirve para practicar.', + intro: 'Llénala mientras avanzas por el procedimiento ' + + 'V4 — preparación y prueba con 0.6.0. ' + + 'Graba la consola desde el primer minuto; al final se sube completa. ' + + 'Si una etapa no pasa, marca «me detengo»: lo que sigue se oculta, llenas el Cierre y envías como FALLA. ' + + 'Sin número de serie: el siguiente V4 libre del tablero. La serie PRUEBA sirve para practicar.', secciones: [ { titulo: '1 · Datos', items: [ - { tipo:'fecha', clave:'s0_00_fecha', req:true, guardaEn:'fecha', txt:'Fecha de la prueba' }, - { tipo:'texto', clave:'s0_01_modem', rows:'1', txt:'Módem 4G: serie RTK- o IMEI (si tiene etiqueta)', ph:'RTK-0007' }, - { tipo:'texto', clave:'s0_02_ard', rows:'1', txt:'simpleRTK2B: serie ARD- (si tiene etiqueta)', ph:'ARD-012' }, - { tipo:'texto', clave:'s0_03_bp', rows:'1', txt:'Blackpill: leyenda impresa en la placa', ph:'WeAct BlackPill V3.0 F411CEU6' }, - { tipo:'nota', txt:'
Reglas. Todo cambio de hardware (soldar, mover interruptores, ' - + 'poner o quitar módulos) se hace sin energía: sin 24 V, batería desconectada y sin USB. ' - + 'Durante las pruebas, ningún USB en el simpleRTK2B ni en el USB-C del módem (J9). ' - + 'En la V4 la consola va solo con el cable sin 5 V; el cable normal es solo para flashear.
' }, + { tipo:'fecha', clave:'s0_00_fecha', req:true, guardaEn:'fecha', txt:'Fecha' }, + { tipo:'texto', clave:'s0_01_modem', rows:'1', txt:'Módem: RTK-NNNN o IMEI', ph:'RTK-0007' }, + { tipo:'texto', clave:'s0_02_ard', rows:'1', txt:'simpleRTK2B: ARD-NNN', ph:'ARD-012' }, + { tipo:'texto', clave:'s0_03_bp', rows:'1', txt:'Blackpill: leyenda impresa', ph:'WeAct BlackPill V3.0 F411CEU6' }, + { tipo:'nota', txt:'
Reglas. Cambios de hardware sin energía (sin 24 V, batería desconectada, sin USB). ' + + 'Ningún USB en el simpleRTK2B ni en J9 durante las pruebas. Consola solo con el cable sin 5 V.
' }, ] }, { titulo: '2 · Puente de reset del módem (Preparación 1, sin energía)', sub: 'Diodo de SW4G1 (pad que va a RESET de J7) a U13 pata 12: ' + 'U13-12 ──|<── SW4G1 · banda (cátodo) en U13, lado sin banda (ánodo) en SW4G1.', items: [ - { tipo:'radio', clave:'s1_00_diodo', req:true, txt:'Diodo que usaste', + { tipo:'radio', clave:'s1_00_diodo', req:true, txt:'Diodo', opciones:['BAT54','BAT85','BAT43','1N5711','1N4148 (solo si en la Prueba A baja de 0.4 V)','Otro'], aviso:'No uses 1N5819: en caliente deja pasar corriente al revés y alimenta al módem durante el reposo.' }, { tipo:'texto', clave:'s1_01_diodo_otro', rows:'1', req:true, si: v => v.s1_00_diodo === 'Otro', - txt:'¿Cuál? (número de parte o marcado)' }, + txt:'Número de parte o marcado' }, { tipo:'check', clave:'s1_02_orient', req:true, txt:'Banda del diodo (cátodo) en U13 pata 12; lado sin banda (ánodo) en el pad de SW4G1 que tiene continuidad con el pin RESET de J7.' }, { tipo:'check', clave:'s1_03_limpio', req:true, - txt:'Revisé con lupa: la pata 12 no quedó unida a la 11 ni a la 13. Alambre fijo con Kapton y lejos del módem 4G.' }, - { tipo:'medida', clave:'s1_04_d_dir', req:true, txt:'Prueba de diodo: roja en SW4G1 (RESET), negra en U13 pata 12', + txt:'Con lupa: pata 12 sin puente a la 11 ni a la 13. Alambre fijo con Kapton, lejos del módem.' }, + { tipo:'medida', clave:'s1_04_d_dir', req:true, txt:'Prueba de diodo: roja SW4G1, negra U13-12', esperado:'0.15 – 0.45 V', u:'V', aviso:'0 V = corto. OL en los dos sentidos = falta soldadura. Corrígelo antes de seguir.' }, - { tipo:'medida', clave:'s1_05_d_inv', req:true, modo:'text', txt:'Prueba de diodo con las puntas invertidas', + { tipo:'medida', clave:'s1_05_d_inv', req:true, modo:'text', txt:'Prueba de diodo, puntas invertidas', esperado:'OL o más de 1 V', ph:'OL' }, { tipo:'foto', clave:'s1_06_f_puente', req:true, etiqueta:'puente-u13-sw4g1', - txt:'Foto del puente: U13 y SW4G1 (una toma o dos), con el diodo y el alambre visibles.' }, + txt:'Puente: U13 y SW4G1 con diodo y alambre visibles.' }, ] }, { titulo: '3 · Interruptores, cable de consola y batería (Preparación 2)', sub: 'Interruptores y batería sin energía. El interruptor doble está junto al LED POWER del simpleRTK2B.', items: [ - { tipo:'radio', clave:'s2_00_ioref', req:true, txt:'Interruptor IOREF=3.3V del simpleRTK2B (debe quedar en OFF)', + { tipo:'radio', clave:'s2_00_ioref', req:true, txt:'IOREF=3.3V (debe quedar en OFF)', opciones:['Estaba en OFF','Estaba en ON — lo pasé a OFF','No tiene esa leyenda — tomé foto y pregunté'] }, - { tipo:'radio', clave:'s2_01_5vout', req:true, txt:'Interruptor 5V=OUTPUT del simpleRTK2B (debe quedar en OFF)', + { tipo:'radio', clave:'s2_01_5vout', req:true, txt:'5V=OUTPUT (debe quedar en OFF)', opciones:['Estaba en OFF','Estaba en ON — lo pasé a OFF','No tiene esa leyenda — tomé foto y pregunté'] }, { tipo:'foto', clave:'s2_02_f_sw', req:true, etiqueta:'interruptores-simplertk2b', si: v => empieza(v, 's2_00_ioref', 'No tiene') || empieza(v, 's2_01_5vout', 'No tiene'), - txt:'Foto de los interruptores del simpleRTK2B.' }, + txt:'Interruptores del simpleRTK2B.' }, { tipo:'texto', clave:'s2_03_sw_resp', rows:'2', req:true, si: v => empieza(v, 's2_00_ioref', 'No tiene') || empieza(v, 's2_01_5vout', 'No tiene'), - txt:'¿Qué te indicó ingeniería y en qué posición quedaron?' }, + txt:'Indicación de ingeniería y posición final' }, { tipo:'check', clave:'s2_04_usb', req:true, - txt:'Ningún USB conectado al simpleRTK2B ni al USB-C del módem (J9).' }, + txt:'Ningún USB en el simpleRTK2B ni en J9.' }, { tipo:'radio', clave:'s2_05_cable', req:true, - txt:'Prueba del cable sin 5 V (tarjeta sin 24 V y sin batería; laptop → Blackpill con ese cable)', + txt:'Prueba del cable sin 5 V (tarjeta sin 24 V ni batería)', opciones:['La Blackpill quedó apagada (ningún LED) — cable bueno','La Blackpill encendió'] }, { tipo:'nota', si: v => empieza(v, 's2_05_cable', 'La Blackpill encendió'), txt:'
El cable no sirve. Revisa que el hilo rojo esté cortado y aislado. ' + 'Si con el rojo cortado la Blackpill sigue encendiendo, detente y avisa a ingeniería.
' }, - { tipo:'medida', clave:'s2_06_vbat', req:true, txt:'Batería medida en su propio conector, como llegó', + { tipo:'medida', clave:'s2_06_vbat', req:true, txt:'Batería en su conector, como llegó', esperado:'3.80 V o más para empezar', u:'V', - aviso:'Menos de 3.80 V: cárgala por fuera de la tarjeta (el firmware 0.5.6 no la carga) con el cargador de 1 celda, ' - + 'o con fuente de banco a 4.00 V y límite de 1 A, sin dejarla sola. Si se calienta o se ve inflada: detente y avisa.' }, - { tipo:'radio', clave:'s2_07_carga', req:true, txt:'¿Tuviste que cargarla?', + aviso:'Menos de 3.80 V: cárgala fuera de la tarjeta con el cargador de 1 celda, ' + + 'o fuente de banco a 4.00 V y límite 1 A, sin dejarla sola. Si se calienta o se infla: detente y avisa.' }, + { tipo:'radio', clave:'s2_07_carga', req:true, txt:'Carga previa', opciones:['No hizo falta','Sí, con el cargador de 1 celda','Sí, con fuente de banco 4.00 V / 1 A'] }, { tipo:'medida', clave:'s2_08_vbat_final', req:true, si: v => empieza(v, 's2_07_carga', 'Sí'), - txt:'Voltaje después de cargarla', esperado:'3.80 V o más', u:'V' }, + txt:'Batería después de cargar', esperado:'3.80 V o más', u:'V' }, { tipo:'radio', clave:'s2_09_prep_fin', req:true, txt:'Preparación', opciones:['Completa — sigo al flasheo', PASO_NO] }, ] }, - { titulo: '4 · Flasheo de 0.5.6', si: prepOK, - sub: 'Tarjeta sin 24 V y con la batería desconectada, cable normal en la Blackpill. ' - + 'DFU: mantén BOOT0, presiona y suelta NRST, suelta BOOT0 → STM32 BOOTLOADER (0483:DF11). ' - + 'dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV4_0.5.6.bin', + { titulo: '4 · Flasheo de 0.6.0', si: prepOK, + sub: 'Sin 24 V, batería desconectada, cable normal en la Blackpill. ' + + 'DFU: mantén BOOT0, pulsa y suelta NRST, suelta BOOT0 → STM32 BOOTLOADER (0483:DF11). ' + + 'dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV4_0.6.0.bin', items: [ { tipo:'check', clave:'s3_00_sha', req:true, - txt:'Usé hbox-tarjetaV4_0.5.6.bin de Descargas (no el de V5) y su SHA-256 empieza con 1e604edd y termina con 0e4c52ab.' }, - { tipo:'radio', clave:'s3_01_dfu', req:true, txt:'¿Dónde lo flasheaste?', + txt:'hbox-tarjetaV4_0.6.0.bin de Descargas (no el de V5); SHA-256 empieza con 1458470b y termina con ba77b2e3.' }, + { tipo:'radio', clave:'s3_01_dfu', req:true, txt:'Dónde se flasheó', opciones:['En la tarjeta','Fuera del zócalo (en la tarjeta no apareció STM32 BOOTLOADER)','No logré flashear'] }, { tipo:'check', clave:'s3_02_orient', req:true, si: v => empieza(v, 's3_01_dfu', 'Fuera'), - txt:'Al regresarla al zócalo, sin energía: USB-C del lado de la etiqueta E-CSn; pin B12 de la Blackpill en E-CSn y pin R en NRST.' }, - { tipo:'texto', clave:'s3_03_fw', rows:'1', req:true, si: flasheada, txt:'Primera línea de la consola tras reiniciar', - ph:'hbox-v5-bringup 0.5.6 built Sep 26 2026 15:52:10' }, + txt:'Reinsertada sin energía: USB-C del lado de E-CSn; B12 en E-CSn y R en NRST.' }, + { tipo:'texto', clave:'s3_03_fw', rows:'1', req:true, si: flasheada, txt:'Firmware (línea BOOT o banner)', + ph:'hbox-v5-bringup 0.6.0 built …' }, { tipo:'check', clave:'s3_04_board', req:true, si: flasheada, - txt:'La segunda línea dice board=EinarBoard v4 (HBOX v4). (Si dice v5, es el binario equivocado: vuelve a flashear.)' }, + txt:'Segunda línea: board=EinarBoard v4 (HBOX v4) (si dice v5, binario equivocado: reflashea).' }, { tipo:'radio', clave:'s3_05_tests', req:true, si: flasheada, - txt:'Final de los tests de arranque (la tecla r los repite; la tecla t imprime la línea $PHLG,0.5.6-fm)', + txt:'Final de los tests de arranque (r los repite; t imprime $PHLG,0.6.0,)', opciones:['>>> BOARD OK','>>> BOARD CHECK FAILED'] }, { tipo:'texto', clave:'s3_06_fails', rows:'3', req:true, si: v => flasheada(v) && v.s3_05_tests === '>>> BOARD CHECK FAILED', - txt:'Copia las líneas [FAIL] completas', ph:'[FAIL] …' }, + txt:'Líneas [FAIL] completas', ph:'[FAIL] …' }, { tipo:'nota', si: v => empieza(v, 's3_01_dfu', 'No logré') || (flasheada(v) && v.s3_05_tests === '>>> BOARD CHECK FAILED'), txt:'
Detente y avisa a ingeniería. Llena el Cierre y envía el acta con resultado FALLA.
' }, { tipo:'check', clave:'s3_07_cable', req:true, si: flashOK, - txt:'Desconecté el cable normal. De aquí en adelante, solo el cable sin 5 V.' }, + txt:'Cable normal retirado; desde aquí, solo el cable sin 5 V.' }, ] }, { titulo: '5 · Prueba A — con 24 V', si: flashOK, - sub: 'Conecta la batería y después los 24 V. Espera 30 s, conecta el cable sin 5 V y abre la consola grabando.', + sub: 'Batería y luego 24 V. A los 30 s, cable sin 5 V y consola grabando.', items: [ - { tipo:'medida', clave:'s4_00_p2', req:true, txt:'P2 (entrada de 5 V del SD-15B)', esperado:'5.1 – 5.3 V', u:'V', - aviso:'0 V con los 24 V puestos: detente y avisa a ingeniería (el SD-15B o el arnés no entregan).' }, + { tipo:'medida', clave:'s4_00_p2', req:true, txt:'P2 (salida del SD-15B)', esperado:'5.1 – 5.3 V', u:'V', + aviso:'0 V con 24 V puestos: detente y avisa a ingeniería (SD-15B o arnés).' }, { tipo:'texto', clave:'s4_01_stat', rows:'3', req:true, - txt:'Línea STAT (tecla s): debe traer v5=5.xx(ok), stack=ON y mrst=1 o más; al rato modoB=ON y gga= con satélites', + txt:'Línea STAT (s): v5=5.xx(ok), stack=ON, mrst ≥ 1; luego modoB=ON y gga= con satélites', ph:'STAT vbat=4.02 v5=5.21(ok) … stack=ON … modoB=ON … mrst=1' }, { tipo:'medida', clave:'s4_02_m_min', req:true, - txt:'Prueba del puente: tecla M con el multímetro en el pad RESET de SW4G1 contra GND. Lectura más baja', + txt:'Tecla M: mínimo en el pad RESET de SW4G1', esperado:'menos de 0.4 V durante ~0.5 s (usa MIN/MAX si lo tiene); en reposo marca alto', u:'V' }, - { tipo:'radio', clave:'s4_03_m_res', req:true, txt:'Con M…', + { tipo:'radio', clave:'s4_03_m_res', req:true, txt:'Resultado de M', opciones:['Bajó de 0.4 V, los LEDs del módem se apagaron y volvieron, consola «MODEM_RST operador»', 'No bajó', 'Bajó, pero se quedó entre 0.4 y 0.7 V'], - aviso:'No bajó: el diodo está al revés o sin soldar. Se quedó entre 0.4 y 0.7 V: el diodo no es Schottky; cámbialo. ' - + 'Corrige (sin energía) y repite. Si después de corregir sigue sin bajar de 0.4 V: detente y avisa a ingeniería.' }, + aviso:'No bajó: diodo al revés o sin soldar. Entre 0.4 y 0.7 V: el diodo no es Schottky. ' + + 'Corrige sin energía y repite; si sigue sin bajar de 0.4 V, detente y avisa a ingeniería.' }, { tipo:'radio', clave:'s4_04_modem', req:true, - txt:'¿El módem registró y los LEDs UART del simpleRTK2B parpadean rápido (llegan correcciones)?', + txt:'Módem registrado y UART del simpleRTK2B en parpadeo rápido', opciones:['Sí','No'] }, - { tipo:'radio', clave:'s4_05_monitor', req:true, txt:'¿En el monitor aparece la unidad con 0.5.6-fm y ⚡?', + { tipo:'radio', clave:'s4_05_monitor', req:true, txt:'Monitor: unidad con 0.6.0 y ⚡', opciones:['Sí','No'] }, { tipo:'check', clave:'s4_06_sin_usb', req:true, - txt:'Todo esto con el cable sin 5 V y sin USB en el simpleRTK2B ni en J9.' }, + txt:'Todo con el cable sin 5 V y sin USB en el simpleRTK2B ni en J9.' }, { tipo:'radio', clave:'s4_07_a_fin', req:true, txt:'Prueba A', opciones:['Pasó — sigo a la prueba en batería','No pasó — me detengo (explico en Cierre)'] }, ] }, { titulo: '6 · Prueba B — en batería', si: aOK, - sub: 'Con todo funcionando, quita los 24 V (la batería se queda conectada) y anota la hora. ' - + 'No presiones RESET en esta prueba: tras un reset sin 24 V la etapa no enciende (es a propósito) y la prueba se pierde.', + sub: 'Quita 24 V (la batería queda) y anota la hora. No pulses RESET: sin 24 V la etapa no vuelve a encender. ' + + 'Nota: los despertares y el reposo describen el ciclo de 0.5.6–0.5.7; desde 0.5.9 la etapa y el módem siguen encendidos en batería. Anota lo que ocurra y avisa a ingeniería.', items: [ - { tipo:'texto', clave:'s5_00_hora', rows:'1', req:true, txt:'Hora en que quitaste los 24 V', ph:'14:05' }, + { tipo:'texto', clave:'s5_00_hora', rows:'1', req:true, txt:'Hora sin 24 V', ph:'14:05' }, { tipo:'radio', clave:'s5_01_perdido', req:true, - txt:'¿La consola mostró «V5 PERDIDO» y «BACKUP inicio … modo reporte cada 10 min», y la etapa siguió encendida unos 2 min?', + txt:'«V5 PERDIDO» y «BACKUP inicio …»; etapa encendida', opciones:['Sí','No (anoto en Cierre qué salió)'] }, - { tipo:'radio', clave:'s5_02_reposo', req:true, txt:'¿Llegaron «DUTY reposo … etapa OFF» y «STACK OFF reason=duty_sleep»?', + { tipo:'radio', clave:'s5_02_reposo', req:true, txt:'«DUTY reposo … etapa OFF» y «STACK OFF reason=duty_sleep»', opciones:['Sí','No'] }, - { tipo:'medida', clave:'s5_03_sw5v', req:true, txt:'En reposo, 30 s después: SW_5V en C3 (+)', esperado:'menos de 0.3 V', u:'V' }, - { tipo:'medida', clave:'s5_04_v3m', req:true, txt:'En reposo: 3V3_MODEM en C43 (+) o J7 pin 1', - esperado:'menos de 0.3 V — anota el valor aunque sea mayor y sigue; ingeniería lo revisa', u:'V' }, - { tipo:'radio', clave:'s5_05_ledpwr', req:true, txt:'En reposo: LED POWER del simpleRTK2B', + { tipo:'medida', clave:'s5_03_sw5v', req:true, txt:'Reposo, 30 s: SW_5V en C3 (+)', esperado:'menos de 0.3 V', u:'V' }, + { tipo:'medida', clave:'s5_04_v3m', req:true, txt:'Reposo: 3V3_MODEM en C43 (+) o J7 pin 1', + esperado:'< 0.3 V (anota el valor aunque sea mayor)', u:'V' }, + { tipo:'radio', clave:'s5_05_ledpwr', req:true, txt:'Reposo: LED POWER del simpleRTK2B', opciones:['Apagado (el LED IOREF encendido es normal)','Encendido'] }, { tipo:'nota', si: v => v.s5_05_ledpwr === 'Encendido', - txt:'
LED POWER encendido en reposo: el interruptor IOREF=3.3V quedó en ON o hay un USB en el ' - + 'simpleRTK2B. Si está en OFF y no hay USB: detente y avisa a ingeniería.
' }, - { tipo:'tabla', clave:'s5_06_desp', txt:'Despertares — a los ~10 y ~20 min de quitar los 24 V', + txt:'
LED POWER encendido en reposo: IOREF en ON o USB en el simpleRTK2B. Si no es eso: detente y avisa a ingeniería.
' }, + { tipo:'tabla', clave:'s5_06_desp', txt:'Despertares (~10 y ~20 min sin 24 V)', sub:'En cada ventana deben salir, en orden: STACK ON reason=duty_wake → NMEA primera trama en PA3 ($GNTXT … u-blox AG …) ' + '→ a los 3 s MODEM_RST stack_on → a los ~10 s MODOB ON. Si la primera trama no es la de u-blox AG, ' - + 'el GPS nunca se apagó: revisa el interruptor IOREF=3.3V. Durante la ventana (2–3 min) no toques nada.', + + 'el GPS nunca se apagó (IOREF). No toques nada durante la ventana (2–3 min).', etiquetaFilas:'Ventana', filas: DESP, columnas: COLS_DESP }, { tipo:'radio', clave:'s5_07_b_fin', req:true, - txt:'Prueba B: ¿el módem registró solo y el monitor recibió la unidad (🔋) en las dos ventanas, sin tocar nada?', + txt:'Prueba B: módem registró solo y el monitor recibió', opciones:['Sí, en las dos ventanas','Solo en una','En ninguna'] }, { tipo:'tabla', clave:'s5_08_diag', si: v => !!v.s5_07_b_fin && !empieza(v, 's5_07_b_fin', 'Sí'), - txt:'No registró: en la siguiente ventana anota lo que veas', - sub:'El valor más bajo que alcances a leer en cada intervalo. Tecla s a 0:30 y 1:30 para vbat / vbatmin.', + txt:'No registró: registro de la siguiente ventana', + sub:'El valor más bajo en cada intervalo. Tecla s a 0:30 y 1:30 para vbat / vbatmin.', etiquetaFilas:'t', filas: FILAS, columnas: COLS_DIAG }, ] }, - { titulo: '7 · Prueba C — regreso de los 24 V sin reset', si: aOK, - sub: 'Dos casos. En ninguno se presiona RESET.', + { titulo: '7 · Prueba C — regreso de 24 V sin reset', si: aOK, + sub: 'Dos casos, sin pulsar RESET.', items: [ - { tipo:'radio', clave:'s6_00_c1', req:true, txt:'Caso 1 — durante el reposo (etapa OFF) reconecté los 24 V. El módem…', + { tipo:'radio', clave:'s6_00_c1', req:true, txt:'Caso 1 — 24 V de vuelta en reposo: módem', opciones:['Registró solo en menos de 2 min','Encendió pero no registró','Siguió oscuro'] }, { tipo:'radio', clave:'s6_01_c1_evt', req:true, - txt:'Caso 1 — ¿salieron «V5 PRESENTE», «DUTY fin», «BACKUP fin», a los ~3 s «STACK ON reason=auto» y 3 s después «MODEM_RST stack_on»?', + txt:'Caso 1 — eventos: «V5 PRESENTE», «DUTY fin», «BACKUP fin», ~3 s «STACK ON reason=auto», 3 s «MODEM_RST stack_on»', opciones:['Sí, todas','Faltó alguna (anoto cuál en Cierre)'] }, { tipo:'radio', clave:'s6_02_c2', req:true, - txt:'Caso 2 — durante una ventana (etapa ON) quité los 24 V y los reconecté antes de 2 min. El módem…', + txt:'Caso 2 — 24 V fuera y de vuelta en < 2 min (etapa ON): módem', opciones:['Registró solo en menos de 2 min','Encendió pero no registró','Siguió oscuro'] }, { tipo:'radio', clave:'s6_03_c2_evt', req:true, - txt:'Caso 2 — ¿salieron «5 V de vuelta tras bateria: ciclo de etapa…» → «STACK OFF reason=pwr_return» → unos 10 s después «STACK ON reason=recovery» → «MODEM_RST stack_on»?', + txt:'Caso 2 — eventos: «5 V de vuelta tras bateria: ciclo de etapa…» → «STACK OFF reason=pwr_return» → ~10 s «STACK ON reason=recovery» → «MODEM_RST stack_on»', opciones:['Sí, todas','Faltó alguna (anoto cuál en Cierre)'] }, - { tipo:'radio', clave:'s6_04_monitor', req:true, txt:'¿El monitor volvió a mostrar la unidad con ⚡?', opciones:['Sí','No'] }, + { tipo:'radio', clave:'s6_04_monitor', req:true, txt:'Monitor de vuelta en ⚡', opciones:['Sí','No'] }, ] }, { titulo: '8 · Cierre', items: [ { tipo:'archivo', clave:'s7_00_log', req:true, etiqueta:'v4-consola', - txt:'Archivo completo de la consola (toda la sesión, desde el flasheo o la Prueba A).' }, - { tipo:'radio', clave:'s7_01_clasif', req:true, guardaEn:'clasificacion', txt:'¿Hasta dónde llegó la tarjeta?', + txt:'Log completo de consola (desde el flasheo o la Prueba A).' }, + { tipo:'radio', clave:'s7_01_clasif', req:true, guardaEn:'clasificacion', txt:'Resultado', opciones:['Pasó A, B y C', 'Se detuvo en la preparación', 'Se detuvo en el flasheo', 'Falló la Prueba A (24 V)', 'Falló la Prueba B (batería)', 'Falló la Prueba C (regreso de 24 V)'], - aviso:'Debe coincidir con lo que marcaste arriba. Resultado final: APROBADA solo si pasó A, B y C.' }, + aviso:'Debe coincidir con lo marcado arriba. APROBADA solo si pasó A, B y C.' }, { tipo:'texto', clave:'s7_02_detalle', rows:'4', req:true, si: falla, - txt:'¿Qué pasó? Paso exacto, lo que se vio en la consola y lo que mediste', + txt:'Detalle de la falla (paso, consola, medidas)', ph:'Prueba B, despertar #1: MODEM_RST stack_on salió pero el módem siguió oscuro; 3V3_MODEM 3.31 V…' }, - { tipo:'texto', clave:'s7_03_obs', rows:'3', txt:'Observaciones (todo lo que no cupo arriba)' }, + { tipo:'texto', clave:'s7_03_obs', rows:'3', txt:'Observaciones' }, { tipo:'check', clave:'s7_04_guardada', req:true, - txt:'Al terminar: 24 V y batería desconectados, tarjeta etiquetada con su serie (V4-NN) y guardada.' }, + txt:'24 V y batería desconectados; tarjeta etiquetada (V4-NN) y guardada.' }, ] }, ] }); diff --git a/docs/formularios/v5.html b/docs/formularios/v5.html index 9f0f558..2f37bd8 100644 --- a/docs/formularios/v5.html +++ b/docs/formularios/v5.html @@ -15,46 +15,46 @@ Acta.render({ prefijo: 'V5', series: 30, // 15 en el lote actual; 30 seleccionables titulo: 'Acta de prueba y flasheo — EinarBoard V5', - subtitulo: 'Lote 15 tarjetas (JLC 22-Ago). Llena cada sección durante la prueba.', + subtitulo: 'Lote de 15 tarjetas (JLC 22-ago). Llena cada sección durante la prueba.', secciones: [ { titulo: '1 · Inspección visual (sin energía)', - sub: 'Con lupa. Marca cada casilla solo cuando lo verifiques.', + sub: 'Con lupa. Marca cada casilla al verificarla.', items: [ { tipo:'check', txt:'Sin puentes de soldadura entre pines de U16 (MCU), U11 (W5500), U10 (SC16IS752), U6 (LTC4040).' }, - { tipo:'check', txt:'Y2 dice 3.6864 (o 36.864). Y1 y Y3 = 25.000, Y4 = 32.768 kHz.', aviso:'Si Y2 dice 1.8432 → marca y avisa a ingeniería.' }, - { tipo:'check', txt:'Botones SW1 y SW2 presentes y con "clic".' }, - { tipo:'check', txt:'Conectores J11, J9, J10 (RJ45) bien asentados, sin pines doblados.' }, - { tipo:'check', txt:'Jumpers del cargador presentes: JP2, JP3, JP4 (no tocar su posición).' }, + { tipo:'check', txt:'Y2 marcado 3.6864 o 36.864; Y1 y Y3 25.000; Y4 32.768 kHz.', aviso:'Y2 marcado 1.8432: anótalo y avisa a ingeniería.' }, + { tipo:'check', txt:'SW1 y SW2 presentes y con clic.' }, + { tipo:'check', txt:'J11, J9 y J10 asentados, sin pines doblados.' }, + { tipo:'check', txt:'JP2, JP3, JP4 presentes (no cambiar su posición).' }, { tipo:'check', txt:'Sin componentes faltantes ni marcas de quemado.' }, ] }, - { titulo: '2 · Continuidad — cortos a tierra (sin energía)', - sub: 'Multímetro en ohms, punta negra en TP6 (GND). Espera a que la lectura se estabilice.', + { titulo: '2 · Cortos a tierra (sin energía)', + sub: 'Multímetro en ohms, punta negra en TP6. Espera a que la lectura se estabilice.', items: [ { tipo:'medida', txt:'TP7 — riel 3V3', esperado:'> 1 kΩ (sube lento)', u:'Ω' }, { tipo:'medida', txt:'P2 pin 1 — VEH5V (entrada 5 V)', esperado:'> 1 kΩ', u:'Ω' }, { tipo:'medida', txt:'P11 pin 1 — MAIN5V', esperado:'> 1 kΩ', u:'Ω' }, { tipo:'medida', txt:'P1 pin 1 — 24V_IN', esperado:'> 10 kΩ', u:'Ω' }, { tipo:'medida', txt:'MOD1 pin "5V" — SW_5V (etapa RTK)', esperado:'> 1 kΩ', u:'Ω', - aviso:'Una lectura fija de 0–20 Ω = corto = FALLA. Unos cientos de Ω que suben es normal (capacitores cargando).' }, + aviso:'Fija en 0–20 Ω = corto = FALLA. Unos cientos de Ω que suben es normal.' }, ] }, { titulo: '3 · Riel 3.3 V por USB (J11)', - sub: 'Conecta el USB-C en J11 (junto a los botones). Solo energiza el MCU.', + sub: 'USB-C en J11. Solo energiza el MCU.', items: [ - { tipo:'check', txt:'D18 (LED verde PWR) encendido.' }, + { tipo:'check', txt:'D18 (PWR) encendido.' }, { tipo:'medida', txt:'TP7 respecto a TP6', esperado:'3.20 – 3.40 V', u:'V' }, - { tipo:'check', txt:'U17 (AMS1117) tibio tras 1 min (si quema → FALLA).' }, - { tipo:'nota', txt:'Deja el USB conectado para las siguientes secciones.' }, + { tipo:'check', txt:'U17 tibio tras 1 min (si quema: FALLA).' }, + { tipo:'nota', txt:'Deja el USB conectado.' }, ] }, { titulo: '4a · Riel 5 V con fuente de banco (entrada P2)', - sub: 'Fuente 5.0 V, límite 500 mA. Coloca el jumper en P11. MCU virgen (sin firmware).', + sub: 'Fuente 5.0 V, límite 500 mA. Jumper en P11. MCU virgen.', items: [ { tipo:'medida', txt:'Corriente de la fuente', esperado:'< 300 mA (típ. 100–250)', u:'mA' }, { tipo:'medida', txt:'P11 pin 1 — MAIN5V', esperado:'4.8 – 5.1 V', u:'V' }, { tipo:'medida', txt:'P11 pin 2 — SYS5V (con jumper)', esperado:'4.8 – 5.1 V', u:'V' }, { tipo:'medida', txt:'TP7 — 3V3', esperado:'3.20 – 3.40 V', u:'V' }, { tipo:'medida', txt:'MOD1 pin "5V" — SW_5V', esperado:'0 V (obligatorio)', u:'V', - aviso:'Si hay 5 V aquí → FALLA (la etapa RTK no arranca apagada).' }, - { tipo:'check', txt:'U6 y U12 tibios, no queman.' }, + aviso:'Con 5 V aquí: FALLA (la etapa RTK no arranca apagada).' }, + { tipo:'check', txt:'U6 y U12 tibios.' }, ] }, { titulo: '4b · Riel 24 V → buck del ventilador (entrada P1)', sub: 'Fuente 24.0 V, límite 200 mA. Pin 3 (ignición) sin conectar.', @@ -62,27 +62,27 @@ Acta.render({ { tipo:'medida', txt:'Corriente de la fuente', esperado:'< 50 mA (sin ventilador)', u:'mA' }, { tipo:'medida', txt:'P6 pin 1 — 5V_FAN (contra TP6)', esperado:'4.9 – 5.1 V', u:'V' }, { tipo:'check', txt:'U2 (buck) frío o tibio.' }, - { tipo:'nota', txt:'Si algún valor está fuera de rango: marca FALLA y no flashees la tarjeta.' }, + { tipo:'nota', txt:'Valor fuera de rango: FALLA; no se flashea.' }, ] }, { titulo: '5 · Flasheo por USB DFU (J11)', - sub: 'Solo tarjetas que pasaron 1–4. Firmware: hbox-v5-bringup_0.1.1.bin @ 0x08000000.', + sub: 'Solo tarjetas que pasaron 1–4. Binario V5 vigente de Descargas, SHA-256 verificado, en 0x08000000.', items: [ - { tipo:'check', txt:'DFU: mantener SW2 (BOOT0), presionar y soltar SW1 (RESET), soltar SW2 → aparece "STM32 BOOTLOADER" (0483:DF11).' }, - { tipo:'check', txt:'Flasheado con STM32CubeProgrammer (o dfu-util): "download complete" + "verify successful".' }, + { tipo:'check', txt:'DFU: mantén SW2, pulsa y suelta SW1, suelta SW2 → STM32 BOOTLOADER (0483:DF11).' }, + { tipo:'check', txt:'Flasheado: "download complete" y "verify successful".' }, ] }, - { titulo: '5d · Verificación después del flasheo', - sub: 'Abre un terminal serie a 115200 baud y pulsa SW1 (RESET).', + { titulo: '5d · Verificación', + sub: 'Terminal serie a 115200 y pulsa SW1.', items: [ - { tipo:'check', txt:'D17 (LED azul) parpadea a 1 Hz.' }, - { tipo:'check', txt:'DB1 → DB4 se encienden en secuencia una vez.' }, - { tipo:'check', txt:'Aparece un puerto serie nuevo en la laptop.' }, - { tipo:'check', txt:'Encabezado hbox-v5-bringup 0.1.1 y al final >>> BOARD OK.' }, - { tipo:'texto', txt:'Reporte / observaciones (anota cualquier línea [FAIL] completa)', ph:'---- RESULT: 12 PASS / 0 FAIL ----' }, + { tipo:'check', txt:'D17 parpadea a 1 Hz.' }, + { tipo:'check', txt:'DB1 → DB4 en secuencia una vez.' }, + { tipo:'check', txt:'Puerto serie nuevo en la laptop.' }, + { tipo:'check', txt:'Encabezado hbox-v5-bringup con la versión flasheada y al final >>> BOARD OK.' }, + { tipo:'texto', txt:'Observaciones (líneas [FAIL] completas)', ph:'---- RESULT: 12 PASS / 0 FAIL ----' }, ] }, { titulo: '6 · Cierre', items: [ - { tipo:'check', txt:'Tarjeta etiquetada con su número de serie y fecha (cerca de MH4).' }, - { tipo:'check', txt:'Guardada en bolsa antiestática (las FALLA en bolsa aparte con la nota del punto que falló).' }, + { tipo:'check', txt:'Etiqueta con serie y fecha cerca de MH4.' }, + { tipo:'check', txt:'En bolsa antiestática (FALLA en bolsa aparte, con nota).' }, ] }, ] }); diff --git a/docs/git/git-guide-en.md b/docs/git/git-guide-en.md index 9517b27..2226dc1 100644 --- a/docs/git/git-guide-en.md +++ b/docs/git/git-guide-en.md @@ -1,5 +1,16 @@ +--- +title: "HBox_PCB — Guía Git para colaboradores externos (versión en inglés)" +tags: [project-drogheda, git, kicad, colaboradores, en] +date: 2026-09-15 +project: Project Drogheda +author: Helgen Technologies +--- + # HBox_PCB — Guide for External Collaborators +!!! note "Versión en inglés" + Versión en inglés — la versión en español es [Guía Git para colaboradores externos](guia-git-es.md). + **Project:** EinarBoard / HBOX watchdog (Helgen Technologies) **Repository:** KiCad hardware design files only **Contact:** Leo Rodríguez — leo@helgen.tech @@ -103,4 +114,12 @@ If your role is review rather than editing, do not modify files at all: open an ## 8. Questions -Anything unclear — ask before pushing. A five-minute question is cheaper than untangling a bad merge of a 1.5 MB board file. +Anything unclear — ask before pushing. A five-minute question is cheaper than untangling a bad merge of a 1.5 MB board file. + +--- + +## Historial de revisiones + +| Versión | Fecha | Autor | Cambios | +|---|---|---|---| +| 1.0 | 2026-09-15 | Helgen Technologies | Guide for external collaborators (English). | diff --git a/docs/git/guia-git-es.md b/docs/git/guia-git-es.md index 95d823e..05c5ccc 100644 --- a/docs/git/guia-git-es.md +++ b/docs/git/guia-git-es.md @@ -1,10 +1,18 @@ -# HBox_PCB — Guía para colaboradores externos - -**Proyecto:** EinarBoard / HBOX watchdog (Helgen Technologies) -**Repositorio:** únicamente archivos de diseño KiCad -**Contacto:** Leo Rodríguez — leo@helgen.tech - --- +title: "HBox_PCB — Guía Git para colaboradores externos" +tags: [project-drogheda, git, kicad, colaboradores] +date: 2026-09-15 +project: Project Drogheda +author: Helgen Technologies +--- + +# HBox_PCB — Guía Git para colaboradores externos + +[English version](git-guide-en.md). + +Proyecto: EinarBoard / HBOX watchdog (Helgen Technologies) +Repositorio: únicamente archivos de diseño KiCad +Contacto: Leo Rodríguez — leo@helgen.tech ## 1. Qué es este repositorio @@ -19,7 +27,7 @@ El historial completo de diseño en KiCad de la tarjeta HBOX watchdog, versiones ## 2. Obtener acceso 1. Pide a Helgen que te cree una cuenta en el servidor Git `git.helgen.online` y te dé acceso a `Helgen-Services/HBox_PCB`. -2. Entra a la interfaz web y agrega tu **llave pública SSH** en la configuración de tu cuenta. +2. Entra a la interfaz web y agrega tu llave pública SSH en la configuración de tu cuenta. 3. Ten en cuenta que SSH corre en el **puerto 222**, no en el 22. ## 3. Clonar @@ -54,8 +62,8 @@ git clone --depth 1 ssh://git@git.helgen.online:222/Helgen-Services/HBox_PCB.git Los `.kicad_sch` y `.kicad_pcb` de KiCad son archivos de texto únicos y grandes. Las ediciones concurrentes no se fusionan bien, así que: -1. **Una sola persona editando a la vez.** Avisa antes de empezar a editar y avisa cuando termines. -2. **Haz pull antes de abrir KiCad. Nunca hagas pull con el proyecto abierto en KiCad.** Cierra KiCad, haz pull, y vuelve a abrir. +1. Una sola persona editando a la vez. Avisa antes de empezar a editar y avisa cuando termines. +2. Haz pull antes de abrir KiCad. Nunca hagas pull con el proyecto abierto en KiCad. Cierra KiCad, haz pull, y vuelve a abrir. 3. **Nunca subas al repositorio:** - archivos de bloqueo (`~*.lck`) - respaldos (`*bak`, `*-bak*`, archivos de autoguardado) @@ -99,8 +107,14 @@ Helgen revisa y hace el merge. Nunca hagas force-push a `main`. ## 7. Retroalimentación de solo revisión (sin editar archivos) -Si tu papel es revisar en lugar de editar, no modifiques archivos: abre un **Issue** en la interfaz web. Refiérete a los componentes por su designador de referencia (`U25`, `C149`, `J12`…) y, cuando aplique, por el número de sección del Plan de Cobre (p. ej. "§8, grupo U25"). Las capturas de pantalla de KiCad son bienvenidas. +Si tu papel es revisar en lugar de editar, no modifiques archivos: abre un Issue en la interfaz web. Refiérete a los componentes por su designador de referencia (`U25`, `C149`, `J12`…) y, cuando aplique, por el número de sección del Plan de Cobre (p. ej. "§8, grupo U25"). Las capturas de pantalla de KiCad son bienvenidas. ## 8. Dudas -Cualquier cosa que no esté clara — pregunta antes de hacer push. Una pregunta de cinco minutos cuesta menos que desenredar un mal merge de un archivo de tarjeta de 1.5 MB. +Cualquier cosa que no esté clara — pregunta antes de hacer push. Una pregunta de cinco minutos cuesta menos que desenredar un mal merge de un archivo de tarjeta de 1.5 MB. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-15 | Guía para colaboradores externos. | diff --git a/docs/guia-ingeniero.md b/docs/guia-ingeniero.md new file mode 100644 index 0000000..d04fc02 --- /dev/null +++ b/docs/guia-ingeniero.md @@ -0,0 +1,63 @@ +--- +title: "Guía del ingeniero" +project: Project Drogheda +date: 2026-09-29 +version: "1.1" +tags: [project-drogheda, procedimientos, sitio, ingeniero] +--- + +# Guía del ingeniero + +Acceso: usuario y contraseña te los da Leo; cámbiala la primera vez en [Mi cuenta](cuenta.html). El sitio es interno: no compartas ligas ni descargas fuera de Helgen. + +## Reglas + +1. Antes de tocar una unidad, abre su [expediente](unidad.html) (H00xx o serie) y lee las actas anteriores. +2. Sigue el procedimiento completo y en orden. Una tarjeta o unidad que falla un paso no avanza al siguiente. +3. Al terminar, llena el acta del procedimiento. Sin acta, el trabajo no existe ([cómo se usan](actas/index.md)). +4. Anota toda medición fuera de rango con su valor, no solo "FALLA". +5. Si algo no cuadra con el documento (valor fuera de rango, paso imposible, la tarjeta no coincide), no improvises: detente, anótalo en Observaciones y avisa a Leo. +6. No edites procedimientos. Si un paso está mal, escríbele a Leo con la página, el número de paso, qué esperabas y qué encontraste. Las páginas se corrigen en el repositorio `Drogheda`; tú no tocas Git. + +## Qué abrir + +- [Producción](produccion/index.md): de la tarjeta nueva a la unidad lista para embarcar. +- [Taller](taller/index.md): unidad o tarjeta en la mesa. +- [Campo](campo/index.md): unidad en la máquina, envíos, recepciones y daños. +- [Tarjetas y hardware](hardware/index.md): pinout, hoja de datos, manuales por tarjeta. +- [Descargas](descargas/index.md): firmware por tarjeta y SHA-256. + +## Reglas que se rompen seguido + +Cada una vive en la página donde se aplica: + +- Firmware por tarjeta, nunca por número de versión; `superseded/` no se instala: [Descargas](descargas/index.md#firmware-del-hbox-que-binario-va-en-que-tarjeta). +- SHA-256 antes de flashear: [Descargas](descargas/index.md#verifica-el-sha-256). +- Credenciales del módem (APN, caster) nunca en un acta ni en el sitio: [Descargas](descargas/index.md#parametros-del-modem-4g-ntrip-master). +- Química del paquete = JP2: [Ensamble §2](procedimientos/v5-ensamble.md#2-tarjeta-sin-energia). +- JP5 solo en los extremos del bus RS-485: [Ethernet y serie](procedimientos/v5-prueba-ethernet-serie.md#conexion-en-la-instalacion). +- En banco, 5 V ≥ 5.2 V o paquete conectado: [Reglas de banco](procedimientos/diagnostico-banco.md#reglas-de-banco). +- En campo, nada se reinicia antes de capturar la evidencia: [Diagnóstico en campo](diagnostico/procedimiento-diagnostico-campo.md). +- En V5.5 no se apaga y prende la etapa RTK en batería "para ver si vuelve": el módem queda oscuro hasta RESET 4G o 24 V ([Módem en batería](procedimientos/prueba-bateria-modem.md#3-hallazgos-2527-sep)). + +## Anexo — publicar el sitio (Leo) + +```bash +cd ~/Documents/Claude/Projects/Drogheda/hbox-docs +./scripts/sync-docs.sh # copia desde el repo lo que está en la lista MAP (política de publicación) +mkdocs build --strict # tiene que terminar sin WARNING +./scripts/deploy.sh # rsync del sitio + backend al servidor +# nuevos tipos de acta: actualizar ACTAS_REPETIBLES en /etc/systemd/system/actas-hbox.service +# (ya incluye prueba-ethernet-serie en backend/actas-hbox.service y DESPLIEGUE.md), luego +# sudo systemctl daemon-reload && sudo systemctl restart actas-hbox +git add -A && git commit -m "docs: ..." && git push +``` + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión. | +| 1.1 | 2026-09-29 | Edición breve; recibe las reglas de la portada; la tabla por situación queda en las portadas de sección. | + +Versiones anteriores en git. diff --git a/docs/hardware/index.md b/docs/hardware/index.md new file mode 100644 index 0000000..7f10926 --- /dev/null +++ b/docs/hardware/index.md @@ -0,0 +1,28 @@ +--- +title: "Tarjetas y hardware" +--- + +# Tarjetas y hardware + +Estado, firmware y cómo reconocer cada tarjeta: [Manuales por tarjeta](../manuales/index.md). + +| Tarjeta | Documentos | +|---|---| +| V3 | [Manual](../manuales/manual-tarjeta-V3.md) · [Pinout](../montaje/pinout-arneses.md) · [BOM](../montaje/bom-split.md) · [Ensamble y QC](../montaje/guia-ensamble-qc.md) · [Guía de ensamble (PDF)](../montaje/assembly-guide.md) | +| V4 | [Manual](../manuales/manual-tarjeta-V4.md) · [Preparación y prueba](../procedimientos/v4-prueba-fw-0.5.6.md) | +| V5.5 | [Manual V5](../manuales/manual-tarjeta-V5.md) | +| V5.6 | [Manual V5 §9](../manuales/manual-tarjeta-V5.md) · [Hoja de datos](v56-datasheet.md) · [Pinout](v56-pinout.md) · [Layout](v56-layout-instrucciones.md) · [ECO](v56-eco.md) · [Cambios al esquemático](v56-cambios-esquematico.md) | +| v6 | [Manual](../manuales/manual-tarjeta-v6.md) · [Auditoría completa](v6-auditoria-completa.md) · [Cambios al esquemático](v6-cambios-esquematico.md) · [Revisión vs. lecciones V5.5](v6-revision-lecciones-v55.md) · [Mapa de pines](v6-pinmap.md) · [Auditoría pre-fab](v6-auditoria-prefab.md) ([inglés](v6-prefab-audit.md)) · [Plan de cobre](EinarBoard-v6_Plan-de-Cobre_ES.html) ([inglés](EinarBoard-v6_Copper-Plan_EN.html)) | + +## Por necesidad + +| Necesito | Página | +|---|---| +| Saber qué tarjeta tengo | [Manuales por tarjeta](../manuales/index.md) | +| Pin, puente o LED de V5.5/V5.6 | [Pinout V5.6](v56-pinout.md) · [Manual V5](../manuales/manual-tarjeta-V5.md) | +| Límites eléctricos, consumos, rieles | [Hoja de datos V5.6](v56-datasheet.md) | +| Qué cambió de V5.5 a V5.6 | [ECO V5.6](v56-eco.md) · [Cambios al esquemático](v56-cambios-esquematico.md) | +| Rutear la PCB V5.6 | [Instrucciones de layout](v56-layout-instrucciones.md) | +| Arneses de una V3 | [Pinout V3](../montaje/pinout-arneses.md) · [BOM V3](../montaje/bom-split.md) | +| El binario correcto | [Descargas](../descargas/index.md) | +| KiCad o el repositorio | [Guía Git](../git/guia-git-es.md) | diff --git a/docs/hardware/v56-cambios-esquematico.md b/docs/hardware/v56-cambios-esquematico.md new file mode 100644 index 0000000..63c5775 --- /dev/null +++ b/docs/hardware/v56-cambios-esquematico.md @@ -0,0 +1,254 @@ +--- +title: "EinarBoard V5.6 — Informe de cambios al esquemático" +tags: [project-drogheda, hardware, einarboard, v5.6, esquematico, eco, kicad] +date: 2026-09-28 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard V5.6 — Informe de cambios al esquemático + +!!! note "EinarBoard V5.6 (`hbox-watchdog-v5`), lote en pedido" + Esta tarjeta es la evolución de la V5.5 fabricada (STM32F411 a bordo + zócalos simpleRTK2B y 4G NTRIP Master). **No es la v6** (GNSS y 4G soldados a bordo, `hbox-watchdog-v6`, en diseño): la v6 tiene su propia sección en el sitio. Cuando este documento dice «copiado de v6» se refiere solo al origen de un valor de componente. + +Fecha: 2026-09-28 · Base: `hbox-watchdog-v5` (V5.5 as-fabbed, intacto) · Proyecto: `kicad/hbox-watchdog-v5.*` (la copia `-v56` de la mañana se fusionó en el proyecto v5 por la tarde, ver §9) · ECO implementada: `2026-09-27_Drogheda_EinarBoard-V5.6_ECO_ES_v1.0.md` secciones A, B, C, D3, E5, F · Autor: Helgen Technologies (elaborado con asistencia de Claude) · Estado: listo para revisión de Leo en KiCad; **no** se ha ejecutado *Update PCB from Schematic* ni se ha tocado el layout. + +## 0. Resumen + +| Ítem | Resultado | +|---|---| +| Proyecto V5.6 | `hbox-watchdog-v56.kicad_sch/.kicad_pro/.kicad_pcb/.kicad_prl/.kicad_dru` (copia de v5; `.kicad_pro/.kicad_prl` apuntan a los nombres v56). Librerías `sym-lib-table`/`fp-lib-table` sin cambio (ya incluían `Drogheda-v6`). | +| V5.5 as-fabbed | Byte-idéntico: SHA-256 de los 5 archivos `hbox-watchdog-v5.*` iguales antes y después (§7). | +| ERC (kicad-cli) | **1 error, 27 warnings — todos preexistentes** en V5.5 (línea base: 1 error, 33 warnings). La ECO no introduce ninguna violación. Detalle en §5. | +| Netlist | Exportada con kicad-cli (`_to_delete/v56-work-20260928/hbox-watchdog-v56-netlist.xml`). Diff pin-a-pin contra la netlist de V5.5: **58 diferencias, todas las previstas por la ECO, ninguna otra** (§4). | +| Refs nuevas | C119 C120 C121 C122 C123 C124 · R105 R106 R107 R108 R109 R110 R111 R112 · U18 · D19 · JP6 (17 componentes). | +| Refs con cambio de valor/símbolo | U7 · L7 · Cbst2 · Rcomp2 · Ccomp2 · Rfreq2 · C3 · C43 · RS1 · R50 · F1 · Dbk2 (DNP). | +| PCB | `hbox-watchdog-v56.kicad_pcb` es copia byte-a-byte de v5; los footprints nuevos entran con *Update PCB* (§8). | +| PDF | `03-Architecture-Hardware/hbox-watchdog-v56-schematic.pdf` (exportado con kicad-cli para revisión rápida). | + +Nombres del ECO → refdes reales asignados: `R_EN` → **R105** (10 k serie) + **R106** (100 k a GND) · `R_RSTM` → **R107** · `R_LEDM` → **R108** · `R_ONS` → **R109** (DNP) · `R_ASC` → **R110** (DNP) · `R_TAP` → **R111** · `R_ETHPD` → **R112** · `Cin U7` → **C119/C120** (22 µF 0805) + **C121** (10 µF 1206) · 22 µF extra en 3V3_MODEM → **C122** · `U4b` → **U18** · `D_J9` → **D19** · `JP_CUT` → **JP6** · 47 pF de COMP → **C123** · desacoplo de U18 → **C124**. (KiCad exige que la referencia termine en número, por eso no se usó «U4b».) + +## 1. Cambios en componentes existentes (antes → después) + +| Ref | V5.5 | V5.6 | LCSC | Nota | +|---|---|---|---|---| +| **U7** | MP1584EN, `Package_SO:SOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.29x3mm`, LCSC C15051 | **AP64350SP-13**, `Drogheda-v6:SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP` (mismo footprint que U20 de v6) | **C2071691** | Mismo UUID de símbolo que en v5 (`56a2435b-…`) → *Update PCB* sustituye el footprint en su sitio. Pinout nuevo: 1 BST, 2 VIN, 3 EN, 4 RT/CLK, 5 FB, 6 COMP, 7 GND, 8 SW, 9 EP. | +| U7 VIN | `SW_5V` (pines 2 y 7) | **`SYS5V`** (pin 2) | | El módem ya no cuelga de Q1/F1. `SW_5V` queda solo con C3, C40, MOD1.5, Q1.3, PF5 (verificado §4). | +| U7 EN | `SW_5V` | **`MODEM_EN_U7`** (R105 10 k desde `MODEM_EN`/PC3, R106 100 k a GND) | | Módem apagado con el MCU en reset/DFU. | +| Cbst2 | 10 nF (BST3↔SW3_NODE) | **100 nF** | C14663 | Cap de bootstrap del AP64350 (v6 usa 100 nF). | +| Rcomp2 | 40.2 k (COMP3→COMP3_C) | **14 k** | C22803 | Compensación copiada de U20 v6 (R116). | +| Ccomp2 | 2.2 nF (COMP3_C→GND) | **3.3 nF** | C1613 | Copiada de U20 v6 (C141). | +| Rfreq2 | 100 k (FREQ3→GND, pin FREQ del MP1584) | **200 k/1 %** (misma net `FREQ3`, ahora al pin 4 **RT/CLK**) | C25811 | Copiada de U20 v6 (R117). La net conserva el nombre `FREQ3`. | +| Dbk2 | SS34 (SW3_NODE→GND, diodo de recirculación) | SS34 DNP (`dnp yes`) | C8678 | El AP64350 es síncrono; se deja el footprint por si se vuelve al MP1584. | +| L7 | 10 µH/2 A, LCSC C17700171 | **4.7uH/4A** | **C17700167** | Sunlord MWSA0804S-4R7MT (misma familia 8.8×8.2 mm que la pieza actual; igual que L20 de v6). Footprint sin cambio. | +| C43 | 100uF/6.3V elco 6.3×7.7 (3V3_MODEM) | **220uF/16V polymer** | **C881921** | Lelon OVZ221M1CTR-0608, mismo can. | +| C3 | 47uF elco 6.3×7.7 (SW_5V) | **220uF/16V polymer** | **C881921** | | +| RS1 | 8mR/1% 1206 | **10mR/1%/1W** | **C105362** | Límite de entrada 2.5 A. | +| R50 | 825R/1% | **1.5k/1%** | **C22843** | I_chg 1.33 A. | +| F1 | PPTC 3A 1812 (C20627123) | **PPTC 4A/1812 low-R** | TBD | Solo nota: elegir ≥ 4 A hold / ≤ 20 mΩ (o 0 Ω + protección en Q1). Footprint 1812 sin cambio. | +| R53 | 499k | 499k (sin cambio) | | Decisión J3 del ECO. | +| RNTB | 10k | 10k (sin cambio) | | Solo BOM; depende de la química (D1). | +| R60/R61 | 100k / 31.6k | sin cambio | | FB 0.8 V → 3.33 V, igual en AP64350. | +| C40, C41 | 22 µF (SW_5V / 3V3_MODEM) | sin cambio | | Ver §6 (decisión pendiente sobre C40). | + +Cada componente tocado lleva una propiedad `Note` que empieza por «V5.6:» y la propiedad `LCSC` actualizada (mismo campo que ya usaba la BOM del proyecto). + +## 2. Componentes nuevos + +Colocados en la zona libre inferior-izquierda de la hoja A1 (x 80–205 mm, y 380–520 mm), en cuatro filas con un texto de cabecera «V5.6 ECO (2026-09-28)». Todo va por etiquetas locales (net labels), igual que el resto del esquemático, así que Leo puede moverlos a su bloque sin rehacer conexiones. + +| Ref | Valor | Footprint | LCSC | Conexión (pin 1 / pin 2) | ECO | +|---|---|---|---|---|---| +| C119 | 22uF | C_0805 | C86817 | SYS5V / GND — Cin de U7, < 3 mm de VIN | A | +| C120 | 22uF | C_0805 | C86817 | SYS5V / GND — Cin de U7 | A | +| C121 | 10uF/25V | C_1206 | C14860 | SYS5V / GND — Cin bulk de U7 | A | +| C122 | 22uF | C_0805 | C86817 | 3V3_MODEM / GND — segundo 22 µF de salida | A | +| C123 | 47pF | C_0603 | C1671 | COMP3 / GND — parte del lazo de compensación (v6 C142) | A | +| R105 | 10k | R_0603 | C25804 | MODEM_EN (PC3) / MODEM_EN_U7 | A/B | +| R106 | 100k | R_0603 | C103211 | MODEM_EN_U7 / GND | A/B | +| R107 | 1k | R_0603 | C14676 | MODEM_RST_MCU (PC1) / MODEM_RST | B | +| R108 | 10k | R_0603 | C25804 | MODEM_LED_MCU (PC2) / MODEM_LED | B | +| R109 | 10k DNP | R_0603 | C25804 | MODEM_ON_SLEEP (PC4) / XBEE_ONSLP (J8.3) | B | +| R110 | 10k DNP | R_0603 | C25804 | MODEM_ASSOC (PC5) / XBEE_ASSOC (J8.5) | B | +| R111 | 1k | R_0603 | C14676 | RTCM_TAP (PC7 = USART6_RX) / DOUT_4G | B | +| R112 | 100k | R_0603 | C103211 | ETH_RST / GND | F | +| U18 | TMP102 (`Sensor_Temperature:TMP102xxDRL`) | SOT-563 | C99269 | 1 SCL→I2C_SCL, 2 GND, 3 ALERT n/c, 4 **ADD0→3V3 (0x49)**, 5 V+→3V3, 6 SDA→I2C_SDA | D3 («U4b») | +| C124 | 100nF | C_0603 | C14663 | 3V3 / GND — desacoplo de U18 | D3 | +| D19 | USBLC6-2SC6 (`Power_Protection:USBLC6-2SC6`) | `Package_TO_SOT_SMD:SOT-23-6` | C7519 | 1,6 I/O1→USB_DM · 3,4 I/O2→USB_DP · 5 VBUS→USB_VBUS · 2 GND | E5 («D_J9») | +| JP6 | JP_CUT (`Jumper:SolderJumper_2_Open`) | `Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm` | — | MAIN5V / SYS5V, en paralelo con P11, abierto | F («JP_CUT») | + +Nets nuevas de señal (J8.3 y J8.5 estaban sin conexión; se les quitó la bandera *no-connect*): `XBEE_ONSLP` (J8.3 = XBee pin 13) y `XBEE_ASSOC` (J8.5 = XBee pin 15). + +## 3. Líneas al MCU (U16 STM32F411RET6) + +Se retiraron las banderas *no-connect* de PC1/PC2/PC3/PC4/PC5/PC7 y se colocó la etiqueta en el extremo del pin. + +| Pad | Pin | Net nueva | A través de | Destino | +|---|---|---|---|---| +| 9 | PC1 | `MODEM_RST_MCU` | R107 1 k | `MODEM_RST` (J7.5, SW4G1) | +| 10 | PC2 | `MODEM_LED_MCU` | R108 10 k | `MODEM_LED` (J8.8, antes de Rmled1) | +| 11 | PC3 | `MODEM_EN` | R105 10 k → `MODEM_EN_U7` (R106 100 k a GND) | U7 pin 3 EN | +| 24 | PC4 | `MODEM_ON_SLEEP` | R109 10 k DNP | `XBEE_ONSLP` (J8.3) | +| 25 | PC5 | `MODEM_ASSOC` | R110 10 k DNP | `XBEE_ASSOC` (J8.5) | +| 38 | PC7 (USART6_RX) | `RTCM_TAP` | R111 1 k | `DOUT_4G` (J7.2 → MOD1.17) | +| 50 | PA15 | `ETH_RST` (existente) | R112 100 k a GND | U11 W5500 pin 37 | + +## 4. Verificación por netlist (kicad-cli, `sch export netlist`) + +Diff pin-a-pin `v55-baseline.xml` → `hbox-watchdog-v56-netlist.xml`: **58 pines cambian, 0 cambios no previstos** (todos los demás ~1 300 nodos idénticos, incluido el resto de U16, MOD1, U6, U12, J7, J9…). + +| Net | Nodos en V5.6 | +|---|---| +| `MODEM_EN` | U16.11 (PC3), R105.1 | +| `MODEM_EN_U7` | U7.3 (EN), R105.2, R106.1 | +| `MODEM_RST_MCU` | U16.9 (PC1), R107.1 | +| `MODEM_RST` | J7.5, SW4G1.1, **R107.2** | +| `MODEM_LED_MCU` | U16.10 (PC2), R108.1 | +| `MODEM_LED` | J8.8, Rmled1.1, **R108.2** | +| `MODEM_ON_SLEEP` | U16.24 (PC4), R109.1 | +| `XBEE_ONSLP` | J8.3, R109.2 | +| `MODEM_ASSOC` | U16.25 (PC5), R110.1 | +| `XBEE_ASSOC` | J8.5, R110.2 | +| `RTCM_TAP` | U16.38 (PC7), R111.1 | +| `DOUT_4G` | J7.2, MOD1.17, **R111.2** | +| `ETH_RST` | U11.37, U16.50, **R112.1** | +| `SYS5V` | C101.1, D12.2, D6.1, F1.1, K1.2, P11.2, PF10.1, R2.2, U12.2, U12.7, **U7.2 (VIN)**, **C119.1, C120.1, C121.1**, **JP6.2** | +| `SW_5V` | C3.1, C40.1, MOD1.5, PF5.1, Q1.3 — **U7 ya no está** | +| `3V3_MODEM` | C41.1, C43.1, J7.1, J8.7, L7.2, R60.1, **C122.1** | +| `SW3_NODE` | U7.8 (SW), L7.1, Cbst2.2, Dbk2.1 (DNP) | +| `BST3` | U7.1 (BST), Cbst2.1 | +| `FB3` | U7.5 (FB), R60.2, R61.1 | +| `COMP3` | U7.6 (COMP), Rcomp2.1, **C123.1** | +| `COMP3_C` | Rcomp2.2, Ccomp2.1 | +| `FREQ3` | U7.4 (RT/CLK), Rfreq2.1 | +| `MAIN5V` | … P11.1, **JP6.1** (resto sin cambio) | +| `USB_DP` | J7.7, J9.A6, J9.B6, **D19.3, D19.4** | +| `USB_DM` | J7.8, J9.A7, J9.B7, **D19.1, D19.6** | +| `USB_VBUS` | J7.6, J9.A4/A9/B4/B9, **D19.5** | +| `I2C_SCL` / `I2C_SDA` | … U4.1/U4.6, **U18.1 / U18.6** | +| `3V3` | … **U18.4 (ADD0), U18.5, C124.1** | + +Volcado pad→net completo de todos los componentes nuevos y modificados: `kicad/_to_delete/v56-work-20260928/padnet-dump.txt`. + +## 5. ERC (kicad-cli, `hbox-watchdog-v56.kicad_sch`) + +**Resultado: 1 error, 27 avisos.** Línea base V5.5 (misma herramienta, antes de tocar nada): 1 error, 33 warnings. + +Preexistentes en V5.5 (no son de la ECO, se dejan tal cual): + +- **[error] Label not connected @ (50.8, 25.146)** — etiqueta `GND` suelta en la esquina superior izquierda. Existe igual en `hbox-watchdog-v5.kicad_sch`. +- [warning] Unconnected wire endpoint @ (201.676, 216.408). +- [warning] «Symbol … doesn't match copy in library» ×17 (SW_Push ×3, L ×4, Crystal ×4, AO4406A, STM32F411RETx, D, SP3485EN, AMS1117-3.3, RJ45_Hanrun…) y «not found in symbol library» ×6 (D_Zener_ANK, Q_PMOS_GDS, Q_NMOS_GSD ×2, Q_PMOS_GSD, PCF8574) — símbolos embebidos distintos de la librería global; sin efecto eléctrico. +- [warning] Footprint PhoenixContact_MC_1,5_3-G-3.5… not found ×2; footprint library `Connector_RJ45` no configurada ×1. + +Warnings que desaparecieron respecto a la línea base (limpieza colateral, sin efecto en la netlist): + +- 8× «A pin with a "no connection" flag is connected»: J7/J8 tenían banderas *no-connect* encima de pines que sí están conectados por etiqueta (J7.1–.8, J8.1, .6, .7, .8, .10). Se quitaron esas 10 banderas (más las 8 de los pines PC1–PC7/J8.3/J8.5 que ahora se usan). Los pines siguen conectados exactamente igual (diff de netlist = 0 en ellos). +- Los pines del símbolo `AP64350SP-13` en `Drogheda-v6.kicad_sym` son de tipo *unspecified*; en la copia embebida en `hbox-watchdog-v56.kicad_sch` se les asignó tipo (VIN/GND power_in, EN/FB input, SW power_out, resto passive) para que ERC no avise «Unspecified and Passive connected». La librería `Drogheda-v6.kicad_sym` no se tocó. + +## 6. Lo que no se hizo / decisiones abiertas + +1. **Compensación y frecuencia del AP64350 copiadas de v6 (U20)** — Rcomp2 14 k, Ccomp2 3.3 nF, C123 47 pF, Rfreq2 200 k, Cbst2 100 nF. En v6 esa red se diseñó para 3.8 V con Cout distinto; aquí la salida es 3.33 V con L = 4.7 µH y Cout ≈ 2×22 µF cerámico + 220 µF polímero (baja ESR). **Comprobar contra la tabla de aplicación del datasheet AP64350** (Diodes, «Typical Application» 3.3 V) antes de pedir; son 0603 y se cambian sin re-layout. +2. **C40 sigue en `SW_5V`.** El ECO dice «C40 pasa a ser Cin»; el brief de ejecución pedía *añadir* 2×22 µF + 10 µF con refs nuevas en SYS5V. Se hizo lo segundo (C119/C120/C121) y C40 se dejó en SW_5V como cerámico del riel del F9P. Si Leo prefiere el texto del ECO: marcar C40 DNP o moverlo a SYS5V en layout (una sola etiqueta). +3. **F1**: valor «PPTC 4A/1812 low-R», LCSC = `TBD`. Elegir la pieza (o 0 Ω) antes de la BOM. +4. **L7 LCSC C17700167** = Sunlord MWSA0804S-4R7MT (8.8×8.2 mm, Extended). La pieza actual (C17700171) es de la misma familia sobre el footprint `L_Bourns-SRU8028_8.0x8.0mm`; confirmar que el 4R7 tiene la misma huella (o cambiar por SRU8028-4R7Y). +5. **U12 (buck 3V3_ETH)** no se cambió (opcional J4 del ECO). +6. **RNTB / JP2** sin cambio (decisión de química D1 pendiente). +7. Serigrafía (SW4G1 = RESET MÓDEM, SW1 = RESET MCU, JP2 = F2) y toda la sección E de EMC son de PCB: no se tocaron. +8. Error ERC preexistente (etiqueta GND suelta en 50.8, 25.146) se dejó tal cual por estar fuera de la ECO; borrar esa etiqueta en KiCad cuesta un clic si se quiere ERC = 0 errores. + +## 7. Integridad de V5.5 + +El estado as-fabbed V5.5 quedó byte-idéntico: los cinco archivos `hbox-watchdog-v5.*` tienen el mismo SHA-256 antes y después del trabajo (hashes y respaldos intermedios en el anexo de trazabilidad, al final de la página). No se ejecutó `git` en la carpeta. + +## 8. Siguientes pasos para Leo / Michelle + +1. **Abrir `hbox-watchdog-v56.kicad_pro` en KiCad 10**, revisar el bloque U7 (x≈433–475, y≈185–210) y el bloque «V5.6 ECO» (x 70–210, y 362–530); mover los componentes nuevos junto a sus bloques si se quiere (todo es por etiquetas). Guardar → KiCad reescribe el archivo en formato canónico. +2. Opcional: borrar la etiqueta `GND` suelta en (50.8, 25.146) para ERC = 0 errores. +3. Revisar punto 6.1 (compensación AP64350) y 6.2 (C40); fijar F1 (6.3). +4. Update PCB from Schematic (F8) sobre `hbox-watchdog-v56.kicad_pcb`: sustituye U7 (mismo UUID, footprint `Drogheda-v6:SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP`, pinout distinto → hay que re-rutear el bloque) y añade 17 footprints nuevos (C119–C124, R105–R112, U18 SOT-563, D19 SOT-23-6, JP6). Dbk2, R109, R110 quedan DNP. +5. Layout (sección E del ECO + notas de A/D): + - U7: lazo Cin (C119/C120/C121) < 3 mm de VIN; BST (Cbst2) pegado a pines 1/8; C123/Rcomp2/Ccomp2 y Rfreq2 junto a pines 4/6 con retorno a GND corto; EP con vías térmicas. + - `SW_BAT` polígono ≥ 2 mm; `BAT_PLUS` ≥ 1.5 mm + vías; EP de U6 ≥ 9 vías térmicas. + - Divisor FB del ventilador (R20/R21) junto al pin 4 de U2; ESD DFU (D14/D15/D16) junto a J11; **D19 en J9**, en la salida de las líneas D+/D− del conector. + - Cristales ≤ 5 mm de sus ICs; costura de vías bajo MOD1. + - **U18** entre J7/J8 y el módem (fuente de calor); C124 al lado. + - JP6 junto a P11; R112 junto a U11 (pin 37); R107/R108 cerca de J7/J8; R111 cerca de J7.2. + - Serigrafía: `SW4G1 = RESET MÓDEM`, `SW1 = RESET MCU`, `JP2 = F2 (Li-ion / LFP)`, `JP6 = CUTOFF BYPASS (abierto)`. +6. DRC = 0 → auditoría pad-a-pad contra `board_v56.h` (PC1/PC2/PC3/PC4/PC5/PC7 según §3) → BOM/CPL → JLC. + +## 9. Addendum 28-sep (tarde) — decisiones cerradas y fusión en `hbox-watchdog-v5.*` + +Por decisión de Leo ya **no existe una copia `hbox-watchdog-v56.*`**: el esquemático de la ECO se fusionó en `hbox-watchdog-v5.kicad_sch` (255 instancias `(project …)` renombradas de vuelta a `hbox-watchdog-v5`; `.kicad_pcb/.kicad_pro` eran copias idénticas). El estado as-fabbed V5.5 queda en git (`git tag v5.5-as-fabbed` antes del commit) y una copia en `kicad/_to_delete/v56-work-20260928/hbox-watchdog-v5_as-fabbed-before-v56-merge.kicad_sch`. Los archivos `-v56` se movieron a la misma carpeta `_to_delete/`. + +Decisiones §6 cerradas y aplicadas en el esquemático (script por referencia, respaldos `08-merged-into-v5` y `09-before-chemistry`): + +| Ref | Antes | Ahora | LCSC | Razón | +|---|---|---|---|---| +| Rcomp2 | 14k (fila 5 V del datasheet, copiada de v6) | **9.1k** | C23260 (básica) | Fila 3.3 V del AP64350 (9.31k); fc ≈ 2.4 kHz con Cout ≈ 250 µF (2×22 µF + 220 µF polímero) | +| Ccomp2 | 3.3nF | **10nF** | C57112 (básica) | Con Cout 250 µF el cero a 5.3 kHz quedaba por encima del cruce → MF 25–40°; a 1.75 kHz → MF 55–70° | +| C123 | 47pF | **68pF** | C1680 | Fila 3.3 V; polo ≈ 260 kHz contra el rizado de 500 kHz | +| F1 | PPTC 3 A (C20627123) / «TBD» | **BSMD1812-400-12V** 4 A hold / 8 A trip, 25 mΩ máx | C18164540 | ≤ 60 mV a 2.5 A; hold ≈ 3 A a 45 °C; mismo 1812 | +| C40 | 22 µF en SW_5V | sin cambio | — | U7 ya tiene C119–C121 como Cin; C40 sigue desacoplando el F9P | +| L7 | — | C17700167 confirmado | — | Misma familia MWSA0804S, mismo encapsulado 8.8×8.2 → misma huella | +| **R55 (= RNTB)** | 10k/1% (C25804) | **5.6k/1%** | C23189 (básica) | Química **LFP-HT 26650**: ventana de carga +10…+60 °C con NTC B3380 en el paquete (P4.3) | +| **JP2** | `SolderJumper_3_Bridged12` «F2:Li-ion» | **`SolderJumper_3_Bridged23`** «F2:LFP (2-3)», huella `…_Bridged23_…` | — | F2 = bajo → flotación LiFePO4 del LTC4040. Símbolo Bridged23 añadido a `lib_symbols` (derivado del Bridged12: puente entre pads 2-3) | + +Pendiente de Leo: tamaño del lote; el paquete 26650 LFP-HT con NTC **B3380** (caja/BOM mecánica). Validación de banco en la primera tarjeta: escalón de carga 0→2 A en 3V3_MODEM (< 150 mV, sin oscilación); carga LFP a 45 °C en horno sin pausa NTC. + +## 10. Addendum 28-sep (noche) — hallazgos de la auditoría v6 aplicados a V5.6 + chequeo de stock JLC + +Fuente: `2026-09-28_EinarBoard-v6_Full-Audit` (E-02, H-01, A-03, H-02, H-02b, A-08, A-09) y un chequeo de stock de las 94 LCSC de la BOM V5.6 para 30 tarjetas (2 problemas, 92 OK). Respaldo previo: `_to_delete/v56-work-20260928/10-before-v6audit-fixes.kicad_sch`. + +| Ref | Antes | Ahora | LCSC | Razón | +|---|---|---|---|---| +| **R112** (ETH_RST → GND) | 100k | **4.7k** | C23162 (básica) | E-02: el W5500 tiene pull-up interno de 62–112 k en RSTn y PA15 arranca como JTDI con pull-up de 30–50 k → con 100 k el nodo queda en 2.75 V (ALTO). Con 4.7 k: 0.62 V peor caso (BAJO). 0.7 mA cuando el firmware lo pone en alto. | +| **U15** MAX3232ESE | huella `SOIC-16W_7.5x10.3mm` (campo obsoleto; la PCB V5.5 ya usa la angosta) | **`Package_SO:SOIC-16_3.9x9.9mm_P1.27mm`** | C15846 | H-01: el ESE es SO-16 angosto. Corregido en el esquemático para que *Update PCB* no cambie la huella buena de la PCB. (U13 PCF8574T sí es ancho: correcto.) | +| **R50** | 1.5k | **1.43k/1%** | C22840 | A-03: I_chg = 2000/R ±5 % → 1.316–1.483 A (con 1.5 k el mínimo es 1.254 A < 1.3 A). Mismo valor en v6 (comunalidad). | +| **U10** | C729142 (SC16IS762, **15 en stock**) | mismo valor SC16IS752IPW | **C57156** (2 670) | H-02: por debajo del mínimo de 20 de JLC. Pin-compatible, modo I²C idéntico, mitad de precio. | +| **R53** 499k | C131054 (**6 en stock**) | mismo valor | **C177479** (26 862) | H-02: fija el voltaje del boost de respaldo; sin ella no hay respaldo. | +| 100k ×9 (Rgs1, R87, R20, R56, Ren1, Rfreq1, R85…) y 100k/1% ×3 (R60, R52, R54) | C103211 (5 %, 702 en stock) / C14675 | mismos valores | **C25803** (1 %, básica, 10.8 M) | H-02b: 2.3× de cobertura para 30 tarjetas y una bobina Extended menos. | +| **U17** | AMS1117-3.3 (C6186) | **TLV1117LV33DCYR** (mismo SOT-223, pin 1 GND / 2 OUT / 3 IN) | C15578 | A-08: en batería LDO_IN = VSYS 4.60–4.99 V − D12 ≈ 4.25–4.65 V y el AMS1117 necesita ≈ 4.3 V (dropout 1.0–1.3 V) → 3V3 marginal justo en respaldo; Iq 5–11 mA vs 0.1 mA. Vin máx 5.5 V ≥ SD-15B 5.57 − D12. Comprobar ≥ 10 µF cerámico en 3V3 (C23 22 µF). | +| **C78** (VEH5V bulk) | 220uF/10V electrolítico 85 °C (C2827940) | **220 µF/16 V polímero** | C881921 | A-09: 2 000 h @ 85 °C ≈ 1 año en gabinete de puerto; mismo can 6.3×7.7. | + +No aplicados a V5.6 (decisión de Leo, o v6.1): A-11 (R56 a 3V3 → cargador OFF por defecto sin MCU; es un cambio de red), D-09 (100 k en la base de Q5), crystales Y1/Y3 HC-49 (E-03/D-02, V5.5 funciona en campo), A-13 (PFO al MCU: no hay pin libre en V5). + +Añadido (Ethernet, E-04, respaldo `11-before-eth-caps`): **C90** (TOCAP, U11.20) 10 µF → **4.7 µF** (C1779) y **C91** (1V2O, U11.22) 4.7 µF → **10 nF** (C1710, básica), ambos 0805 sin cambio de huella — valores que exige el datasheet W5500 v1.0.2 («must be connected to a 4.7uF / 10nF capacitor»). Y1/C95/C96 (E-03) se dejan: el diseño de referencia de WIZnet usa las mismas cargas de 18 pF; sólo verificar con frecuencímetro si el enlace falla. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-28 | Informe de la ECO aplicada al esquemático; addenda tarde (fusión en `hbox-watchdog-v5`, decisiones cerradas) y noche (hallazgos de la auditoría v6, stock JLC). | +| 1.1 | 2026-09-29 | Hashes, respaldos e incidentes de herramienta movidos al anexo de trazabilidad. Sin cambios técnicos. | + +??? note "Anexo técnico — trazabilidad" + **SHA-256 de V5.5 as-fabbed (antes = después):** + + ``` + 8e4d3a7ba7a209367c2dda2394ca7809b5b68078a388f74b8052ddda2aab518c hbox-watchdog-v5.kicad_dru + 6f7ca0e414cc2af321c4909ac3491ee71300f6fa61507e179a46e945eb5c39b0 hbox-watchdog-v5.kicad_pcb + 8f0158affbf93516649a1317572a687f330ad7f009cd4f4d8345324d8506c04c hbox-watchdog-v5.kicad_prl + 8253ad14bea362c534bdb0895477899863bd3c843173751b0af3d253448a8fe3 hbox-watchdog-v5.kicad_pro + 8926a7c0ec4785f9accaf6d005ae7a57b43099dd5d772b945782fdc3751c843f hbox-watchdog-v5.kicad_sch + ``` + + `hbox-watchdog-v56.kicad_sch` final: `08219316517f636564fd0ae0804a30213d10fbc048b6446dd61216b312f81d2e`. + + Respaldos intermedios. Respaldos de cada estado intermedio (nada se borró): `kicad/_to_delete/v56-work-20260928/` — `00-copied-from-v5`, `01-nc-removed-renamed`, `02-u7-replaced`, `03-values`, `04-new-parts`, `05-metadata`, `06-junction-nc-pintypes`, `07-final` (`.kicad_sch`), netlists `v55-baseline.xml`, `v6-reference.xml`, `step02/04/06.xml`, `hbox-watchdog-v56-netlist.xml`, y `padnet-dump.txt`. No se ejecutó `git` en la carpeta. + + **Notas de proceso (antes §6.9–6.10):** + + 9. Formato del archivo: las herramientas KiCad-MCP reescriben `hbox-watchdog-v56.kicad_sch` en formato compacto (una línea por elemento, 657 kB frente a 813 kB). Es válido para KiCad 10 (kicad-cli lo lee para ERC/netlist/PDF) y al guardar desde eeschema vuelve al formato canónico; solo afecta a la legibilidad del diff en git. Las 238 instancias `(project …)` se renombraron de `hbox-watchdog-v5` a `hbox-watchdog-v56` (lo que haría *Save As*). + 10. Incidente detectado y corregido durante el trabajo: la herramienta MCP `replace_schematic_component` eliminó la unión (junction) en (39.37, 76.2) — Rig2.1 quedaba sin `IGN_SENSE`. Se detectó con el diff de netlist, se restauró la junction con su UUID original y el diff final es limpio. La misma herramienta añadió 5 junctions en cruces de cables ya conectados (722.63,130.81 · 722.63,69.85 · 699.77,240.03 · 446.786,301.498 · 509.524,287.02); se verificó que no alteran ninguna net. + +## 11. Addendum 29-sep — correcciones para que *Update PCB* funcione en cualquier máquina + +| Problema | Corrección | +|---|---| +| JP2 apuntaba a `Jumper:SolderJumper-3_P1.3mm_Bridged23_RoundedPad1.0x1.5mm`, que **no existe** en la librería estándar de KiCad → *Update PCB* no podía cargar la huella. | Nueva huella de proyecto `Drogheda:SolderJumper-3_P1.3mm_Bridged23_RoundedPad1.0x1.5mm` (copia de la Bridged12 con el puente de cobre en 2-3 y `net_tie_pad_groups "2,3"`); JP2 la usa. | +| `sym-lib-table` tenía la ruta absoluta `/Users/leo/…/Drogheda-sym.kicad_sym` → en otra máquina la librería no aparece. | Ruta relativa `${KIPRJMOD}/Drogheda-sym.kicad_sym`. | +| P15/P16 con huella `…MC_1,5_3-G-3.5…_Vertical` (no existe) y J10 con el apodo `Connector_RJ45` (no configurado): en la PCB ya estaban `…_Horizontal` y `Connector_RJ:`. | Esquemático igualado a la PCB. | +| R85 (100 k, ETH_FREQ de U12) tenía LCSC `C15051` (el MP1584EN) — error de la sustitución masiva. | R85 → `C25803`. | + +Verificación: ERC 1 error / 28 avisos, todos preexistentes (ninguno de huella no encontrada en piezas nuevas); netlist contra V5.5 = exactamente los 65 pines previstos; *Update PCB* de prueba sobre una copia: las 19 huellas nuevas cargan, 0 sin resolver. diff --git a/docs/hardware/v56-datasheet.md b/docs/hardware/v56-datasheet.md new file mode 100644 index 0000000..7d8102a --- /dev/null +++ b/docs/hardware/v56-datasheet.md @@ -0,0 +1,346 @@ +--- +title: "EinarBoard V5.6 (HBOX V5) — Hoja de datos de ingeniería" +project: Project Drogheda +date: 2026-09-29 +version: "1.0" +status: BORRADOR para revisión de ingeniería — V5.6 con ECO aplicada en esquemático; PCB pendiente de *Update PCB* +tags: [project-drogheda, hardware, einarboard, v5.6, datasheet, hbox] +author: Helgen Technologies +--- + +# EinarBoard V5.6 (HBOX V5) — Hoja de datos de ingeniería + +!!! note "Alcance y fuentes" + Evolución de la V5.5 fabricada (STM32F411 a bordo + zócalos simpleRTK2B y 4G NTRIP Master). No es la v6 (GNSS y 4G soldados, `hbox-watchdog-v6`, en diseño); "copiado de v6" se refiere solo al origen de un valor de componente. Fuentes: netlist `kicad/_to_delete/v56-work-20260928/p5ntc-after.xml` (SHA-256 `45d3f034…8e42a7`, exportada de `kicad/hbox-watchdog-v5.kicad_sch` el 2026-09-28), `2026-09-28_Drogheda_EinarBoard-V5.6_Schematic-Change-Report_v1.0.md` (§1, §9, §10), `2026-09-27_Drogheda_EinarBoard-V5.6_ECO_ES_v1.0.md`, `04-Source-Code/firmware/hbox_v5_bringup/board_v5.h`, `hbox_v5_bringup.ino` 0.6.0 y `README.md`. Lo no verificado va marcado ``. + +## Resumen + +La EinarBoard V5.6 es la tarjeta portadora/watchdog del rastreador HBOX RTK. Lleva a bordo: + +- MCU STM32F411RET6 (LQFP-64, HSE 25 MHz, USB-C DFU/consola en J11). +- LTC4040, respaldo de batería 1S: límite de entrada 2.5 A, carga 1.4 A, boost de respaldo 4.79 V, umbral de falla de alimentación 4.44 V. Alimenta el riel `SYS5V`, que corta el interruptor P11. +- Zócalos para los módulos ArduSimple: simpleRTK2B (u-blox ZED-F9P, formato UNO, MOD1, en el riel `SW_5V` que controla el MCU) y 4G NTRIP Master (formato XBee, J7/J8, con buck propio AP64350 de 3.3 V que el MCU enciende con `MODEM_EN` y resetea con `MODEM_RST`). +- Periféricos: Ethernet W5500 (SPI2, RJ45 J10, sin PoE); puente UART doble SC16IS752 para RS-485 (P15) y RS-232 (P16); expansor PCF8574 para el medidor de batería de 4 LEDs y el LED RGB externo (P14); SHT40 (T/HR del aire); dos TMP102 (cargador @0x48, módem @0x49); NTC del paquete leída por el LTC4040 y el MCU; entrada de NTC de punto caliente (P12); buck del ventilador (24 V → 5 V, P6); relevador K1 de Modo B a prueba de fallas, que mantiene el tráfico GNSS → módem aunque el MCU muera. +- Entradas: 24 V del vehículo (P1, solo ventilador y lectura de ignición) y 5 V de una Mean Well SD-15B-05 externa (P2). + +V5.6 = V5.5 (15 pzas, JLC 22-ago-2026) + ECO 27/28-sep: riel del módem en `SYS5V` bajo control del MCU, cargador redimensionado para la SD-15B, straps de química LiFePO4 (LFP-HT 26650), sensores de temperatura de módem y cargador, ESD en J9, pull-down en `ETH_RST`, puente JP6 del corte, sin conector P5. Firmware: `hbox_v5_bringup` 0.6.0 (un binario para V5.5/V5.6; `MODEM_EN/RST`, derivación RTCM y `tcell` llegan en 0.6.x). + +## 1. Qué es + +| Ítem | Valor | Fuente | +|---|---|---| +| Nombre | **EinarBoard V5.6** — tarjeta portadora/watchdog del HBOX RTK (cuadro de título KiCad: *EINARBoard HBox*, Helgen Servicios Especializados) | netlist `title_block` | +| Proyecto KiCad | `03-Architecture-Hardware/kicad/hbox-watchdog-v5.*` (V5.5 y V5.6 comparten proyecto; V5.6 = ECO aplicada al esquemático el 28-sep; PCB pendiente de *Update PCB from Schematic*; etiqueta git `v5.5-as-fabbed` guarda el estado del lote anterior) | Informe de cambios §9 | +| MCU | U16 **STM32F411RET6** LQFP-64 soldado (ya no hay Blackpill en zócalo) · HSE Y3 25 MHz · LSE Y4 32.768 kHz · SYSCLK 96 MHz, USB 48 MHz | `board_v5.h`, `.ino` | +| Módulos en zócalo | **MOD1** simpleRTK2B (u-blox ZED-F9P, formato UNO) · **J7/J8** 4G NTRIP Master (formato XBee, paso 2.00 mm) | netlist | +| Firmware | `hbox_v5_bringup` **0.6.0** (`hbox-v5-bringup_0.6.0.bin`), consola USB CDC en J11 | `README.md` | +| Lote V5.5 | 15 pzas, JLCPCB 22-ago-2026 | FACTS / procedimiento v5 | +| Lote V5.6 | Por pedir (semana del 29-sep-2026); BOM 94 LCSC comprobados para 30 tarjetas | Informe §10 | +| Componentes / nets | 252 componentes · 237 nets en la netlist V5.6 | netlist | + +## 2. Diagrama de bloques + +`pymdownx.superfences` no tiene configurado el *custom fence* de Mermaid en `mkdocs.yml`, así que el diagrama va en texto. + +```text + P1 GX16-5 ──24V_IN──▶ D10 SMBJ33A (TVS) ─▶ Q10 IRFR5305 (polaridad) ──24V──▶ U2 MP1584EN ──5V_FAN──▶ P6 FAN (Q2 lado bajo, PA6) + │ pin 3 IGN_IN ──▶ Rig1 22k / (Rig2 22k ∥ Rigb1 3.3k) + D5 BAT54 ──IGN_SENSE──▶ PA5 + │ + P2 5V (SD-15B-05) ──VEH5V──▶ RS1 10 mΩ ──VIN_SW──▶ Q7 AO4406A (ideal diode, IGATE) ──▶ U6 LTC4040 ──MAIN5V──▶ P11 CUTOFF-SW / JP6 ──SYS5V──┐ + │ │ ▲ BAT_PLUS ◀── P4 paquete 1S (+NTC) │ + │ R7/R8 ÷2 ──5V_SENSE──▶ PA4 │ PFI 4.44 V (R51/R52) · boost 4.79 V (R53/R54) · I_chg 1.4 A (R50) · straps JP2/3/4 │ + │ │ + ├── SYS5V ──▶ F1 PPTC 4 A ──SW_IN──▶ Q1 AO3401A (gate ◀ Q5 ◀ PA1 PWR_CTRL) ──SW_5V──▶ MOD1.5 (simpleRTK2B) │ + ├── SYS5V ──▶ U7 AP64350 (EN ◀ PC3 MODEM_EN) ──3V3_MODEM──▶ J7.1/J8.7 (4G NTRIP Master) │ + ├── SYS5V ──▶ U12 MP1584EN ──3V3_ETH──▶ U11 W5500 + J10 RJ45 (siempre encendido) │ + ├── SYS5V ──▶ D12 ─┐ │ + │ J11 DFU_VBUS ──▶ D13 ─┴─LDO_IN──▶ U17 TLV1117LV33 ──3V3──▶ U16 MCU, U3/U4/U18/U10/U13/U14/U15, LEDs │ + └── SYS5V ──▶ K1 G5V-1 bobina (Q6 ◀ PB5 BYP_CTRL) ┘ + + Datos: MOD1 D0/D1 (F9P UART1) ◀──USART2 PA2/PA3──▶ U16 MOD1 D8 (F9P TX2) ──USART1_RX PA10──▶ U16 ──PA9──▶ K1 NO ─┐ + J7.2 DOUT_4G (RTCM del módem) ──▶ MOD1 D2 (F9P RX2) y ──R111──▶ PC7 USART6_RX (escucha) K1 NC ◀── F9P TX2 ─┴─DIN_4G──▶ J7.3 + I²C1 PB6/PB7: U3 SHT40 0x44 · U4 TMP102 0x48 · U18 TMP102 0x49 · U13 PCF8574 0x20 · U10 SC16IS752 0x4D + U10 ch A ──▶ U14 SP3485 ──▶ P15 RS-485 (JP5 120 Ω) U10 ch B ──▶ U15 MAX3232 ──▶ P16 RS-232 (H4 = mismo canal en TTL 3V3) + U13 P0–P3 ──▶ DB1–DB4 (medidor) · P4–P6 ──▶ P14 RGB externo · P7 libre (puente 0.5.6 a SW4G1 en V5.5/V4) + SPI2 PB12–PB15 + PC0 INT + PA15 RST ──▶ U11 W5500 + J11 USB-C ──▶ PA11/PA12 (DFU + consola CDC) J9 USB-C ──▶ J7.6/7/8 (USB de servicio del módem, D19 ESD) +``` + +## 3. Árbol de potencia + +| Riel | Origen | Regulador / paso | Valor | Alimenta | Notas | +|---|---|---|---|---|---| +| `24V_IN` → `24V` | P1.1 (vehículo 24 V nominal; ignición 12–24 V) | D10 SMBJ33A a GND, Q10 IRFR5305 (protección de polaridad, DzG1 BZX84C15 + Rrp1 10 k en compuerta) | 24 V | Solo U2 (ventilador) | El resto de la tarjeta **no** depende de 24 V | +| `5V_FAN` | `24V` | U2 MP1584EN (EN por Ren1 100 k / Ren2 20 k desde `24V`), L2 10 µH, Dbk1 SS34, FB R20 100 k / R21 19.1 k | ≈ 5.0 V (0.8 V × (1 + 100/19.1) = 4.99 V) | P6.1 ventilador; retorno conmutado por Q2 AO3400A (PA6) | JP1 (abierto) une `5V_FAN` con `VEH5V` — no cerrar | +| `VEH5V` | P2.1 (Mean Well SD-15B-05 externa, ajustada 5.2–5.4 V; unidades medidas 5.25–5.57 V) | C78 220 µF polímero + C30/C31 | 5.25–5.57 V | RS1, divisor PFI, R7/R8 (`5V_SENSE`), R55 (NTC bias), U6 VIN/OVSNS | Lección E-PFI: nunca trabajar el módem sin batería con menos de 5.2 V en P2 | +| `VIN_SW` | `VEH5V` | RS1 **10 mΩ** 1 W (límite de entrada LTC4040 = 25 mV / 10 mΩ = **2.5 A**) | — | Q7 AO4406A (diodo ideal, IGATE U6.15) | V5.5 tenía 8 mΩ (3.1 A > 3 A de la fuente → plegado) | +| `MAIN5V` (VSYS) | Q7 o boost de respaldo de U6 | **U6 LTC4040EUFD** · L6 2.2 µH/8 A · C32/C33/C34 (≥ 100 µF) | = VEH5V − caída, o **4.79 V** en respaldo (R53 499 k / R54 100 k) | P11.1, JP6.1, straps JP2/JP3/JP4 | **PFI 4.44 V** de caída (R51 270 k / R52 100 k); PFO en TP2 | +| `SYS5V` | `MAIN5V` a través de **P11 CUTOFF-SW** (o JP6 puenteado) | — | ≈ MAIN5V | F1/Q1 (etapa RTK), U7 (módem), U12 (Ethernet), D12→U17 (3V3), K1 bobina, R2 | Abrir P11 apaga todo salvo el LTC4040 y el cargador | +| `SW_IN` → `SW_5V` | `SYS5V` | **F1 PPTC BSMD1812-400-12V** (4 A hold / 8 A trip, ≤ 25 mΩ) → **Q1 AO3401A** (compuerta por Q5 ← R1 ← PA1 `PWR_CTRL`, R2 10 k pull-up = OFF por defecto) | ≈ 5.0 V con etapa ON | **MOD1.5** (simpleRTK2B) · C3 220 µF polímero + C40 22 µF | `PWR_CTRL` HIGH = etapa ON. Solo el F9P cuelga de aquí en V5.6 | +| `3V3_MODEM` | `SYS5V` (V5.5: `SW_5V`) | **U7 AP64350SP-13** · L7 4.7 µH/4 A · Cin C119/C120 22 µF + C121 10 µF · FB R60 100 k / R61 31.6 k · comp. Rcomp2 9.1 k / Ccomp2 10 nF / C123 68 pF · Rfreq2 200 k · Cbst2 100 nF · Dbk2 DNP | **3.33 V** (0.8 × (1 + 100/31.6)) | J7.1 / J8.7 (4G NTRIP Master) · C41 22 µF + C122 22 µF + C43 220 µF polímero | **EN = PC3 `MODEM_EN`** por R105 10 k, R106 100 k a GND → módem **apagado** con MCU en reset/DFU. Validar en banco: escalón 0→2 A < 150 mV sin oscilación (Informe §9) | +| `3V3_ETH` | `SYS5V` | **U12 MP1584EN** (EN = VIN: siempre encendido) · L8 10 µH/2 A · D11 SS34 · FB R87 100 k / R88 31.6 k | **3.33 V** (0.8 × (1 + 100/31.6)) | U11 W5500, J10 (TCT/RCT) | Sobrevive los ciclos de la etapa RTK; en batería el W5500 sigue alimentado (por eso R112 lo mantiene en reset) | +| `LDO_IN` → `3V3` | `SYS5V` por **D12** SS34 o `DFU_VBUS` (J11) por **D13** SS34 | **U17 TLV1117LV33** (SOT-223; V5.5: AMS1117-3.3) · C117 · C23/C80… | 3.3 V | MCU, sensores, U10/U13/U14/U15, LEDs, SW2, TP7, P14.1, H4.1, MOD1.2 (IOREF) | TLV1117LV: dropout bajo → 3V3 estable en respaldo (LDO_IN ≈ 4.25–4.65 V); Vin máx 5.5 V | +| `VDDA` | `3V3` | R104 + C109/C112 | 3.3 V | U16 VDDA (ADC) | — | +| `BAT_PLUS` | P4.1 | U6.23 BAT · L6 · C35 · R5/R6 ÷2 → `BAT_SENSE` PA0 | 1S: Li-ion 3.0–4.0 V (V5.5) / LFP 2.5–3.6 V (V5.6) | Boost de respaldo del LTC4040 | Ver §8 | +| `USB_VBUS` | J9 | D19 USBLC6-2SC6 | 5 V del portátil | J7.6 (USB de servicio del módem) | No alimenta la tarjeta | +| `DFU_VBUS` | J11 | D16 PESD5V0S1BA · D13 → `LDO_IN` | 5 V del portátil | Solo el 3V3 (MCU + sensores) | Con USB solo: W5500, módem y F9P sin energía | + +### 3.1 Cargador LTC4040 (U6) — parámetros + +| Parámetro | Valor V5.6 | Componentes | V5.5 | Fuente | +|---|---|---|---|---| +| Corriente de carga | **1.4 A** (2000 / 1430 ± 5 % → 1.32–1.48 A) | R50 **1.43 k** 1 % (PROG) | 2.42 A (825 Ω) | Informe §10 A-03 | +| Límite de entrada (SYSLIM) | **2.5 A** | RS1 **10 mΩ** 1 % 1 W | 3.1 A (8 mΩ) | Informe §1 | +| Umbral PFI (caída) | **4.44 V** (1.2 V × 3.7) | R51 270 k / R52 100 k | igual | README fw 0.2.1; netlist | +| Voltaje de respaldo (BSTFB = RSTFB) | **4.79 V** | R53 499 k / R54 100 k | igual | Informe §1 (R53 sin cambio) | +| Química / flotación | **LiFePO4 3.50 V** (F2=0, F1=0, F0=1) | JP2 **2-3** (`F2_SEL`→GND) · JP3 1-2 (F1→GND) · JP4 1-2 (F0→MAIN5V) | Li-ion 4.00 V (JP2 1-2) | Informe §9; Review-vs-V5.5 F6 | +| NTC de celda (propiedad del cargador) | Ventana de carga **+10…+60 °C** con NTC **B3380** en el paquete | R55 (RNTB) **5.6 k** 1 % de `VEH5V` a `NTC` (P4.3) | 10 k (Li-ion) | Informe §9 | +| Fin de carga | C/8 (interno LTC4040) | — | — | FACTS | +| CHGOFF | `CHRG_EN` PA8 (HIGH = carga OFF) · R56 100 k a GND | U6.4 | igual | `board_v5.h` | +| CHRG / FAULT | `CHRG_STAT` PB3 · `CHRG_FAULT` PB4, colector abierto, pull-ups R57/R58 100 k (LOW = cargando / falla) | U6.8 / U6.9 | igual | `board_v5.h` | +| BSTOFF / OVSNS / RST | GND / a `VEH5V` (OVP sin uso) / sin conectar | U6.5 / U6.16 / U6.11 | igual | netlist | +| Puntos de prueba | TP1 `CLPROG` (U6.3) · TP2 `PFO` (U6.20) | — | — | netlist | + +## 4. Mapa de pines del MCU (U16 STM32F411RET6, LQFP-64) + +Fuente: netlist V5.6 + `board_v5.h` (0.6.0). Los pines PC1/PC2/PC3/PC4/PC5/PC7 son nuevos en V5.6 y **aún no tienen `#define` en `board_v5.h`** (0.6.x). ADC = ADC1. + +| Pad | Pin | Net | Dirección / periférico | Función | Componentes | +|---|---|---|---|---|---| +| 1 | VBAT | `3V3` | — | Alimentación RTC | — | +| 2 | PC13 | `LED_C13` | OUT, activo bajo | LED azul D17 | R102 1 k a 3V3 | +| 3 / 4 | PC14 / PC15 | `LSE_IN` / `LSE_OUT` | OSC32 | Y4 32.768 kHz | C115 / C116 | +| 5 / 6 | PH0 / PH1 | `HSE_IN` / `HSE_OUT` | OSC | Y3 25 MHz | C113 / C114 | +| 7 | NRST | `NRST` | IN | Reset: SW1, P10, TP5 | C104 | +| 8 | PC0 | `ETH_INT` | IN | INT del W5500 (U11.36) | — | +| 9 | PC1 | `MODEM_RST_MCU` | OUT (open-drain, LOW = reset) | Reset del módem por MCU (**V5.6**) | R107 1 k → `MODEM_RST` (J7.5, SW4G1) | +| 10 | PC2 | `MODEM_LED_MCU` | IN | Lee el LED de asociación del módem (**V5.6**) | R108 10 k ← `MODEM_LED` (J8.8) | +| 11 | PC3 | `MODEM_EN` | OUT | Habilita U7 (riel del módem) (**V5.6**); pull-down R106 → OFF por defecto | R105 10 k → U7.3 | +| 13 | VDDA | `VDDA` | — | Referencia ADC | R104, C109, C112 | +| 14 | PA0 | `BAT_SENSE` | ADC1_IN0 | Voltaje del paquete ÷ 2 | R5 / R6 10 k, C5 | +| 15 | PA1 | `PWR_CTRL` | OUT (HIGH = etapa RTK ON) | Compuerta de Q1 vía R1 1 k / Q5 | R2 10 k pull-up = OFF | +| 16 | PA2 | `GNSS_TX` | USART2_TX | → MOD1.16 (F9P UART1 RX) | — | +| 17 | PA3 | `GNSS_RX` | USART2_RX | ← MOD1.15 (F9P UART1 TX), NMEA | — | +| 20 | PA4 | `5V_SENSE` | ADC1_IN4 | `VEH5V` ÷ 2 | R7 / R8 10 k, C7 | +| 21 | PA5 | `IGN_SENSE` | IN digital (INPUT_PULLDOWN) | Ignición 12–24 V | Rig1 22 k / Rig2 22 k ∥ Rigb1 3.3 k, D5 BAT54, C9 | +| 22 | PA6 | `FAN_PWM` | OUT (HIGH = ventilador ON) | Compuerta de Q2 | Rg1 | +| 23 | PA7 | — | — | Sin conectar | — | +| 24 | PC4 | `MODEM_ON_SLEEP` | IN (**V5.6**, DNP) | XBee ON/SLEEP (J8.3) | R109 10 k DNP | +| 25 | PC5 | `NTC_CELL` | ADC1_IN15 (**V5.6**) | NTC del paquete (`tcell`) | R113 100 k / R114 120 k / C125 10 nF desde P4.3 | +| 26 | PB0 | `EXT_LED` | OUT (HIGH = ON) | LED de panel D1 (P8) vía Q4 | Rled1 10 k | +| 27 | PB1 | `NTC_TEMP` | ADC1_IN9 | NTC de punto caliente (P12): 3V3 – R42 10 k – NTC – GND | C24 | +| 28 | PB2 | `BOOT1_STRAP` | strap | R99 10 k a GND — **no reutilizar** | — | +| 29 | PB10 | — | — | Sin conectar (tacómetro de ventilador, no usado) | — | +| 33 | PB12 | `ETH_CS` | SPI2_NSS (GPIO) | W5500 U11.32 | — | +| 34 | PB13 | `ETH_SCK` | SPI2_SCK | U11.33 | — | +| 35 | PB14 | `ETH_MISO` | SPI2_MISO (entrada, nunca manejar) | U11.34 | — | +| 36 | PB15 | `ETH_MOSI` | SPI2_MOSI | U11.35 | — | +| 37 | PC6 | — | — | Sin conectar (USART6_TX libre) | — | +| 38 | PC7 | `RTCM_TAP` | USART6_RX (**V5.6**, solo escucha) | Copia del flujo RTCM módem → F9P | R111 1 k ← `DOUT_4G` (J7.2 / MOD1.17) | +| 39 / 40 | PC8 / PC9 | — | — | Sin conectar | — | +| 41 | PA8 | `CHRG_EN` | OUT (HIGH = carga OFF) | LTC4040 CHGOFF | R56 100 k a GND | +| 42 | PA9 | `USART1_TX` | USART1_TX | → K1.10 (contacto NO) — inyección `$PHLG` en Modo B | — | +| 43 | PA10 | `USART1_RX` | USART1_RX | ← F9P TX2 (MOD1.23) / K1.1 (COM) — tap del uplink | Rdfu1 | +| 44 / 45 | PA11 / PA12 | `DFU_DM` / `DFU_DP` | USB_OTG_FS | J11 USB-C (DFU + consola CDC) | D15 / D14 PESD5V0S1BA | +| 46 / 49 | PA13 / PA14 | `SWDIO` / `SWCLK` | SWD | TP3 / TP4 | — | +| 50 | PA15 | `ETH_RST` | OUT (LOW = W5500 en reset) | U11.37 | R112 **4.7 k** a GND (**V5.6**) | +| 51–54 | PC10–PC12, PD2 | — | — | Sin conectar | — | +| 55 | PB3 | `CHRG_STAT` | IN (LOW = cargando) | U6.8 | R57 100 k pull-up | +| 56 | PB4 | `CHRG_FAULT` | IN (LOW = falla / pausa NTC) | U6.9 | R58 100 k pull-up | +| 57 | PB5 | `BYP_CTRL` | OUT (HIGH = K1 energizado) | Bobina de K1 vía R40 1 k / Q6 | LOW/reset = K1 NC = F9P → módem directo | +| 58 | PB6 | `I2C_SCL` | I2C1_SCL | Bus de sensores | R30 4.7 k | +| 59 | PB7 | `I2C_SDA` | I2C1_SDA | Bus de sensores | R31 4.7 k | +| 60 | BOOT0 | `BOOT0` | strap | SW2 a 3V3; R98 10 k a GND | — | +| 61 | PB8 | `SER_IRQ` | IN | ~IRQ del SC16IS752 (U10.15) | R81 10 k pull-up | +| 62 | PB9 | — | — | Sin conectar | — | +| 12, 18, 31, 47, 63 | VSS / VSSA | `GND` | — | — | — | +| 19, 32, 48, 64 | VDD | `3V3` | — | — | C105–C108 | +| 30 | VCAP1 | `VCAP1` | — | C111 | — | + +## 5. Mapa de direcciones I²C (I2C1, PB6/PB7, 100 kHz, pull-ups 4.7 k) + +| Dirección | Ref | Dispositivo | Función | Pin de dirección | Fuente | +|---|---|---|---|---|---| +| 0x20 | U13 | PCF8574 (SOIC-16W) | P0–P3 medidor DB1–DB4 (LOW = ON) · P4–P6 RGB R/G/B en P14 (LOW = ON) · P7 libre (en V5.5/V4: puente 0.5.6 → SW4G1) | A0–A2 = GND | `board_v5.h` | +| 0x44 | U3 | SHT40-AD1B | Temperatura y humedad del aire del gabinete (`tair`, `rh`) | fijo | `board_v5.h` | +| 0x48 | U4 | TMP102 (SOT-563) | Temperatura del cargador (`tbat`/`tchg`) — en V5.6 colocar junto a U6/L6 | ADD0 = GND | Informe §10 / FACTS | +| 0x49 | U18 | TMP102 (SOT-563) | Temperatura del módem — colocar entre J7/J8 y el módulo (**V5.6**) | ADD0 = 3V3 | Informe §2 | +| 0x4D | U10 | SC16IS752IPW (TSSOP-28) | UART dual: canal A → RS-485, canal B → RS-232/TTL; ~IRQ → PB8 | A1 = A0 = GND, pin 9 = VDD (modo I²C) | `board_v5.h` | + +## 6. Sensores de temperatura y humedad + +| Sensor | Ref / pin | Señal firmware | Qué mide | Rango útil | Fuente | +|---|---|---|---|---|---| +| SHT40 | U3 @0x44 | `tair`, `rh` | Aire dentro del gabinete | −40…+125 °C, 0–100 %RH | `.ino` leyenda | +| TMP102 | U4 @0x48 | `tbat` (0.6.0) / `tchg` (V5.6) | Cargador LTC4040 / bobina L6 | −40…+125 °C | Informe §10 | +| TMP102 | U18 @0x49 | (0.6.x) `tmodem` | Módem 4G | −40…+125 °C | Informe §2 | +| NTC del paquete | P4.3 → U6.17 (LTC4040) y PC5 ADC1_IN15 vía R113/R114/C125 | `tcell` (V5.6, 0.6.x) | Celda del paquete (NTC B3380 en LFP-HT) | Ventana de carga +10…+60 °C (hardware) | netlist; Informe §9 | +| NTC de punto caliente | P12.1 → PB1 ADC1_IN9 (3V3 – R42 10 k – NTC) | `tntc` (`n/c` = sin sonda) | Sonda opcional pegada al punto caliente (módem/batería) | — | `board_v5.h` | +| Sensor interno del MCU | ADC canal de temperatura | `tmcu` / `tc`, `tmax` | Silicio del F411 | — | `.ino` | +| *(eliminado)* | P5 TEMP_PROBE | — | Sonda externa I²C — **no existe en V5.6** | — | Informe §10 | + +## 7. Conectores, zócalos, puentes, botones y LEDs + +Pinout completo pin a pin (generado de la netlist): [Pinout de arneses y conectores V5.6](v56-pinout.md). + +### 7.1 Conectores + +| Ref | Tipo | Pines | Función | Notas | +|---|---|---|---|---| +| P1 | Phoenix MKDS 1.5 / 5 pos. 5.00 mm (GX16-5 en el gabinete) | 1 `24V_IN` · 2 `GND` · 3 `IGN_IN` · 4 `GND` · 5 n/c | Entrada de vehículo | Ignición cruda 12–24 V | +| P2 | JST-XH 2 | 1 `VEH5V` · 2 `GND` | 5 V de la SD-15B-05 | Calibre ≥ 3 A | +| P4 | JST-XH 3 | 1 `BAT_PLUS` · 2 `GND` · 3 `NTC` | Paquete 1S + NTC | V5.6: LFP-HT 26650, NTC B3380 | +| P6 | JST-XH 2 | 1 `5V_FAN` · 2 `FAN_RET` | Ventilador 5 V, 2 hilos | Q2 conmuta el retorno | +| P8 | JST-XH 2 | 1 `LED_A` · 2 `LED_K` | LED de panel (cableado en duro, PB0) | Sigue vivo aunque falle el I²C | +| P10 | JST-XH 2 | 1 `NRST` · 2 `GND` | Botón de reset externo | Solo resetea el MCU | +| P11 | JST-XH 2 | 1 `MAIN5V` · 2 `SYS5V` | Interruptor de corte | Abierto = tarjeta apagada (salvo LTC4040) | +| P12 | JST-XH 2 | 1 `NTC_TEMP` · 2 `GND` | NTC de punto caliente | Opcional | +| P14 | JST-XH 4 | 1 `3V3` · 2 `RGBR_K` · 3 `RGBG_K` · 4 `RGBB_K` | LED RGB externo, ánodo común | R89/R90/R91 120 Ω | +| P15 | Phoenix MC 1.5 / 3 pos. 3.5 mm | 1 `RS485_A` · 2 `RS485_B` · 3 `GND` | RS-485 semidúplex (U14 SP3485, canal A de U10) | JP5 = terminación 120 Ω (R82) | +| P16 | Phoenix MC 1.5 / 3 pos. 3.5 mm | 1 `RS232_TX` · 2 `RS232_RX` · 3 `GND` | RS-232 (U15 MAX3232, canal B de U10) | No usar junto con H4 | +| H4 | Header 2.54 mm × 4 | 1 `3V3` · 2 `SER_TXB` · 3 `SER_RXB` · 4 `GND` | Canal B en TTL 3V3 | Mismo canal que P16 | +| J11 | USB-C (GCT USB4085) | D+/D− → PA12/PA11, VBUS → D13 → 3V3 | DFU + consola | ESD D14/D15/D16 | +| J9 | USB-C (GCT USB4085) | D+/D−/VBUS → J7.7/J7.8/J7.6 | USB de servicio del módem | ESD D19 (V5.6). No alimenta la tarjeta | +| J10 | RJ45 HR911105A (magnéticas + LEDs) | TX± U11.1/2, RX± U11.5/6, LEDs LINK/ACT | Ethernet 10/100 | **Sin PoE** (pines 7/8 sin conectar) | +| MOD1 | Zócalo UNO hembra | 5 `SW_5V` · 2 `3V3` (IOREF) · 15/16 UART1 · 17 `DOUT_4G` · 23 `USART1_RX` · GND | simpleRTK2B | Resto sin conectar (indicación ArduSimple) | +| J7 / J8 | Zócalo XBee 2×10, paso 2.00 mm | Ver pinout | 4G NTRIP Master | J8 pad k = pin XBee 21−k | + +### 7.2 Puentes de soldadura + +| Ref | Default V5.6 | Función | Cuándo cambiarlo | +|---|---|---|---| +| **JP1** | Abierto | `5V_FAN` ↔ `VEH5V` | Nunca en producción (drenaría el riel de la SD-15B / respaldo) | +| **JP2** | **2-3** (`F2_SEL` → GND) = LFP | Strap F2 del LTC4040 | 1-2 (→ `MAIN5V`) = Li-ion 4.00 V. **Debe coincidir con la química del paquete y con R55** | +| **JP3** | 1-2 (`F1_SEL` → GND) = F1:0 | Strap F1 | No cambiar | +| **JP4** | 1-2 (`F0_SEL` → `MAIN5V`) = F0:1 | Strap F0 | No cambiar | +| **JP5** | Abierto | Terminación 120 Ω del RS-485 (R82 entre A y B) | Cerrar solo en el nodo terminal del bus | +| **JP6** | Abierto (**nuevo V5.6**) | Puentea P11 (`MAIN5V` ↔ `SYS5V`) | Cerrar solo en unidades sin interruptor de corte | + +### 7.3 Botones + +| Ref | Serigrafía | Acción | +|---|---|---| +| SW1 | RESET (MCU) | `NRST` a GND: reinicia solo el MCU (no el módem ni el F9P) | +| SW2 | BOOT0 | `BOOT0` a 3V3: mantener + pulsar SW1 → modo DFU (USB `0483:DF11`) | +| SW4G1 | RESET (módem) | `MODEM_RST` (J7.5) a GND: reinicia el 4G NTRIP Master. En V5.6 el MCU hace lo mismo por PC1/R107 | + +### 7.4 LEDs + +| Ref | Color / nombre | Control | Significado (fw 0.6.0) | +|---|---|---|---| +| D18 | Verde PWR | R103 1 k desde `3V3` | Hay 3.3 V (USB o SYS5V) | +| D17 | Azul **C13** | PC13, activo bajo | Parpadeo rápido: esperando consola USB (hasta 4 s); después lo maneja el firmware | +| DB1–DB4 | Medidor de batería | U13 P0–P3 (RB1–RB4 120 Ω) | Umbrales **3.60 / 3.75 / 3.90 / 3.97 V** (−0.10 V de histéresis) — calibrados para Li-ion | +| RGB externo (P14) | R/G/B ánodo común | U13 P4–P6 | Verde = RTK fix · Azul = etapa ON sin RTK · Magenta = etapa ON sin NMEA · Amarillo = en batería · Rojo = etapa OFF | +| D1 (P8) | LED de panel | PB0 → Q4 | Indicador de respaldo cableado en duro | +| D4G1 | LED del módem | J8.8 `MODEM_LED` → Rmled1 1 k | Asociación del 4G NTRIP Master (salida 1.8 V → tenue) | +| J10 LINK / ACT | Integrados en el RJ45 | U11.25 / U11.27 (R96/R97) | Enlace / actividad Ethernet | + +## 8. Valores máximos y rangos de operación + +| Parámetro | Mín | Típ | Máx | Nota / fuente | +|---|---|---|---|---| +| Entrada P1 `24V_IN` | 12 V (ignición) | 24 V | 28 V (U2 MP1584EN V_IN máx); TVS D10 SMBJ33A (V_RWM 33 V) | netlist; datasheet MP1584 | +| Ignición P1.3 | 12 V | 24 V | 24 V (divisor 22 k / 22 k ∥ 3.3 k → 2.8 V a 24 V; clamp BAT54 a 3V3) | Informe V3+V4 §obs-ign | +| Entrada P2 `VEH5V` | **5.2 V** (regla de banco sin batería) | 5.3 V | **5.5 V** (LTC4040 VIN operativo; U17 Vin máx 5.5 V − D12) | E-PFI; Informe §10 A-08 | +| Corriente de entrada P2 | — | — | 2.5 A (SYSLIM por RS1); fuente SD-15B-05 = 3 A | Informe §1 | +| Paquete P4 | 1S | LFP-HT 26650 (V5.6) / Li-ion 18650 1S4P ≈ 12 Ah (V5.5) | — | FACTS; Informe V3+V4 | +| Voltaje de celda (firmware) | Corte etapa **3.40 V**, rearme **3.70 V** o 5 V presente | — | Flotación 3.50 V (LFP) / 4.00 V (Li-ion) | `.ino` 0.4.0/0.6.0 | +| Corriente de carga | 1.32 A | 1.40 A | 1.48 A; inhibida con celda ≥ 45 °C (rearme < 40 °C) por firmware; ventana NTC +10…+60 °C por hardware | Informe §10; `.ino` `CHG_CELL_HOT_C` | +| Riel `3V3_MODEM` | — | 3.33 V | 3.5 A (AP64350) — el módem pide 1–2 A en ráfaga | Informe §1 | +| Riel `SW_5V` | — | 5.0 V | 4 A hold / 8 A trip (F1) | Informe §9 | +| Temperatura — corte térmico de la etapa (fw) | aviso 50 °C | — | corte a **60 °C** en `tbat`/`tntc`, rearme < 55 °C | `.ino` 0.4.0 | +| Temperatura — ventilador en batería (fw) | ON ≥ 48 °C | — | OFF ≤ 45 °C (termostato); con 24 V + ignición: 100 % | `.ino` 0.4.0 | +| Temperatura ambiente de operación de la tarjeta | −20 °C | — | +85 °C (rango de validación de los sensores en el autotest) | `.ino` `runTests` | +| USB J11 / J9 | 5 V | — | 5.5 V; ESD PESD5V0S1BA (J11) / USBLC6-2SC6 (J9) | netlist | +| Bus RS-485 | — | — | Terminación 120 Ω opcional (JP5); SP3485 ±7 V modo común (datasheet) | netlist | + +## 9. Interfaz de firmware (`hbox_v5_bringup` 0.6.0) + +| Ítem | Valor | +|---|---| +| Consola | USB CDC en **J11**, 115200 (el baud no importa en CDC), líneas CR+LF. Primera línea: `hbox_v5_bringup 0.6.0 built …`, luego `board=EinarBoard v5 (HBOX v5)` | +| Compilación | `arduino-cli` STM32duino 3.x, FQBN `GenF4:pnum=GENERIC_F411RETX,usb=CDCgen,xserial=generic,rtlib=nanofp`, `-DHSE_VALUE=25000000UL`; variante Ethernet de banco `-DENABLE_ETH=1` (0.6.0-eth); `-DENABLE_CHARGE=0` = cargador siempre OFF (0.5.x) | +| Flasheo | DFU por J11: SW2 pulsado → SW1 pulsar/soltar → soltar SW2 → `dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.6.0.bin` (o STM32CubeProgrammer, USB, `0x08000000`) | +| Modo por defecto | **AUTO** (flash byte `0x5A` = MANUAL): la etapa se enciende sola 3 s después de haber 5 V en P2; respaldo continuo en batería; reset del MCU al volver el 5 V tras ≥ 10 s de respaldo | +| Watchdog | IWDG 16 s | + +### 9.1 Teclas de consola (texto de ayuda `h`) + +| Tecla | Acción | +|---|---| +| `r` | Repetir autotest · `g` recorrido del medidor/RGB · `i` escaneo I²C · `s` STAT ahora · `t` `$PHLG` ahora · `l` leyenda · `v` puntos de medición · `h` ayuda | +| `P` + `Y` | Armar (10 s) y confirmar el encendido de la etapa RTK (requiere v5 > 4.5 V); `P` de nuevo = apagar | +| `n` | Monitor NMEA 20 s (fix 4 = RTK FIX) | +| `A` | AUTO / MANUAL (se guarda en flash) | +| `B` | Modo B on/off (K1 + `$PHLG` en banda) | +| `M` | Pulso `MODEM_RST` (V5.5/V4: por U13 P7 y el puente 0.5.6; V5.6: por PC1 en 0.6.x) | +| `R` | Reset del MCU por software | +| `C` | Veto del operador al cargador (el gobernador decide cuándo cargar) | +| `E` | Ethernet on/off (solo build `-DENABLE_ETH=1`) | + +### 9.2 Autotest (`---- TESTS ----`, se ejecuta al arrancar) + +| Prueba | PASS si | +|---|---| +| `CLOCK_HSE` | SYSCLK = 96 MHz, HSE listo, PLL desde HSE | +| `LSE_Y4` | LSERDY = 1 (Y4 32.768 kHz) | +| `I2C` ×4 | ACK de PCF8574 0x20, SHT40 0x44, TMP102 0x48, SC16IS752 0x4D (+ escaneo 0x08–0x77) | +| `TMP102` / `SHT40` | Lectura entre −20 y +85 °C | +| `SC16IS752` | Registro *scratchpad* lee lo escrito (sin *loopback* de canal todavía; previsto 0.6.1) | +| `GAUGE_WALK` | Visual: DB1→DB4 y luego R, G, B | +| `ADC` / `DIN` | Informativos: `vbat v5 ntc mcu` y `ign chrg fault ser_irq eth_int` | +| Resultado | `---- RESULT: n PASS / m FAIL ----` → `>>> BOARD OK` o `>>> BOARD CHECK FAILED` | + +### 9.3 Línea `STAT` (cada 5 s) + +`STAT up= vbat= v5=(ok|BAJO|no) ign= chrg= flt= tntc= tbat= tair= rh= tmcu= i2cerr= stack= modo= fan= rec= [LIMP] [backup=] [duty=…] carga=FASE [+CALIENTE][+OP] pin= ltc= cortes= modoB= relay= phlg_aire= v5min= vbatmin= bkp= mrst= [eth=… ip= lineas= bytes= drop= conn=] [t_on= nmea= bad= gga= sats= hdop= age= rtcm_age= sta= rtcm_last= sag5= sagb= flat= modem=]` + +Fases del gobernador de carga (`carga=`): `HOLDOFF` (< 120 s tras boot/STACK ON) · `NOTRUN` · `BATT` · `WAIT` (riel 4.90–5.05 V) · `PROVING n/30s` · `ON` · `SHED` · `COOLDOWN faltan s`. Umbrales: arranque ≥ 5.05 V estable 30 s, corte < 4.90 V (muestra rápida), enfriamiento 60 s → 30 min, celda ≥ 45 °C inhibe. + +### 9.4 Trama `$PHLG` (cada 10 s en consola, cada 30 s en banda; checksum XOR) + +Campos 1–24 (formato de flota v3.x, lo lee `htracker/retranslator.py`) + 25–29 (0.5.1, *append-only*): + +`fw, state, link, fix_q, sats, rx_count, vbat, v5v, tc, tmax, recoveries, limp, nmea_age_ms, reset, tair, rh, tbat, fan_rpm, fan_pwm, fan_fault, tntc, chg, cflt, rxbad, up_s, pwr(VEH|BATT), v5min, vbat_min, bkp_n` + +`state` = `BENCH | RUN | PWRCYC | SLEEP | DUTY` · `link` = `SRCH | DEGR | OK | LIMP` · `chg` = CHRG_STAT real del LTC4040 · `cflt` = CHRG_FAULT (1 con pausa NTC). Eventos en banda: `$PHEV,,,*CS`; identificación: `$PHID` (UID, fw, tarjeta, MAC) por Ethernet. + +## 10. Cambios V5.5 → V5.6 + +Fuente: Informe de cambios §1 (tabla antes → después), §2–§3 (partes y pines nuevos), §9 (decisiones cerradas 28-sep tarde) y §10 (hallazgos de la auditoría v6 aplicados 28-sep noche). + +| Área | V5.5 (as-fabbed 22-ago) | V5.6 | Refs | Motivo | +|---|---|---|---|---| +| Riel del módem | U7 MP1584EN desde `SW_5V` (tras F1/Q1), EN = VIN | **U7 AP64350SP-13** desde **`SYS5V`**, EN = **PC3 `MODEM_EN`** (R105 10 k, R106 100 k ↓) | U7, L7 4.7 µH/4 A, Cbst2 100 nF, Rcomp2 9.1 k, Ccomp2 10 nF, C123 68 pF, Rfreq2 200 k, C119/C120 22 µF, C121 10 µF, C122 22 µF, Dbk2 DNP | Módem oscuro en batería (MP1584 no arranca a 4.6 V); el MCU puede apagar/encender el módem | +| Control del módem | Solo SW4G1 (V4/V5.5 con puente 0.5.6 a U13 P7) | **PC1 `MODEM_RST`** (R107 1 k) · **PC2 `MODEM_LED`** (R108 10 k) · PC4 `XBEE_ONSLP` (R109 DNP) · **PC7 `RTCM_TAP`** USART6_RX (R111 1 k) | R107–R111 | Reset y diagnóstico del módem desde firmware; escucha de RTCM | +| Capacitores de riel | C3 47 µF elco, C43 100 µF/6.3 V elco, C78 220 µF/10 V elco 85 °C | **C3, C43, C78 = 220 µF/16 V polímero** (Lelon OVZ221M1CTR-0608, C881921) | C3, C43, C78 | Ráfagas LTE; vida a 85 °C en gabinete | +| Cargador | RS1 8 mΩ (3.1 A), R50 825 Ω (2.42 A) | **RS1 10 mΩ/1 W (2.5 A)**, **R50 1.43 k (1.40 A)** | RS1, R50 | La SD-15B (3 A) se plegaba (incidente 10-ago) | +| Química | Li-ion 4.00 V: JP2 1-2, R55 10 k | **LFP 3.50 V: JP2 2-3, R55 5.6 k** (NTC B3380, ventana +10…+60 °C) | JP2, R55 | Paquete LFP-HT 26650 para puertos a 45 °C | +| Fusible etapa | F1 PPTC 3 A (C20627123) | **F1 BSMD1812-400-12V** 4 A/8 A, 25 mΩ | F1 | Caída ≤ 60 mV a 2.5 A | +| Térmico | U4 TMP102 (posición V5.5), sonda externa P5 | **U4 junto a U6/L6 (cargador)**, **U18 TMP102 0x49 junto al módem** (+ C124), **NTC del paquete también a PC5** (R113 100 k / R114 120 k / C125 10 nF), **P5 eliminado** | U4, U18, C124, R113, R114, C125, P5 | Ver el calor donde ocurre; sin sonda externa | +| Ethernet | `ETH_RST` sin pull; C90 10 µF, C91 4.7 µF | **R112 4.7 k** `ETH_RST` → GND; **C90 4.7 µF**, **C91 10 nF** (datasheet W5500) | R112, C90, C91 | W5500 en reset mientras el MCU está en reset (130 mA en batería); valores de datasheet | +| USB módem | Sin ESD en J9 | **D19 USBLC6-2SC6** | D19 | Robustez | +| Corte | Solo P11 | **JP6** en paralelo con P11 (abierto) | JP6 | Unidades sin interruptor | +| LDO 3V3 | U17 AMS1117-3.3 | **U17 TLV1117LV33DCYR** (mismo SOT-223) | U17 | Dropout: 3V3 marginal en respaldo; Iq 0.1 mA | +| BOM / stock | U10 C729142 (15 en stock), R53 C131054 (6), 100 k C103211 | **U10 C57156**, **R53 C177479**, 100 k → **C25803** (1 %, básica) | U10, R53, ×12 | Stock JLC para 30 tarjetas | +| Huella | U15 `SOIC-16W` (campo obsoleto) | U15 **`SOIC-16_3.9x9.9mm`** (la PCB ya la usaba) | U15 | Evitar que *Update PCB* cambie la huella buena | +| Sin cambio (decisión) | R53 499 k (boost 4.79 V), C40 22 µF en `SW_5V`, U12, R60/R61, cristales HC-49, A-11 (R56), D-09, A-13 (PFO al MCU: sin pin libre) | — | — | Informe §6, §9, §10 | + +## 11. Pedido y BOM + +| Ítem | Dónde | +|---|---| +| BOM V5.6 (94 LCSC, verificados para 30 pzas el 28-sep) | Campo `LCSC` de cada componente en `kicad/hbox-watchdog-v5.kicad_sch` → exportar con `kicad-cli sch export bom` / plugin JLC; guía: `03-Architecture-Hardware/JLCPCB-Order-Guide.md` | +| BOM maestro del gabinete (módulos, fuente, paquete, cables) | `03-Architecture-Hardware/Drogheda-BOM-Maestro.xlsx`, `BOM-master.md`, `Assembly-BOM-Split.md` | +| Pendientes antes de pedir | *Update PCB* + re-ruteo del bloque U7 y 17 huellas nuevas · DRC 0 · auditoría pad-a-pad contra `board_v5.h`/0.6.x · **prueba de Ethernet en una V5.5** (nunca ejercitado en hardware real) · escalón de carga en `3V3_MODEM` · carga LFP a 45 °C sin pausa NTC (Informe §8–§9) | +| Esquemático PDF | `03-Architecture-Hardware/hbox-watchdog-v56-schematic.pdf` | +| Cristal Y2 | Valor en esquemático `1.8432MHz`, LCSC C2238 = X49SM36864MSD2SC-1 (**3.6864 MHz**, que es lo que dice `board_v5.h` y la serigrafía del cristal) | + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión (V5.6 con ECO en esquemático; PCB pendiente) | + +Ver también: [manual V5](../manuales/manual-tarjeta-V5.md) · [pinout V5.6](v56-pinout.md) · [informe de cambios](v56-cambios-esquematico.md) · [ECO](v56-eco.md) · [instrucciones de layout](v56-layout-instrucciones.md). diff --git a/docs/hardware/v56-eco.md b/docs/hardware/v56-eco.md new file mode 100644 index 0000000..e0c3bca --- /dev/null +++ b/docs/hardware/v56-eco.md @@ -0,0 +1,159 @@ +--- +title: "EinarBoard V5.6 — ECO (orden de cambio de ingeniería) para el siguiente lote" +tags: [project-drogheda, hardware, einarboard, v5.6, eco, requisitos] +date: 2026-09-27 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard V5.6 — ECO (orden de cambio de ingeniería) para el siguiente lote + +!!! note "EinarBoard V5.6 (`hbox-watchdog-v5`), lote en pedido" + Esta tarjeta es la evolución de la V5.5 fabricada (STM32F411 a bordo + zócalos simpleRTK2B y 4G NTRIP Master). **No es la v6** (GNSS y 4G soldados a bordo, `hbox-watchdog-v6`, en diseño): la v6 tiene su propia sección en el sitio. Cuando este documento dice «copiado de v6» se refiere solo al origen de un valor de componente. + +Fecha: 2026-09-27 · Base: `hbox-watchdog-v5` (V5.5, 15 pzas 22-ago, netlist verificada) · Autor: Helgen Technologies (elaborado con asistencia de Claude) para Leo / Michelle (PCB) · Estado: propuesta para aprobar antes de pedir esta semana. + +Documentos relacionados: [Informe de cambios al esquemático](v56-cambios-esquematico.md) (lo que se aplicó de esta ECO) · [Instrucciones de layout](v56-layout-instrucciones.md) · [Hoja de datos V5.6](v56-datasheet.md) · [Pinout V5.6](v56-pinout.md). + +Arquitectura que no cambia: simpleRTK2B en zócalo UNO (MOD1) + 4G NTRIP Master en zócalo XBee (J7/J8), STM32F411RET6, LTC4040 con paquete 1S4P, W5500, SC16IS752, mismo contorno 140×100 mm, mismo stackup S-G-P-S. + +## 0. Qué tiene que poder hacer la V5.6 que la V5.5 no puede + +| # | Requisito | Por qué la V5.5 no lo hace (evidencia de banco 26/27-sep) | +|---|---|---| +| R1 | **Ciclo de 10 min en batería**: apagar todo, despertar, registrar el módem, reportar, apagar | El módem no arranca en frío sobre el boost: F9P y módem arrancan juntos por Q1 sobre 4.6 V; U7 MP1584 (mín. 4.5 V) cae en UVLO con la ráfaga de arranque; el PMIC del módem aborta sin reintentar. Solo SW4G1 lo revive. | +| R2 | Control del módem desde el MCU: encender/apagar, resetear, saber si está vivo | `MODEM_RST` solo llega a SW4G1; `MODEM_LED` solo a D4G1; el MCU no ve nada del módem. | +| R3 | **Cargar la batería con la fuente SD-15B (3 A)** sin bucles de brown-out | `RS1` 8 mΩ → límite de entrada 3.1 A > 3 A de la fuente; `R50` 825 Ω → 2.4 A de carga. La fuente se pliega antes de que el LTC4040 recorte al cargador (incidente 10-ago; hoy lo tapa el gobernador 0.6.0 por firmware). | +| R4 | Gestión térmica en puertos a ~45 °C | Ventana de carga del LTC4040 con `RNTB` 10 k pausa en caliente a ~40–42 °C: el paquete no se llena de día. Cobre del boost (`SW_BAT` 0.3 mm) se calienta. Sin temperatura del módem en telemetría. | +| R5 | Lista EMC del segundo lote (auditoría 22-ago) | `SW_BAT` 0.3 mm, `BAT_PLUS` 0.3–0.5 mm, lazos Cin 5–8.5 mm, divisor FB del ventilador a 25 mm, ESD DFU a 41 mm de J11, J9 sin ESD. | + +## A. Alimentación del módem — riel propio con margen y enable desde el MCU (R1) + +| Cambio | Detalle | +|---|---| +| **U7: MP1584EN → AP64350SP-13** | Buck 3.5 A, **Vin 3.8–40 V** (UVLO 1 V por debajo del riel de batería, contra 0.1 V hoy), SO-8-EP (mismo tamaño que el MP1584, otro pinout → re-layout del bloque). LCSC **C2071691** (~US$0.90, 14 900 en stock). FB = 0.8 V igual que el MP1584 → **R60 100k / R61 31.6k se quedan** (3.33 V). | +| **Entrada de U7: de `SW_5V` a `SYS5V`** | El módem ya no cuelga de Q1 ni de F1: tiene su propio interruptor (EN). Sigue detrás de P11 (cable de corte) para que el corte físico siga apagando todo. Cin: 2 × 22 µF 0805 + 10 µF 1206 pegados a VIN (lazo < 3 mm). | +| **EN de U7 = `MODEM_EN` (MCU PC3, pad 11)** | 10 k en serie desde PC3; **100 k a GND** en el pin EN para que el módem esté APAGADO con el MCU en reset/DFU (mismo criterio que PWR_CTRL). | +| **Salida 3V3_MODEM** | 2 × 22 µF 0805 (C41 + 1 nuevo) + **C43 100 µF electrolítico → 220 µF/16 V polímero 6.3×7.7** (LCSC **C881921**, mismo can): las ráfagas LTE de 2 A las absorbe el condensador, no el riel. | +| **L7 10 µH/2 A → 4.7 µH, Isat ≥ 4 A**, misma huella 8×8 (Bourns SRU8028-4R7Y o equiv.) | Con 2 A de ráfaga el 10 µH/2 A satura. | +| **C3 47 µF electrolítico (SW_5V) → 220 µF/16 V polímero** (C881921) | Riel del F9P: más colchón al arrancar sobre el boost. | +| Opcional **R53 499k → 511k** (LCSC C188257) → boost 4.79 → **4.89 V** | LTC4040 permite 3.5–5.0 V (datasheet confirmada 27-sep). No es necesario con el AP64350; dejar 499k salvo que el banco muestre caídas. **No subir a 523k** (4.98 V, tolerancia del 0.8 V ±2.5 % roza el máximo). | +| Opcional U12 (buck 3V3_ETH, también MP1584 desde SYS5V) → AP64350 | Mismo problema de UVLO, pero Ethernet no se usa en batería. Solo si se quiere una sola referencia de buck. | + +**Secuencia que habilita esto (firmware V5.6):** despertar → `PWR_CTRL` alto (F9P arranca, riel se asienta) → 3–5 s → `MODEM_EN` alto (el módem arranca solo, sobre riel estable, con 1 V de margen de UVLO) → registro/NTRIP → reporte → `MODEM_EN` bajo → `PWR_CTRL` bajo. El módem se puede apagar y encender solo, sin tocar al F9P: eso es también el «reset duro del módem» que hoy no existe. + +## B. Líneas del módem al MCU (R2) + +Pines libres del F411 (netlist V5: pads sin conexión): PC1 (9), PC2 (10), PC3 (11), PC4 (24), PC5 (25), PC6 (37), PC7 (38), PC8–PC12, PD2, PB9, PB10, PA7. + +| Neta nueva | MCU | Desde | Resistencia | Uso | +|---|---|---|---|---| +| `MODEM_EN` | **PC3** (pad 11) | U7 EN | 10 k serie + 100 k a GND en EN | Encender/apagar el módem (A). | +| `MODEM_RST_MCU` | **PC1** (pad 9) | `MODEM_RST` (J7.5, con SW4G1 en paralelo) | **1 k** serie | MCU en open-drain: baja 500 ms = pulsar SW4G1. SW4G1 se queda. | +| `MODEM_LED_MCU` | **PC2** (pad 10) | `MODEM_LED` (J8.8, antes de Rmled1) | 10 k serie | Leer el patrón del LED del módem (fijo = arrancando, rápido = normal, lento = comandos, irregular = conectando) → «módem vivo» sin adivinar. D4G1 se queda. | +| `MODEM_ON_SLEEP` | **PC4** (pad 24) | J8.3 (XBee pin 13) | 10 k serie, DNP si el módulo no lo usa | Seguro barato: si ArduSimple saca ON/SLEEP, lo tenemos. | +| `MODEM_ASSOC` | **PC5** (pad 25) | J8.5 (XBee pin 15) | 10 k serie, DNP | Ídem (ASSOC). | +| `RTCM_TAP` | **PC7 = USART6_RX** (pad 38) | `DOUT_4G` (J7.2 → MOD1.17, TX del módem hacia el F9P) | **1 k** serie | El MCU cuenta bytes RTCM que el módem entrega al F9P: «módem registrado y NTRIP fluyendo» medido, no inferido. Solo escucha (entrada alta impedancia en paralelo con RX2 del F9P). | + +Todas son nets nuevas de señal 3.3 V, sin condensadores; ruteo corto por Top/In2. `MODEM_RST` y `MODEM_LED` ya existen como nets: solo se les cuelga la resistencia hacia el MCU. + +## C. Cargador con la SD-15B (R3) + +| Cambio | Valor | Efecto | +|---|---|---| +| **RS1 8 mΩ → 10 mΩ** 1206 1 W 1 % (LCSC **C105362**, FMF06FTHR010) | Límite de entrada 25 mV / 10 mΩ = **2.5 A** | Queda por debajo de los 3 A de la fuente: el LTC4040 recorta al cargador antes de que la SD-15B se pliegue. Fin del bucle 10-ago por hardware; el gobernador 0.6.0 queda como segunda capa. | +| **R50 825 Ω → 1.5 kΩ** 0603 1 % (LCSC **C22843**, básica) | I_chg = 2000 / 1500 = **1.33 A** | 12 Ah se llena en un turno (~9 h desde vacío) sin pedirle 2.4 A a una fuente de 3 A que además alimenta la etapa. El safety timer (4.25 h Li-ion) se rearma por firmware (pulso 0.6.0). | +| P2 / SD-15B | Sin cambio (5.3 V) | Con 2.5 A de límite y 1.33 A de carga, la fuente ya no se satura ni con ráfaga LTE. | + +## D. Temperatura (R4) + +| Cambio | Detalle | Decisión de Leo | +|---|---|---| +| **D1 — Ventana de carga del LTC4040 (`RNTB`)** | Con `RNTB` 10 k y NTC 10 k B3380/B3950 el LTC4040 **pausa la carga por encima de ~40–42 °C** (umbral caliente 34.9 % de Vin). En puerto a 45 °C el paquete no se llena de día. Dos caminos: (a) paquete **LiFePO4 alta temperatura 26650** (carga 0…+60 °C, ≥2000 ciclos) + `JP2` puenteado 2-3 (F2 bajo = LFP, flotación 3.50 V) + **`RNTB` 5.6 k con NTC B3380** (ventana +10…+60 °C); **(b)** seguir con Li-ion 18650 y aceptar la pausa (o `RNTB` 6.6 k = pausa a 55 °C, que castiga la celda). | Hay que decidir la química: la PCB no cambia (JP2 es puente de soldadura, RNTB es valor de BOM), pero el paquete 26650 cambia caja y BOM mecánica. Recomendación: (a). Si no se decide esta semana, pedir la PCB igual y fijar RNTB/JP2 en ensamble. | +| **D2 — Cobre del boost** (= EMC #1 y #2) | `SW_BAT` ≥ 2 mm polígono, `BAT_PLUS` ≥ 1.5 mm + granja de vías, EP de U6 con ≥ 9 vías térmicas a In1. | Obligatorio. | +| **D3 — Sensor de temperatura del módem: U4b TMP102 (0x49)** | Segundo TMP102 SOT-563 (misma pieza que U4), ADD0 a 3V3 → dirección 0x49, colocado entre J7/J8 y el módem. El módem es la fuente de calor que sube con la ráfaga LTE; hoy `tair` (SHT40) está en la tarjeta, lejos. | Recomendado (US$0.50). Firmware: campo nuevo en `$PHLG` (append). | +| **D4 — Ventilador** | Sin cambio de hardware (2 hilos, Q2 en PA6 = TIM3_CH1: el PWM real es firmware). El buck del ventilador U2 es solo de 24 V: en batería no hay ventilador — con el ciclo de 10 min el calor en batería es bajo. | Firmware. | +| **D5 — `P12` NTC (PB1)** | Dos tarjetas con termistor conectado leen `n/c` (pendiente desde 19-sep). Antes de rediseñar, medir V en P12-1 con el NTC puesto; si el divisor R(10k a 3V3) está bien, es cable/conector. | Verificar en banco antes del pedido. | + +## E. Lista EMC del segundo lote (auditoría 22-ago) (R5) + +1. 🔴 `SW_BAT` U6-SW → L6: polígono ≥ 2 mm F.Cu (hoy 0.3 mm × 15 mm, ~4 A en respaldo). +2. 🔴 `BAT_PLUS` últimos 20 mm a U6: ≥ 1.5 mm + vías (hoy 0.3–0.5 mm). +3. 🟠 Divisor FB del buck del ventilador (R20/R21) al pin 4 de U2 (hoy a 25 mm, `FB_FAN` 60 mm y rozando `SW_FAN`). +4. 🟠 Lazos Cin de los bucks < 3 mm (U2→C11 6.3, U7→Cin nuevo, U12→C101 8.5). +5. 🟠 ESD DFU D14/D15/D16 junto a J11 (hoy a 41 mm, en el MCU). **J9 (USB del módem): añadir USBLC6-2SC6** en el conector. +6. 🟡 Cristales ≤ 5 mm de sus ICs (Y2 del SC16IS752, Y3/Y4 del MCU); par RX Ethernet acoplado; rellenar las 8 celdas de 20 mm sin vías de costura (bajo MOD1). + +## F. Varios de robustez (hallazgos 26/27-sep) + +| Cambio | Por qué | +|---|---| +| **F1 PPTC 3 A 1812 → PPTC de menor resistencia** (≥ 4 A hold, ≤ 20 mΩ, p. ej. 1812 6 A) o **0 Ω + protección en Q1** | Con 3 A de hold el PPTC mete 50–100 mΩ en serie con el riel del F9P: 100–200 mV de caída en cada ráfaga, justo sobre el boost. El módem ya no pasa por F1 (A). | +| **P11 con puente de soldadura en paralelo** (`JP_CUT`, abierto por defecto) | Unidades sin cable de corte no dependen de un puente volante en el JST. | +| Serigrafía: `SW4G1 = RESET MÓDEM`, `SW1 = RESET MCU`, `JP2 = F2 (Li-ion / LFP)` | Confusiones de banco esta semana. | +| `ETH_RST` (PA15) con **pull-down 100 k** | Hoy flota cuando el MCU está en reset: el W5500 sale de reset y gasta 130 mA en batería durante los ~4 s del reset. | + +## G. Tabla BOM delta + +| Ref | V5.5 | V5.6 | LCSC | Nota | +|---|---|---|---|---| +| U7 | MP1584EN | **AP64350SP-13** | C2071691 | SO-8-EP, re-layout | +| L7 | 10 µH/2 A SRU8028 | **4.7 µH ≥ 4 A**, huella 8×8 | (elegir en JLC DB) | | +| C43 | 100 µF/6.3 V elco | **220 µF/16 V polímero** 6.3×7.7 | C881921 | | +| C3 | 47 µF elco | **220 µF/16 V polímero** 6.3×7.7 | C881921 | | +| Cin U7 | C40 22 µF (en SW_5V) | 2 × 22 µF 0805 + 10 µF 1206 **en SYS5V** junto a U7 | C86817 (22 µF ya en BOM) | C40 pasa a ser Cin | +| R_EN | — | 10 k 0603 (PC3→EN) + 100 k 0603 (EN→GND) | básicas | | +| R_RSTM | — | 1 k 0603 (PC1→MODEM_RST) | básica | | +| R_LEDM | — | 10 k 0603 (MODEM_LED→PC2) | básica | | +| R_ONS, R_ASC | — | 10 k 0603 ×2 (J8.3→PC4, J8.5→PC5) | básicas, DNP | | +| R_TAP | — | 1 k 0603 (DOUT_4G→PC7) | básica | | +| R_ETHPD | — | 100 k 0603 (ETH_RST→GND) | básica | | +| RS1 | 8 mΩ 1206 | **10 mΩ 1206 1 W** | C105362 | | +| R50 | 825 Ω | **1.5 kΩ** | C22843 | | +| RNTB | 10 k | 10 k (Li-ion) / **5.6 k** (LFP B3380) | básica | ver D1 | +| R53 | 499k | 499k (opcional 511k) | C188257 | ver A | +| U4b | — | TMP102 SOT-563, ADD0→3V3 | = U4 | D3 | +| D_J9 | — | USBLC6-2SC6 | C7519 | E5 | +| F1 | PPTC 3 A 1812 | PPTC ≥ 4 A / ≤ 20 mΩ | (elegir) | F | +| JP_CUT | — | puente de soldadura 2 pads, abierto | — | F | + +## H. Firmware para V5.6 (0.7.0, sobre 0.6.0) — lo que desbloquea el hardware + +- `board_v56.h`: `PIN_MODEM_EN PC3`, `PIN_MODEM_RST PC1`, `PIN_MODEM_LED PC2`, `PIN_MODEM_ONSLP PC4`, `PIN_MODEM_ASSOC PC5`, `RTCM_TAP` = USART6 RX PC7. +- `ENABLE_DUTY 1` de fábrica en V5.6: ventana = `PWR_CTRL` → 4 s → `MODEM_EN` → registro (LED del módem en «rápido» o primeros bytes RTCM en PC7) → ≥ 2 `$PHLG` con `pwr=BATT` + fix fresco → `MODEM_EN` bajo → `PWR_CTRL` bajo → 10 min. Sin la ceguera actual: el fin de ventana lo decide `RTCM_TAP`/LED, no un temporizador. +- Módem oscuro en 24 V: `MODEM_RST` 500 ms; si no vuelve, `MODEM_EN` OFF 5 s / ON (reset de alimentación real, sin tocar al F9P). El «modem watch» 0.5.9 pasa de diagnóstico a acción con señales reales. +- Cargador: gobernador 0.6.0 sin cambios (con RS1/R50 nuevos casi nunca corta); umbral térmico de celda según química (Li-ion 45 °C / LFP 55–60 °C) y `SLEEP`/rearme por voltaje re-derivados si LFP (curva plana ~3.2 V). +- `$PHLG`: campos append `tmodem` (U4b), `rtcm_bps`, `modem_led`. + +## I. Validación del primer lote V5.6 (banco, 1 unidad, 1 día) + +1. Riel del módem: `3V3_MODEM` estable con `MODEM_EN`; osciloscopio en VIN de U7 durante el arranque del módem **en batería a 3.5 V**: sin caída bajo 3.8 V. Módem arranca 10/10 en batería (`P`+`Y` con 24 V quitado). +2. Ciclo 10 min en batería 20 ciclos seguidos (módem registra cada vez; `RTCM_TAP` cuenta bytes; posición en el monitor cada 10 min). +3. Carga: paquete a 3.4 V, 24 V con etapa ON: `ltc=CARGANDO`, corriente de entrada en P2 ≤ 2.5 A con ráfagas LTE (pinza), `cortes=0` en 2 h, safety timer rearma. +4. Térmico: cámara/horno a 45 °C: carga sigue (solo LFP+5.6 k); `tmodem` en `$PHLG`; ventilador por firmware. +5. EMC rápido: caída en `SW_BAT` a 2.5 A en respaldo < 50 mV; temperatura de L6/U6 en respaldo continuo 1 h. + +## J. Para pedir esta semana — lista de decisiones + +1. Química del paquete (D1): LFP-HT 26650 + JP2 2-3 + RNTB 5.6 k/B3380 — sí/no. (Afecta caja y BOM del paquete, no la PCB.) +2. Tamaño del lote V5.6 y si va con ensamble JLC (todo LCSC arriba) — partes «Extended» nuevas: AP64350, polímero 220 µF, RS1, USBLC6 (US$3 c/u de setup). +3. **R53** se queda en 499k (recomendado). +4. **U12 → AP64350** (opcional, uniformidad) — sí/no. +5. Congelar V5.5 como registro «as-fabbed»: copiar `hbox-watchdog-v5.*` → `hbox-watchdog-v55-PROD.*` (como se hizo con v3-PROD) y editar `hbox-watchdog-v5` como V5.6. + +## Orden de trabajo propuesto (esta semana) + +| Día | Quién | Qué | +|---|---|---| +| L | Leo | Decisiones J1–J5. Congelar V5.5. | +| L–M | Ingeniería (script con diff y respaldo) + Leo (revisión en KiCad) | Esquemático: bloque U7 nuevo (AP64350, Cin/Cout, EN), 7 resistencias y nets a PC1–PC5/PC7, U4b, D_J9, JP_CUT, valores RS1/R50/RNTB/C3/C43/L7/F1. ERC 0. | +| M–J | Michelle / Leo | PCB: re-layout bloque módem, polígonos SW_BAT/BAT_PLUS, mover FB del ventilador y ESD DFU, 7 pistas nuevas, costura. DRC 0. | +| J | Ingeniería | Auditoría pad-a-pad de la netlist V5.6 contra `board_v56.h` (como el 15-sep) + BOM/CPL. | +| V | Leo | Gerbers + BOM + CPL a JLC. | + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-27 | Propuesta de ECO (requisitos R1–R5, secciones A–J). | +| 1.1 | 2026-09-29 | Enlaces a los documentos que la implementan; sin cambios técnicos. Lo aplicado y las decisiones cerradas están en el informe de cambios §9–§10. | diff --git a/docs/hardware/v56-layout-instrucciones.md b/docs/hardware/v56-layout-instrucciones.md new file mode 100644 index 0000000..86dd87c --- /dev/null +++ b/docs/hardware/v56-layout-instrucciones.md @@ -0,0 +1,97 @@ +--- +title: "EinarBoard V5.6 — del esquemático a la PCB" +project: Project Drogheda +date: 2026-09-29 +tags: [project-drogheda, hardware, kicad, v5.6, layout] +--- + +# EinarBoard V5.6 — del esquemático a la PCB + +!!! note "EinarBoard V5.6 (`hbox-watchdog-v5`), lote en pedido" + Esta tarjeta es la evolución de la V5.5 fabricada (STM32F411 a bordo + zócalos simpleRTK2B y 4G NTRIP Master). **No es la v6** (GNSS y 4G soldados a bordo, `hbox-watchdog-v6`, en diseño): la v6 tiene su propia sección en el sitio. Cuando este documento dice «copiado de v6» se refiere solo al origen de un valor de componente. + +Para: Michelle (layout) y Leo (revisión). Proyecto KiCad: `03-Architecture-Hardware/kicad/hbox-watchdog-v5.kicad_pro` (KiCad 10). Ya **no existe** un proyecto `-v56`: la V5.6 se edita en el mismo proyecto; el estado fabricado V5.5 es el tag git `v5.5-as-fabbed`. + +Referencias: [Informe de cambios al esquemático](../hardware/v56-cambios-esquematico.md) (qué cambió y por qué, §1–§10) · [ECO V5.6](../hardware/v56-eco.md) (requisitos R1–R5, sección E de EMC) · [Hoja de datos V5.6](v56-datasheet.md) · [Pinout V5.6](v56-pinout.md). + +!!! warning "Reglas" + - Trabajar solo en `hbox-watchdog-v5.*`; no tocar `hbox-watchdog-v6.*` ni `v3`/`v4`. + - Commit en el submódulo `kicad` primero, luego el gitlink en el repo padre (guía Git del sitio). + - No ejecutar «Update footprints from library» ni marcar «Replace footprints with those specified in schematic» al actualizar la PCB: las huellas colocadas en la V5.5 son las correctas (RJ45, Phoenix, U15 angosto). + +## 1. Esquemático (Leo, 15 min) + +1. Abrir `hbox-watchdog-v5.kicad_pro` → eeschema → Guardar una vez (KiCad reescribe el archivo generado por script en formato canónico; el diff en git será grande, es normal). +2. ERC: se espera 1 error preexistente (etiqueta `GND` suelta en 50.8, 25.146 — borrarla deja 0 errores) y los mismos avisos de librería que la V5.5. Ningún aviso nuevo. +3. Revisar visualmente el bloque **U7** (x≈433–475, y≈185–210 mm) y el bloque **«V5.6 ECO (2026-09-28)»** (x 70–210, y 362–580 mm, 5 filas). Los componentes nuevos van por etiquetas: se pueden mover junto a su bloque sin rehacer conexiones. +4. Commit del `.kicad_sch`. + +## 2. Update PCB from Schematic (F8) + +Resultado esperado del diálogo (sin «replace footprints»): + +| Acción | Refs | +|---|---| +| Huella sustituida en su sitio (mismo UUID, pinout distinto → re-rutear) | **U7** → `Drogheda-v6:SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP` (AP64350) | +| Huella cambiada | **JP2** → `Drogheda:SolderJumper-3_P1.3mm_Bridged23_RoundedPad1.0x1.5mm` (huella del proyecto; puente en 2-3 = LFP) | +| Huellas nuevas (caen en el origen) | C119 C120 C121 C122 C123 C124 **C125** · R105 R106 R107 R108 R109(DNP) R110 ya no existe R111 R112 **R113 R114** · U18 (SOT-563) · D19 (SOT-23-6) · JP6 | +| Huella eliminada | **P5** (TEMP_PROBE, JST XH-4) | +| DNP (quedan en placa, sin pieza) | Dbk2, R109 | +| Sin cambio de huella, solo valor/LCSC | RS1, R50, R53, R55, R112, U10, U15 (campo corregido = huella ya colocada), U17, C3, C43, C78, C90, C91, L7, F1, Cbst2, Rcomp2, Ccomp2, Rfreq2, Y2 | + +Antes de F8: hacer `git pull` del repositorio HBox_PCB (trae la huella de JP2 y la tabla de librerías corregida). El log de F8 no debe mostrar «footprint not found»; si aparece, la copia local está desactualizada. + +## 3. Layout — en este orden + +**A. Térmico del LTC4040 (bloqueante, lección F5)** + +1. `SW_BAT` (U6.21/22 → L6.1): polígono en F.Cu **≥ 2 mm**, sin cuellos de 0.3 mm más allá del abanico de los pines. +2. `BAT_PLUS` (P4 → L6.2 → U6.23): **≥ 1.5 mm** + ≥ 4 vías por cambio de capa; sensado del pin 23 como Kelvin desde L6.2/C35. +3. **EP de U6: ≥ 9 vías** 0.3/0.6 mm (3×3, paso 0.9×1.2 mm), conexión sólida a la zona. +4. L6 a ≤ 5 mm de U6; C30/C31 ≤ 3 mm del pin 6; C32/C33/C34 ≤ 2 mm de los pines 1/24. +5. **U4 (TMP102, 0x48) se mueve** desde junto al MCU a **≤ 5 mm del EP de U6**, entre U6 y L6 = sensor del cargador (`tchg`). C124 no es su desacoplo (es de U18): usar el 100 nF que ya tiene U4. +6. In1/In2 sólidos ≥ 5 mm alrededor de U6/L6 (mover `VFB_BST`, `IGATE`, `CHRG_*` de In1). + +**B. Bloque U7 (AP64350, módem)** + +7. Re-rutear: Cin **C119/C120/C121 < 3 mm** del pin 2 (VIN) con GND al EP; **Cbst2** pegado a pines 1/8; **C123/Rcomp2/Ccomp2** y **Rfreq2** junto a pines 4/6 con retorno a GND corto; EP con vías; L7 ≤ 5 mm del pin 8 (SW); `SW3_NODE` ≤ 25 mm². +8. R60/R61 (FB) ≤ 3 mm del pin 5, lejos del pin 8. +9. **C3 y C43** (220 µF polímero, mismo can 6.3×7.7) en su sitio; C122 (22 µF) junto a C43 en 3V3_MODEM. + +C. Piezas nuevas + +10. **U18 + C124** entre J7/J8 y el módem (fuente de calor). SOT-563: revisar orientación en 3D. +11. **D19** en la salida D+/D− de **J9** (flow-through), ≤ 3 mm de cobre, vía a GND ≤ 1 mm. +12. **R112 (4.7 k)** junto a U11 pin 37. **R107/R108** cerca de J7/J8; **R111** cerca de J7.2; **R105/R106** junto a U7 pin 3. +13. **R113/R114/C125** (divisor NTC → PC5) junto a P4/R55, pista corta a U16 pin 25. +14. **JP6** junto a P11 (silk «CUTOFF BYPASS — abierto»). +15. **P5 fuera**: liberar el área; no dejar pads huérfanos. + +D. EMC (sección E de la ECO) + +16. Divisor FB del ventilador (R20/R21) junto al pin 4 de U2; ESD DFU (D14/D15/D16) en línea con J11; cristales ≤ 5 mm de sus ICs; costura de vías bajo MOD1 y en cada isla de GND ≥ 20 mm²; ninguna celda de 20×20 mm sin vía de GND. +17. Cin de cada regulador (U2, U12, U7) con lazo < 3 mm. + +E. Serigrafía + +18. `SW4G1 = RESET MÓDEM`, `SW1 = RESET MCU`, `SW2 = BOOT0 (DFU)`, `JP2 = QUÍMICA 1-2 Li-ion / 2-3 LFP`, `JP5 = TERM RS-485`, `JP6 = CUTOFF BYPASS`, nombre de función en cada conector (P15 RS-485 A/B/G, P16 RS-232 TX/RX/G, J10 ETH sin PoE). Textos ≥ 0.8 mm / 0.15 mm. + +## 4. Salida + +19. Rellenar zonas → **DRC = 0 errores**; anchos: ningún aviso en `SW_BAT`, `BAT_PLUS`, `MAIN5V`, `SYS5V`. +20. Exportar PDF de esquemático y capas a `03-Architecture-Hardware/` (`hbox-watchdog-v5_V5.6_*.pdf`). +21. BOM y CPL desde el esquemático (`kicad-cli sch export bom` con el campo `LCSC`, no desde la placa); comprobar: sin `TBD`, DNP marcados (Dbk2, R109), U10 = C57156, R53 = C177479, U15 = C15846 sobre huella angosta. +22. Pedido JLC: lote según Leo; ENIG; verificar stock el día del pedido (U10, R53, C25803 ya son los sustitutos con stock). +23. Commit en `kicad` → gitlink en el padre → avisar a Leo. + +## 5. Después de la PCB (no bloquea el pedido) + +- Banco en una V5.5: Ethernet con el binario `-eth` ([procedimiento](../procedimientos/v5-prueba-ethernet-serie.md)). +- Firmware 0.6.1: umbrales LFP (indicador, corte 3.40 V → LFP), `tcell` en PC5, `tchg` en U4, autoprueba U18 (0x49), lazo de puertos serie. +- Paquete LFP-HT 26650 con NTC B3380 (caja y BOM mecánica). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión. | diff --git a/docs/hardware/v56-pinout.md b/docs/hardware/v56-pinout.md new file mode 100644 index 0000000..4ebad6e --- /dev/null +++ b/docs/hardware/v56-pinout.md @@ -0,0 +1,332 @@ +--- +title: "HBOX EinarBoard V5.6 — Pinout de arneses y conectores" +project: Project Drogheda +date: 2026-09-29 +version: "1.0" +tags: [project-drogheda, hardware, harness, pinout, einarboard, v5.6] +--- + +# HBOX EinarBoard V5.6 — Pinout de arneses y conectores + +!!! note "EinarBoard V5.6 (`hbox-watchdog-v5`), lote en pedido" + Esta tarjeta es la evolución de la V5.5 fabricada (STM32F411 a bordo + zócalos simpleRTK2B y 4G NTRIP Master). **No es la v6** (GNSS y 4G soldados a bordo, `hbox-watchdog-v6`, en diseño): la v6 tiene su propia sección en el sitio. Cuando este documento dice «copiado de v6» se refiere solo al origen de un valor de componente. + +Generado automáticamente desde la netlist del esquemático (independiente de la colocación). `GND` = plano de tierra de la tarjeta; su lista completa de pads se omite. Las nets de potencia van marcadas ⚡ para elegir calibre de cable. Se omiten las banderas `PWR_FLAG` (PFx). + +| Netlist | Valor | +|---|---| +| Archivo | `03-Architecture-Hardware/kicad/_to_delete/v56-work-20260928/p5ntc-after.xml` (exportada de `kicad/hbox-watchdog-v5.kicad_sch` con la ECO V5.6 aplicada, Eeschema 10.0.4, 2026-09-28 17:43) | +| SHA-256 | `45d3f034a327f8176bd76bf8d95698e21c3e3f914726b2648fcd80cc538e42a7` | +| Aplica a | **V5.6** (lote por pedir). Para V5.5 as-fabbed (lote 22-ago, 15 pzas) ver la sección «Diferencias V5.5 → V5.6» al final. | + +## Resumen de conectores + +| Conn | Función | Pines | Tipo (huella) | +|---|---|---|---| +| **P1** | GX16-5 | 5 | `TerminalBlock_Phoenix_MKDS-1,5-5_1x05_P5.00mm_Horizontal` | +| **P2** | 5V-IN-SD15B05 | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P4** | BATT-1S4P+NTC | 3 | `JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical` | +| **P6** | FAN 2-pin | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P8** | PANEL_LED | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P10** | RESET-EXT | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P11** | CUTOFF-SW | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P12** | NTC-HOTSPOT | 2 | `JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical` | +| **P14** | RGB_LED_EXT | 4 | `JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical` | +| **P15** | RS485_OUT | 3 | `PhoenixContact_MC_1,5_3-G-3.5_1x03_P3.50mm_Vertical` | +| **P16** | RS232_OUT | 3 | `PhoenixContact_MC_1,5_3-G-3.5_1x03_P3.50mm_Vertical` | +| **H4** | TTL_UARTB | 4 | `PinHeader_1x04_P2.54mm_Vertical` | +| **J11** | USB-C DFU | 15 | `USB_C_Receptacle_GCT_USB4085` | +| **J9** | USB-C | 15 | `USB_C_Receptacle_GCT_USB4085` | +| **J10** | HR911105A | 13 | `RJ45_Hanrun_HR911105A_Horizontal` | +| **J7** | XBEE-ROW-1 (VCC/DOUT/DIN) | 10 | `PinSocket_1x10_P2.00mm_Vertical` | +| **J8** | XBEE-ROW-2 | 10 | `PinSocket_1x10_P2.00mm_Vertical` | +| **MOD1** | simpleRTK2B-Pro on UNO female headers | 32 | `Arduino_UNO_R3` | + +## Conectores de arnés (P) + +### P1 — GX16-5 + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `24V_IN` ⚡potencia | D10.1, Q10.2 | +| 2 | `GND` | plano de tierra | +| 3 | `IGN_IN` | Rig1.1 | +| 4 | `GND` | plano de tierra | +| 5 | — | *(sin net)* | + +### P2 — 5V-IN-SD15B05 + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `VEH5V` ⚡potencia | C30.1, C31.1, C78.1, JP1.2, R7.1, R51.1, R55.1, RS1.1, U6.16, U6.6 | +| 2 | `GND` | plano de tierra | + +### P4 — BATT-1S4P+NTC + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `BAT_PLUS` ⚡potencia | C35.1, L6.2, R5.1, U6.23 | +| 2 | `GND` | plano de tierra | +| 3 | `NTC` | R55.2, R113.1, U6.17 | + +### P6 — FAN 2-pin + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `5V_FAN` ⚡potencia | C23.1, D2.1, JP1.1, L2.2, R20.1 | +| 2 | `FAN_RET` | D2.2, Q2.3 | + +### P8 — PANEL_LED + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `LED_A` | D1.2, R3.2 | +| 2 | `LED_K` | D1.1, Q4.3 | + +### P10 — RESET-EXT + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `NRST` | C104.1, SW1.1, TP5.1, U16.7 | +| 2 | `GND` | plano de tierra | + +### P11 — CUTOFF-SW + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `MAIN5V` ⚡potencia | C32.1, C33.1, C34.1, JP2.1, JP3.3, JP4.1, JP6.1, Q7.5, Q7.6, Q7.7, Q7.8, R53.1, U6.1, U6.24 | +| 2 | `SYS5V` ⚡potencia | C101.1, C119.1, C120.1, C121.1, D6.1, D12.2, F1.1, JP6.2, K1.2, R2.2, U7.2, U12.2, U12.7 | + +### P12 — NTC-HOTSPOT + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `NTC_TEMP` | C24.1, R42.2, U16.27 | +| 2 | `GND` | plano de tierra | + +### P14 — RGB_LED_EXT + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `3V3` ⚡potencia | C80.1, C81.1, C84.1, C89.1, C105.1, C106.1, C107.1, C108.1, C110.1, C118.1, C124.1, Cu3.1, Cu4.1, D5.1, DB1.2, DB2.2, DB3.2, DB4.2, … (+31) | +| 2 | `RGBR_K` | R89.1 | +| 3 | `RGBG_K` | R90.1 | +| 4 | `RGBB_K` | R91.1 | + +### P15 — RS485_OUT + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `RS485_A` | R82.1, U14.6 | +| 2 | `RS485_B` | JP5.2, U14.7 | +| 3 | `GND` | plano de tierra | + +### P16 — RS232_OUT + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `RS232_TX` | U15.14 | +| 2 | `RS232_RX` | U15.13 | +| 3 | `GND` | plano de tierra | + +### H4 — TTL_UARTB + +| Pin | Net | Conecta con | +|---|---|---| +| 1 | `3V3` ⚡potencia | C80.1, C81.1, C84.1, C89.1, C105.1, C106.1, C107.1, C108.1, C110.1, C118.1, C124.1, Cu3.1, Cu4.1, D5.1, DB1.2, DB2.2, DB3.2, DB4.2, … (+31) | +| 2 | `SER_TXB` | U10.23, U15.11 | +| 3 | `SER_RXB` | U10.24, U15.12 | +| 4 | `GND` | plano de tierra | + +## Puertos de servicio (USB-C, Ethernet) + +### J11 — USB-C DFU + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| A1 | GND_A1 | `GND` | plano de tierra | +| A4 | VBUS_A4 | `DFU_VBUS` ⚡potencia | D13.2, D16.1 | +| A5 | CC1_A5 | `DFU_CC1` | R100.1 | +| A6 | D+_A6 | `DFU_DP` | D14.1, U16.45 | +| A7 | D-_A7 | `DFU_DM` | D15.1, U16.44 | +| A9 | VBUS_A9 | `DFU_VBUS` ⚡potencia | D13.2, D16.1 | +| A12 | GND_A12 | `GND` | plano de tierra | +| B1 | GND_B1 | `GND` | plano de tierra | +| B4 | VBUS_B4 | `DFU_VBUS` ⚡potencia | D13.2, D16.1 | +| B5 | CC2_B5 | `DFU_CC2` | R101.1 | +| B6 | D+_B6 | `DFU_DP` | D14.1, U16.45 | +| B7 | D-_B7 | `DFU_DM` | D15.1, U16.44 | +| B9 | VBUS_B9 | `DFU_VBUS` ⚡potencia | D13.2, D16.1 | +| B12 | GND_B12 | `GND` | plano de tierra | +| SH | SHIELD_SH | `GND` | plano de tierra | + +### J9 — USB-C + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| A1 | GND_A1 | `GND` | plano de tierra | +| A4 | VBUS_A4 | `USB_VBUS` ⚡potencia | D19.5, J7.6 | +| A5 | CC1_A5 | `USB_CC1` | Rcc1.1 | +| A6 | D+_A6 | `USB_DP` | D19.3, D19.4, J7.7 | +| A7 | D-_A7 | `USB_DM` | D19.1, D19.6, J7.8 | +| A9 | VBUS_A9 | `USB_VBUS` ⚡potencia | D19.5, J7.6 | +| A12 | GND_A12 | `GND` | plano de tierra | +| B1 | GND_B1 | `GND` | plano de tierra | +| B4 | VBUS_B4 | `USB_VBUS` ⚡potencia | D19.5, J7.6 | +| B5 | CC2_B5 | `USB_CC2` | Rcc2.1 | +| B6 | D+_B6 | `USB_DP` | D19.3, D19.4, J7.7 | +| B7 | D-_B7 | `USB_DM` | D19.1, D19.6, J7.8 | +| B9 | VBUS_B9 | `USB_VBUS` ⚡potencia | D19.5, J7.6 | +| B12 | GND_B12 | `GND` | plano de tierra | +| SH | SHIELD_SH | `GND` | plano de tierra | + +### J10 — HR911105A + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| 1 | TD+_1 | `ETH_TXP` | R92.1, U11.2 | +| 2 | TD-_2 | `ETH_TXN` | R93.1, U11.1 | +| 3 | RD+_3 | `ETH_RXP` | R94.1, U11.6 | +| 4 | TCT_4 | `3V3_ETH` ⚡potencia | C92.1, C93.1, C94.1, C98.1, C102.1, C103.1, L8.2, R84.1, R87.1, R92.2, R93.2, R96.2, R97.2, U11.11, U11.15, U11.17, U11.21, U11.28, … (+2) | +| 5 | RCT_5 | `ETH_RCT` | C97.1, R94.2, R95.2 | +| 6 | RD-_6 | `ETH_RXN` | R95.1, U11.5 | +| 7 | NC_7 | — | *(sin net)* | +| 8 | 8 | — | *(sin net)* | +| 9 | 9 | `ETH_LNK_A` | R96.1 | +| 10 | 10 | `ETH_LINKLED` | U11.25 | +| 11 | 11 | `ETH_ACT_A` | R97.1 | +| 12 | 12 | `ETH_ACTLED` | U11.27 | +| SH | SH | `GND` | plano de tierra | + +## Zócalos de módulos + +### J7 — XBEE-ROW-1 (VCC/DOUT/DIN) + +Fila 1 del zócalo XBee (pines 1–10 del módulo, en orden). Módem ArduSimple 4G NTRIP Master. + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| 1 | Pin_1_1 | `3V3_MODEM` ⚡potencia | C41.1, C43.1, C122.1, J8.7, L7.2, R60.1 | +| 2 | Pin_2_2 | `DOUT_4G` | MOD1.17, R111.2 | +| 3 | Pin_3_3 | `DIN_4G` | K1.5, K1.6 | +| 4 | Pin_4_4 | `GND` | plano de tierra | +| 5 | Pin_5_5 | `MODEM_RST` | R107.2, SW4G1.1 | +| 6 | Pin_6_6 | `USB_VBUS` ⚡potencia | D19.5, J9.A4, J9.A9, J9.B4, J9.B9 | +| 7 | Pin_7_7 | `USB_DP` | D19.3, D19.4, J9.A6, J9.B6 | +| 8 | Pin_8_8 | `USB_DM` | D19.1, D19.6, J9.A7, J9.B7 | +| 9 | Pin_9_9 | — | *(sin net)* | +| 10 | Pin_10_10 | `GND` | plano de tierra | + +### J8 — XBEE-ROW-2 + +Fila 2 del zócalo XBee: **pad k = pin XBee (21 − k)** (espejo; regla verificada en el Informe técnico V3+V4 contra el footprint-R00 de ArduSimple: J8.8 = pin 13 LED, J8.6 = pin 15 GND, J8.10 = pin 11 GND). La net `XBEE_ONSLP` en J8.3 (R109 DNP) corresponde por esa regla al pin XBee 18; el ECO la etiqueta «pin 13 ON/SLEEP». + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| 1 | Pin_1_1 | `GND` | plano de tierra | +| 2 | Pin_2_2 | — | *(sin net)* | +| 3 | Pin_3_3 | `XBEE_ONSLP` | R109.2 | +| 4 | Pin_4_4 | — | *(sin net)* | +| 5 | Pin_5_5 | — | *(sin net)* | +| 6 | Pin_6_6 | `GND` | plano de tierra | +| 7 | Pin_7_7 | `3V3_MODEM` ⚡potencia | C41.1, C43.1, C122.1, J7.1, L7.2, R60.1 | +| 8 | Pin_8_8 | `MODEM_LED` | R108.2, Rmled1.1 | +| 9 | Pin_9_9 | — | *(sin net)* | +| 10 | Pin_10_10 | `GND` | plano de tierra | + +### MOD1 — simpleRTK2B-Pro on UNO female headers + +Zócalo UNO del simpleRTK2B Pro (ArduSimple). Solo se usan 5V, IOREF, GND, D0/D1 (UART1) y D2/D8 (UART2); el resto queda sin conectar por indicación de ArduSimple. + +| Pin | Señal | Net | Conecta con | +|---|---|---|---| +| 1 | NC_1 | — | *(sin net)* | +| 2 | IOREF_2 | `3V3` ⚡potencia | C80.1, C81.1, C84.1, C89.1, C105.1, C106.1, C107.1, C108.1, C110.1, C118.1, C124.1, Cu3.1, Cu4.1, D5.1, DB1.2, DB2.2, DB3.2, DB4.2, … (+31) | +| 3 | RESET_3 | — | *(sin net)* | +| 4 | 3V3_OUT_4 | — | *(sin net)* | +| 5 | 5V_5 | `SW_5V` ⚡potencia | C3.1, C40.1, Q1.3 | +| 6 | GND_6 | `GND` | plano de tierra | +| 7 | GND_7 | `GND` | plano de tierra | +| 8 | VIN_8 | — | *(sin net)* | +| 9 | A0_9 | — | *(sin net)* | +| 10 | A1_10 | — | *(sin net)* | +| 11 | A2_11 | — | *(sin net)* | +| 12 | A3_12 | — | *(sin net)* | +| 13 | A4_13 | — | *(sin net)* | +| 14 | A5_14 | — | *(sin net)* | +| 15 | TX1_D0_15 | `GNSS_RX` | U16.17 | +| 16 | RX1_D1_16 | `GNSS_TX` | U16.16 | +| 17 | RX2_D2_17 | `DOUT_4G` | J7.2, R111.2 | +| 18 | D3_18 | — | *(sin net)* | +| 19 | D4_19 | — | *(sin net)* | +| 20 | D5_20 | — | *(sin net)* | +| 21 | D6_21 | — | *(sin net)* | +| 22 | D7_22 | — | *(sin net)* | +| 23 | TX2_D8_23 | `USART1_RX` | K1.1, Rdfu1.1, U16.43 | +| 24 | D9_24 | — | *(sin net)* | +| 25 | D10_25 | — | *(sin net)* | +| 26 | FENCE_D11_26 | — | *(sin net)* | +| 27 | EXTINT_D12_27 | — | *(sin net)* | +| 28 | TPS_D13_28 | — | *(sin net)* | +| 29 | GND_29 | `GND` | plano de tierra | +| 30 | AREF_30 | — | *(sin net)* | +| 31 | SDA_31 | — | *(sin net)* | +| 32 | SCL_32 | — | *(sin net)* | + +## Puentes de soldadura + +| Ref | Valor (estado por defecto) | Pad 1 | Pad 2 | Pad 3 | +|---|---|---|---|---| +| **JP1** | 0R | `5V_FAN` | `VEH5V` | — | +| **JP2** | F2:LFP (2-3) | `MAIN5V` | `F2_SEL` | `GND` | +| **JP3** | F1:0 | `GND` | `F1_SEL` | `MAIN5V` | +| **JP4** | F0:1 | `MAIN5V` | `F0_SEL` | `GND` | +| **JP5** | RS485_TERM | `RS485_T` | `RS485_B` | — | +| **JP6** | JP_CUT | `MAIN5V` | `SYS5V` | — | + +## Botones + +| Ref | Serigrafía | Pin 1 | Pin 2 | +|---|---|---|---| +| **SW1** | RESET | `NRST` (C104.1, P10.1, TP5.1, U16.7) | `GND` | +| **SW2** | BOOT0 | `3V3` (C80.1, C81.1, C84.1, C89.1, C105.1, C106.1, C107.1, C108.1, C110.1, C118.1, C124.1, Cu3.1, … (+37)) | `BOOT0` | +| **SW4G1** | RESET | `MODEM_RST` (J7.5, R107.2) | `GND` | + +## Puntos de prueba + +| Ref | Nombre | Net | Conecta con | +|---|---|---|---| +| **TP1** | CLPROG | `CLPROG_TP` | U6.3 | +| **TP2** | PFO | `PFO_TP` | U6.20 | +| **TP3** | SWDIO | `SWDIO` | U16.46 | +| **TP4** | SWCLK | `SWCLK` | U16.49 | +| **TP5** | NRST | `NRST` | C104.1, P10.1, SW1.1, U16.7 | +| **TP6** | GND | `GND` | plano de tierra | +| **TP7** | 3V3 | `3V3` | C80.1, C81.1, C84.1, C89.1, C105.1, C106.1, C107.1, C108.1, C110.1, C118.1, C124.1, Cu3.1, … (+37) | + +## Diferencias V5.5 → V5.6 en conectores (lo que cambia para el arnés) + +| Conector | V5.5 (lote 22-ago) | V5.6 | Fuente | +|---|---|---|---| +| **P5** TEMP_PROBE (3V3/GND/SDA/SCL) | Presente | Eliminado — ya no hay sonda externa de T/RH; la temperatura del cargador la mide U4 y la del módem U18 en la tarjeta | Informe de cambios §10 / netlist `p5ntc-after.xml` (sin P5) | +| **P4.3** NTC | Solo al LTC4040 (U6.17) con R55 10 k (Li-ion) | Además al MCU **PC5** por R113 100 k / R114 120 k / C125 10 nF (`NTC_CELL`); R55 **5.6 k** para química **LFP-HT** (NTC B3380) | netlist; Informe §9 | +| **JP2** | `F2:Li-ion` puente 1-2 | **`F2:LFP` puente 2-3** (flotación LiFePO4) | Informe §9 | +| **JP6** | No existía | Nuevo, en paralelo con P11 (`MAIN5V`↔`SYS5V`), abierto — puentear solo si la unidad no lleva interruptor de corte | Informe §2 | +| **J7.2** DOUT_4G | Solo a MOD1.17 | Además al MCU **PC7** (USART6_RX) por R111 1 k — escucha RTCM | Informe §3 | +| **J7.5** MODEM_RST | Solo SW4G1 | Además al MCU **PC1** por R107 1 k | Informe §3 | +| **J8.8** MODEM_LED | Solo Rmled1/D4G1 | Además al MCU **PC2** por R108 10 k | Informe §3 | +| **J8.3** | Sin conexión | `XBEE_ONSLP` → PC4 por R109 10 k DNP | Informe §2–3 | +| **J9** USB-C módem | Sin ESD | **D19 USBLC6-2SC6** en D+/D−/VBUS | Informe §2 | +| **J10** RJ45 | Sin cambio (sin PoE) | Sin cambio; U11 con R112 4.7 k pull-down en `ETH_RST`, C90 4.7 µF, C91 10 nF | Informe §10 | +| **P11** CUTOFF-SW | `MAIN5V`/`SYS5V` | Sin cambio (JP6 lo puentea si se desea) | netlist | +| **P1, P2, P6, P8, P10, P12, P14, P15, P16, J11, MOD1** | — | **Sin cambio** eléctrico | diff de netlist v55-baseline → V5.6 (Informe §4) | + +!!! note "P13 (MODO-B-UPLINK) y P3 (RTK2B-UART1)" + Existían en la V3 (`harness-connector-pinout.md`) y **no existen en V4/V5.5/V5.6** (eliminados en V4 junto con H3: el Modo B es permanente por K1). No buscarlos en la tarjeta. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión para V5.6 | + diff --git a/docs/hardware/v6-auditoria-completa.md b/docs/hardware/v6-auditoria-completa.md new file mode 100644 index 0000000..73332c7 --- /dev/null +++ b/docs/hardware/v6-auditoria-completa.md @@ -0,0 +1,1544 @@ +--- +title: "EinarBoard v6 — Auditoría completa pre-fabricación" +tags: [project-drogheda, hardware, einarboard, v6, auditoria, kicad, pcb] +date: 2026-09-28 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard v6 — Auditoría completa pre-fabricación + +!!! warning "EinarBoard v6 (`hbox-watchdog-v6`): en diseño, no se pide" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. + +Responsable: Leo (Helgen Technologies) · Fecha: 2026-09-28 · Versión: 1.0 · Autor: Helgen Technologies (elaborado con asistencia de Claude) · Alcance: auditoría de solo lectura de `03-Architecture-Hardware/kicad/hbox-watchdog-v6.*`; no se modificó ningún archivo de KiCad · Brief: `2026-09-28_Drogheda_EinarBoard-v6_Full-Audit_Agent-Brief_v1.0.md` · Documento compañero: [Pin map MCU v6](v6-pinmap.md) · Lo que se aplicó de esta auditoría: [Informe de cambios al esquemático v6](v6-cambios-esquematico.md) + +**Snapshot del diseño (KiCad 10.0.4, versión de archivo de tarjeta 20260206).** Tarjeta: 4 capas, 140.0 × 100.0 mm, 312 huellas, 1999 segmentos de pista, 210 vías, 205/205 nets multi-pad ruteadas. Esquemático: una hoja plana, 328 símbolos en la netlist. Hashes de los archivos en el anexo de trazabilidad. + +## Resumen ejecutivo + +1. ¿Listo para ordenar? NO. Condiciones para ordenar: (a) cerrar los **10 Bloqueantes** (valores y campos de BOM, dos piezas nuevas —TPS2552 con sus 2 resistencias y un SMBJ33A—, reglas de diseño y layout); (b) Leo confirma el patrón de agujeros de la placa base (**G-01** es Bloqueante si se reutilizan los standoffs de la V5.5); (c) DRC limpio con las reglas corregidas de **F-01** como puerta de salida; (d) los **19 Mayor** hechos o con razón escrita (escala del brief: «deben cambiar antes de pedir salvo razón escrita»). Ningún hallazgo cambia la arquitectura de la v6. +2. Conteo tras fusiones (81 hallazgos activos; 36 IDs absorbidos en su hallazgo primario; mapa completo en el Apéndice D): + + | Severidad | Número | + |---|---| + | Bloqueante | **10 + 1 condicional** (G-01) | + | Mayor | **19** (incluye V1-01, nuevo del verificador 1, y H-02b, separado de H-02) | + | Menor | **30** | + | Nota | **21** | + +3. Bloqueantes, una línea cada uno (orden de riesgo): + 1. **A-01** — La rama `/24V` sin fusible alimenta U20 y U2; **D21** (Schottky 30 V) ve 23.5 V inversos con el bus cargando a 28.8 V y 30.7 V a 36 V → fuga con riesgo de embalamiento térmico a 45–60 °C; un D21 en corto pone 24 V sin fusible en `MAIN5V`. Arreglo: U20 solo desde `MAIN5V` (sin D20/D21), ventilador desde `VEH5V` (bloque U2 DNP), **F2 3 A (C206912) delante de D10**. + 2. **F-02** — La ignición cruda `/IGN_IN` (9–36 V) corre **106.5 mm en In2 a 0.221 mm de `/VEH5V`**: la geometría del corto del 23-jul otra vez, en el mismo par de redes. Arreglo: Rig1 a ≤ 3 mm de cobre de P1.3 + SMBJ33A (C224019). + 3. **F-01** — Netclasses rotas (solo `/24V_IN` resuelve a HV24) y una regla de 0.15 mm que anula todas las demás: el «DRC 0 errores» no puede ver ningún espaciado de 24 V. Arreglo: tabla de netclasses + `.kicad_dru` corregido por verify_2 (incluye la regla HV24↔HV24). + 4. **H-04** — U25 lleva `LCSC Part` = C2071691 (AP64350, 40 V) además de `LCSC` = C524806; Fabrication Toolkit lee `LCSC Part` primero → se ensamblaría un buck de 40 V detrás de un clamp de 53 V. Arreglo: borrar el campo en la tarjeta y en la huella de librería. + 5. **C-01** — El bias de la antena GNSS no tiene limitador (u-blox exige ≥ 10 Ω); un coaxial en corto supera los 300 mA abs. máx. de VCC_RF y los 400 mA de L21. Arreglo: **TPS2552DBVR (C46506)**, 75 mA, ANT_OFF → EN̅, FAULT̅ → ANT_SHORT_N. + 6. **B-03** — La ESD de la antena LTE (D28 ESD9L5.0, unidireccional 5 V) conduce en cada semiciclo negativo (−0.6 V) y avalancha en GSM (14.1 V pico). Arreglo: **PESD0402-240 (C1975527)**, bidireccional 24 V, o DNP (la PGB1010402KR propuesta solo aguanta 12 VDC). + 7. **A-02** — Cobre y placement del LTC4040 repiten la lección F5: `/SW_BAT` 0.5 mm × 11.9 mm con cuellos de 0.25/0.30 mm, EP de U6 sin vías, L6 a 8.65 mm, C30/C31 a 7.2/6.2 mm, sensor más cercano a 71.4 mm. Arreglo: layout (pour ≥ 2 mm, 9 vías en el EP, re-agrupar). + 8. **A-03** — R50 = 825 Ω programa 2.42 A (2.28–2.57 A; la esquina alta supera los 2.5 A máx. del LTC4040). Arreglo: **1.43 kΩ (C22840)** → ≥ 1.316 A en todas las esquinas (1.5 k de la ECO da 1.254 A mínimo). + 9. **H-01** — U15 MAX3232ESE (SO-16 angosto) sobre huella SOIC-16W (filas a 9.3 mm): no se puede soldar. Es una **regresión de la v6** (la V5.5 se fabricó con la huella angosta). Arreglo: `SOIC-16_3.9x9.9mm` en esquemático y PCB, mantener C15846. + 10. **H-02** — Sin stock para ningún pedido: U10 (15 pzas) y R53 (6 pzas, mínimo JLC 20). R53 fija el voltaje del boost de respaldo. Arreglo: U10 → **C57156** (SC16IS752, idéntico en I²C), R53 → **C177479**. + 11. *(condicional)* **G-01** — Falta el agujero MH4 de la V5.5 en (193.2, 90.3) (L6 queda encima) y los agujeros de la abrazadera del disipador (MH11 + pareja). Bloqueante si la placa base de la V5.5 se reutiliza; si se re-taladra, pasa a documentación. +4. **Mayores (19):** V1-01 polaridad inversa derrota a D10 (F2 primero) · A-04 R121 57.6 k (5.32 V) · F-12 vías de tierra/EP/módulos/costura (69 vías vs ≥ 400) · F-03 lazos calientes de U25/U20/U12 · B-02 bulk de VBAT_MODEM → polímero + compensación 113 k/6.8 nF/56 pF · D-01 U24 retro-alimenta al F9P apagado · E-01 3V3_ETH conmutable (PD2) · F-51 sin temperatura de cargador ni de celda en el MCU · A-05 presupuesto en batería + CSYS · A-07 cuellos del camino de 5 V en capas internas · F-06 líneas RF (LTE 22 mm en In1) · F-05 In1 no es plano (19 % vacío, 1572 mm de pistas) · C-04 Q1 del F9P a 9 mm de la antena LTE · G-02 J9 sin ESD · A-08 AMS1117 → TLV1117LV33 · A-09 C78 electrolítico 85 °C → polímero · C-02 rampa de VCC del F9P → TPS7A2033 · E-02 ETH_RST 4.7 k · H-02b stock a verificar el día del pedido. +5. **Qué puede esperar a v6.1:** los 30 Menor y los 21 Nota (§5 parte 3), más lo que los hallazgos difieren explícitamente: K1 → enlace directo PC6 → DIN_4G (B-13), PoE (E-07), U12 → AP64350 (A-20a), P3 → JST-XH-5 si se rehace el arnés (G-07). Ningún Mayor está marcado como diferible; E-02 baja a Menor si se adopta E-01. +6. **Firmware (FW 0.7.x, `board_v6.h`), lo más importante:** (1) `board_v6.h` desde `pinmap-v6.md`; un binario V5.6 en v6 choca en PC3 contra RTK_STAT; (2) primeras líneas de `setup()`: PC10, PC8, PC11, PA1, PB5, **PA15**, PA6, PB0 en LOW; (3) secuencia de ventana: F9P asentado → BAT ≥ 3.4 V → W5500 apagado → `MODEM_PWR_EN` → PWRKEY → STATUS; **nunca PC10 alto con PA1 bajo** hasta tener D-01 en hardware; (4) en batería: **solo LTE** (`AT+CNMP=38`), `ETH_PWR_EN` = 0, K1 solo en la ventana TX; (5) `V5_PFI` 4.60 → **4.40 V**, VDDA desde VREFINT, ignición por ADC con umbrales; (6) `$PHID` (UID 96 bits) por el enlace del módem al conectar y cada 5 min; (7) inhibición térmica con `tcell` (PC5) y `tchg` (TMP102 0x48), campos nuevos al final de `$PHLG`. +7. Costo: BOM ≈ **US$131.98 por tarjeta (20 pzas) / US$124.40 (100 pzas)**, **+US$91.30 / +US$90.14 vs V5.6**; el 94 % del delta es ZED-F9P + A7670SA, que sustituyen al simpleRTK2B y al 4G NTRIP Master externos, así que el costo de sistema casi seguro baja (precios pendientes de Leo). 79 partes Extended = US$237 de setup por pedido. Los arreglos agregan pocas piezas; U10 → SC16IS752 ahorra US$3.52 y U2 DNP retira el MP1584 (US$2.21 a 100 pzas). + +## Índice del cuerpo del informe + +El cuerpo del informe está en inglés (documento de ingeniería de 1 500 líneas). Vocabulario: *Blocker* = Bloqueante · *Major* = Mayor · *Minor* = Menor · *Note* = Nota · *finding* = hallazgo · *footprint* = huella · *track* = pista · *via* = vía · *pour* = vertido de cobre · *EP* = pad térmico. + +| Sección | Qué contiene | +|---|---| +| [1. Method and evidence](#1-method-and-evidence) | Cómo se verificó cada hallazgo (verificado / verificado con corrección / no verificado de forma independiente), convenciones de medida y formato de los hallazgos. | +| [2. Findings and pass/fail by block](#2-findings-and-passfail-by-block-brief-4-a-4-j) | Los 81 hallazgos activos, por bloque: 4-A árbol de potencia, 4-B módem, 4-C GNSS, 4-D MCU, 4-E Ethernet, 4-F layout/EMC, 4-G conectores, 4-H BOM, 4-I requisitos, 4-J ERC/DRC. Cada uno con evidencia, consecuencia, corrección (valor + LCSC o instrucción de layout) y esfuerzo. | +| [3. Requirements traceability](#3-4-i-requirements-traceability-r1r5-eco-0) | Trazabilidad contra los requisitos R1–R5 de la ECO: qué cumple la v6 tal como está dibujada y qué necesita cambios. | +| [4. Pin map (condensed)](#4-4-d-pin-map-condensed-6464-pins) | Los 64 pines del MCU en forma condensada; la versión completa es el [pin map v6](v6-pinmap.md). | +| [5. Ranked change list](#5-ranked-change-list) | Los cambios ordenados por riesgo: Bloqueantes, Mayores y lo que puede esperar a v6.1. | +| [6. Layout instruction list for Michelle](#6-layout-instruction-list-for-michelle) | Instrucciones de layout numeradas (L-1 … L-33) con distancias y anchos. | +| [7. Schematic change list](#7-schematic-change-list-for-the-apply-phase-brief-7) | Lista de cambios de esquemático por severidad; es lo que aplicó el [informe de cambios v6](v6-cambios-esquematico.md). | +| [8. Firmware requirements](#8-firmware-requirements-board_v6h-fw-07x) | Requisitos para `board_v6.h` / FW 0.7.x: pines, secuencias, umbrales, telemetría. | +| [9. Verdict](#9-verdict) | Veredicto: condiciones para ordenar. | +| [10. Inputs needed from Leo](#10-inputs-needed-from-leo) | Decisiones pendientes de Leo. | +| [11. Appendices](#11-appendices) | Apéndice A resumen de ERC y B resumen de DRC. (Índice de evidencia y mapa de IDs: anexo de trazabilidad al final.) | + +## Cuerpo del informe (inglés) + +## 1. Method and evidence + +- **Verification:** two independent verifiers re-derived every item the auditors rated Blocker or Major (plus D-02) from primary sources with their own scripts: verify_1 = power and RF (24 items), verify_2 = layout, BOM, MCU and connectors (22 items). Outcome: 0 refuted; 13 confirmed with corrections; 6 severity changes; 1 new Major (V1-01). **Where auditor and verifier disagree, this report uses the verifier.** Where the two verifiers merged overlapping items differently, the merge is reconciled into one item and the choice is stated (§2 per item, Appendix D). Minor and Note items outside that list are marked *not independently verified*. +- **Conventions:** "edge" = pad copper to pad copper; "ctr" = pad centre. Stackup for impedance and inner-layer current: JLC04161H-7628 (L1–L2 prepreg 0.2104 mm, εr 4.4; outer 1 oz; inner 0.5 oz by default), because the board file carries the generic 3 × 0.48 mm stack. Island and void analysis uses the zone fills stored in the file; refill before fab and re-check. +- **Finding format:** ID · severity · block; *Absorbs* (merged IDs); *Status* (verified / verified-with-correction / not independently verified); Evidence; Consequence; Fix (value + LCSC, or layout instruction with numbers); Effort (schematic-only / layout / both / firmware-only). Original working-file IDs are kept. **V1-01** is the new Major raised by verify_1; **H-02b** is the part of H-02 that verify_2 re-rated Major. + +--- + +--- +## 2. Findings and pass/fail by block (brief §4-A … §4-J) + +### 4-A Power tree (24 V → 5 V → rails), lessons F4 / F5 / F7 + +#### (a) Findings + +##### A-01 · Blocker · Unfused `/24V` branch feeds U20 and U2; D21 (30 V Schottky) reverse-stressed toward thermal runaway +*Absorbs:* B-01, H-05, F-53, F-08, A-06 (U2 row). *Status:* verified-with-correction (verify_1: the Blocker rests on D21 and the unfused branch, not on U2; ISO 7637-2:2011 pulse 2a is +50 V, not +112 V; D32 also clamps `/24V` for fast transients). +- **Evidence:** + - Netlist: `/24V_IN` = {P1.1, D10, F2.1, Q10.D}. Fused branch F2 (0154002.DR 2 A, C206910) → `/VIN_FUSED` → Q23 → `/VIN_PROT` = {D32 SMCJ33A, C149–C151, U25.2, R124}. **Unfused branch** Q10.S → `/24V` = {C10, C11, C22, Ren1, U2.7, D20.A, DzG1.K}. `/VIN_MODEM` = {D20.K, D21.K, C127, C128, U20.2}; D21.A = `/MAIN5V` (LTC4040 VSYS, after RS1 and Q7). + - Clamping (verify_1): for µs–ms transients `/24V` is clamped by D10 and by D32 through Q10 (65 mΩ) → F2 (≈ 0.05 Ω) → Q23 (65 mΩ), ≈ 0.2 Ω. Neither TVS conducts at 36 V DC (VBR 36.7–40.6 V). "Outside the D32 clamp" holds only for DC and for fusing. + - Ratings: D21 PMEG3050EP VR 30 V, IR 2.6 mA typ / 8 mA max at 30 V, 25 °C, datasheet thermal-runaway warning, Rth(j-a) 60–200 K/W. U2 MP1584 VIN 4.5–28 V, **30 V abs max**, EN abs max 6 V (EN = 24V·20k/120k = 6.0 V at 36 V). U20 AP64350 42 V DC / 45 V for 400 ms. D20/Dbk1 SS34 40 V. + - Stress: 28.8 V charging bus → D21 VR = **23.5 V** (78 % VRRM), U2 0.8 V over its operating max. 36 V / 60 min (ISO 16750-2) → D21 VR **30.7 V > 30 V**, U2 6 V over abs max. Pulse 2a (+50 V, 2 Ω) → D10 ∥ D32 clamp ≈ 42–45 V: U20 at its 45 V/400 ms limit, D21 ≈ 37–40 V reverse (avalanche for 50 µs). Suppressed load dump 58 V: everything on `/24V` over rating (A-19). + - D21 runaway (verify_1): IR ≈ 1.8 mA at 23.5 V/25 °C; stability needs PR < 0.12 W at 120 K/W (0.24 W at 60 K/W). 45 °C board → IR ≈ 7 mA, PR ≈ 0.17 W; 60 °C → ≈ 20 mA, 0.48 W. **Runaway is plausible at port-box temperatures.** + - Layout: the `/24V` 1.5 mm track runs on In1 at 0.15 mm from the In1 GND pour, and a `/24V` via sits 0.15 mm from the B.Cu `/3V3` pour (`clearance_24v.md`). + - Field weighting: on V5.x P1 = 24 V fed only U2 and no U2 failure is recorded, so U2 alone would rate Major. D21, U20/D20 on the unfused branch and the D21-short mode are new on v6. +- **Consequence:** a D21 that fails short puts `/24V` onto `/MAIN5V` with no fuse (LTC4040 VSYS 6 V abs max, U21, U17, F9P, MCU). A short of C10/C22/U2/U20/D22 draws vehicle-fuse current through 0.3–1.5 mm board copper (fire and harness risk). +- **Fix (single topology, verify_1 conflict (a)):** + 1. U20 from `/MAIN5V` only: delete D20 and the 48 mm `/VIN_MODEM` run; merge `/VIN_MODEM` into `/MAIN5V` in copper (no D21). + 2. Fan from `/VEH5V`: DNP U2, L2, Dbk1, Cbst1, Rcomp1, Ccomp1, Rfreq1, Ren1, Ren2, R20, R21; bridge JP1 by changing its footprint to `Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm` (no BOM part; A-01's 0 Ω 0805 alternative has no LCSC in the findings). Fan stays dark on battery, as today (ECO D4). + 3. `/24V` then has no loads: DNP Q10, DzG1, Rrp1, C10, C11, C22. Q23 remains the single reverse-polarity FET. + 4. **F2 → 3 A 0154003.DR, LCSC C206912** (stock 2217), placed electrically **ahead of D10** (V1-01). 4 A C206914 (stock 778) only if sustained 9 V operation is required. + 5. Prerequisites: A-07 (widen `/VEH5V`, `/VIN_SW`, `/MAIN5V`), A-04 (R121 57.6 k), A-05 (CSYS), F-03 (U20 Cin 2 × 22 µF C86817 + 1 × 220 µF C881921 at U20.2). + - Numbers with the fix (verify_1): U20 input at MAIN5V ≈ 5.25 V, η 0.9: LTE 23 dBm 0.54 A, GSM 2 A **1.61 A**, 2.8 A peak 2.25 A. RS1 path while charging at 1.43 k plus LTE TX: 0.35 + 0.54 + 1.19 = **2.08 A** (< 2.35–2.65 A limit); during a GSM burst the charger is throttled to 0.4–0.7 A (system load has priority, LTC4040 DS p.16). U25 ≤ 2.65 A + 0.3 A fan = **2.95 A** vs 3.5 A rating; overshoot inductor peak ≈ 3.8 A < 4.5 A switch limit. D34 ≈ 0.8 W (≈ 1.0 W as-is). On battery VIN(U20) rises 4.42 → 4.72 V and MAIN5V current at 2 A GSM falls to ≈ 2.0–2.13 A. F2 current 0.74 A at 24 V, 1.48 A at 12 V, 1.97 A at 9 V. PFI margin with 57.6 k: 5.176 V − ≈ 0.2 V droop = 4.98 V vs 4.54 V PFI max (0.44 V; 0.13 V as-is). + - Rejected: D20 → `/VIN_PROT` with a 60 V Schottky (PMEG6045ETPX C552943) keeps U20 at 0–3 V margin to the pulse-2a clamp and costs ≈ 0.15 V of battery headroom. The JSMSEMI clone C53114006 (H-05) has unknown leakage. + - Record for Leo: U20 then sits upstream of the P5 cutoff. The ECO §A intent ("the cutoff switches everything off") still holds functionally, because cutting SYS5V unpowers the MCU and R113 holds U20 EN low (µA shutdown current). +- **Effort:** both. + +##### A-02 · Blocker · LTC4040 (U6) copper, EP vias and placement repeat lesson F5 +*Absorbs:* F-13 (U6 EP part), the In1-under-U6 part of A-14. *Status:* verified (verify_1 re-measured edge-to-edge; caveat: the H0008 thermal-cycling causality is weak, because the ≈ 1.3 A is inferred from an OCV slope and 0.75 W at bench ambient needs θJA > 150 °C/W to reach OT. The Blocker stands on lesson F5, ECO D2 "Obligatorio" and the datasheet layout guidance). +- **Evidence (verify_1):** + + | Item | v6 | Target (ECO D2) | + |---|---|---| + | `/SW_BAT` U6.21/22 → L6.1 | 6 F.Cu segments, **0.5 mm × 11.89 mm** + 0.25 mm and 0.30 mm necks (0.50 mm long) at the pins, 0 vias; ≈ 12.2 mΩ | ≥ 2 mm polygon | + | `/BAT_PLUS` P3 → L6.2 | 1.0 mm × 21.27 mm | ≥ 1.5 mm + vias | + | `/BAT_PLUS` L6.2 → U6.23 | 1.0 mm, then 0.5 mm × 10.49 mm, then 0.25 mm × 5.38 mm | Kelvin from L6.2/CBAT | + | U6 EP (2.65 × 3.65 mm) | **0 vias**; nearest GND via 3.04 mm edge at (191.6, 104.3) | ≥ 9 vias | + | L6.1 ↔ U6.21/22 | **8.65 mm** | ≤ 5 mm | + | C30 / C31 → U6.6 (VIN) | **7.20 / 6.18 mm** | ≤ 3 mm | + | C32 / C33 / C34 → U6.1 (VSYS) | 3.90 / 3.44 / 4.74 mm, behind 0.30 mm pin necks | ≤ 2 mm, pour | + | C35 (CBAT) → L6.2 | 20.2 mm edge | at L6.2 / BAT pin | + | GND clusters | U6 EP, C32, C30/C31, C35 on a 252 mm² F.Cu cluster with 5 vias; C33 on the 3611 mm² cluster | one solid EP island | + | In1 under U6 | split by 7 `/VFB_BST` segments + `/IGATE` + `/CHRG_*` | solid ≥ 5 mm around U6/L6 | + | Temperature sensor ≤ 10 mm | none; U3 SHT40 at **71.4 mm** | ≤ 10 mm (F-51) | + + - IPC-2221 external rise: `/SW_BAT` 0.5 mm → **+32 °C at 2.42 A**, **+80 °C at 3.6 A** backup battery current; `/BAT_PLUS` 1.0 mm → +25 °C at 3.6 A. The same current at 2.0 mm gives +8 °C. + - LTC4040 has over-temperature shutdown only, no charge-current thermal regulation (DS p.5 Note 2). IC loss ≈ 0.75 W at 2.42 A; as-built θJA ≈ 60–70 °C/W (the 43 °C/W datasheet figure assumes a via array). +- **Consequence:** R5 (≥ 1.3 A without thermal cycling) is not met by layout; in continuous backup the boost node and the VSYS necks run hot. This repeats V5.5 lesson F5 (ECO D2 / EMC 🔴 #1, #2). +- **Fix (layout, Michelle; §6 L-11 … L-16):** L6 pad 1 ≤ 5 mm from U6.21/22; C32/C33/C34 ≤ 2 mm from VSYS pins 1/24 with GND on the EP copper; C30/C31 ≤ 3 mm from pin 6; C35 (or an extra 22 µF 0805, C86817) at L6.2 next to BAT pin 23. `/SW_BAT` F.Cu polygon ≥ 2 mm wide, starting after the combined pin 21+22 fan-out (QFN 0.5 mm pitch), kept compact. `/BAT_PLUS` P3 → L6.2 ≥ 1.5 mm F.Cu or pour (≥ 4 vias per transition if routed inner). `/MAIN5V` pour from pins 1/24 over C32–C34 to the Q7 drain, ≥ 2 mm, no 0.3/0.5 mm necks. EP: **≥ 9 vias, 3 × 3 at 0.9 × 1.2 mm pitch, 0.3/0.6 mm** (fit checked by verify_2; A-02 proposed 3 × 4 = 12 at 0.9 mm), pad `zone_connect` solid. In1/In2 GND solid for ≥ 5 mm around U6/L6 (reroute `/VFB_BST`, `/IGATE`, see A-14). Place the F-51 TMP102 between U6 and L6. +- **Effort:** layout. + +##### A-03 · Blocker · R50 = 825 Ω programs 2.42 A; set 1.43 kΩ to hold ≥ 1.3 A at every corner +*Status:* verified (verify_1). Lesson F4; ECO §C; R5. +- **Evidence:** RPROG = 2000 V / ICHG (hPROG 2500, VPROG 0.8 V), ±5 % (950/1000/1050 mA at 2 k), maximum charge current 2.5 A (LTC4040 DS p.3, 10, 18). + + | R50 (1 %) | ICHG min | nom | max | + |---|---|---|---| + | 825 Ω (as-is, C50214) | 2.280 A | 2.424 A | **2.571 A** (above the 2.5 A maximum) | + | **1.43 kΩ** | **1.316 A** | 1.399 A | 1.483 A | + | 1.47 kΩ | 1.280 A | 1.361 A | 1.443 A | + | 1.5 kΩ (ECO C, C22843) | 1.254 A | 1.333 A | 1.414 A | + + - H0008 (V5.5, same R50): ≈ 1.3 A average, 8.5 h to termination, pulsed charge. At 1.4 A the IC loss drops ≈ 3× ((2.42/1.4)²). Input side at 1.4 A: 1.4·4.0/(0.9·5.3) ≈ 1.17 A + 0.35 A logic = 1.52 A < RS1 limit, so the charger stops being input-limited. The Li-ion safety timer (4.25 h) counts in CV only. +- **Consequence:** at 825 Ω v6 repeats the H0008 behaviour, runs U25 at the RS1 limit (≈ 2.5 A) whenever charging, and exceeds the IC's 2.5 A maximum at the top corner. +- **Fix:** **R50 → 1.43 kΩ 1 % 0603, LCSC C22840** (Extended, stock 4965). 1.43 k is the largest E96 value with a worst-case minimum ≥ 1.3 A; it costs ≈ 10 % more I²R than 1.5 k. 1.5 kΩ (C22843, Basic) keeps V5.6 commonality but meets R5 only nominally. +- **Effort:** schematic-only. + +##### V1-01 · Major · Reverse polarity is defeated by the D10 position (new) +*Status:* raised by verify_1 ("Anything else" #1); not cross-checked by a second verifier. +- **Evidence:** D10 (C224019, SMBJ33A) and D32 (C699039, SMCJ33A) are unidirectional parts drawn with a bidirectional A1/A2 symbol, pad 1 (cathode) on the + rail. D10 sits on `/24V_IN`, ahead of F2 and ahead of the Q10/Q23 reverse-polarity FETs. +- **Consequence:** a reversed P1 forward-biases D10 straight across the harness with no board fuse; the SMB part carries harness-fuse current until it fails, typically short. +- **Fix:** F2 electrically first: **P1 → F2 → D10 ∥ Q23** (D10 moves from `/24V_IN` to the F2 output). A reversed connection then blows the socketed Nano2 fuse. ISO 7637-2 pulse 1 (24 V: −600 V, 50 Ω, 1 ms, ≈ 12 A, I²t ≈ 0.07 A²s) is ≈ 7 % of a 3 A Nano2's I²t. A-01 listed this as optional; verify_1 makes it mandatory. Same F2 part as A-01 (C206912). +- **Effort:** both. + +##### A-04 · Major · U25 set-point 5.00 V (4.87–5.14 V) sits below the charge governor's start line; set R121 = 57.6 k +*Status:* verified (verify_1). Lesson F7; ECO §A/§C. +- **Evidence:** Vout = Vref·(1 + R121/R122), TPS54360B Vref 0.792/0.800/0.808 V (−40…150 °C), 1 % resistors, R122 = 10.2 k. + + | R121 | min | nom | max | vs CHG_RAIL_ON 5.05 V | vs LTC4040 VIN max 5.5 V | + |---|---|---|---|---|---| + | 53.6 k (as-is) | **4.871** | **5.004** | 5.140 | nominal below the start line | ok | + | 56.2 k | 5.069 | 5.208 | 5.350 | low corner +0.02 V | ok | + | **57.6 k** | **5.176** | **5.318** | **5.463** | ≥ 0.13 V above | 37 mV margin | + | 57.6 k, 0.1 % | 5.256 | 5.318 | 5.380 | ok | 120 mV margin | + + - LTC4040 PFI (R51 270 k / R52 100 k, 1.17/1.19/1.21 V, +30 mV hysteresis): **falling 4.27 / 4.40 / 4.54 V, rising 4.38 / 4.51 / 4.66 V**. Firmware `V5_PFI` 4.60 V is stale (it came from the old 287 k). + - ADC reads 5V_SENSE (R7/R8 10 k/10 k) against VDDA = the 3V3 LDO (±1.5 %, lower on battery, A-08): thresholds carry ±2–3 % unless calibrated with VREFINT. +- **Consequence:** with FW 0.6.0 thresholds most v6 units never start charging (R5 fails); margins are thin under modem bursts once the modem moves to MAIN5V (A-01). +- **Fix:** **R121 → 57.6 k 1 % 0603, LCSC C23082** (Extended, stock 3673). Top corner 5.463 V is 37 mV under the 5.5 V VIN operating maximum; load-release overshoot is brief and far below abs max (verify_1). 0.1 % parts optional (no 0.1 % LCSC found in the DB). Firmware: `V5_PFI` = 4.40 V, VREFINT calibration. +- **Effort:** schematic-only (+ firmware constants). + +##### A-05 · Major · Battery-mode budget: 2.25–2.33 A on MAIN5V during a GSM burst; CSYS ≈ 57–69 µF effective +*Absorbs:* nothing (its fix 1 is E-01, fix 3 is in F-03, fix 4 is A-01). *Status:* verified-with-correction (verify_1: the 93–97 % is against the datasheet's guaranteed 2.5 A from ≥ 3.2 V; the hard limit is ILIM(BST) ≥ 5.5 A, which leaves ≈ 30–40 % switch headroom at 3.5 V; a 2.8 A GSM peak at a 3.2 V battery reaches ≈ 5.4 A, i.e. the limit). +- **Evidence:** what stays alive on battery: BAT → L6 → U6 boost → `/MAIN5V` (VSYS 0.8·(1 + 499k/100k) = **4.60 / 4.79 / 4.99 V**); from MAIN5V: D21 → U20 → modem (ahead of P5; EN held low by R113 when the MCU is unpowered), and P5 → `/SYS5V` → D12 → U17 (3V3), U12 (3V3_ETH, EN tied to VIN = always on), F1 → Q1 → U21 → F9P, K1 coil. CSYS = C32/C33 47 µF 16 V X7R 1210 + C34 10 µF 50 V = 104 µF nominal, **≈ 57–69 µF effective** at 4.8 V, below the 75 µF transient guidance (DS p.21). Worst-case budget below (assumptions: logic 90/120 mA, F9P 100/85 mA, W5500 132 mA at 3.3 V via U12 η 0.85, K1 30 mA, modem 2.0 A GSM peak / 0.7 A LTE / 20 mA idle, U20 η 0.88, boost η 0.88, battery 3.5 V). +- **Consequence:** as-is, a cold modem registration or a GSM burst with everything else on sits at 91–97 % of the guaranteed boost rating with no allowance for > 2 A bursts or an aged pack. Hitting the limit droops VSYS: U17 drops out first (A-08), then VBAT_MODEM < 3.4 V, the V5.5 "modem dark on battery" symptom by another mechanism. R1/R3 need the fixes plus firmware sequencing. +- **Fix:** add **2 × 47 µF 16 V X7R 1210, LCSC C5440143**, at U6 VSYS pins 1/24 (≈ 113 µF effective). Plus: E-01 (gate 3V3_ETH), A-01 (no D21, +0.30 V at U20), A-07 (MAIN5V ≥ 1.5–2 mm to U20), F-03 (U20 Cin), and mandatory firmware sequencing (§8: LTE-only on battery, W5500 off, F9P settled before the modem, refuse modem cold start below VBAT ≈ 3.4 V). +- **Effort:** both. + +**Worst-case current budget (A-05, reproduced by verify_1).** On 24 V, as-is topology, charging with R50 825 Ω / with 1.43 k: + +| Rail | Cold start | Steady | Modem TX burst | +|---|---|---|---| +| /3V3 (U17 out) | 0.120 A | 0.090 A | 0.090 A | +| /3V3_GNSS | 0.100 A | 0.085 A | 0.085 A | +| /3V3_ETH | 0.132 A | 0.132 A | 0.132 A | +| /VBAT_MODEM | 2.0 A pk (0.3 A avg) | 0.024 A | 2.0 A pk | +| /VIN_MODEM @ 23.5 V (from /24V) | 0.37 A pk | 0.005 A | 0.37 A pk | +| /SYS5V | 0.35 A | 0.31 A | 0.31 A | +| /VEH5V (U25 out; charger held off 120 s at boot) | 0.36 A | **2.50 A (RS1-limited) / 1.48 A** | 2.50 / 1.48 A | +| P1 total @ 24 V | 0.50 A | 0.65 / 0.43 A | **1.02 / 0.80 A** | +| P1 total @ 9 V | — | 1.73 / 1.1 A | **2.8 / 2.2 A** | + +On battery, as-is topology (VSYS 4.79 V, VIN_MODEM ≈ 4.4 V after D21): + +| Rail | Cold start (all on, modem registering) | Steady (idle) | GSM TX burst | LTE TX | +|---|---|---|---|---| +| /VIN_MODEM | 1.96 A pk | 0.024 A | 1.96 A pk | 0.69 A | +| /SYS5V (logic + F9P + W5500 + K1) | 0.36 A | 0.32 A | 0.32 A | 0.32 A | +| **/MAIN5V = boost load** | **2.33 A (93 % of 2.5 A)** | 0.34 A | **2.28 A (91 %)** | 1.01 A (40 %) | +| same at VSYS low corner 4.60 V | **2.43 A (97 %)** | 0.34 A | 2.38 A (95 %) | 1.04 A | +| Battery current (3.5 V, η 0.88) | 3.62 A | 0.53 A | 3.55 A | 1.57 A | +| with fixes + FW sequencing (W5500 off, K1 off, F9P deferred, D21 bridged) | **1.95 A (78 %)** | 0.15 A | 1.95 A | 0.85 A | +| with fixes + LTE-only on battery | ≈ 1.2 A (48 %) | 0.15 A | — | 0.85 A | + +verify_1 reproduction: MAIN5V **2.25 A** during a 2 A GSM burst (modem 1.89 A at 4.42 V input, SYS5V ≈ 0.36 A); battery **3.42 A at 3.5 V**, 3.24 A at 3.7 V. Cold-start statement for the modem: B-16 (§4-B). + +##### A-07 · Major · 5 V power path runs the full LTC4040 input current through inner 0.5/0.8 mm tracks +*Absorbs:* J-02 copper on `/VEH5V`, `/VIN_SW`, `/MAIN5V` (J-02 residual stays Minor). *Status:* verified (verify_1; verify_2 adds that JLC04161H inner copper is 0.5 oz by default, which makes the inner runs worse: R ≈ 27 mΩ, 0.17 W over 13.6 mm). +- **Evidence (widest-path bottlenecks):** `/VEH5V` L22.2 → RS1.1: **In1 0.5 mm × 13.6 mm** (+ In2 1.0 mm × 66.6 mm), 2.5 A while charging → IPC-2221 internal +168 °C (IPC-2152 ≈ half). `/VIN_SW` RS1.2 → Q7: **In2 0.8 mm × 23.6 mm**, +77 °C at 2.5 A. `/MAIN5V` Q7 → U6.24/C32: F.Cu 0.5 mm × 13.3/6.6 mm, +26/+32 °C; U6.1 → C32 0.30 mm neck (A-02). `/MAIN5V` Q7 → D21: 1.0 mm, 40 mm. RS1 Kelvin: CLN sense (U6.7) taps 1.66 mm down the 0.8 mm trace from RS1.2 (+1.0 mΩ) → effective input limit 2.14–2.41 A instead of 2.35–2.65 A (conservative, unintended). verify_2 J-02: under-capacity length `/MAIN5V` 111 mm, `/VEH5V` 102 mm, `/VIN_SW` 26 mm. +- **Consequence:** hot inner copper under U6/Q7 at charge current, extra drop, heat shared with the U6 area. A-01 adds more hours at the RS1 limit, so A-07 is a prerequisite of A-01. +- **Fix (layout):** `/VEH5V` L22.2 → RS1.1 on F.Cu ≥ 2 mm or a pour (move L22/C153/C154 toward RS1), or ≥ 2 mm inner with ≥ 4 vias per transition. `/VIN_SW` on F.Cu ≥ 2 mm, Q7 ≤ 5 mm from RS1/U6. `/MAIN5V` per A-02, and ≥ 1.5 mm all the way to U20. Route U6.7 (CLN) and U6.6 (VIN) sense from the inner edges of the RS1 pads (Kelvin). Either order 1 oz inner copper or widen inner runs by 1.65× (verify_2). +- **Effort:** layout. + +##### A-08 · Major · U17 AMS1117-3.3 drops out on battery and sets a 25–55 mW sleep floor +*Status:* verified (verify_1). +- **Evidence:** LDO_IN on battery = VSYS 4.60–4.99 V − D12 (≈ 0.3 V) = **4.27–4.67 V**; AMS1117 dropout ≈ 1.0 V at 0.1 A (1.1 V typ / 1.3 V max at 0.8 A) → needs ≈ 4.3 V. Ground current 5 mA typ / 11 mA max → 27–60 mW referred to the battery (boost η 0.88), against the 20–50 mW duty-cycle floor (`drogheda-backup-lowpower`). VDDA = 3V3 via R104 10 Ω while firmware assumes 3.30 V → BAT_SENSE/5V_SENSE read up to +4 % high; the 3.40 V low-battery cut trips at ≈ 3.27 V real. Datasheet asks for 22 µF tantalum; /3V3 is all ceramic. +- **Consequence:** degraded 3V3 exactly on battery, wrong battery telemetry, and a sleep floor as large as the whole target. +- **Fix:** **U17 → TI TLV1117LV33DCYR, LCSC C15578** (SOT-223, same 1-GND / 2-OUT / 3-IN pinout, 1 A, 455 mV at 1 A, ≈ 100 µA Iq, ceramic-stable, VIN max 5.5 V vs LDO_IN max ≈ 5.21 V with 57.6 k; stock 26 999). Do **not** use C48937499 (same MPN listed, wrong die: 1.2 V dropout, 12 V). Firmware: VREFINT calibration. +- **Effort:** schematic-only. + +##### A-09 · Major · C78 is an 85 °C / 2000 h general-purpose electrolytic on the 5 V rail (≈ 1-year life in a port box) +*C130/C131 moved to B-02.* *Status:* verified (verify_1). +- **Evidence:** C78 (VEH5V bulk) = C2827940 SamYoung MVG 16 V 220 µF, −40…+85 °C, 2000 h @ 85 °C, 130 mA ripple. 10 °C-rule life at 65 °C local (assumption): MVG ≈ 8 000 h (0.9 y 24/7). Others: C10 MVK 105 °C/1000 h (removed by A-01), C3/C103 Rubycon TZV 105 °C/2000 h, C151 Nichicon UUD 105 °C/5000 h ✅. +- **Consequence:** bulk capacitance and ESR drift within the first year, affecting U25 transient response. +- **Fix:** **C78 → Lelon OVZ221M1CTR-0608 220 µF 16 V polymer, LCSC C881921** (same 6.3 × 7.7 can, 105 °C/2000 h, stock 2442). Effect on the U25 loop is benign: fc ≈ 4.4 kHz with 276 µF against the 1.8 kHz compensation zero → PM ≈ 68° (verify_1). +- **Effort:** schematic-only. + +##### Minor (A) +- **A-10 · Minor · No over-voltage protection on VEH5V** (not independently verified). U6.16 OVSNS tied straight to `/VEH5V` (OVP unused). A TPS54360B high-side short puts `/VIN_PROT` (24–36 V) on VEH5V (LTC4040 VIN abs max 6 V steady / 7 V transient) and through Q7 onto MAIN5V → SYS5V. V5 used the isolated SD-15B, so v6 adds this failure mode. *Fix (pick one):* (a) LTC4040 OVP arrangement per the datasheet application (OVSNS via 6.2 kΩ + series N-FET ≥ 40 V; verify the topology against the datasheet figure before committing), or (b) a 1.5 kW 5 V TVS (SMCJ5.0A class) as a crowbar to open F2 (imperfect). No LCSC selected in the findings. *Effort:* both. +- **A-11 · Minor · CHGOFF (PA8) has a pull-down: charger runs at full current whenever the MCU is not driving the pin** (not independently verified). R56 100 k `/CHRG_EN` → GND; during reset, DFU, boot loops and unflashed boards the charger is enabled with no governor (2.42 A as-is). *Fix:* R56 100 k (C25803) re-netted to `/3V3` → default charge OFF; polarity unchanged. *Effort:* schematic + one track. +- **A-13 · Minor · PFO goes only to TP2: no hardware power-fail interrupt** — *absorbs D-10* (not independently verified; pin allocation per verify_1 (h)). `/PFO_TP` = {U6.20, TP2}; firmware detects backup by polling 5V_SENSE (V5_OFF 3.80 V) although the LTC4040 has switched at PFI 4.40 V; tens of ms late to shed loads. `/CLPROG_TP` = {U6.3, TP1} (V = 32·(VIN − CLN), 0.32 V/A with RS1 10 mΩ). *Fix:* PFO → **PB10** (pad 29, EXTI10) with **100 k C25803 pull-up to /3V3**. D-10's CLPROG → PC5 is dropped because PC5 goes to F-51; CLPROG stays on TP1. *Effort:* both (two tracks). +- **A-14 · Minor · BSTFB divider 21–24 mm from U6; IGATE 43 mm unguarded** — *absorbs F-10* (not independently verified; the In1-cut part is in A-02). R53.2 → U6.18 21.4 mm, R54.1 24.0 mm; `/VFB_BST` F.Cu 16.8 mm + In1 24.4 mm, 5 vias, 41.2 mm total (83 kΩ Thevenin node); `/IGATE` F.Cu 6.0 + In1 37.0 mm, Q7.4 ↔ U6.15 23.2 mm. Switch-node overlap (F-10): `/SW_PWRIN` over In1 `/MAIN5V` 2.41 mm², `/SW_5V` 2.91 mm², `/VFB_BST` 1.14 mm² (≈ 0.095 pF → ≈ 0.23 mA spikes at 24 V/10 ns); `/SW_BAT` over In1 `/SW_5V` 1.39 mm². *Consequence:* backup set-point noise (the mode R1/R3 rely on); µA-class IGATE drive exposed to humid-box leakage (Q7 body diode ≈ 1.2 W at 2.5 A if partially off). *Fix:* R53/R54 ≤ 3 mm from pins 18/10, top leg Kelvin-tapped at the CSYS pads, net on F.Cu; Q7 ≤ 5 mm from U6.15, IGATE ≤ 8 mm on F.Cu flanked by MAIN5V copper; In1 solid under all switch nodes (F-05). *Effort:* layout. +- *(D-09, absorbing A-12, is in §4-D; F-51/F-52 are in §4-F; F-01/F-02 (24 V clearance) are in §4-F.)* + +##### Notes (A) — not independently verified unless stated +| ID | Observation | Action | +|---|---|---| +| A-16 | U25 EN/UVLO divider R124 523 k / R125 84.5 k DNP → internal UVLO 4.1–4.3 V; between ≈ 4.3 V and 5.8 V input VEH5V is in dropout inside the PFI band (12 V vehicles under crank only). | Optional: populate R124/R125 (start ≈ 8.0 V, stop ≈ 5.5 V) if 12 V machines are in scope; LCSC to be picked in sourcing. | +| A-18 | U25 compensation = TPS54360B datasheet example (13 k / 6.8 nF / 39 pF) for 8.2 µH + 58 µF; v6 has 10 µH + ≈ 56 µF ceramic + bulk; fco ≈ 4–6 kHz, PM > 60° (estimate); ≈ 0.16 V dip for a 1.8 A step. | None required; optional R123 → 24 k after A-01/A-09; bench 0.3 → 2.5 A step. | +| A-19 | SMCJ33A/SMBJ33A survive 36 V/60 min and ISO 7637-2 fast pulses but not an ISO 16750-2 Test B suppressed load dump (58 V, 100–350 ms, ≈ 10 A); the TVS would fail short and F2 then opens (after A-01). | Confirm alternator load-dump suppression in the fleet (§10). Keep SMCJ33A; do not raise the TVS voltage (U25 65 V abs max). | +| A-20 | (a) U12 MP1584EN (C15051, $2.21 @100, −20…+85 °C): gate EN (E-01); optional swap to AP64350 C2071691 ($0.58, re-layout). (b) F1 3 A PPTC now protects only the F9P LDO branch: harmless, not protective; keep. (c) P2 bench jack has no reverse protection (VEH5V −0.3 V abs max): state on silkscreen. (d) JP_CUT → G-04. (e) C22 value text 22 µF vs 10 µF part → H-08. (f) K1 G5V-1 rated −40…+70 °C. (g) R112 1 k VBAT_MODEM bleeder 3.8 mA / 14 mW: fine. | As listed. | + +*F-53 (fan block) is absorbed into A-01 and not counted as a Note:* U2 5V_FAN 4.99 V (4.76–5.23 V); FB divider R20/R21 0.67/1.48 mm from U2.4 (ECO E3 fixed); PA6 → Rg1 100 Ω → Q2 with Rgs1 100 k (default OFF), D2 flyback; 2-wire fan, no tach. A-01 moves the fan to VEH5V; firmware adds the NTC to `thermalCtlTemp()`. + +#### (b) Pass/fail — §4-A +| Check | Evidence (one line) | Result | +|---|---|---| +| U25 output formula / tolerance | 0.8·(1 + 53.6/10.2) = 5.004 V; Vref 0.792–0.808 → 4.87–5.14 V | ❌ set-point (A-04) | +| U25 RT / fsw / min on-time | 162 k → 600 kHz; tON at 36 V = 244 ns ≥ 135 ns | ✅ | +| U25 inductor L22 | 10 µH ≥ Lmin 7.2 µH (36 V); SRP1265A Isat 15.5 A vs peak 3.1–3.4 A | ✅ | +| U25 current capability | ≤ RS1 limit 2.14–2.41 A (+0.3 A fan with A-01) vs 3.5 A rating, 4.5 A min switch limit | ✅ | +| U25 Cout / ripple | 2 × 47 µF X7R 1210 (≈ 56 µF eff) + 220 µF; ΔI 0.69 A, ΔV ≈ 3 mV | ✅ value / ❌ C78 life (A-09) | +| U25 compensation | datasheet example; fco ≈ 4–6 kHz, PM > 60° (estimate) | ✅ (A-18 Note) | +| U25 BOOT cap C152 | 100 nF, 1.49 mm edge | ✅ | +| U25 Cin value | 2 × 2.2 µF/100 V X7R ≈ 3.4–3.8 µF eff ≥ TI 3 µF | ✅ value / ❌ loop (F-03) | +| U25 soft start / inrush | 1024 cycles / 600 kHz = 1.7 ms; ≈ 0.9 A into ≈ 280 µF | ✅ | +| U25 EN / UVLO | EN floats → on; internal UVLO 4.1–4.3 V | ✅ (A-16 Note) | +| Vehicle-voltage exposure of other parts | U2 30 V abs max, D21 30 V, U20 42 V on unfused `/24V` | ❌ A-01 | +| Reverse polarity | Q23/Q10 IRFR5305 −55 V/65 mΩ, gate clamps D33/DzG1 ✅; but D10 ahead of F2 conducts on reversal | ❌ V1-01 | +| DzG1 netlisted (V5 corruption) | DzG1.1 `/Q10_GATE`, .3 `/24V` | ✅ | +| TVS standoff / polarity | SMCJ33A/SMBJ33A VRWM 33 V ≥ 32 V; pad 1 = K on + rail | ✅ (A-19 Note) | +| F2 part / coverage | C206910 2 A assigned ✅; protects the U25 branch only | ❌ A-01 | +| 24 V-to-LV inner clearance < 0.5 mm | 6 inner spots, all `/IGN_IN` (worst 0.221 mm to `/VEH5V` on In2); `/24V` In1 at 0.15 mm to GND fill | ❌ F-01, F-02 | +| RS1 input limit | 10 mΩ 1 W (C105362): 2.35–2.65 A (2.14–2.41 A with the CLN tap) < U25 3.5 A | ✅ | +| R50 charge current | 825 Ω → 2.42 A (2.57 A max > 2.5 A IC max) | ❌ A-03 | +| LTC4040 PROG node | R50 1.26 mm from pin 2; `/PROG` 2.6 mm | ✅ | +| BSTFB (backup VSYS) | 499 k/100 k → 4.60/4.79/4.99 V within 3.5–5.0 V; keep 499 k | ✅ value / ⚠ placement (A-14) | +| PFI divider | 270 k/100 k: fall 4.27/4.40/4.54, rise 4.38/4.51/4.66 V | ✅ (FW `V5_PFI` stale) | +| RSTFB / RST | RSTFB tied to BSTFB (allowed), RST NC | ✅ | +| OVSNS | tied to VIN → OVP unused | ⚠ A-10 | +| NTC window RNTB | R55 10 k: hot pause 42.4 °C, resume 40.1 °C, cold −3.1 °C (B3380) | ⚠ chemistry D1 pending | +| Chemistry straps | JP2 1-2 (Li-ion), JP3 F1 = 0, JP4 F0 = 1 → 4.00 V | ✅ | +| Safety timer | Li-ion 4.25 h, counts in CV only | ✅ | +| CHRG / FAULT to MCU | R57/R58 100 k to 3V3 → PB3/PB4 | ✅ | +| CHGOFF default | R56 100 k pull-down → charger ON without MCU | ⚠ A-11 | +| BSTOFF | tied to GND → boost always armed | ✅ / Note | +| Q7 ideal-diode orientation | AO4406A S = VIN_SW, D = MAIN5V | ✅ | +| L6 value / rating | 2.2 µH, 8 A ≥ ILIMBST max 7.5 A | ✅ value / ❌ placement (A-02) | +| SW_BAT / BAT_PLUS copper, U6 EP vias | 0.5 mm + 0.25/0.30 mm necks; 1.0 mm; 0 EP vias | ❌ A-02 | +| CSYS | 104 µF nominal, ≈ 57–69 µF effective (< 75 µF) | ⚠ A-05 | +| CBAT C35 | 22 µF ≥ 10 µF; 20.2 mm from L6.2 | ✅ value / ⚠ placement (A-02) | +| 5 V path widths | `/VEH5V` In1 0.5 mm, `/VIN_SW` In2 0.8 mm at 2.5 A | ❌ A-07 | +| U20 FB | 75 k/20 k → 3.70/3.80/3.90 V within A7670 3.4–4.2 V | ✅ | +| U20 RT / min on-time | 200 k → 500 kHz; tON at 36 V = 211 ns ≥ 100 ns | ✅ | +| U20 UVLO on battery | falling ≈ 3.1–3.3 V vs VIN_MODEM ≥ 4.2 V (≈ 1 V margin; V5.5 had 0.1 V) | ✅ | +| U20 EN default | EN pull-up 1.5 µA (verify_1; not 5.5 µA) × R113 100 k = 0.15 V < 1.03 V → OFF | ✅ | +| U20 BST | C129 100 nF, 1.8 mm | ✅ | +| L20 | 4.7 µH (MWSA0804S-4R7), 5 A vs peak 2.2–2.7 A | ✅ (land: H-03) | +| U2 FB / placement | 4.99 V; divider at pin | ✅ (rating ❌ A-01; Cin moot with A-01) | +| U12 FB | 100 k/31.6 k → 3.18/3.33/3.48 V | ✅ (EN ❌ E-01, loop ❌ F-03) | +| U21 AP2112K dropout | 250 mV at 600 mA; F9P ≈ 0.1 A; SW_5V ≥ 4.5 V on battery | ✅ (ramp ❌ C-02) | +| U17 AMS1117 | LDO_IN ≈ 4.6 V on 24 V ✅; 4.27–4.67 V on battery | ❌ A-08 | +| Worst-case battery budget | 2.25–2.33 A on MAIN5V at a GSM burst (91–97 % of guaranteed 2.5 A) | ⚠ A-05 | +| DFU-only power | DFU_VBUS → D13 → LDO_IN; D12 blocks back-feed into SYS5V | ✅ | +| K1 flyback | D6 1N4148W across the coil | ✅ | +| Fan PWM default | Rgs1 100 k → Q2 OFF at reset | ✅ | +| Q5 base (F9P rail) default | no base pull-down; floats in reset | ⚠ D-09 | + +--- +### 4-B Modem A7670SA (U19), lessons F1 / F2 / F3, ECO A / B + +Cross-references: U20 input topology → **A-01** (absorbs B-01); U20 hot loop and Cin → **F-03** (absorbs B-06); modem ground vias → **F-12** (absorbs B-04); LTE feed on In1 → **F-06** (absorbs B-05); J9 ESD → **G-02** (absorbs B-07's ESD part); NC flags on PC6/PC7 → **J-04** (absorbs B-11); stackup and netclasses → **F-06 / F-01** (absorb B-12). + +#### (a) Findings + +##### B-03 · Blocker · LTE antenna ESD D28 is a unidirectional 5 V TVS on an RF line with no DC bias +*Status:* verified-with-correction (verify_1: the proposed PGB1010402KR is rated 12 VDC max operating, below the 14.1 V GSM peak; use PESD0402-240). +- **Evidence:** D28 = C82326 onsemi ESD9L5.0ST5G, "Unidirectional, 0.9 pF, VRWM 5 V, VBR 5.4 V, VC 9.8 V", SOD-923; pin 1 (C) on `/RF_ANT_LTE`, pin 2 (A) on GND; in-line 1.8 mm from J13.1. A7670SA output (HD V1.03 Table 30; GSM supported per Table 1): GSM850/900 33 dBm ±2, DCS/PCS 30 dBm, LTE 23 dBm ±2.7. Peak voltage at 50 Ω, V = √(2·P·50): 23 dBm → **4.47 V**, 33 dBm → **14.1 V**; at VSWR 3:1 (×1.5) 6.7 / 21.2 V. SIMCom Fig. 33: "D1 is a Bidirectional ESD Protection device". +- **Consequence:** the diode forward-conducts at ≈ −0.6 V on every negative half-cycle, even in LTE, and avalanches at 5.4 V on GSM positive peaks: hard clipping, spurious emissions (homologation), lost TX power, PA stress, D28 heating and likely failure (possibly shorting the antenna port). +- **Fix:** **D28 → Littelfuse PESD0402-240, LCSC C1975527** (bidirectional, 24 V working, 0.25 pF → −j335 Ω shunt at 1.9 GHz, |Γ| ≈ 0.07; stock 9394), or DNP D28 (SIMCom marks it optional). Either way needs an **0402 land** in place of the SOD-923 (comes with the F-06 reroute). Keep D27 on the GNSS line (+3.2 V bias, no TX; a unidirectional 5 V part is correct there). +- **Effort:** both. + +##### B-02 · Major · VBAT_MODEM bulk is a general-purpose electrolytic; U20 compensation is the 5 V table row +*Absorbs:* A-09 (C130/C131), A-17. *Status:* verified, severity changed Blocker → Major (verify_1: works on day 1, fails cold or aged; BOM-only fix on the same land). +- **Evidence:** C130, C131 = C2827940 SamYoung MVG 16 V 220 µF 6.3 × 7.7 (value field reads "220uF/10V"), −40…+85 °C, 2000 h @ 85 °C, 130 mA ripple: not polymer. Placement: C131 8.70 mm, C130 16.26 mm from U19.55–57; nearest cap to L20.2 is C130 at 10.1 mm. Low-ESR output capacitance is only C132 22 µF + C133 1 µF + C134 100 nF ≈ 14 µF effective (SIMCom asks ≥ 300 µF, HD V1.03 p.27). Compensation R116 14 k / C141 3.3 nF / C142 47 pF = the AP64350 **Table 1 VOUT = 5.0 V** row (designed for 2 × 22 µF ceramic). FB R110 75 k / R111 20 k → 3.80 V (3.67–3.94 V worst case) ✅. Life ≈ 8 000 h at 65 °C. + + | Condition (verify_1 averaged current-mode model) | 2 A GSM burst droop | 0.7 A LTE | + |---|---|---| + | Battery via D21 (4.42 V), MVG new (ESR 0.2 Ω pair) | **0.28 V** (VBAT 3.52 V) | 0.08 V | + | Same, cold / aged (0.6 Ω pair) | **0.52 V** (3.29 V < 3.4 V min) | 0.13 V | + | Battery, polymer + 113 k / 6.8 nF / 56 pF | 0.06 V | 0.02 V | + | Battery, polymer with the as-is 14 k | 0.18 V (PM ≈ 27°) | 0.06 V | + +- **Consequence:** within SIMCom's 300 mV limit on day 1 with LTE-only on battery; with cold or aged caps GSM bursts pull VBAT below 3.4 V → "modem dark" likely within about a year. Reliability failure → Major. +- **Fix (change caps and compensation together):** **C130, C131 → C881921** (Lelon OVZ 220 µF/16 V polymer, 105 °C/2000 h, 6.3 × 7.7, stock 2442); **R116 14 k → 113 k 1 % (C22862, stock 59 728)**; **C141 3.3 nF → 6.8 nF X7R 0402 (C1542)**; **C142 47 pF → 56 pF C0G 0402 (C1572)** (C141/C142 are 0402 today); **add 2 × 22 µF 0805 (C86817, stock 4144) at L20.2** ≤ 3 mm. Checks: R5 = 4.67e3·14 kHz·3.8 V·454 µF = 112.8 k; C5 = 3.8·454 µ/(2 A·113 k) = 7.6 nF; zero 207 Hz, fc 14 kHz, C6 pole 25 kHz → **PM ≈ 60°**. 113 k is valid only with the polymer bank (with MVG the ESR zero ≈ 1.8 kHz sits below fc). A-17's alternative (R116 = 10 k with polymer) gives PM ≈ 15° and is rejected (verify_1 conflict (c)). Move C131 ≤ 5 mm from U19.55–57 (B-08). Bench: 0.1 → 2 A step on VBAT_MODEM, droop ≤ 150 mV, no ringing. +- **Effort:** both (BOM values + 2 caps + C131 move). + +##### Minor (B) — not independently verified +- **B-08 · Minor · VBAT_MODEM feed: 0.5 mm neck into pins 55–57; 1 mm over 7 mm; no pour.** F.Cu 48.9 mm (0.25/0.5/1/1.5/2 mm) + In1 6.3 mm, 2 vias; final feed 0.5 mm × 2.5 mm into U19.55 then 0.5 mm × 2.0 mm to 56/57. L20.2 → U19.55 12.5 mΩ, drop at 2 A 25–29 mV (static, fine). verify_2 J-02: 12.5 mm under capacity. *Consequence:* violates SIMCom's VBAT width rule (≥ 3 mm V1.03), adds loop inductance between bulk and pins. *Fix:* F.Cu pour ≥ 3 mm from L20.2 → C130 → C131 → C132–C136 → U19.55/56/57, fanned to all three pads; C131 ≤ 5 mm from the pads. *Effort:* layout. +- **B-09 · Minor · SIM interface: 0 Ω instead of 22 Ω; ESD 22–25 mm from J14; VDD cap 13.5 mm away.** J14 (C2977286) + R131–R134 0 Ω populated, U22 + R127–R130 DNP ✅. D23/D24/D25 PESD5V0S1BA (C2827694) sit 1.3–5.7 mm from U19 but 21.7–24.8 mm from J14; C126 100 nF 13.5 mm from J14.C1; `/SIM_VDD` unclamped. *Fix:* **R132/R133/R134 → 22 Ω 0603 (C23345, Basic)**; add **100 nF 0402 (C1525) at J14.C1**; move D23–D25 next to J14 (an ESDA6V1W5-class array covering VDD is an option; no LCSC selected). Keep F.Cu clear under U22's die-pad zone if MFF2 is ever fitted. *Effort:* both. +- **B-10 · Minor · Undefined idle levels on the modem interface; RTCM-tap resistor too small** — *absorbs D-14.* U24 (VCCA = `/1V8_MODEM`) is Hi-Z whenever the modem is off, so `/MODEM_STATUS` (PC9) and `/DOUT_4G` float; `/DIN_4G` floats during the K1 transfer and with the F9P off. R106 = 100 Ω between U24 1B and PC7: a mis-configured PC7 output would see ≈ 33 mA (> 25 mA pin limit). *Fix:* **100 k (C25803) `/MODEM_STATUS` → GND**; **100 k (C25803) `/DIN_4G` → /3V3**; **R106 100 Ω → 1 kΩ (C14676)** (ECO §B value; 1 k × ≈ 5 pF = 5 ns, fine to 921 600 Bd). *Effort:* schematic-only (+ 2 small footprints). + +##### Notes (B) — not independently verified +| ID | Observation | Action | +|---|---|---| +| **B-16** | **Cold start on battery (brief §4-B explicit statement).** With VSYS 4.79 V: PMEG3050EP as-is, GSM 2 A → VIN(U20) 4.44 V, MAIN5V 2.28 A (OK, 9 % margin to 2.5 A); 2.8 A peak (HD V1.00) → 3.08 A, **over** the backup limit; D21 replaced by a link (A-01) → 4.70 V, 2.17 A (13 % margin); LTE 1.0 A with link → 1.27 A. U20 UVLO (3.5–3.7 V rising) is never approached (VIN ≥ 4.2 V). **Yes, v6 can bring the modem up from the LTC4040 boost alone**, provided (1) the modem is enabled only after the F9P rail has settled, (2) the modem is LTE-only on battery, (3) the W5500 is off (E-01), and (4) the VBAT bank is fixed (B-02). Otherwise LTE-burst droop, not UVLO, is the failure mode. R2 hardware path: EN low stops U20; VBAT decays through R112 1 kΩ, τ 0.46 s → 47 mV after the 2 s HARD_CYCLE. | Firmware sequencing (§8). Bench-check VBAT at MAIN5V = 4.6 V with a 2 A load (AP64350 max duty not stated in DS41976). | +| B-13 | K1 fail-safe premise is obsolete: the A7670SA has no NTRIP client, and an MCU reset also switches the modem off (R113) and releases K1. Coil 5 V × 30 mA = 150 mW while Mode B is held. | No hardware change for v6; firmware energises K1 only while the modem is on; consider a direct PC6 → DIN_4G link in v6.1. | +| B-14 | Everything the modem prints (AT replies, URCs, socket headers) reaches F9P UART2 RXD. No contention (single driver U24). | Firmware: F9P UART2 in-protocol RTCM3 only at 115 200; caster socket transparent (`AT+CIPMODE=1`) or MCU re-assembly → USART2 → F9P UART1. | +| B-15 | R107/R108 "bypass the shifter" DNP 0 Ω footprints cannot work: fitted without the shifter they put 1.8 V on F9P RXD2 (VIH 2.64 V) and 3.3 V on modem RXD (abs max 2.0 V). | Delete them or add a "never fit" note. | + +#### (b) Pass/fail — §4-B +| Check | Evidence (one line) | Result | +|---|---|---| +| A7670SA footprint / pin numbering | LGA-124 matches HD V1.03 (VBAT 55–57, RF_ANT 60, STATUS 66, VDD_1V8 15, UART 9/10, USIM 30–34) | ✅ | +| U20 source | `/VIN_MODEM` from unfused `/24V` via D20 and from MAIN5V via D21 (30 V) | ❌ A-01 | +| U20 EN default OFF | EN pull-up 1.5 µA × R113 100 k = 0.15 V < 1.03 V | ✅ | +| U20 output set-point | 75 k/20 k → 3.80 V; worst 3.67–3.94 V within 3.4–4.2 V | ✅ | +| U20 frequency / min on-time | R117 200 k → 500 kHz; tON at 40 V = 190 ns > 100 ns | ✅ | +| U20 compensation vs datasheet for 3.8 V | 5 V Table 1 row applied at 3.8 V; PM ≈ 27° with polymer and 14 k | ❌ B-02 | +| U20 input caps | C127 10 µF 50 V + C128 1 µF; ≈ 65 mV p-p ripple at 2 A; GND 6.86/8.48 mm, 0.25 mm neck | ❌ F-03 | +| L20 saturation | 4.7 µH MWSA0804S, ≥ 8.7 A family Isat vs 2.7 A peak | ✅ (land: H-03) | +| L20 / C129 / COMP / RT placement | L20 2.24 mm, BST 1.8 mm, COMP 0.72 mm, RT 1.44 mm | ✅ | +| SW_MODEM copper | 1.0 mm × 6.6 mm, 2.2 mΩ (was 0.25 mm × 23 mm on 25-Sep) | ✅ | +| Bulk ≥ 220 µF polymer within 10–20 mm | 2 × 220 µF MVG electrolytic at 8.70 / 16.26 mm | ❌ B-02 (type) | +| VBAT track width ≥ 0.25 mm / vendor ≥ 3 mm | 0.5 mm neck into pins 55–57, 1 mm over 7 mm | ⚠ B-08 | +| VBAT HF ceramics | C133–C136 1.7–2.7 mm, C132 4.1 mm from VBAT pads | ✅ | +| D22 polarity | SMAJ5.0A pad 1 = cathode on `/VBAT_MODEM` | ✅ | +| VBAT bleed for HARD_CYCLE | τ = 0.46 s → 47 mV after 2 s EN low | ✅ | +| PWRKEY / RESET drive | 2N7002 open-drain, 100 k gate pull-downs, no caps | ✅ | +| Level shifting to 1.8 V | U23 DIR = GND (3.3 → 1.8 V into modem RXD); U24 DIR = VCCA (TXD + STATUS up); unused 2B tied | ✅ | +| Back-powering of the modem | 74LVC2T45 Ioff with VCCA = 0; PWRKEY/RESET open-drain; only 1.8 V on `_M` nets | ✅ | +| STATUS readback | U24 2A→2B, VOH ≈ 3.3 V vs PC9 VIH 2.31 V; floats when modem off | ✅ / ⚠ B-10 | +| UART contention | `/DOUT_4G` single driver (U24); `/DIN_4G` via break-before-make K1 | ✅ | +| RTCM visibility (R106 tap) | GGA field 13 on USART2 (PA3) + raw RTCM3 on USART6 RX (PC7); R106 100 Ω too small | ✅ / ⚠ B-10 | +| USART allocation | USART6 PC6/PC7 AF8, USART2 PA2/PA3, USART1 RX PA10; PA9 free | ✅ | +| USB_BOOT | TP8 floating (not pulled low at power-up) | ✅ | +| SIM population / eSIM | J14 + R131–R134 fitted; U22 MFF2 + R127–R130 DNP; USIM1_DET NC | ✅ (details B-09) | +| LTE π-pad | R118 0 Ω + C146/C147 DNP at J13 | ✅ | +| LTE antenna ESD | unidirectional ESD9L5.0 on a 14.1 V-peak TX line | ❌ B-03 | +| LTE feed geometry | 22.14 mm on In1, 2 via transitions, 32–47 Ω, 1 fence via | ❌ F-06 | +| Modem ground vias | 1 GND via under U19; U20 EP 0 vias; J13 20–21 mm to a via | ❌ F-12 | +| J9 modem USB ESD | none | ❌ G-02 | +| Cold start on battery (R1) | possible with sequencing, LTE-only, W5500 off and B-02 (B-16) | ⚠ needs fixes + firmware | + +--- +### 4-C GNSS ZED-F9P (U18) + +Cross-references: F9P back-power through U24 → **D-01** (§4-D, absorbs C-06); F9P ground vias → **F-12** (absorbs C-03); GNSS RF line and bias-line coupling → **F-06** (absorbs C-05). + +#### (a) Findings + +##### C-01 · Blocker · GNSS antenna bias has no current limit and no supervisor; ANT_DETECT / ANT_SHORT_N are undriven +*Absorbs:* D-07. *Status:* verified (verify_1). +- **Evidence:** `/VCC_RF_GNSS` = {U18.7, L21, C144, C145}; L21 = C162555 LQG18HN68NJ00D, 68 nH, 0.8 Ω, **400 mA**, SRF 1 GHz (u-blox recommends 120 nH). ZED-F9P-04B DS R05: pin 4 ANT_DETECT = **input** (active high), pin 5 ANT_OFF = output, pin 6 ANT_SHORT_N = **input** (active low); VCC_RF 50 mA operating, **300 mA abs max**. On v6 pins 4/6 connect only to PC1/PC2 (MCU inputs), so nothing drives them; U18.5 ANT_OFF is NC. u-blox IM UBX-18010802 R02 §8.6: "a 10 Ω current limiting resistor is **required** to prevent against short circuits destroying the BIAS-T inductor." +- **Consequence:** a crushed or wet coax (the H0005/H0014 field fault class) lets U21 (AP2112, current limit ≈ 0.6–0.8 A) push more than VCC_RF's 300 mA abs max and L21's 400 mA, collapses 3V3_GNSS into an F9P brown-out loop, and the PC1/PC2 "antenna telemetry" never reports it. Hardware-damage path. +- **Fix:** add **TPS2552DBVR, LCSC C46506** (SOT-23-6, stock 3002). Pinout 1 IN / 2 GND / 3 EN̅ / 4 FAULT̅ / 5 ILIM / 6 OUT. IN = `/3V3_GNSS`; OUT → new net `/ANT_BIAS` = L21.2 + C144 + C145; **ILIM tied to IN → 75 mA typ** (VIN 2.5–6.5 V; constant current into a short, ≈ 0.25 W at 3.3 V; FAULT̅ deglitch 7.5 ms); **EN̅ ← U18.5 ANT_OFF with 100 k (C25803) to GND** (antenna ON by default; ANT_OFF high → antenna off, matching the F9P's active-high ANT_OFF); **FAULT̅ → `/GNSS_ANT_SHORT_N`** (U18.6 + PC2) with **10 k (C25804) to /3V3_GNSS**; leave U18.7 VCC_RF NC. ANT_DETECT stays unimplemented (infer open antenna from C/N0). U21 load becomes 130 mA + 75 mA. The 10 Ω series fallback gives 3.2 V/10.8 Ω ≈ 0.30 A, right at VCC_RF's abs max: acceptable only as u-blox's stated minimum, and no LCSC is selected for it in the findings. +- **Effort:** both. + +##### C-02 · Major · U21 AP2112K has no soft-start: the ZED-F9P VCC ramp window (20–8000 µs/V) is met only by an unspecified margin +*Status:* verified, Major at the low end (verify_1). +- **Evidence:** U21 = AP2112K-3.3 (C51118), EN tied to VIN (`/SW_5V`), starts when Q1 switches `/SW_5V` (no gate RC). AP2112 DS39724: tS = 20 µs at no load, 50 mA foldback short-circuit current, no soft-start. `/3V3_GNSS` ≈ 18 µF (2 × 10 µF X5R + 3 × 100 nF). Ramp: ≈ 400 µs/V at start → ≈ 28 µs/V near regulation, ≈ 80 µs/V average: inside 20–8000 µs/V (ZED-F9P DS Table 15), but the fast-end margin (≈ 1.4×) depends on the AP2112's unspecified current-limit maximum. The F9P is power-cycled every 10-min window (R1: ≈ 52 000 starts/year). +- **Consequence:** occasional failed F9P start (dark receiver until the next cycle) in exactly the duty-cycled mode R1 requires. +- **Fix:** **U21 → TPS7A2033PDBVR, LCSC C2862740** (same DBV pinout 1 IN / 2 GND / 3 EN / 4 NC / 5 OUT; t_STR 750–1150 µs → **239–367 µs/V**; current limit ≥ 360 mA > 20 µF·3.3 V/0.75 ms = 88 mA + load; VIN max 6.0 V vs SW_5V ≤ 5.46 V; COUT 0.47–200 µF; stock 28 370). Bench: scope `/3V3_GNSS` rise (target 100–1000 µs/V). +- **Effort:** schematic-only (drop-in). + +##### C-04 · Major · GNSS supply switch Q1 sits 9 mm from the LTE antenna feed; `/SW_5V` crosses the board on In1 +*Status:* verified (verify_1). +- **Evidence:** Q1 AO3401A (`/SW_IN` → `/SW_5V`) at (197.28, 59.81) = **9.0 mm from J13**, Q5 7.1 mm (centres); F1 at (171.4, 44.3) in the LTE corner. `/SW_5V` Q1.3 → U21.1: **In1 181.32 mm** + F.Cu 19.7 mm, 2 vias (95 mΩ at 35 µm, 184 mΩ at 17.5 µm inner copper). The In1 section of RF_LTE passes 0.21 mm under `/SW_IN` and `/SYS5V`. +- **Consequence:** the F9P supply starts in the LTE transmitter's near field and travels ≈ 17–20 cm as a slot in the GND plane; LDO PSRR at LTE frequencies ≈ 0 dB, so TX envelope/IMD products ride into the receiver rail (desense, the brief's #1 risk), and In1 is cut end to end (F-05). +- **Fix (layout):** move Q1 + Q5 + R1 + R2 (F1 optional) into the GNSS island next to U21/C3/C40/C119; bring `/SYS5V` (or `/SW_IN`) to it instead; keep `/PWR_CTRL` as the long signal; route the remaining feed on F.Cu or In2 away from the RF lines. Target `/SW_5V` ≤ 15 mm and 0 mm on In1. +- **Effort:** layout. + +##### Minor (C) — not independently verified +- **C-07 · Minor · No test pad on SAFEBOOT_N.** U18.50 SAFEBOOT_N NC; V_USB/USB_DM/USB_DP NC; the only access is UART1 through the MCU bridge (P17 removed). *Consequence:* a failed F9P firmware update over the passthrough cannot be recovered (safeboot needs SAFEBOOT_N low at power-up). *Fix:* 1 mm test pads on U18.50 (SAFEBOOT_N) and U18.49 (RESET_N) next to a GND pad; no resistor. *Effort:* both. + +##### Notes (C) — not independently verified +| ID | Observation | Action | +|---|---|---| +| C-08 | Identity: no `$GPTXT H00xx` source on v6 (the ArduSimple NTRIP Master is gone; A7670SA and F9P emit no unit ID). FW 0.6.0-eth builds `$PHID,<96-bit UID>,,,,` (L718–724) but sends it only on the Ethernet TCP mirror. Lesson F9. | FW 0.7.x sends `$PHID` on the modem uplink at every connect and every 5 min; backend `retranslator` maps UID → H-number before v6 ships. | +| C-09 | V_BCKP (U18.36) on the always-on `/3V3` → hot start after each 10-min off (45 µA) ✅; its decoupler Cu4 (100 nF) is 4.06 mm from pin 36. | Optional: move Cu4 ≤ 2 mm. | + +#### (b) Pass/fail — §4-C +| Check | Evidence (one line) | Result | +|---|---|---| +| VCC ramp window 20–8000 µs/V | AP2112 no soft-start: ≈ 28 µs/V near regulation, margin unspecified | ⚠ C-02 | +| RTK_STAT | U18.20 → PC3 (output → MCU input) | ✅ | +| TIMEPULSE | U18.53 → PA7 (TIM3_CH2 / EXTI7) | ✅ | +| RESET_N | PC12 + R105 10 k to /3V3_GNSS (open-drain drive in firmware) | ✅ | +| SAFEBOOT_N | NC, no pad | ⚠ C-07 | +| V_BCKP | on always-on /3V3, 45 µA; Cu4 at 4.06 mm | ✅ (C-09 Note) | +| Antenna bias current limit / short detect | none; ANT_DETECT/ANT_SHORT_N undriven F9P inputs | ❌ C-01 | +| DC block / bias-T | C143 0.56 mm from J12; L21 68 nH still −j455 Ω at L1 despite 1 GHz SRF | ✅ | +| GNSS ESD D27 | unidirectional 5 V, cathode on line, bias 3.2 V < VRWM | ✅ | +| 50 Ω trace geometry on the real stackup | 0.5 mm / 0.15 mm gap → 38–41 Ω on JLC04161H-7628; `/VCC_RF_GNSS` 0.274 mm alongside over 3.3 mm | ❌ F-06 | +| RF_GNSS over a solid plane | 0 In1 slot crossings | ✅ | +| F9P decoupling | C121/C122 1.7 mm, C120/C124 2.4–2.5 mm, U21 4.4 mm from VCC pins | ✅ | +| UART / I²C / SPI to MCU | UART1 ↔ USART2 PA2/PA3; UART2 RX ← modem, TX → PA10 / K1 NC; D_SEL open = UART | ✅ | +| u-center passthrough via J11 (P17 removed) | only through the MCU USB-CDC bridge to USART2 (firmware must follow CDC line coding) | ✅ (firmware item) | +| F9P back-powering while off | U24 drives 3.3 V into unpowered RXD2 | ❌ D-01 | +| Supply switch distance from LTE feed | Q1 9.0 mm from J13; `/SW_5V` 181 mm on In1 | ❌ C-04 | +| GNSS island vs switchers ≥ 25 mm | nearest SW copper `/ETH_SW` 27.5 mm, L8 35.3 mm | ✅ | +| Island separation | J13 ↔ J12 150.3 mm; U19 ↔ U18 108.9 mm | ✅ | +| F9P ground vias | 0 vias under U18; 946 mm² cluster with 5 vias | ❌ F-12 | +| Identity without `$GPTXT` (lesson F9) | no H00xx source on v6; `$PHID` on Ethernet only | ⚠ C-08 (firmware) | +| MCU UID path for identity | 96-bit UID at 0x1FFF7A10 used by 0.6.0-eth | ✅ | + +--- +### 4-D MCU pin map vs firmware 0.6.0 (U16 STM32F411RET6) + +The full 64-pin table is in §4 of this report (condensed) and in `pinmap-v6.md` (complete, with AF/ADC/EXTI, V5 macro and proposed v6 macro per pin). Cross-references: ETH_RST pull-down → **E-02** (absorbs D-04); raw ignition on In2 → **F-02** (absorbs D-06); antenna pins PC1/PC2 → **C-01** (absorbs D-07); PFO → **A-13** (absorbs D-10); NC flags on connected pins → **J-04** (absorbs D-11); MODEM_STATUS pull → **B-10** (absorbs D-14); Y2 value text → **H-08** (absorbs D-16). + +#### (a) Findings + +##### D-01 · Major · U24 back-powers the unpowered ZED-F9P through RXD2 +*Absorbs:* C-06. *Status:* verified-with-correction (verify_2: use the Nexperia gate C12518, not the clone; the 10 k series-R alternative is not enough). +- **Evidence:** U24 74LVC2T45: VCC(A) = `/1V8_MODEM`, **VCC(B) = `/3V3` (always on)**, DIR = VCC(A) (A→B). `/DOUT_4G` = {U24.7 (1B), R106.1, R107.2 (DNP), U18.26 RXD2}; `/3V3_GNSS` = U21 output + U18.33/34 only (switched by PA1 → Q5 → Q1). ZED-F9P-04B DS R05 Table 14: input −0.5 … VCC + 0.5 V for VCC ≤ 3.1 V, so at VCC = 0 a 3.3 V push-pull high exceeds it by 2.8 V. The 74LVC2T45's Ioff protects only the modem side (U23), not U24's B output into a dead load. Smaller paths into the same receiver: Rdfu1 22 k → /3V3 on `/USART1_RX` (U18.27) ≈ 0.12 mA; PA10 internal pull-up 7–14 kΩ (≈ 0.5 mA if left enabled); PC7 pull-up via R106 (≈ 70 µA); PA2/PC12 if driven high. Same mechanism as the FW 0.5.5/0.5.6 lesson (idle-high UART held the V5.5 rails up through ESD diodes). +- **Consequence:** whenever the modem is up and PA1 is low, the F9P rail sits pre-biased (≈ 2–2.7 V, auditor estimate): no clean ramp, F9P power-cycle recovery silently fails, RXD2 ESD structure stressed. Firmware can avoid it only by never having the modem on with the F9P off (rules out F9P-only recovery with the modem registered). Major, not Blocker, because that sequencing avoids it (verify_2). +- **Fix:** add **U27 = Nexperia 74LVC1G125GV,125, LCSC C12518** (SOT-753: 1 OE̅, 2 A, 3 GND, 4 Y, 5 VCC; datasheet Rev 17.1 "IOFF … partial power-down", ±2 µA), **VCC = `/3V3_GNSS`**, OE̅ = GND, **100 nF C14663** at VCC; A = `/DOUT_4G`, Y = new net `/DOUT_4G_F9P` → U18.26. PC7/R106 stay on `/DOUT_4G` (moving U24's VCCB to `/3V3_GNSS` would kill MODEM_STATUS and the RTCM tap with the F9P off, R2). Do not use the TECH PUBLIC clone C3040595. **Rdfu1 22 k → 100 k (C25803)** (≤ 27 µA into U18.27). Rejected: 10 k in series at U18.26 (≈ 0.28 mA, the same order as the leakage that held the V5.5 modem rail at ≈ 1 V). Bench: `/3V3_GNSS` < 0.3 V with PA1 low and the modem on. +- **Effort:** both (1 IC + 1 cap + short reroute at U18.26). + +##### Minor (D) +- **D-02 · Minor · HSE crystal 8.3/11.3 mm from the MCU; HC-49S CL 20 pF crystal at the ST start-up gm limit** — *absorbs F-11 (Y3 part).* *Status:* verified (verify_2). Y3 = C14872 (CL 20 pF, **−20…+70 °C**) pad edge → PH0/PH1 **8.32 / 11.30 mm**; C113/C114 15 pF (C1644) → CL_eff 12.5–17.5 pF; gm_crit 1.21–2.37 mA/V at ESR 40 Ω vs Gm_crit_max 1 mA/V (DS10314 Table 37): passes at typical ESR; V5.5 as-fabbed has the same parts at 11.9–13.7 mm and starts in the field. In1 `/USART6_RX` crosses both HSE lines under Y3; `/BAT_PLUS` on all four layers beside it (F-11). ROM DFU and the USB clock depend on HSE. *Fix:* **Y3 → C2901684** (SCTF 3225-4P, 25 MHz, CL 10 pF, ESR 30 Ω, −40…+85 °C, stock 11 076; footprint `Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm`) + **C113/C114 → 12 pF C0G (C38523)** → CL_eff 9.5 pF, gm_crit **0.46 mA/V** (2.2× margin); ≤ 3 mm from PH0/PH1, no inner track under the crystal or its lines. Verifier conflict: verify_2 prefers **C9006** (YXC 3225, CL 12 pF, Basic, 528 k stock) with the existing 15 pF C1644 (≈ 0.77 mA/V at ESR 40 Ω) **after confirming its ESR**; verify_1 (f) left Y3 to the MCU auditor, who chose C2901684. This report picks C2901684 because its ESR is stated in the listing and its margin is larger; C9006 is the Basic-part alternative once its ESR is confirmed. *Effort:* both. +- **D-03 · Minor · LSE crystal load and gm do not suit the F411 low-drive LSE** (not independently verified). Y4 = C32346 FC-135 (CL 12.5 pF, ESR 70 kΩ max); C115/C116 12 pF → CL_eff ≈ 9 pF (+44 ppm ≈ 3.8 s/day); gm_crit 2.16 µA/V at max ESR (≈ 1.1 typ) vs Gm_crit_max 0.56 µA/V low-drive / 1.50 high-drive (DS10314 Table 38); pads 5.54/7.91 mm centre (3.92/6.32 mm pad edge, F-11). *Consequence:* LSE may fail to start in the default low-drive mode; an RTC wake from STOP falls back to LSI (±5–10 %). *Fix:* **Y4 → C48615** (FC-135, CL 7 pF, stock 101 k) + **C115/C116 → 6.8 pF C0G (C1679)** → CL_eff ≈ 6.9 pF, gm_crit 0.76 µA/V max ESR; ≤ 3 mm from PC14/PC15; firmware sets `LSEMOD` (high-drive) before `LSEON`, LSI fallback. *Effort:* both. +- **D-05 · Minor · IGN_SENSE read digitally cannot detect a 12 V ignition; ADC saturates at 28.6 V** (not independently verified). Ratio 2.870 k/(22 k + 2.870 k) = 0.1154: 12 V → 1.385 V (1.30 V with the INPUT_PULLDOWN of `board_v5.h`), 24 V → 2.77 V, 28 V → 3.23 V; VIH 2.31 V → a digital HIGH is guaranteed only above **20.0 V**; ADC full scale at 28.6 V. *Fix:* firmware reads PA5 on the ADC with thresholds (for the as-is ratio: ON > 0.60 V ≈ 5.2 V in, OFF < 0.35 V), no internal pull; hardware **Rigb1 3.3 k → 2.2 k (C4190, Basic)** → ratio 0.0833: 12 V → 1.00 V, 24 V → 2.00 V, 36 V → 3.00 V, linear to 39.6 V; new `$PHLG` field `vign`. *Effort:* firmware (+ schematic value). +- **D-08 · Minor · No hardware board ID: a V5.6 binary on v6 drives PC3 against the F9P's RTK_STAT output** (not independently verified). V5.6 drives PC3 push-pull as MODEM_EN; v6 PC3 = U18.20 RTK_STAT (push-pull output); PC1/PC2 are F9P inputs on v6. *Fix:* **10 k (C25804) strap → GND** on a spare pin; firmware reads it with INPUT_PULLUP at boot (v6 build requires 0, V5.6 build requires 1, else outputs off and `BOARD MISMATCH`). **Open conflict:** D-08 proposed PD2, which verify_1 (h) assigns to E-01 (`ETH_PWR_EN`); the only spare left is PA9, which D-12 wants as a debug TX pad. Leo to choose (§10). *Effort:* schematic + 1 short trace. +- **D-09 · Minor · PWR_CTRL has no default-off pull at Q5's base** — *absorbs A-12* (not independently verified). `/PWR_CTRL` = {U16.15, R1.1}; `/BASE_LS` = {R1.2, Q5.1}; PA1 floats in reset/DFU; worst-case leakage ±1 µA × hFE ≈ 100 → up to 100 µA through R2 10 k → ≈ 1 V gate drive on Q1 AO3401A (VGS(th) −0.5…−1.3 V). V5.5 identical and fielded (typical leakage nA). *Fix:* **100 k (C25803) `/BASE_LS` → GND** next to Q5 (A-12's 47 k had no LCSC; 100 k C25803 is already in the BOM). *Effort:* both. +- **D-12 · Minor · No UART TX pad for a TX-only log / ROM USART bootloader; SWD pads scattered** (not independently verified). PA9 (USART1_TX, pad 42) NC; ROM USART1 bootloader runs on HSI but needs PA9; SWD = TP3 (109.0, 69.7), TP4 (112.5, 76.2), TP5 (110.0, 74.7), GND TP6 17.6 mm from TP3, 3V3 TP7; no SWO (PB3 = CHRG_STAT). *Fix:* **TP9** (`TestPoint_Pad_D1.5mm`, no BOM part) on PA9 next to TP3–TP5; optional DNP 1×5 2.54 mm footprint (3V3, SWDIO, SWCLK, NRST, GND) or a Tag-Connect TC2030-NL land (no BOM cost). *Effort:* layout (+ schematic pad). + +##### Notes (D) — not independently verified +| ID | Observation | Action | +|---|---|---| +| D-13 | EXTI3 shared by PC3 RTK_STAT and PB3 CHRG_STAT; EXTI9 by PB9 ACC_INT1 and PC9 MODEM_STATUS; PA6 fan (TIM3_CH1) and PA7 PPS (TIM3_CH2) share TIM3. | EXTI9 → PB9 (motion wake); poll PC9 and PB3; fan stays GPIO ON/OFF so TIM3 is free for PPS capture. | +| D-15 | Nearest 100 nF per VDD pin (centre): VDD19 3.29 mm, VDD32 3.65, VDD48 2.10, VDD64 3.90 (shared with VBAT pin 1), VDDA 3.13, VCAP1 3.19. | Tighten to ≤ 2 mm in the layout pass if convenient. | + +#### (b) Pass/fail — §4-D +| Check | Evidence (one line) | Result | +|---|---|---| +| U16 symbol vs ST LQFP64 | 64/64 pin numbers and names match ST open-pin-data | ✅ | +| Pin-map coverage | 64/64 rows (`pinmap-v6.md`, §4) | ✅ | +| Firmware pins unconnected on v6 | `PIN_USART1_TX` PA9 NC (Mode-B TX moves to PC6 USART6_TX); TMP102 0x48 and PCF P7 modem-reset absent | ⚠ firmware delta (§8) | +| v6 nets with no firmware counterpart | PA7, PC1–PC4, PC6–PC12, PB9 | ⚠ firmware delta (§8) | +| ADC nets on ADC pads | PA0/IN0, PA4/IN4, PA5/IN5, PB1/IN9, PC4/IN14; spare PC5/IN15 | ✅ | +| AF conflicts | USART2 AF7, USART6 AF8, USART1_RX AF7, SPI2 AF5, I2C1 AF4, OTG AF10, SWD AF0: no overlap | ✅ | +| 5 V on a non-FT pin | none; TC pins carry PA0 ≤ 2.10 V and PB5 (output) | ✅ | +| 1.8 V modem signals reaching the MCU | none (U23/U24, Q20/Q21) | ✅ | +| PWM (fan) timer | PA6 TIM3_CH1 shares TIM3 with PPS capture on PA7; fan is ON/OFF | ✅ (D-13 Note) | +| EXTI allocation | EXTI3 and EXTI9 each shared by two pins | ⚠ D-13 | +| Modem control defaults in reset | R113/R114/R115 100 k pull-downs on PC10/PC8/PC11 | ✅ | +| F9P rail default in reset | Q5 base floats | ⚠ D-09 | +| Charger default in reset | R56 pull-down → charger ON | ⚠ A-11 | +| BOOT0 / BOOT1 DFU trap | R98 10 k PD + SW2; PB2 only R99 10 k PD; ETH_INT on PC0 | ✅ | +| NRST routing (SW1, P6, C104) | C104 100 nF at 3.26 mm; SW1 pad pairs correct; P6 RESET-EXT; TP5 | ✅ (P6 ESD: G-08) | +| SWD access | TP3/TP4/TP5 pads, no header, GND TP 17.6 mm away, no SWO | ⚠ D-12 | +| DFU ESD at J11 | D14/D15/D16 at 3.19/6.74/6.83 mm; CC 5.1 k × 2; VBUS diode-OR D12/D13 | ✅ (stubs: F-14) | +| VCAP1 / VDDA | C111 4.7 µF at 3.19 mm; R104 10 Ω + 1 µF + 100 nF | ✅ | +| CHRG_STAT / FAULT inputs | R57/R58 100 k → /3V3 on PB3/PB4 | ✅ | +| PFO input | `/PFO_TP` goes to TP2 only | ⚠ A-13 | +| IGN_SENSE divider (Rig 22 k) and junction | Rig1.2/Rig2.1/Rigb1.1/C9/D5/U16.21 on one net, sch and PCB (6 pads, 1 group); V5.6 junction loss not present | ✅ | +| IGN clamp orientation | D5 K → /3V3, A → /IGN_SENSE | ✅ | +| IGN digital threshold for 12 V vehicles | HIGH guaranteed only above 20.0 V | ⚠ D-05 | +| I²C address map | 0x18 SC7A20, 0x20 PCF8574, 0x44 SHT40, 0x4D SC16IS752: no clash (TMP102 0x48 would also fit) | ✅ | +| NC flags on connected pins hide an error? | U16.37/38, U10.13/14 nets real in netlist + IPC-356, routed | ✅ (cosmetic: J-04) | +| HSE ≤ 5 mm | 8.32 / 11.30 mm pad edge | ❌ D-02 (Minor) | +| LSE ≤ 5 mm | 3.92 / 6.32 mm pad edge (5.54 / 7.91 mm centre) | ⚠ D-03 | +| F9P back-feed from MCU-side logic | U24 → U18.26 with the F9P off | ❌ D-01 | +| ETH_RST pull-down | none; 100 k would not work | ❌ E-02 | +| Hardware board ID | none; mis-flash drives PC3 against RTK_STAT | ⚠ D-08 | + +--- +### 4-E Ethernet W5500 (U11), lesson F8 + +Cross-references: J10/P11/P12 DNP and footprint parity → **G-03** (absorbs E-05); J9 (modem USB) ESD → **G-02**; U12 hot loop and FB node → **F-03** (absorbs F-09). + +#### (a) Findings + +##### E-01 · Major · 3V3_ETH is not switchable: the W5500 is powered on battery and during MCU reset (lesson F8 repeated) +*Absorbs:* A-05 fix 1. *Status:* verified (verify_1). +- **Evidence:** U12 (MP1584EN) pin 2 EN = `/SYS5V` = pin 7 VIN → on whenever SYS5V exists (vehicle and battery). W5500 DS v1.0.2: 128 mA (100M link), 75 mA (10M), 13 mA power-down. J10 is DNP on the PCB but U11/U12 are populated, so the draw exists even without a jack. MP1584 EN: internal 1 µA pull-up to ≈ 3 V, rising threshold 1.5 V, abs max 6 V. W5500 VIH max 5.5 V (5 V-tolerant I/O), so MCU-driven SPI/RST lines do not back-power a gated 3V3_ETH. +- **Consequence:** a permanent ≈ 0.05–0.6 W battery load; even the 13 mA power-down current costs ≈ 57 mW from the battery, more than the whole 20–50 mW sleep floor. Hardware gating is required for R1's energy target. +- **Fix:** new net **`/ETH_PWR_EN`: U12.2 (EN) → U16 pad 54 PD2**, with **100 k (C25803) to GND** → EN at 0.1 V (OFF) in reset/DFU/battery; PD2 at 3.3 V turns it on. PD2 allocation per verify_1 conflict (h). +- **Effort:** both (1 resistor, 1 track). + +##### E-02 · Major (Minor once E-01 is in) · `/ETH_RST` has no pull-down; the 100 k proposed in the lessons review could never work +*Absorbs:* D-04. *Status:* verified-with-correction (verify_1: the W5500 RSTn has its own internal pull-up, so 100 k fails even without PA15; D-04's "PD2 + 100 k" also fails). +- **Evidence:** `/ETH_RST` = {U11.37, U16.50 PA15}. PA15 resets to JTDI with pull-up (RM0383: GPIOA_PUPDR reset 0x6400 0000), R_PU 30–50 kΩ (DS10314). W5500 RSTn internal pull-up **62–112 kΩ** (DS v1.0.2 §5.3); VIL 0.8 V; Schmitt VT− 0.95–1.09 V. 100 k pull-down: 3.3·100/(100 + 30k∥62k = 20.2 k) = **2.75 V** (reads HIGH); with PA15 floating 1.56–2.04 V (undefined or high). **4.7 k:** worst case 3.3·4.7/(4.7 + 20.2) = **0.62 V** (typ 0.49 V) → reliably LOW; drive current 0.70 mA when firmware holds it high. +- **Consequence:** the W5500 leaves reset during every MCU reset/DFU/bootloader and draws up to 128 mA; on battery that is the lesson-F8 drain. A V5.6 built with R112 = 100 k keeps the same bug. +- **Fix:** **add 4.7 kΩ 0603 (C23162, Basic) from `/ETH_RST` to GND at U11.37.** Tell V5.6: R112 100 k → 4.7 k. D-04's move to PD2 with 100 k is rejected (1.56–2.04 V, and PD2 is needed for E-01). Firmware still drives PA15 low as the first line of `setup()`. +- **Effort:** schematic-only (+ 1 small footprint). + +##### Minor (E) +- **E-03 · Minor · W5500 crystal Y1 10.8/13.7 mm from XO/XI; CL mismatch pulls +78…+156 ppm** — *absorbs H-07, F-11 (Y1 part).* *Status:* verified, severity changed Major → Minor (verify_1: V5.5 as-fabbed and V5.6 have the identical Y1 C14872 and C95/C96 18 pF C1647 and Ethernet works; J10 is DNP on the v6 prototypes). Y1 = C14872 HC-49S, **CL 20 pF**, ±20 ppm, −20…+70 °C; W5500 specifies CL 18 pF, ±30 ppm (100BASE-TX ±50 ppm). Pad edge → U11.31 XO 10.79 mm, → U11.30 XI 13.74 mm; `/ETH_XI` 22.98 mm, `/ETH_XO` 22.03 mm; C96 6.4 mm from Y1. CL ≈ (C1+Cp)(C2+Cp)/(C1+C2+2Cp) + Cshunt with Cp ≈ 5.5 pF → **≈ 12.8 pF** → pulling ≈ **+78…+156 ppm**. 63 × 25 MHz = 1575.000 MHz, 420 kHz from GPS L1 (a +100 ppm pull moves it to ≈ 1575.16 MHz, closer to L1 centre; EMC note shared with Y3). *Fix (verify_1 conflict (f)):* preferred **Y1 → C9006** (YXC 3225, 25 MHz, CL 12 pF, ±10 ppm, −40…+85 °C, Basic, stock 528 k) and **keep C95/C96 = 18 pF (C1647)** → CL ≈ 12 pF; place ≤ 3 mm from U11.30/31, caps adjacent, 2 GND vias, no inner track under it (F-11). Alternative keeping the HC-49 part: **C95/C96 → 33 pF C0G (C1663, Basic)** → CL ≈ 19.3–20.3 pF. Verify with a frequency counter (target ±10 ppm). *Effort:* both. +- **E-04 · Minor · W5500 TOCAP and 1V2O capacitor values do not follow the datasheet** (not independently verified). C90 on `/ETH_TOCAP` (U11.20) = 10 µF (DS: 4.7 µF; schematic note "VERIFY value vs ref"); C91 on `/ETH_1V2` (U11.22) = 4.7 µF (DS: **10 nF**, 470× larger); C90 4.4 mm, C91 5.5 mm from their pins; AVDD pins 4/8/11/21 rely on C94 10 µF (7.1 mm) / C102 22 µF (5.8 mm). *Consequence:* internal 1.2 V regulator outside its specified load capacitance (start-up/stability risk). *Fix:* **C91 → 10 nF 0603 X7R (C1589)**; **C90 → 4.7 µF 0805 (C1779**, the part now on C91); both ≤ 2 mm from their pins; add **100 nF (C14663)** at the AVDD 4/8 and 11/21 pairs. *Effort:* both. +- **E-06 · Minor · Ethernet pairs not coupled and split across layers; no line-side ESD; J10 pin 8 NC** (not independently verified). TXP F.Cu 3.9 + In1 11.7 mm (1 via) vs TXN F.Cu 21.5 mm → coupled 0.3 mm; RXP F 5.0 + In1 11.2 vs RXN F 5.8 + In1 14.9 → coupled 1.2 mm; skew 5.9/4.4 mm (≈ 30–40 ps, irrelevant at 100BASE-TX). Terminations, EXRES1 12.4 k 1 % (5.0 mm from pin 10), VBG open, RSVD23 → GND, PMODE high: ✅. *Consequence:* common-mode emission from unbalanced pairs; lower ESD robustness on cabled installs. *Fix:* each pair coupled on F.Cu only (100 Ω diff), ≤ 1 via pair, In1 unbroken; optional low-capacitance array between magjack and U11 (SRV05-4 class; no LCSC selected); tie J10.8 per the HR911105A drawing (function not confirmed). *Effort:* layout. + +##### Notes (E) — not independently verified +| ID | Observation | Action | +|---|---|---| +| E-07 | No PoE PD/controller; J10.7/J10.8 NC; firmware prints "SIN PoE". Consistent with the recorded decision (external splitter). | None for v6; PoE is a v6.1 feature (PD controller + isolated DC-DC). Record the decision in the schematic block note. | + +#### (b) Pass/fail — §4-E +| Check | Evidence (one line) | Result | +|---|---|---| +| SPI2 wiring | PB12 CS (GPIO), PB13 SCK, PB14 MISO, PB15 MOSI (AF5) | ✅ | +| INT | U11.36 → PC0 (EXTI0), BOOT1 trap avoided | ✅ | +| RST pull-down | none on `/ETH_RST`; 100 k would read 2.75 V | ❌ E-02 | +| 3V3_ETH switchable | U12 EN tied to VIN (`/SYS5V`): always on, battery included | ❌ E-01 | +| Straps / analog | PMODE all high (R84); EXRES1 12.4 k 1 % at 5.0 mm; VBG open; RSVD23 GND; 38–42 open | ✅ | +| TOCAP / 1V2O | 10 µF / 4.7 µF vs DS 4.7 µF / 10 nF | ❌ E-04 | +| Termination | TX 49.9 Ω to 3V3_ETH + TCT; RX 49.9 Ω to RCT + 6.8 nF | ✅ | +| Magnetics / HR911105A | J10 C12074 set; PCB DNP vs schematic populated; LED pins still "VERIFY" | ⚠ G-03 | +| Magjack keepout | MAGJACK_NO_POUR rule area on all layers | ✅ | +| Line-side ESD on J10 | none (optional) | ⚠ E-06 | +| ESD on J9 (USBLC6-2SC6) | none | ❌ G-02 | +| No PoE (state it) | none in hardware, documented | ✅ (E-07) | +| 25 MHz crystal ≤ 5 mm | 10.79 / 13.74 mm; CL 20 pF with 18 pF caps | ❌ E-03 (Minor) | +| Pair routing | TX coupled 0.3 mm, RX 1.2 mm, split across layers | ⚠ E-06 | +| U12 buck loop / FB | Cin 6.40 mm from VIN, D11 11.92 mm, FB top 25.9 mm, FB node under SW | ❌ F-03 | + +--- +### 4-F Thermal and EMC (ECO §E, Copper Plan), lessons F5 / F6, 23-Jul short incident + +Cross-references: U6 copper and EP vias → **A-02**; BSTFB/IGATE and switch-node overlap → **A-14** (absorbs F-10); crystals → **E-03** (Y1) and **D-02** (Y3) (absorb F-11); U2 fan buck → **A-01** (absorbs F-08, F-53); J9 ESD → **G-02** (absorbs F-14's J9 part). + +#### (a) Findings + +##### F-02 · Blocker · Raw ignition `/IGN_IN` crosses the board on In2 at 0.221 mm from `/VEH5V`: the 23-Jul inner-layer geometry repeated +*Absorbs:* D-06, F-16. *Status:* verified (verify_2: Blocker; D-06's Major under-rated a repeat of a paid-for lesson with a damage path). +- **Evidence:** `/IGN_IN` = {P1.3, Rig1.1}; P1.3 at (177.5, 135.0), Rig1.1 at (123.55, 50.675), 100 mm apart. Routing: 4.08 mm F.Cu + **106.47 mm In2**, 0.5 mm wide, 1 via at (127.6, 50.75). With the corrected HV24 rule it is the **only** inner-layer violation set: + + | Layer | Other net | Gap | At | + |---|---|---|---| + | In2 | `/VEH5V` 1.0 mm track | **0.221 mm** | (147.34, 67.49) | + | In2 | GND via | 0.250 mm | (154.4, 83.15) | + | In2 | `/FAN_PWM` track | 0.291 mm | (152.63, 73.49) | + | In2 | `/5V_FAN` via | 0.300 mm | (157.5, 104.5) | + | In1 | `/NTC2` track (IGN via) | 0.305 mm | (127.32, 50.47) | + | In2 | `/VEH5V` via | 0.340 mm | (147.4, 67.4) | + + Plus zone fills at 0.1505 mm on all four layers (re-pour under F-01). 23-Jul incident (`drogheda-einarboard-short-incident`): `/24V_IN` on In2 at 0.202–0.25 mm from MAIN5V/VEH5V and **`VEH5V ↔ IGN_IN` at 0.2 mm on In2**; v6 is within 0.02 mm of that geometry on the same net pair. `/IGN_IN` has no TVS (D10 covers `/24V_IN` only); D5 BAT54 clamps positive only; a negative ISO 7637-2 pulse through 22 k gives ≈ −27 mA into PA5 vs −5 mA I_INJ (DS10314 Table 12). F-16 (absorbed): `/24V_IN` runs 27.11 mm of 1.5 mm track on In1 at exactly **0.500 mm** from `/SW_5V`, cutting a 25 mm In1 slot. +- **Consequence:** one inner-layer defect puts 9–36 V (and load-dump pulses) onto `/VEH5V` (LTC4040 VIN, 6 V class, and the whole 5 V system) or the fan gate/5 V fan rail. This is the failure that scrapped the 23-Jul board; inner layers can be neither inspected nor reworked. +- **Fix:** move **Rig1 (22 k 0603, C88614) to ≤ 3 mm of copper from P1.3**, with `/IGN_IN` ≤ 3 mm long on F.Cu. The 106 mm run becomes `/IGN_SENSE`, limited to (36 − 5 V)/22 k = 1.4 mA (2.5 mA at 58 V) into any bridged 5 V net; C9 at the MCU keeps τ = (22 k ∥ 2.87 k)·100 nF = 0.25 ms. Keep Rig2/Rigb1/C9/D5 at the MCU. **Add SMBJ33A (C224019**, Littelfuse DO-214AA, stock 9624; VR 33 V, VC 53.3 V at 11.3 A) **from `/IGN_IN` to GND at P1.3**: it also clamps negative ISO 7637 pulses at ≈ −1 V, removing the PA5 injection (D-06's BAT54S C19726 becomes optional). Rig1 at 58 V dissipates 0.13 W for 400 ms: an 0603 thick-film part (75 V working, 2.5× short-time overload) is acceptable with the TVS; 1206 optional. The In1 IGN via next to `/NTC2` disappears with the reroute. F-16: move `/24V_IN` to F.Cu along the south edge, or keep ≥ 1.0 mm from any LV net with nothing crossing it. Conflict ≤ 3 mm (F-02) vs ≤ 5 mm (D-06) resolved to ≤ 3 mm of copper (verify_2). +- **Effort:** both (one resistor moved, one TVS added, one net rerouted). + +##### F-01 · Blocker · Netclasses are broken and one custom rule overrides every clearance: "DRC 0 errors" cannot see any 24 V spacing +*Absorbs:* J-01, F-15, B-12 (netclass part). *Status:* verified-with-correction (verify_2: the proposed `.kicad_dru` misses HV24↔HV24 pairs, which would add 4 false errors; corrected rule set below). +- **Evidence:** + - `.kicad_pro` HV24 patterns = `/24V_IN`, `24V`, `IGN_IN`, `Q10_GATE`; patterns are anchored matches against the full name, so the three un-prefixed ones match nothing. Netlist `class` attribute: **HV24 = {`/24V_IN`} only**; PWR_HI 6 nets; PWR_MID 6 (incl. `/3V3_ETH`); Default 338, including `/24V`, `/IGN_IN`, `/Q10_GATE`, `/VIN_PROT`, `/VIN_FUSED`, `/VIN_MODEM`, `/Q23_GATE`, `/SW_PWRIN`, `/BOOT_PWRIN`, `/SW_MODEM`, `/BST_MODEM`, `/BST_FAN`, `/VBAT_MODEM`, `/RF_LTE`, `/RF_GNSS`. Dead patterns also include the un-prefixed PWR_* duplicates, `/3V3_MODEM`, `/SW3_NODE`. **RF and PWR_MODEM classes are missing** (lost on GUI saves, `drogheda-v6-resync-protocol` §5). + - Rule "Minimum clearance 1" = 0.15 mm, condition `A.NetClass != 'HV24' && B.NetClass != 'HV24'`, no layer or type clause. Netclass values become implicit rules and custom rules are appended after them; the **last matching rule wins** (KiCad developer statement). So it replaces Default/PWR 0.2 mm, the zones' 0.3 mm and any future RF class. + - Proof in the stored fills: gap to every non-HV24 net **0.1505 mm**, to `/24V_IN` 0.5005 mm, although all 5 zones carry `(connect_pads (clearance 0.3))`; DRC reports 0 clearance items. + - Deleting the rule with Default at 0.2 mm would fail 471 item pairs (209 net pairs) at 0.15–0.20 mm, so the floor must stay 0.15 mm, stated explicitly. + - Spacing basis (IPC-2221B Table 6-1, 51–100 V row, since the rail peaks at the 53.3 V clamp and 58 V suppressed load dump): B1 internal 0.10 mm, B4 external coated 0.13 mm, A6 0.13 mm. The **0.5 mm inner** value is a defect/CAF margin from the 23-Jul loss; **0.3 mm outer** under mask (2.3× IPC) fits the SO-8 pin rows. + - F-15 (absorbed), outer layer with corrected classes: 15 spots < 0.3 mm (38 < 0.5 mm): `/SW_MODEM` U20.8–GND 0.150; `/VIN_MODEM`–GND 0.150 / U20.9 0.200 / U20.2 pad–GND track 0.195; **`/VIN_PROT` 1.5 mm – `/VEH5V` 0.8 mm track 0.162 mm at (176.24, 116.28)** and – untented `/VEH5V` via 0.193; `/SW_MODEM`–GND 0.170; `/Q23_GATE` and `/VIN_PROT` – `/USB_VBUS` 0.225; `/BST_MODEM`–GND 0.225 / 0.275; `/VIN_MODEM` – U20.3/U20.4 0.250; `/SW_PWRIN`–GND 0.270; `/24V` – `/COMP_FAN` 0.290. Full list `work/FHJ/hv24_violations_corrected_rule.csv`. +- **Consequence:** DRC cannot flag a repeat of the 23-Jul geometry. F-02 is exactly that, and it passed DRC with 0 errors. +- **Fix (project settings + rules, then copper):** + - Netclass table (exact names, one pattern per line): + + | Class | Nets | Clearance | Track | Via | + |---|---|---|---|---| + | HV24 | `/24V_IN` `/VIN_FUSED` `/VIN_PROT` `/24V` `/VIN_MODEM` `/IGN_IN` `/Q10_GATE` `/Q23_GATE` `/SW_PWRIN` `/BOOT_PWRIN` `/SW_FAN` `/BST_FAN` `/SW_MODEM` `/BST_MODEM` | **0.3** (class value; layer rules below) | 1.0 | 0.8/0.4 | + | PWR_HI | `/BAT_PLUS` `/SW_BAT` `/MAIN5V` `/VEH5V` `/SYS5V` `/VIN_SW` | 0.15 | 1.5 | 0.8/0.4 | + | PWR_MID | `/SW_5V` `/SW_IN` `/5V_FAN` `/FAN_RET` | 0.15 | 0.6 | 0.8/0.4 | + | PWR_MODEM | `/VBAT_MODEM` | 0.15 | 1.5 | 0.8/0.4 | + | RF | `/RF_GNSS` `/RF_ANT_GNSS` `/RF_LTE` `/RF_ANT_LTE` | CPWG gap (F-06) | CPWG width (F-06) | none | + | Default | everything else (incl. `/3V3_ETH`, `/EN_FAN`, `/EN_PWRIN`) | **0.15** | 0.2 | 0.6/0.3 | + + If A-01 is adopted, remove `/SW_FAN`, `/BST_FAN` (U2 deleted) and `/VIN_MODEM` (merged into MAIN5V) from HV24 (verify_2). Delete the un-prefixed duplicates. + - `.kicad_dru` (replaces "Minimum clearance 1", "HV24 clearance", "HV24 exception"; order matters, later rules win): + ``` + (rule "Floor 0.15 (non-HV24, non-RF)" + (condition "A.NetClass != 'HV24' && B.NetClass != 'HV24' && A.NetClass != 'RF' && B.NetClass != 'RF'") + (constraint clearance (min 0.15mm))) + (rule "HV24 to HV24" + (condition "A.NetClass == 'HV24' && B.NetClass == 'HV24'") + (constraint clearance (min 0.2mm))) + (rule "HV24 outer" + (layer outer) + (condition "A.NetClass == 'HV24' && B.NetClass != 'HV24'") + (constraint clearance (min 0.3mm))) + (rule "HV24 inner" + (layer inner) + (condition "A.NetClass == 'HV24' && B.NetClass != 'HV24'") + (constraint clearance (min 0.5mm))) + (rule "HV24 IC land patterns" + (layer outer) + (condition "A.Type == 'Pad' && B.Type == 'Pad' && ((A.memberOfFootprint('U2') && B.memberOfFootprint('U2')) || (A.memberOfFootprint('U20') && B.memberOfFootprint('U20')) || (A.memberOfFootprint('U25') && B.memberOfFootprint('U25')))") + (constraint clearance (min 0.15mm))) + ``` + Without the "HV24 to HV24" rule, 4 false errors appear: `/BST_MODEM` C129.1 ↔ `/SW_MODEM` 0.180 mm, `/BST_FAN` Cbst1.1 ↔ `/SW_FAN` 0.285, `/Q23_GATE` D33.1 ↔ `/VIN_PROT` 0.388, `/SW_FAN` ↔ `/VIN_MODEM` 0.400. + - Then: refill all zones, run DRC (gate). Expected: the 6 inner spots of F-02 and the 15 outer spots of F-15; the F.Cu pour recedes to 0.3/0.5 mm around ≈ 178 HV24 items (re-check `isolated_copper` and the U25/U20 GND islands). Fix the outer spots: `/VIN_PROT` vs `/VEH5V` ≥ 0.5 mm near R124/U25 (24 → 5 V); remove the U20 GND neck (F-03); `/USB_VBUS` away from Q23; `/COMP_FAN` ≥ 1 mm from `/24V` (moot with A-01); tent all vias except test vias. Check with Inspect → Clearance Resolution on one `/24V` ↔ GND-zone pair and one GND-zone ↔ Default pair; re-check that the classes survive every GUI save. +- **Effort:** both (rules now; the copper they flag is F-02 / F-15). + +##### F-12 · Major · Ground vias: 69 on the board (V5.5: 165); 1 under the modem, 0 under the F9P, 0 in every regulator EP; east pour stitched by 5 vias +*Absorbs:* F-13, F-04, B-04, C-03, A-06 (EP/via part). The U6 EP belongs to A-02. *Merge note:* verify_1 made F-12 the umbrella; verify_2 used F-13 as primary of the same family (M-C); both agree on content and severity. *Status:* verified (both verifiers; B-04 re-rated Blocker → Major; F-12's via target corrected to ≥ 400; F-13's board-wide pad setting corrected). +- **Evidence:** + - GND vias per 20 × 20 mm cell (rows from y 40.32): `[0,5,4,3,0,1,0] [2,3,4,4,4,0,2] [2,1,2,3,0,1,3] [0,2,2,2,0,2,4] [4,5,0,2,2,0,0]` → **10 of 35 cells empty**; 2 GND vias within 3 mm of the 480 mm edge; max distance to a GND via 27.8 mm at (197.7, 42.3) next to J13. + - East F.Cu GND (U19, U20, U25, U2, J13, D34): 3611 mm² pad/track-joined cluster (verify_1) / 3766 mm² pour piece (verify_2), reaching In1/In2 through **5 vias** at (145.7, 129.9), (148.1, 135.3), (152.6, 62.5), (153.5, 77.0), (198.8, 78.1); pour-point-to-via median 10.4 mm, p90 19.8 mm, max 29.5 mm. + - U19 A7670SA: 39 GND pads (20 × 2.1 mm centre pads on a 3.8 mm grid, 1.7 mm gaps), **1 GND via** under the courtyard at (184.6, 81.775), 4 in a 5 mm ring; pads on thermal spokes (18–24 % perimeter contact). U18 ZED-F9P: 56 GND pads (48 × 1.1 mm on a 2.1 mm grid + 8 ring pads), **0 vias** under the body, 946 mm² cluster with 5 vias. J13 GND pads 20.3/21.3 mm from a via; D28 GND 19.1 mm; J12.3 has a GND via 0.73 mm away (verify_1 correction), J12.2 3.7 mm. + - EPs: 0 vias in U6, U25, U20, U2, U12; zones default to thermal relief (gap 0.5 / spoke 0.5 mm); solid overrides only on U6.25, U2.9, U12.9, U11.9, U11.29, JP1–JP5; contact U25 EP 18 %, U20 EP 13 %, D34 anode 18 %. +- **Consequence:** the modem's return currents (23 dBm LTE, 2 A GSM bursts) and the whole east pour reach the planes through 5 vias 30–70 mm apart: the pour behaves as a resonant patch at 1–2.7 GHz (LTE self-desense of the F9P, the brief's #1 risk; ESD returns through the pour); U19 (≈ 1–2 W at max TX) and the regulators lose their heat path (spokes + no vias roughly double θ). Major, not Blocker (both verifiers): no R1–R5 violated outright, no V5.5 field precedent for an on-board modem, no damage path, manufacturable. Zero BOM cost: do it with the Blockers. +- **Fix (layout; §6 L-24 … L-29):** EP arrays of 0.3/0.6 mm vias: U6 9 (A-02); **U25, U20: 2 × 3 = 6 at 1.0 mm, or 2 × 4 = 8 at 0.8 mm with 0.3/0.5 mm vias** (3 × 3 at 1.0 mm does not fit the 2.5 mm EP side); U12 (and U2 if kept) 2 × 3. Pad-level `zone_connect` solid on EPs, all U18/U19 GND pads, D34/Dbk1/D11 anodes and buck Cin/Cout GND pads — **not** a board-wide `thru_hole_only`, which would make 23 × 0402 and 142 × 0603 GND pads solid (tombstoning). U19: one tented via in each 1.7 mm gap between centre GND pads (0.55 mm clearance per side) + perimeter ring, **≥ 30, target 40**, never in pads. U18: vias at the diagonal interstitial centres of the 2.1 mm grid (0.41 mm to pad corners), **≥ 24**, no microvias needed. 2 vias ≤ 1 mm from each U.FL GND pad (J12, J13) and at D28. Every F.Cu GND island ≥ 20 mm² gets ≥ 2 vias; no F.Cu GND pour point > 5 mm from a GND via; edge fence ≤ 5 mm pitch within 1.5 mm of the edge clearance (≈ 96 vias); **board total ≥ 400 GND vias** (≈ 96 edge + ≈ 316 area at 1 per 25 mm² of the 7890 mm² F.Cu GND). Tented, or JLC "epoxy filled & capped" under U18/U19. **Acceptance:** 0 empty 20 mm cells; every GND pad of U19/U18/U20/U25/J12/J13 in an F.Cu cluster with ≥ 1 plane via ≤ 2 mm. +- **Effort:** layout. + +##### F-03 · Major · Switcher hot loops: U25 input caps on a different GND island from its EP/diode (≈ 311 mm² loop); U20 returns through a 0.25 mm neck; U12 Cin 6.4 mm, diode 11.9 mm +*Absorbs:* A-06 (loop part), B-06, F-07, F-09 (U2 = F-08 → A-01). *Merge note:* verify_2 made F-03 primary (M-D); verify_1 kept A-06 and used B-06 as primary for U20. One item here, because both merges share F-07 and A-06. *Status:* verified (verify_1 and verify_2; F-09 corrected: Cin is 6.40 mm from VIN pin 7, not 1.77 mm, which was measured to EN). +- **Evidence:** + - **U25 TPS54360B (non-synchronous, 24–36 V):** C150.1 → U25.2 2.88 mm ✅, C149.1 6.36 mm, C151.1 6.42 mm; C149/C150/C151 GND on the ≈ 252–270 mm² U6 island (nearest via 9.4–11.4 mm); U25.7/EP and D34.2 on the east piece (nearest on-piece via 29.5–30.4 mm from the EP, 37.9 mm from D34.2); D34 → SW 4.28 mm; L22.1 → SW 13.75 mm edge; `/SW_PWRIN` 45.8 mm². Input loop ≈ **311 mm²** (≈ 51 mm² if C150.2 joined the EP island; Copper Plan target ≤ 1 cm²). EP 0 vias, 4 × 0.5 mm spokes. D34 loss 0.78·2.5 A·0.5 V ≈ 0.98 W. Estimated 15–25 nH × 3 A/5 ns → ≈ 9–15 V ringing on VIN over the 53.3 V clamp vs 65 V abs max (not simulated). + - **U20 AP64350:** C128.1 → U20.2 0.72 mm, C127.1 2.38 mm ✅; GND C128.2 → U20.7 **6.86 mm**, C127.2 **8.48 mm**, via a **0.25 mm GND track squeezed between U20.1 and U20.2** (gaps 0.225/0.195 mm); EP 0 vias (nearest 3.45 mm). Cin C127 10 µF 50 V X5R + C128 1 µF ≈ 9.5 µF at 5 V → 2 A·D(1−D)/(f·C) ≈ **65 mV p-p**, input RMS 0.78 A. FB: R110/R111 junction ≈ 2 mm from SW copper, `/FB_MODEM` 13.9 mm, VBAT tap via a 5.6 mm In1 detour. + - **U12 MP1584EN (3V3_ETH):** C101.1 → U12.7 **6.40 mm**; D11 → U12.1 11.92 mm; L8 15.10 mm; R87 (FB top) 25.9 mm → `/ETH_FB` 35 mm long, 1.84 mm² directly under `/ETH_SW` on In1; C101.2 and D11.2 on different F.Cu pieces (224 / 178 mm²). The same R5 🟠 item was 8.5 mm on V5.5. +- **Consequence:** SW-node/VIN ringing and conducted/radiated EMI into the GNSS/LTE receivers; U25 VIN overshoot eats the margin to 65 V during a clamped transient; EP/diode thermals; FB noise on U12 (3V3_ETH jitter) and U20. ECO §E.4 (Cin loops < 3 mm) not met. +- **Fix (layout; §6 L-20 … L-23), common rules:** Cin (VIN and GND pads) ≤ 2 mm from the IC VIN and GND/EP pins; Cin GND, catch-diode anode (D34/D11) and EP on **one solid F.Cu area**, no GND neck < 1 mm; ≥ 2 vias ≤ 1 mm from each Cin GND pad; catch diode ≤ 3 mm from SW; inductor ≤ 5 mm from SW; SW copper ≤ 25 mm²; FB divider ≤ 3 mm from the FB pin with nothing on In1 under the SW copper; acceptance input loop ≤ 1 cm². Per regulator: **U25** C149/C150 ≤ 2 mm from pins 2/7 on the EP/D34 copper, L22 ≤ 5 mm from pin 8, `/SW_PWRIN` off In1 signal tracks, 4 GND vias around the Cin/D34 node. **U20** delete the 0.25 mm GND neck; R110/R111 ≤ 2 mm from U20.5 on the side away from pin 8; VBAT sense by a dedicated trace from C131 (delete the In1 detour); **add 2 × 22 µF 16 V 0805 (C86817) ≤ 3 mm + 1 × 220 µF 16 V polymer (C881921) at U20.2** (verify_1 conflict (d): ripple 65 → 17 mV p-p; the 220 µF because at PFI hand-over the modem load sits on CSYS ≈ 60 µF; 16 V parts are valid only with A-01's 5 V input). **U12** R87/R88 ≤ 3 mm from U12.4, top resistor Kelvin-fed from C102/C94, FB ≤ 5 mm on F.Cu, nothing under `/ETH_SW`; D11 ≤ 2 mm from pin 1 with its anode on C101's GND copper; L8 ≤ 5 mm. +- **Effort:** both (layout + 3 caps at U20). + +##### F-51 · Major · No charger-die or cell temperature reaches the MCU; the firmware thermal inhibit has no source on v6 (R4) +*Status:* verified (verify_1). +- **Evidence (every temperature source on v6):** + + | Sensor | Ref / net | MCU input | Distance to U6 | Notes | + |---|---|---|---|---| + | Board air + RH | U3 SHT40 (0x44) | I²C1 | **71.4 mm** | 52 mm from U19 | + | MCU die | U16 internal | ADC1_IN16 | 77 mm | | + | External probe 1 | P7 → `/NTC_TEMP` (R42 10 k) | PB1 / ADC1_IN9 | ≈ 100 mm | jack only | + | External probe 2 | P8 → `/NTC2` (R126 10 k) | PC4 / ADC1_IN14 | ≈ 83.5 mm | jack only | + | Pack NTC | P3.3 → `/NTC` → **U6.17 only** (R55 10 k from VEH5V) | **none** | — | LTC4040 hot pause 42.4 °C (B3380) | + | Modem die | A7670SA internal | AT over USART6 | — | firmware only (F-52) | + | TMP102 | **absent** (V5.x U4 and V5.6 TMP102 deleted in v6 T10) | — | — | — | + + Free pins: PC5 (only free ADC, ADC1_IN15), PB10, PA9, PD2. I²C: TMP102 at 0x48 does not clash (U10 A0 = A1 = GND → 0x4D). +- **Consequence:** `CHG_CELL_HOT/COOL` (45/40 °C) have no cell sensor unless an installer tapes P7 to the pack; no charger-die visibility, so A-02-type cycling is invisible in telemetry. R4 is not met in firmware (the cell is still protected in hardware by the LTC4040 NTC pause). +- **Fix:** (1) **TMP102AIDRLR, LCSC C99269** (SOT-563, stock 34 854) between U6 and L6, ≤ 5 mm from the U6 EP, I²C1 **0x48** (ADD0 → GND), **100 nF C14663**. (2) Pack NTC to the MCU: tap `/NTC` into **PC5** through **100 k (C25803) top / 120 k bottom (**C25808**, 0603 1 %, Basic; assigned at publication) + 10 nF (C1589, the 10 nF 0603 X7R of E-04)**; PC5 ≤ 0.545·5.46 V = 2.98 V; the 220 k load shifts the LTC4040 hot threshold ≈ 0.7 °C (B3380, verify_1). `tcell` is valid only with VEH5V present (VEH5V = 0 on battery), which is when charging is possible. (3) Firmware: `tchg`, `tcell` appended to `$PHLG`; governor inhibits on `tcell` (Li-ion 45 °C / LFP 55–60 °C) and sheds on `tchg` > 85 °C. Rating Major: R4 is still reachable with the P7 probe on the pack plus the NTC pause; **Leo can promote it to Blocker if "sensor ≤ 10 mm of U6" is binding for R4** (verify_1). +- **Effort:** both (2 parts + 3 passives, placed in the A-02 re-cluster). + +##### F-06 · Major · RF feeds: LTE routed 22 mm on In1 under the modem power tracks with 2 via transitions; GNSS bias line 0.27 mm beside the RF line; neither line is 50 Ω on the real stackup +*Absorbs:* B-05, C-05, B-12 (stackup part). *Status:* verified-with-correction (verify_1 and verify_2: GNSS coupling re-measured; impedances re-derived; fence pitch set to ≤ 3 mm). +- **Evidence:** + - LTE: `/RF_LTE` U19.60 → 4.01 mm F.Cu → **In1 22.14 mm** (0.5 mm) with vias at (174.25, 58.25) and (194.27, 53.72) → R118 → `/RF_ANT_LTE` 5.62 mm F.Cu → D28 → J13; ≈ 31.5–31.8 mm total. Copper within ±0.25 mm of the In1 run: `/VBAT_MODEM` F.Cu 1.15 mm², `/SYS5V` 0.71, `/SW_IN` 0.40, `/MODEM_LED_K/A` 0.56/0.10, `/DIN_4G` In2 0.71. F.Cu GND above covers ≈ 45–55 %; 1 GND via within 3.5 mm of the whole path. In1 section ≈ 30–47 Ω (FD 32.5 / 47.1 Ω). + - GNSS: `/RF_GNSS` 22.7 mm F.Cu, 0.5 mm / 0.15 mm gap; `/VCC_RF_GNSS` alongside with minimum edge gap **0.274 mm**, 3.25 mm of run at ≤ 0.3 mm, 13.4 mm at ≤ 0.5 mm, 17.9 mm within 1 mm (verify_2; FHJ's "16.7 mm at 0.27" overstated it); 2 GND vias within 3.5 mm; D27 on a 2.8 mm stub beyond C143 (≈ 1–1.2 pF, RL ≈ 11 dB, ≈ 0.4 dB). + - Impedance (JLC04161H-7628, L1–L2 0.2104 mm, εr 4.4): 0.5 mm microstrip **42.1 Ω**; CPWG 0.5/0.15 as built 41.0 Ω (FD 38.4 bare / 35.2 masked); CPWG 0.30/0.20 56.6 Ω bare closed-form, **FD 53.3 Ω bare / 48.4 Ω masked**; 0.35/0.20 52.1 Ω bare. On the file's generic stack (0.48 mm, εr 4.5) 0.5 mm is 66.6 Ω. The board file carries the generic stackup (copper finish "None"); RF and PWR_MODEM netclasses are missing. +- **Consequence:** LTE mismatch plus two unshielded via transitions, with the PA supply crossing the RF line (PA noise and burst ripple couple into the antenna feed) and radiated desense of the adjacent F9P; on GNSS a coupled section between the antenna input and a bias line decoupled only at L21. The G3 desense bench test is likely to fail. +- **Fix (layout + stackup; §6 L-1, L-30 … L-33):** set the real stackup in Board Setup (JLC04161H-7628: 0.035 / 0.2104 / 0.035 / 1.065 / 0.035 / 0.2104 / 0.035 mm, εr 4.4 prepreg / 4.6 core) and order impedance control. Both RF runs on **F.Cu only as CPWG over solid In1, starting at w 0.30 mm / gap 0.20 mm**, finalised in JLC's calculator; RF netclass (width = CPWG width, clearance = gap, no autoroute). LTE: reroute U19.60 → R118/C146/C147 → D28 → J13 on F.Cu (rotate J13 or move it toward U19's RF pad side); nothing above or below; `/VBAT_MODEM` ≥ 3 mm away. Via fence both sides at **≤ 3 mm pitch** (λg/20 = 3.1 mm at 2.69 GHz), ≤ 1 mm from the gap edge; 2 vias per U.FL GND pad. GNSS: bias feed (`/ANT_BIAS` after C-01) ≥ 1 mm from the RF line with a stitched GND strip between (or on In2 after 100 pF + 100 nF decoupling at U18 pin 7); L21 taps the line stub-free at J12; D27 on the J12 pad. Optional (C-05): C143 → 47 pF C0G 0402 (no LCSC selected). Fence-pitch conflict (FHJ ≤ 2.5 mm, BCE ≤ 3.3 mm) resolved to ≤ 3 mm (verify_2). +- **Effort:** both (stackup setting + layout). + +##### F-05 · Major · In1, the "solid GND reference", is 19 % void and carries 1572 mm of tracks from 49 nets +*Status:* verified, fix scope corrected (verify_2). +- **Evidence:** In1 GND fill 11 370.5 mm² in 8 islands: **18.8 % void** vs 14 000 mm² (17.4 % vs the 139 × 99 mm usable area); **1571.9 mm of tracks from 49 nets** (largest users `/SW_5V` 181 mm, `/DOUT_4G` 95, `/KCOIL` 85, `/MAIN5V` 73, `/CHRG_FAULT` 72, `/CHRG_STAT` 69, `/USART6_TX` 68, `/BOOT0` 61, … `/24V_IN` 27, `/RF_LTE` 22). F.Cu nets over In1 voids: USB_DP/DM 10.4/9.7 mm (directly over `/24V_IN` and `/SW_5V`); I2C_SDA 25.2 mm (14.2 mm directly over `/SER_TXB`); ETH_XO 8.3 mm (6.95 mm over `/ETH_RST`); NRST 21.1 mm (7.2 mm over `/USART6_RX`); DFU_DM 13.2 mm; SIMB_CLK 9.1 mm (5.8 mm over `/SW_5V`); DOUT_4G_M 13.1 mm; RF_GNSS/RF_ANT_* 0 mm ✅. In2 GND (1 island) carries 1009 mm from 25 nets; B.Cu is the `/3V3` pour. +- **Consequence:** return currents detour around slots (emissions, susceptibility); broadside crosstalk with no plane between (I2C_SDA over SER_TXB, ETH_XO over ETH_RST); the Copper Plan's "unbroken In1" rule for the RF receiver is broken by design. +- **Fix (layout):** a full "In1 = plane" re-layout is ideal. **Minimum (verify_2):** clear In1 under the USB pairs, the crystals and their lines, all switch nodes, VBAT_MODEM/the RF area, SIM, and the three broadside parallels above. Priority moves: `/RF_LTE` (F-06), `/24V_IN` (F-02), `/SW_5V` (C-04), `/MAIN5V`, `/KCOIL`, `/USART6_TX/RX`, `/DOUT_4G`, `/CHRG_*`, `/SER_TXB/RXB`, `/ETH_*`, `/VFB_BST`, `/IGATE` → In2/B.Cu (or F.Cu where short). **Acceptance: ≤ 3 In1 islands and no critical net over a void longer than 1 mm.** +- **Effort:** layout (large). + +##### Minor (F) — not independently verified +- **F-52 · Minor · No on-board sensor near the modem (ECO D3 dropped).** Nearest board sensor to U19 is U3 at 52.1 mm; the only modem-temperature path is AT over USART6 (`AT+CPMUTEMP` exists on SIMCom A76xx; availability on the A7670SA firmware not verified; works only while the modem is up). *Fix:* firmware-only (`tmodem` in `$PHLG`), or a **second TMP102 (C99269) at 0x49** (ADD0 → 3V3) between U19 and U20. *Effort:* firmware-only, or both. +- **F-14 · Minor · DFU ESD (D14/D15/D16) hangs on stubs; D15 is 10.9 mm of copper from J11** (J9 part → G-02). DFU_DP/DM have no series resistors. Pad-edge / copper path J11 → ESD / on the path?: D14 2.53 / 3.3 mm / no (T-stub); D15 6.07 / **10.9 mm** / no; D16 2.62 / 3.0 mm / no; ESD GND → via 2.6 / 1.8 / 4.9 mm. *Consequence:* ≈ 1 nH/mm stub raises the clamp voltage on the fast IEC 61000-4-2 edge. *Fix:* route J11 D+/D− through the D14/D15 pads, D15 ≤ 3 mm of copper from J11, each ESD GND pad with its own via ≤ 1 mm; optional: one USBLC6-2SC6 (C7519) at J11 instead of three PESD5V0S1BA. *Effort:* layout. +- **F-17 · Minor · USB pairs split across layers and crossing slots.** `/USB_DP` F.Cu 49.9 + In1 9.6 mm; `/USB_DM` F.Cu 50.0 + In1 8.0 + In2 1.7 mm; they cross In1 `/24V_IN` (2.5 mm gap) at (157.75, 121.75), `/SW_5V` 2.47 mm, `/5V_FAN`, `/IGATE`, `/CHRG_FAULT/STAT`; `/DFU_DM` runs 5.98 mm over In1 `/ETH_ACTLED`. *Consequence:* A7670SA USB is high speed; FOTA/recovery through J9 may fail at HS. *Fix:* both pairs on F.Cu only over solid In1, coupled (≈ 0.2/0.15 mm on JLC7628 for 90 Ω, verify in the calculator), ≤ 1 via pair, no slot crossings. *Merge note:* verify_1 folded F-17 into B-07; verify_2 kept it separate as the routing (not ESD) part. Kept separate here so the Minor routing item does not inherit a Major rating. *Effort:* layout. +- **F-18 · Minor · Silkscreen: 304 of 312 reference texts are 0.5 mm / 0.1 mm (JLC minimum 1.0 mm / 0.15 mm).** The DRU text rule is 0.5/0.1 so DRC stays silent; 14 DRC silk items (11 silk_overlap incl. D27, U23, U24, Q10/JP5, Q23; 2 silk_over_copper Rigb1, C10; 1 silk_edge P1). *Fix:* refs ≥ 0.8 mm / 0.15 mm (1.0/0.15 where it fits); DRU text rule `(min 0.8mm)` / `(min 0.15mm)`; clear the 14 items; check D27/D28/Q10 polarity marks in the 3D view. See G-05 for label content. *Effort:* layout. + +##### Notes (F) — not independently verified +| ID | Observation | Action | +|---|---|---| +| F-19 | JLC 4-layer standard: passes (min track 0.20 mm, spacing 0.15 mm, vias 0.30/0.80 mm, copper-to-edge 0.625 mm); J9/J11 (GCT USB4085) at the limits: PTH ring 0.15 mm, hole-to-hole 0.45 mm, PTH hole → track 0.30 mm (V5.5 fabbed fine). | Order notes: ENIG (LGA U18/U19); JLC04161H-7628 with impedance control; X-ray on U18/U19; tent vias. | +| F-20 | Courtyard overlaps: all 15 MCP hits are bounding-box artefacts (polygon intersection 0.000 mm²); KiCad `courtyards_overlap` reports 0; only MH5–MH8 lack courtyards. | None. Watch the MWSA0804S bodies (8.2 × 8.8 mm on an 8.0 × 8.0 courtyard basis, H-03). | +| F-21 | One dangling `/SW_5V` track end at (86.35, 121.88): overlaps U21.3 by 0.085 mm², connected per KiCad. | Extend 0.3 mm to the pad centre (cosmetic). | + +#### (b) Pass/fail — §4-F +| Check | Evidence (one line) | Result | +|---|---|---| +| Fan driver / FB divider location | R20/R21 0.67/1.48 mm from U2.4 (ECO E3 fixed); moot if A-01 removes U2 | ✅ | +| Fan tach | 2-wire, `ENABLE_FAN_TACH 0` (decision) | ✅ (Note) | +| Fan default OFF | Rgs1 100 k on Q2 gate | ✅ | +| Temperature sensor near U6 | none; U3 at 71.4 mm | ❌ F-51 | +| Temperature sensor near modem | none on board (U3 52.1 mm); AT path only | ⚠ F-52 | +| Board ambient sensor | U3 SHT40 at (122.4, 77.3), I²C 0x44 | ✅ | +| Pack NTC reaches the MCU | `/NTC` → U6.17 only (the brief's "P12 NTC" is P3 on v6; P12 is now the RS-232 terminal) | ❌ F-51 | +| Real cell source for `CHG_CELL_HOT` 45 °C | none on board | ❌ F-51 | +| Crystals ≤ 5 mm | Y1 10.79/13.74 mm (E-03), Y3 8.32/11.30 mm (D-02), Y4 3.92/6.32 mm (D-03), Y2 5.51/4.64 mm (no finding) | ❌ Minor items | +| Crystal ↔ inductor ≥ 10 mm | nearest Y1–L8 13.6 mm | ✅ | +| Via stitching under the modem / F9P | 1 / 0 vias under the bodies | ❌ F-12 | +| Board stitching / edge fence | 69 GND vias, 10 empty 20 mm cells, 2 edge vias | ❌ F-12 | +| Thermal vias in regulator EPs | 0 in U6/U25/U20/U2/U12 | ❌ A-02, F-12 | +| DFU ESD at J11 | 2.5–6.1 mm pad edge (V5.5: 41 mm) | ✅ (stubs: F-14) | +| Return paths across splits | In1 19 % void, 1572 mm of tracks; USB, crystal, SIM, I²C lines over slots | ❌ F-05 | +| 24 V on inner layers next to LV | `/IGN_IN` In2 0.221 mm from `/VEH5V`; `/24V_IN` In1 0.500 mm from `/SW_5V` | ❌ F-02 | +| Netclasses resolve / DRC can see 24 V spacing | 1 of 14 HV nets in HV24; 0.15 mm override rule; RF/PWR_MODEM missing | ❌ F-01 | +| Outer-layer 24 V spacing ≥ 0.3 mm | 15 spots < 0.3 mm (worst 0.150; `/VIN_PROT`–`/VEH5V` 0.162) | ❌ F-01 (F-15) | +| `/24V_IN` clearance | ≥ 0.500 mm to everything on all 4 layers | ✅ | +| Switch nodes only on outer layer | `/SW_PWRIN`, `/SW_FAN`, `/SW_MODEM`, `/SW_BAT`, `/ETH_SW` F.Cu-only | ✅ | +| Buck hot loops (ECO E.4) | U25 GND split (≈ 311 mm² loop), U20 0.25 mm neck, U12 6.40 mm / 11.92 mm | ❌ F-03 | +| U20 VIN cap, BST, L20 placement | C128 0.72 mm, C129 1.8 mm, L20 2.24 mm | ✅ | +| U25 BST cap, FB/COMP/RT | C152 1.49 mm; R122 1.0, R121 2.9 mm; FB net 4.1 mm | ✅ | +| RF lines 50 Ω, fenced, on the real stackup | LTE 22 mm on In1, 30–47 Ω, 1 fence via; GNSS 38–42 Ω, bias line 0.274 mm | ❌ F-06 | +| RF_GNSS over a solid plane | 0 In1 slot crossings | ✅ | +| GNSS island ↔ switchers ≥ 25 mm | `/ETH_SW` 27.5 mm, L8 35.3 mm, `/SW_FAN` 54.1 mm | ✅ | +| Courtyard overlaps (real) | 0 of 15 (polygon intersection 0.000 mm²) | ✅ | +| Dangling track ends | 1, benign | ✅ (F-21) | +| Silkscreen size vs JLC | 304 refs at 0.5/0.1 mm | ❌ F-18 | +| JLC 4-layer manufacturability | passes; J9/J11 at PTH-ring and hole-spacing limits | ✅ / ⚠ (F-19) | +| DRC clean | 0 errors, but only because of F-01; 283 warnings classified in §4-J | ⚠ F-01 | + +--- +### 4-G Connectors and harness (`drogheda-einarboard-harness`, `drogheda-einarboard-j1-mirror`) + +#### (a) Findings + +##### G-01 · Blocker (conditional) · Mounting-hole pattern changed vs V5.5: MH4 now lands on L6; heatsink-clamp holes MH11 + partner missing +*Status:* verified-with-correction (verify_2: Blocker unless Leo confirms a re-drilled backplate; MH11 and its partner are also missing). +- **Evidence:** outline identical to V5.5 (140.00 × 100.00 mm, x 60.19–200.19, y 40.32–140.32). V5.5 PCB holes: MH5 (65.2, 45.3), MH6 (65.2, 135.3), **MH4 (193.2, 90.3)**, MH7/9/10/11 (M2.5 shield/heatsink). v6 holes: MH5 (65.2, 45.3), MH6 (65.2, 135.3), MH7 (195.2, 45.3), MH8 (195.2, 135.3): a 130 × 90 mm corner pattern. At (193.2, 90.3) on v6 the **L6 courtyard contains the point** (0.0 mm); L6.2 `/BAT_PLUS` pad centre 2.44 mm away; R133 1.75 mm. Design brief v1.0: "Keep 140.000 × 100.000 mm — no enclosure rework"; memory `drogheda-v6-zed-f9p-integration`: "MH4/5/6 (enclosure) and MH11 (heatsink clamp) survive"; Phase-2 delta: "KEEP MH11 and add one partner near U19". **MH11 at (168.3, 84.6) is missing** (the point is now 0.6 mm from the U19 courtyard), and so is its partner: these are the modem heatsink-clamp holes for thermal gate T1. MH6: `/3V3` F.Cu track 3.55 mm from the hole centre (an M3 washer Ø7 mm needs ≥ 3.5 mm plus tolerance). +- **Consequence:** in an enclosure drilled for V5.5, v6 cannot be screwed down on the right side, and a metal standoff at (193.2, 90.3) would press on L6 / `/BAT_PLUS`. No modem heatsink clamp is possible. If the backplate is re-drilled per board, this becomes a documentation item. +- **Fix:** Leo confirms the backplate pattern (§10). If the V5.5 standoffs are reused: **restore MH4 at (193.2, 90.3)** (L6 must move anyway, A-02: ≤ 5 mm from U6); decide and place the heatsink-clamp pair near U19 (MH11 + partner). Otherwise publish the 130 × 90 mm corner pattern for the enclosure. Keep a ≥ 4.0 mm copper-free radius on F.Cu/B.Cu around every mounting hole (move the `/3V3` track at MH6 by ≥ 0.5 mm) or specify nylon washers. +- **Effort:** layout (+ enclosure drawing). + +##### G-02 · Major · Modem USB-C J9 has no ESD protection (lesson F8, ECO §E.5) +*Absorbs:* B-07 (ESD part), F-14 (J9 part). *Merge note:* verify_1 used B-07 as primary and folded F-17 in; verify_2 used G-02 and kept F-17 (pair routing) separate as a Minor. This report follows verify_2, because the routing item carries its own lower severity. *Status:* verified (verify_1 and verify_2). +- **Evidence:** `/USB_DP` = {J9.A6, J9.B6, U19.27}, `/USB_DM` = {J9.A7, J9.B7, U19.28}, `/USB_VBUS` = {J9.A4/A9/B4/B9, U19.24}: no protection device (unchanged since the 25-Sep review). J9 is 64.6 mm (centre) from U19. J11 has D14/D15/D16. J9 is the modem's firmware-update / USB_BOOT recovery port (TP8). +- **Consequence:** a field-service ESD hit on J9 goes straight into the A7670SA USB PHY/VBUS; the modem is the unit's only link and J9 is its only recovery route. +- **Fix:** add **USBLC6-2SC6, LCSC C7519** (ST, SOT-23-6, 3.5 pF, stock 1415): pins 1/6 → `/USB_DM`, 3/4 → `/USB_DP`, 5 → `/USB_VBUS`, 2 → GND (same connection as V5.6 D19); **≤ 3 mm of copper from the J9 pads**, flow-through (D± routed through the device pads), GND via ≤ 1 mm (distance conflict ≤ 3 mm vs B-07's ≤ 5 mm resolved to ≤ 3 mm by verify_2). +- **Effort:** both. + +##### Minor (G) — not independently verified +- **G-03 · Minor · J10 / P11 / P12: DNP and footprint disagree between schematic and PCB** — *absorbs E-05, H-06.* Schematic: J10, P11, P12 populated; PCB: all three `dnp`. P11 (`/RS485_A,B,GND`) and P12 (`/RS232_TX,RX,GND`) schematic footprint `…MC_1,5_3-G-3.5_1x03_P3.50mm_Vertical` **does not exist** in the KiCad library (MC = right-angle; vertical is MCV); the PCB uses `…_Horizontal`, which matches **C5160226 DEGSON 15EDGRC-3.5-03P, right-angle, 7 A** (V5.5 fabbed the same Horizontal footprint). J10: schematic nickname `Connector_RJ45` (not configured) vs PCB `Connector_RJ`; LED pins 9–12 still marked "VERIFY". U10/U14/U15 are populated on both sides. With J10 DNP, the populated W5500 block (U11, U12, Y1, C90–C103, ≈ $2.5) has no connector. These are the 3 "real" ERC items (`footprint_link_issues`). *Consequence:* the schematic BOM orders three parts the CPL marks DNP; an Update-PCB with "replace footprints" would load the missing Vertical footprint and flip DNP back. *Fix:* schematic footprints → `Connector_Phoenix_MC:PhoenixContact_MC_1,5_3-G-3.5_1x03_P3.50mm_Horizontal` (P11, P12) and `Connector_RJ:RJ45_Hanrun_HR911105A_Horizontal` (J10); set DNP identically on both sides per Leo's intent (if hand-fitted THT: DNP in the schematic too, listed on the hand-assembly sheet); if Ethernet is not fitted on v6, DNP U11/U12/Y1 and their passives as well; verify the J10 LED pins against the HR911105A drawing. *Effort:* schematic-only (+ Leo's decision). +- **G-04 · Minor · No solder-jumper bypass across the cut-off connector P5** (ECO §F JP_CUT; Review §4 #9). P5 CUTOFF-SW = {1 `/MAIN5V`, 2 `/SYS5V`}; nothing bridges them. Without a plug in P5, `/SYS5V` is dead. *Fix:* add **JP_CUT = `Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm`** (no BOM part) across P5, open by default, silk "CUTOFF BYPASS"; `/SYS5V` load ≲ 0.8 A fits a 1.0 × 1.5 mm bridged pad pair. *Effort:* both. +- **G-05 · Minor · Silkscreen labels: stale modem-reset label, ECO names missing, P-renumber collisions.** "4G NTRIP RESET" at (187.0, 124.1): v6 has no modem-reset button (SW4G1 deleted); the label sits between D34 and L22. SW1 "NRST", SW2 "BOOT" (ECO asks "RESET MCU"); JP2 (chemistry) carries only its refdes, and "F2" is also the fuse refdes; P1 has one label "IGN 24V" at (178.5, 129) with no per-pin legend although v6 accepts 9–36 V; all labels 0.5 mm / 0.1 mm. **Renumber hazard:** a V5-labelled "P6 FAN" XH-2 plug fits v6 **P6 RESET-EXT** (the fan motor across NRST–GND holds the MCU in reset); V5 "P8 PANEL_LED" fits v6 **P8 NTC2**. *Fix:* delete "4G NTRIP RESET"; SW1 "RESET MCU", SW2 "BOOT0 (DFU)"; JP2 "CHEM 1-2 Li-ion / 2-3 LFP"; P1 legend "VIN 9-36V · GND · IGN · GND · NC"; a function name at every connector (FAN, RESET, NTC1, NTC2, LED, BATT, CUTOFF, 5V BENCH); text ≥ 0.8 mm / 0.15 mm (F-18); harness labels by function, not P-number. *Effort:* layout. +- **G-08 · Minor · External-cable inputs P6 (NRST) and P7/P8 (NTC ADC) have no ESD protection.** `/NRST` = {U16.7, C104, SW1, P6.1, TP5}: C104 3.26 mm from the MCU, 35.6 mm from P6, NRST routed 108.6 mm. `/NTC_TEMP` (PB1) and `/NTC2` (PC4) go to P7.1/P8.1 with 100 nF near the MCU (C24 6.63 mm, C157 3.11 mm); P7/P8 at 20.2/21.5 mm. IEC 8 kV/150 pF dumps 1.2 µC ≈ 12 V step on 100 nF before the MCU diodes conduct. *Fix:* **PESD5V0S1BA (C2827694, SOD-323**, already in the BOM as D14–D16) at P6.1, P7.1 and P8.1, each ≤ 3 mm from its connector to GND; optional 100 Ω series (C22775) on NRST between P6 and the net. *Effort:* both. + +##### Notes (G) — not independently verified +| ID | Observation | Action | +|---|---|---| +| G-06 | P2 bench input sits directly on U25's output (`/VEH5V`), no OR-ing. With P2 only: current flows L22 → SW → TPS54360B high-side body diode → `/VIN_PROT`; Q23 then conducts to `/24V_IN`, and via Q10's body diode to `/24V`: ≈ 4 V on P1.1 and `/24V` (U2 may try to run). Benign with both sources (both source-only). | Document in the bench procedure ("P1.1 reads ≈ 4 V on P2-only power"); or a series Schottky on P2 (no LCSC selected). With A-01, Q10/U2 are DNP. | +| G-07 | P3 = JST B3B-XH-A (C144394), 3 A per contact: 2.42 A charge (81 %) with 825 Ω, 1.4 A after A-03; backup peaks 3.0–3.4 A, 0.6–1 A average; ≈ 70 mV across two contacts at 3.4 A. | Keep XH-3 for compatibility with the existing 1S4P packs; if the pack harness is remade (LFP-HT, ECO D1) move to XH-5 (2 × BAT+, 2 × GND, NTC) or JST VH (v6.1). | + +#### (b) Pass/fail — §4-G +| Check | Evidence (one line) | Result | +|---|---|---| +| P1 / P2 power entry | P1 MKDS 5-pin (16 A) = VIN, GND, IGN, GND, NC; P2 = bench 5 V on `/VEH5V` | ✅ (G-06 Note) | +| Ignition GND return | P1.2 and P1.4 = GND, P1.5 NC (as V5.5) | ✅ | +| Ignition wire routing / protection | raw `/IGN_IN` 106 mm on In2, no TVS | ❌ F-02 | +| JP_CUT across the P5 cutoff | none | ❌ G-04 | +| Pin-1 marking / mirrored sockets (J1 errata class) | every connector a KiCad-library footprint with a distinct pad-1 shape and silk marker; J12/J13 symmetric; J14 stock KiCad JAE; no module sockets on v6 | ✅ | +| Harness pinouts vs V5.5 (by function) | P1, P2, P3=P4, P4=P6, P5=P11, P6=P10, P7=P12, P9=P8, P10=P14, P11=P15, P12=P16 identical | ✅ | +| Renumbered-plug collisions | V5 "P6 FAN" fits v6 P6 RESET-EXT; V5 "P8 PANEL_LED" fits P8 NTC2 | ⚠ G-05 | +| Silkscreen names (RESET MÓDEM / RESET MCU / F2) | stale "4G NTRIP RESET"; SW1 "NRST"; JP2 no legend | ❌ G-05 | +| J9 modem USB ESD | none | ❌ G-02 | +| J11 DFU ESD | D14/D15/D16 at 3.19/6.74/6.83 mm | ✅ (stubs: F-14) | +| P6/P7/P8 external-cable ESD | none | ⚠ G-08 | +| Sch/PCB parity J10/P11/P12 | DNP and footprint mismatch | ❌ G-03 | +| Mounting holes vs V5.5 enclosure | MH4 (193.2, 90.3) missing, L6 on it; MH11 + partner missing | ❌ G-01 (conditional) | +| Outline / case fit XY | 140.00 × 100.00 at V5.5 coordinates; J10 and J11 within 0.09 mm of V5.5 | ✅ | +| Connector current ratings | P1 16 A, P2 3 A at ≤ 2.5 A, P5 3 A at ≤ 0.8 A, P11/P12 7 A; P3 3 A at 81 % (as-is) | ✅ (P3: G-07) | + +--- +### 4-H BOM and JLC manufacturability + +Full line-by-line check: `findings/bom_check.csv` (152 BOM lines; LCSC, JLC DB part, package, Basic/Extended, stock at 20/100 boards, footprint vs package, unit price). Cross-references: C130/C131/C78 electrolytics → **B-02 / A-09**; D21 60 V clone (H-05) → **A-01**; J10/P11/P12 → **G-03** (absorbs H-06); Y1 load caps → **E-03** (absorbs H-07). + +#### (a) Findings + +##### H-04 · Blocker · U25's footprint carries `LCSC Part` = C2071691 (AP64350, 40 V) and the Fabrication Toolkit reads that field first +*Absorbs:* A-15. *Status:* verified, severity raised Major → Blocker (verify_2: the key order is proven in the toolkit source; the 25-Sep pre-fab audit prescribes that toolkit). +- **Evidence:** 14 v6 footprints carry `LCSC Part`, all inherited from the easyeda `Drogheda-v6.pretty` footprints; **U25 is the only one whose value differs from `LCSC`** (C2071691 vs C524806). Source: `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod` line 12, `(property "LCSC Part" "C2071691")` (U20 and U25 share this footprint). Fabrication-Toolkit `plugins/process.py::_get_mpn_from_footprint` tries `['LCSC Part #', 'LCSC Part', …]` before the fallback `['LCSC', …]` and returns the first non-empty field. The 25-Sep pre-fab audit says "Generate BOM/CPL from the board … (Fabrication Toolkit)", and the V5.5 `production/` folder is the toolkit's output folder. AP64350 and TPS54360B are pin-compatible (1 BST, 2 VIN, 3 EN, 4 RT/CLK, 5 FB, 6 COMP, 7 GND, 8 SW) with the same 0.8 V FB. +- **Consequence:** U25 would be assembled as the AP64350: boards pass the bench, then fail at the first transient above 40 V behind a 53 V clamp. Damage risk → Blocker. +- **Fix:** delete `LCSC Part` from U25 **on the board and in the library footprint** (or from all 10 `Drogheda-v6.pretty` footprints). Alternatively generate the BOM from the schematic with kicad-cli (`evidence/bom.csv` is correct), but delete the field regardless. +- **Effort:** schematic/board property only. + +##### H-01 · Blocker · U15 MAX3232ESE (narrow SO-16) sits on a wide SOIC-16W land: it cannot be soldered (v6 regression) +*Status:* verified-with-correction (verify_2: V5.5 was built on the correct narrow land; v6 regressed when its footprints were rebuilt from the schematic). +- **Evidence:** JLC DB: C15846 = MAX3232ESE+T, "SOIC-16" (compare C7605 PCF8574T = "SOIC-16-300mil"). Maxim 19-0273 Rev 10 Ordering Information: "MAX3232ESE+ … 16 Narrow SO"; "MAX3232EWE+ … 16 Wide SO". v6 PCB U15 = `SOIC-16W_7.5x10.3mm`, pads 2.05 × 0.6 mm, pad-row centres x = 117.3 / 126.6 (**9.3 mm apart**); a narrow SO lead tip reaches ±3.0–3.1 mm while the inner pad edge is at ±3.625 mm → leads end 0.5–0.6 mm short of the pads. History: the V5.5/V5.6 schematics carry the same stale SOIC-16W field, but the V5 PCB uses `Package_SO:SOIC-16_3.9x9.9mm_P1.27mm` (pads 1.95 × 0.6 at ±2.475 mm); v6 regressed at the 02-Sep fresh-layout re-sync. U15 is the only carried-over LCSC part whose footprint changed. +- **Consequence:** RS-232 (P12) dead on every v6 board; JLC either rejects the job or places a part that cannot be soldered. +- **Fix:** set **`Package_SO:SOIC-16_3.9x9.9mm_P1.27mm`** in the v6 schematic **and** PCB, keep **C15846** (genuine Maxim, stock 4873), re-place C84–C88 against U15. Fix the stale field in the V5.x schematics too, so a future Update-PCB cannot break the working V5.5 land. C19268179 (TECH PUBLIC MAX3232ID) only as an alternate; the wide part C118514 (30 in stock) is not recommended. +- **Effort:** both (footprint + local re-route). + +##### H-02 · Blocker (order gate) · U10 and R53 cannot be bought for any order quantity +*Status:* verified-with-correction (verify_2: Blocker only for U10 + R53; the other stock items become Major H-02b). +- **Evidence (JLC DB snapshot 2026-09-28):** U10 C729142 (SC16IS762IPW) **15 in stock**; R53 C131054 (YAGEO 499 k 1 %) **6 in stock**, first price break 20+, so JLC's 20-piece minimum cannot be met at any board quantity. R53 sets the LTC4040 boost set-point: unplaced, the backup rail does not regulate. +- **Consequence:** JLC leaves U10 (RS-485/RS-232 bridge) and R53 unplaced. +- **Fix:** **U10 → C57156 SC16IS752IPW,128** (same TSSOP-28, pinout and registers; U10 runs in I²C mode (pin 9 = 3V3), where 752 and 762 are identical; the value field already says 752; stock 2670; $3.80 vs $7.32). **R53 → C177479** HKR RCT03499KFLF (499 k, 1 %, 100 ppm, 0603, 100 mW, 75 V; stock 26 862). Both are exact drop-ins. Re-check stock on order day. +- **Effort:** schematic-only. + +##### H-02b · Major · Stock to re-check against the order quantity (split from H-02) +*Status:* verified (verify_2). +- **Evidence:** C103211 (RALEC 100 k **5 %**) 702 in stock, 9 per board → 78 boards max (refs R20, R56–R58, R85, R87, Ren1, Rfreq1, Rgs1; R20/Ren1/Rfreq1 disappear if A-01 DNPs the U2 block). U19 A7670SA-LASC C18548276: 96. U18 ZED-F9P-04B C5120257: 104. J14 C2977286: 10 890 but in "Pre-ordered Products" (must be pre-ordered into the JLC account; pre-fab B4 still open). L2+L8 / L6 / U13 / P11+P12 stock is fine at 100 boards. +- **Consequence:** a 100-board order stalls on U18/U19/C103211; J14 fails without a pre-order. +- **Fix:** **C103211 → C25803** (UNI-ROYAL 100 k **1 %**, Basic, 10.8 M in stock; an upgrade: R87 sets 3V3_ETH, R20 the fan output). Pre-order/consign U18 and U19 for quantities ≳ 100; pre-order J14. Re-check all on order day. +- **Effort:** schematic-only + purchasing. + +##### Minor (H) +- **H-03 · Minor · Sunlord MWSA0804S inductors (L2, L6, L8, L20) sit on a Bourns SRU8028 land.** *Status:* verified, severity changed Major → Minor (verify_2: the same part/land pairing ran on L2/L6/L7/L8 of 15 assembled V5.5 boards; joint strength is ample). Land: pads 2.0 × 3.2 mm at ±3.9 mm (2.9–4.9 mm from centre). MWSA0804S (Sunlord spec Table 4-1): body 8.2 ± 0.3 × 8.8 ± 0.4 × 3.8 mm, electrodes D 1.4 × E 5.0 mm, recommended land I 2.75 / J 4.0 / H 5.5 mm (typ); wetted electrode area **55–64 %**; ≈ 3.8 mm² per joint, SAC ≈ 30 MPa → ≈ 100 N against ≈ 0.1 N/g. The Sunlord drawing letters could not be read in the sandbox (LCSC/Digikey PDFs blocked). The V5.5 "modem dark on battery" was root-caused to back-feed/UVLO, not inductor joints. *Fix:* change the footprint, not the part (SRU8028-class Bourns parts have lower Isat than MWSA0804S-2R2 for L6): build `Drogheda-v6:IND-SMD_MWSA0804S` from the LCSC drawing (auditor's reading: pads 2.75 × 4.0 mm, 5.5 mm inner gap → centres ±4.125 mm; courtyard 9.4 × 9.8 mm; confirm against the drawing) and assign it to L2/L6/L8/L20 (C17700171/65/67) while L6/L20 are re-placed anyway; re-check neighbours for the 0.4 mm body growth. *Effort:* both. +- **H-08 · Minor · Value-field / BOM mismatches** — *absorbs D-16* (not independently verified). C22 "22uF/50V" but C138687 is 10 µF 50 V X7R 1210 (moot if A-01 DNPs C22); **Y2 "1.8432MHz" but C2238 is 3.6864 MHz** (firmware `BOARD_SER_XTAL_HZ 3686400UL` already matches the fitted part); U10 "SC16IS752IPW" but C729142 is SC16IS762 (fixed by H-02); C103 "100uF/6.3V" but C88744 is 35 V (harmless); C130/C131/C78 "220uF/10V" but C2827940 is 16 V (parts replaced by B-02/A-09). *Fix:* correct the value fields (C22 → "10uF/50V" unless 22 µF was intended; Y2 → "3.6864MHz"). *Effort:* schematic-only. + +##### Notes (H) — not independently verified +| ID | Observation | Action | +|---|---|---| +| H-09 | Every fitted BOM line has an LCSC number except TP1–TP8 (copper pads) and PF1–PF21 (virtual). Schematic DNP: C146/C147, R107/R108, R124/R125, R127–R130, U22 (+ J10/P11/P12 on the PCB only, G-03). F2 = C206910 now assigned. The 10 "not found" and 22 "differs from library" symbols were checked pin → pad → net on 25 parts: **no hidden pin mismatch**. RS1 62.5 mW of 1 W. | None beyond H-01…H-08. | +| H-10 | Cost (DB snapshot prices, excluding PCB/assembly/THT fees): v6 **$131.98 (qty 20) / $124.40 (qty 100)** per board (284 placements); modules ZED-F9P-04B $80.11 + A7670SA $6.07 = $86.18; V5.6 **$40.69 / $33.83** (235 placements) → **delta +$91.30 / +$90.14**, 94 % of it F9P + A7670SA. The delta excludes the external simpleRTK2B and 4G NTRIP Master that v6 removes from the unit, so system cost almost certainly drops. 79 unique Extended parts × $3 = **$237 per order** ($11.85/board at 20, $2.37 at 100). Cheap consolidations: C14676 → C21190 (1 k 1 % Basic), C14675/C103211 → C25803, C304185 → C21189 (0 Ω Basic): −4 fees. The A7670SA DB price looks low; confirm at order. | Verdict cost note (§9). Leo to supply ArduSimple/NTRIP-Master unit prices for a system delta (§10). | + +#### (b) Pass/fail — §4-H +| Check | Evidence (one line) | Result | +|---|---|---| +| Every fitted BOM line has an LCSC number | all except TP1–TP8 (pads) | ✅ | +| LCSC parts exist in the JLC DB | 121/121 found | ✅ | +| Stock for any order quantity | U10 15, R53 6 (20-pc minimum) | ❌ H-02 | +| Stock for 100 boards | C103211 78 boards max; U19 96; U18 104; J14 pre-order | ⚠ H-02b | +| Package ↔ footprint | U15 narrow SO on SOIC-16W land (hard mismatch) | ❌ H-01 | +| Inductor land (L7-class SRU8028 vs MWSA0804S question) | 55–64 % electrode wetting; ran on 15 V5.5 boards | ⚠ H-03 | +| BOM field integrity (tool reads the intended LCSC) | U25 `LCSC Part` = AP64350 read first by Fabrication Toolkit | ❌ H-04 | +| DNP list explicit / consistent | schematic DNP list explicit; J10/P11/P12 DNP only on the PCB | ⚠ G-03 | +| No `TBD` | F2 now C206910; no TBD on fitted parts | ✅ | +| Polarity marks | polarized parts use footprints with pin-1/cathode marks; D27/D28/Q10 marks among the silk overlaps | ✅ / ⚠ F-18 | +| Voltage ratings on 24 V nets | ceramics ≥ 50 V (≥ 1.8× at 28.8 V); D21 30 V, U2 30 V abs max | ✅ / ❌ A-01 | +| Value fields match parts | C22, Y2, U10, C103, C130/C131/C78 | ⚠ H-08 | +| Stale library symbols hide pin errors | 25 parts checked pin → pad → net, 0 mismatches | ✅ | +| U19 / L22 fab attribute | both `smd` (pre-fab B2 closed) | ✅ | +| Unit BOM cost delta vs V5.6 | +$91.30 (qty 20) / +$90.14 (qty 100) | ✅ (H-10 Note) | + +--- +### 4-I Requirements traceability (ECO §0 R1–R5) + +The full traceability table is §3. Pass/fail summary on v6 **as drawn**: + +| Requirement | As drawn | Closed by | +|---|---|---| +| R1 — 10-min off/on on battery with report | ❌ needs changes + firmware | A-05, E-01, B-02, C-02, D-01, A-01, A-08, H-02 (R53) + FW sequencing | +| R2 — modem never left dark (MCU can power-cycle it) | ✅ hardware; firmware only | FW ladder (B-10 makes STATUS unambiguous) | +| R3 (brief) — report while on battery | ❌ needs changes + firmware | A-05, E-01, B-02, B-03, F-12, F-06 + FW | +| R3 (ECO) — charge from the 5 V source without brown-out loops | ⚠ no fold-back possible; charger does not start | A-04 (+ A-03) | +| R4 — temperature management (sensors + fan + charger inhibit) | ❌ no cell/charger temperature at the MCU | F-51 (+ F-52 option, A-01 fan) + FW | +| R5 (brief) — charge ≥ 1.3 A without thermal cycling | ❌ | A-03, A-02, A-04 (+ A-07) | +| R5 (ECO) — EMC list of the second batch (ECO §E) | ❌ items 1, 2, 4, 5 (J9 part) and 6 open; item 3 (fan FB divider) and item 5 (DFU ESD at J11) done | A-02 (1, 2), F-03 (4), G-02 (5), D-02 / D-03 / E-06 / F-12 (6) | + +--- + +### 4-J ERC / DRC + +Run with kicad-cli (KiCad 10.0.4) through the KiCad MCP on the unmodified v6 files. Summary tables in Appendix A (ERC) and Appendix B (DRC). Every item is classified in **`findings/ercdrc_classified.csv`** (449 rows: 166 ERC + 283 DRC; columns tool, type, severity, message, coordinates, refs, net, width, rule, layer, classification, justification). Classes: **real** (a design problem), **pre-existing-benign** (rule or library noise, no action beyond hygiene), **needs-fix-cosmetic** (fix for a clean gate, no electrical effect). + +| Tool | Result | real | pre-existing-benign | needs-fix-cosmetic | +|---|---|---|---|---| +| ERC | 0 errors, **166 warnings** | 3 (`footprint_link_issues`: P11, P12, J10 → G-03) | 126 (104 pin_to_pin, 22 lib_symbol_mismatch) | 37 (23 orphan NC flags, 10 lib_symbol_issues, 2 NC-on-connected markers, 2 wire stubs) | +| DRC | 0 errors, **283 warnings**, 0 unconnected | 59 per the CSV (`track_width` on 7 power nets) → **verified: 63 hits on 6 nets** (J-02) | 206 (124 track_width on low-current nets, 82 lib_footprint_mismatch) | 18 (11 silk_overlap, 4 lib_footprint_issues MountingHole, 2 silk_over_copper, 1 silk_edge) | + +**The DRC "0 errors" is produced by the rule set, not by the copper (J-01 → F-01).** With the corrected netclasses and `.kicad_dru`: 6 inner-layer errors (all `/IGN_IN`, F-02) + 15 outer-layer errors at the 0.3 mm rule (38 at 0.5 mm), plus ≈ 178 zone-fill proximities that disappear on refill. With Default = 0.2 mm and no floor rule: +471 pairs. Five DRC checks are ignored in the project (`footprint_type_mismatch`, `missing_courtyard`, `track_not_centered_on_via`, `footprint_filters_mismatch`, `tuning_profile`); J-05 found nothing hidden behind them. + +#### (a) Findings + +*J-01 is merged into F-01 (Blocker, §4-F).* + +##### Minor (J) +- **J-02 · Minor (residual) · `track_width` warnings: 6 nets really under-sized; the rest is an over-strict T15 rule.** *Status:* verified-with-correction (verify_2: 6 real nets carrying 63 DRC hits (`/BAT_PLUS` 123 mm under capacity incl. 69.9 mm of In2 1.0 mm, `/MAIN5V` 111 mm, `/VEH5V` 102 mm, `/SW_BAT` 12.9 mm, `/VIN_SW` 26 mm, `/VBAT_MODEM` 12.5 mm); `/VIN_MODEM` is only a 0.1 mm neck; JLC04161H inner copper 0.5 oz makes inner runs ≈ 40 % weaker than the file's 1 oz). The copper itself is owned by A-02 (`/SW_BAT`, `/BAT_PLUS`), A-07 (`/VEH5V`, `/VIN_SW`, `/MAIN5V`) and B-08 (`/VBAT_MODEM`). *Residual fix:* move `/3V3_ETH` to Default (54 benign hits, 0.15 A) and relax T15 for the benign fan/SW_5V/SW_IN/SYS5V/VIN_PROT/VIN_FUSED nets (keep the 0.8 mm rule on `/VIN_PROT`/`/VIN_FUSED` for pulse/fuse coordination), so the warning list becomes a clean gate. Order 1 oz inner copper or widen inner runs 1.65×. *Effort:* layout (rules). +- **J-03 · Minor · 104 ERC pin-to-pin warnings are pin-type noise** (not independently verified). All involve pins typed `unspecified` in easyeda-imported symbols (U19, U20, U23, U24, U26, D21, D22, D27, D28, J12, J13): 50 Unspecified–Passive, 46 Unspecified–Unspecified, 5 –Bidirectional, 2 –Power output, 1 –Input. Net-by-net check found no driver conflict (U23 DIR = GND, U24 DIR = VCCA, single drivers on every UART/status net, Q20/Q21 open drain). *Consequence:* 104 standing warnings hide the next real one. *Fix:* retype the pins in `Drogheda-v6.kicad_sym` (power_in/power_out/input/output/passive). *Effort:* schematic-only (library). +- **J-04 · Minor · ERC cosmetics: 23 orphan NC flags, NC flags on 4 connected pins, 2 wire stubs, 10 missing symbols, 22 lib-mismatched symbols** — *absorbs B-11, D-11* (not independently verified). Orphan NC flags at x = 453.898 mm (13) and 484.378 mm (10), left from the deleted SimpleRTK2B socket. NC flags on connected pins U16.37 (PC6 `/USART6_TX` → K1.10), U16.38 (PC7 `/USART6_RX` → R106.2), U10.13/14 (`/I2C_SCL`/`/I2C_SDA`): nets are real in the netlist and IPC-356 and routed (KiCad reports 2 markers). Wire stubs at P1.4 and R52.2 (uuid 2b755f7f…, 46f71e27…, 7c1dbfc0…). *Consequence:* the NC flags would suppress a future "unconnected pin" ERC if a label broke (the V5.6 junction incident shows how that happens); a tool honouring NC flags could drop the modem UART. *Fix:* delete the 27 flags and 3 stub segments by UUID; copy the 10 missing symbols into `Drogheda-sym` and re-link; leave the 22 mismatches (do not bulk-update); re-run ERC (D-11: the NC-on-connected count should drop by its 2 markers). *Effort:* schematic-only. + +##### Notes (J) — not independently verified +| ID | Observation | Action | +|---|---|---| +| J-05 | Ignored DRC checks hide nothing real today: `missing_courtyard` only MH5–MH8; `footprint_type_mismatch` JP1–5/TP1–8 (unspecified attribute, SMD pads); 178 track ends off-centre in vias (≤ 0.40 mm, all connected); no tuned nets; 82 lib_footprint_mismatch = KiCad 10 library revisions; 4 lib_footprint_issues = MountingHole nickname not in `fp-lib-table`. | Re-enable `footprint_type_mismatch` after setting TP1–8 to SMD + exclude-from-BOM. Do **not** run "Update footprints from library" (it would swap P11/P12 and reset pads). | + +#### (b) Pass/fail — §4-J +| Check | Evidence (one line) | Result | +|---|---|---| +| ERC run | kicad-cli, 166 items, full list reconstructed (22 + 10 + 30 exact + 104 pin-to-pin modelled, totals equal KiCad) | ✅ | +| ERC errors | 0 | ✅ | +| ERC real items | 3 footprint-link issues (P11, P12, J10) | ❌ G-03 | +| ERC pin-to-pin conflicts hide a driver clash? | net-by-net check: none | ✅ (J-03 hygiene) | +| NC flags hide a wiring error? | 4 flagged pins are connected and routed | ✅ (J-04 hygiene) | +| DRC run | kicad-cli on stored fills, 283 items, 0 unconnected | ✅ | +| DRC errors meaningful | 0 errors only because the 0.15 mm catch-all overrides all classes | ❌ F-01 | +| DRC unconnected | 0; 205/205 multi-pad nets routed (pack union-find agrees) | ✅ | +| `track_width` real vs benign | 63 hits on 6 real nets (A-02/A-07/B-08), 124 benign | ❌ copper (A-02, A-07, B-08) / ⚠ J-02 rules | +| Silk DRC items | 14 (11 overlap, 2 over copper, 1 edge) | ⚠ F-18 | +| Library footprint mismatch / issues | 82 revisions (benign), 4 MountingHole nickname | ⚠ J-05 | +| Ignored checks | 5 ignored; nothing real behind them | ✅ (J-05) | + +--- +## 3. §4-I Requirements traceability (R1–R5, ECO §0) + +**Wording note.** The ECO §0 table and the brief §4-I phrase two requirements differently: ECO R3 = "charge the battery from the 5 V source without brown-out loops" (brief R3 = "report while on battery"); ECO R5 = "EMC list of the second batch" (brief R5 = "charge at ≥ 1.3 A without thermal cycling"). The power auditor used the brief wording for R5, the other auditors and verify_2 the ECO wording. Both readings are traced below (R3 / R3′, R5 / R5′) so neither is lost. "As drawn" = v6 snapshot `ecee9fed…` / `6ddec80d…`. + +| Req. | Requirement | Status on v6 as drawn | IDs that close it | Residual risk after the fixes | +|---|---|---|---|---| +| **R1** | 10-min cycle on battery: everything off, wake, register the modem, report, off | **Needs changes + firmware.** Structure is right (independent `PWR_CTRL` PA1 / `MODEM_PWR_EN` PC10, STATUS PC9, U20 UVLO margin ≈ 1 V vs 0.1 V on V5.5). As drawn: boost at 91–97 % of its guaranteed 2.5 A during a GSM burst with all loads on; W5500 cannot be switched off; AMS1117 sets a 25–55 mW floor; U24 back-feeds the F9P whenever the modem is on and the F9P off; F9P ramp margin unspecified; VBAT bank ages out; R53 (boost set-point) unobtainable | A-05, E-01, E-02, A-01 (+0.30 V at U20), B-02, C-02, D-01, A-08, H-02; Minor D-03 (LSE wake), A-13 (PFO); firmware §8 (sequencing, LTE-only on battery) | GSM 2.8 A peaks exceed the backup limit → LTE-only on battery is mandatory (Leo: is 2G needed on battery?). Modem LTE average current is an assumption: run the ECO §I-1 battery cold start at VBAT 3.5 V with MAIN5V/VIN scope and a `/BAT_PLUS` current probe | +| **R2** | Modem never left dark: MCU can switch, reset and see the modem | **Satisfied by hardware; firmware only.** U20 EN on PC10 with R113 pull-down (full power removal, τ 0.46 s bleed), PWRKEY via Q20/PC8, RESET via Q21/PC11, STATUS via U24/PC9; the modem can be cycled alone | Firmware recovery ladder (§8); B-10 (STATUS pull-down) makes STATUS unambiguous; A-01 changes the U20 source, not the control | Every MCU reset power-cycles the modem (≈ 30 s re-registration, by design). A V5.6 binary on v6 leaves the modem uncontrolled (D-08; board-ID pin unresolved) | +| **R3** (brief) | Report while on battery | **Needs changes + firmware.** Budget fits with LTE-only (≈ 1.0–1.3 A on MAIN5V); GSM bursts at 2.2–2.4 A sit at the 2.5 A limit; link robustness limited by LTE ESD, ground vias, RF feed | A-05, E-01, B-02, B-03, F-12, F-06, C-04; A-13 (faster load shedding); firmware §8 | LTE-to-GNSS desense not measured: G3 bench (modem TX power vs F9P C/N0, before/after F-12/F-06) | +| **R3′** (ECO) | Charge from the 5 V source without brown-out loops (on v6 the source is U25, not the SD-15B) | **Fold-back impossible** (RS1 limit 2.14–2.41 A < U25 4.5 A minimum switch limit; the governor is a safety net) ✅, but U25 at 5.00 V nominal sits below `CHG_RAIL_ON` 5.05 V, so the charger never or randomly starts ❌ | A-04 (R121 57.6 k → 5.18–5.46 V), A-03 (charger no longer input-limited at 1.4 A); firmware `V5_PFI` 4.40 V + VREFINT | With A-01 the modem load moves onto MAIN5V: 0.44 V margin from U25 minimum minus a 1.6 A step droop to PFI max with 57.6 k (0.13 V as drawn) | +| **R4** | Temperature management at ~45 °C ports: sensors + fan + charger inhibit | **Needs changes.** No cell or charger-die temperature at the MCU (TMP102 deleted; pack NTC goes only to U6.17); fan block works (U2 out of rating, A-01); LTC4040 NTC pause at 42.4 °C unchanged (chemistry D1 pending) | F-51 (TMP102 0x48 + pack-NTC tap on PC5), F-52 (optional modem sensor), A-01 (fan from VEH5V), A-02 / F-12 (heat paths); firmware thermal inhibit | `tcell` exists only with VEH5V present; RNTB/JP2 waits for the chemistry decision; F-51 promotion to Blocker is Leo's call; no modem heatsink clamp holes (G-01) | +| **R5** (brief) | Charge at ≥ 1.3 A without thermal cycling | **Needs changes.** R50 825 Ω → 2.42 A (2.57 A corner > 2.5 A IC max); `/SW_BAT` 0.5 mm with 0.25/0.30 mm necks, 0 EP vias, L6 8.65 mm; U25 set-point below the governor start | A-03 (1.43 k → 1.316–1.483 A), A-02, A-04, A-07 | H0008 causality unproven (≈ 1.3 A inferred from the OCV slope); do the clamp-meter + IR checks and a thermal-camera run on U6/L6 at 1.4 A charge and 2.3 A backup | +| **R5′** (ECO) | EMC list of the second batch (ECO §E) | **Needs changes.** #1 `SW_BAT` pour ❌, #2 `BAT_PLUS` ❌, #3 fan FB divider at U2.4 ✅ (0.67/1.48 mm), #4 Cin loops < 3 mm ❌, #5 DFU ESD at J11 ✅ / J9 USBLC6 ❌, #6 crystals ≤ 5 mm ❌ (Y3 8.3/11.3, Y4 3.9/6.3, Y2 5.51/4.64 mm), Ethernet RX pair coupled ❌ (1.2 mm), empty 20 mm stitching cells ❌ (10; V5.5 had 8) | A-02 (#1, #2), F-03 (#4), G-02 (#5), D-02 / D-03 / E-06 / F-12 (#6) | Grades follow Leo's ECO marks (🔴 → Blocker, 🟠 → Major, 🟡 → Minor) except stitching, kept Major because v6 adds an LTE PA and a GNSS receiver (verify_2). Y2 (5.51 mm) has no finding | + +--- + +## 4. §4-D Pin map (condensed, 64/64 pins) + +Complete table (AF/ADC/EXTI, FT/TC, V5 macro vs v6, distances, draft `board_v6.h`): **`pinmap-v6.md`** (same folder). "Audit change" = pin-level effect of a finding if it is adopted; blank = no change. + +| Pin | Name | v6 net | Function on v6 | Proposed v6 macro | Audit change | +|---|---|---|---|---|---| +| 1 | VBAT | /3V3 | backup domain tied to 3V3 (no coin cell) | — | | +| 2 | PC13 | /LED_C13 | status LED, active LOW | `PIN_LED_C13` | | +| 3 | PC14 | /LSE_IN | 32.768 kHz LSE | `BOARD_LSE_HZ` | D-03: Y4 → C48615, C115 6.8 pF | +| 4 | PC15 | /LSE_OUT | LSE | — | D-03: C116 6.8 pF | +| 5 | PH0 | /HSE_IN | 25 MHz HSE (ROM DFU needs it) | `BOARD_HSE_HZ` | D-02: Y3 → C2901684, C113 12 pF | +| 6 | PH1 | /HSE_OUT | HSE | — | D-02: C114 12 pF | +| 7 | NRST | /NRST | MCU reset (SW1, P6, TP5, C104) | — | G-08: ESD at P6 | +| 8 | PC0 | /ETH_INT | W5500 INT, EXTI0 | `PIN_ETH_INT` | | +| 9 | PC1 | /GNSS_ANT_DETECT | F9P input, undriven | `PIN_GNSS_ANT_DET` (hi-Z) | C-01: stays undriven | +| 10 | PC2 | /GNSS_ANT_SHORT_N | F9P input | `PIN_GNSS_ANT_SHORT_N` | C-01: TPS2552 FAULT̅ → LOW = antenna short | +| 11 | PC3 | /GNSS_RTK_STAT | F9P RTK status, EXTI3 | `PIN_GNSS_RTK_STAT` | D-08: mis-flash hazard (V5.6 drives PC3) | +| 12 | VSSA | GND | analog ground | — | | +| 13 | VDDA | /VDDA | ADC reference (R104 10 Ω) | — | A-08/A-04: calibrate from VREFINT | +| 14 | PA0 | /BAT_SENSE | pack ÷ 2, ADC1_IN0 (TC) | `PIN_BAT_SENSE` | | +| 15 | PA1 | /PWR_CTRL | F9P rail enable (Q5 → Q1 → U21) | `PIN_GNSS_PWR` (+ alias `PIN_PWR_CTRL`) | D-09: 100 k base pull-down | +| 16 | PA2 | /GNSS_TX | USART2_TX → F9P RXD | `PIN_GNSS_TX` | hi-Z while F9P off | +| 17 | PA3 | /GNSS_RX | USART2_RX ← F9P TXD | `PIN_GNSS_RX` | | +| 18 | VSS | GND | ground | — | | +| 19 | VDD | /3V3 | supply | — | D-15: cap ≤ 2 mm | +| 20 | PA4 | /5V_SENSE | VEH5V ÷ 2, ADC1_IN4 | `PIN_5V_SENSE` | A-04: 5.32 V → 2.66 V | +| 21 | PA5 | /IGN_SENSE | ignition, ADC1_IN5 (read analog) | `PIN_IGN_SENSE` | F-02: Rig1 at P1.3 + SMBJ33A; D-05: Rigb1 2.2 k | +| 22 | PA6 | /FAN_PWM | fan low-side ON/OFF (TIM3_CH1) | `PIN_FAN` | A-01: fan supply = VEH5V | +| 23 | PA7 | /GNSS_TIMEPULSE | PPS, TIM3_CH2 / EXTI7 | `PIN_GNSS_PPS` | | +| 24 | PC4 | /NTC2 | probe 2, ADC1_IN14 | `PIN_NTC2` | | +| 25 | PC5 | NC (spare) | ADC1_IN15 | `PIN_NTC_CELL` | **F-51: pack-NTC tap** | +| 26 | PB0 | /EXT_LED | panel LED (P9) | `PIN_EXT_LED` | | +| 27 | PB1 | /NTC_TEMP | probe 1, ADC1_IN9 | `PIN_NTC` | | +| 28 | PB2 | /BOOT1_STRAP | BOOT1 = 0 (R99 10 k) | — (never reconfigure) | | +| 29 | PB10 | NC (spare) | EXTI10 | `PIN_PFO` | **A-13: PFO + 100 k pull-up** | +| 30 | VCAP1 | /VCAP1 | core regulator cap (C111) | — | | +| 31 | VSS | GND | ground | — | | +| 32 | VDD | /3V3 | supply | — | D-15 | +| 33 | PB12 | /ETH_CS | W5500 CS | `PIN_ETH_CS` | | +| 34 | PB13 | /ETH_SCK | SPI2 SCK (AF5) | `PIN_ETH_SCK` | | +| 35 | PB14 | /ETH_MISO | SPI2 MISO (AF5) | `PIN_ETH_MISO` | | +| 36 | PB15 | /ETH_MOSI | SPI2 MOSI (AF5) | `PIN_ETH_MOSI` | | +| 37 | PC6 | /USART6_TX | MCU → modem via K1 NO (Mode B), AF8 | `PIN_MODEM_TX` | J-04: delete NC flag | +| 38 | PC7 | /USART6_RX | modem → MCU via R106, AF8 | `PIN_MODEM_RX` | D-01 gate on U18.26; B-10: R106 1 k; J-04 | +| 39 | PC8 | /MODEM_PWRKEY | PWRKEY via Q20 (HIGH = pressed) | `PIN_MODEM_PWRKEY` | | +| 40 | PC9 | /MODEM_STATUS | STATUS via U24 | `PIN_MODEM_STATUS` | B-10: 100 k pull-down | +| 41 | PA8 | /CHRG_EN | charger disable (HIGH = off) | `PIN_CHRG_EN` | A-11: R56 → pull-up (default off) | +| 42 | PA9 | NC (spare) | USART1_TX (was RELAY TX on V5) | `PIN_DBG_TX` if a pad is added | D-12: TP9; only candidate left for D-08 | +| 43 | PA10 | /USART1_RX | F9P TXD2 tap, RX-only, no pull | `PIN_F9P_TX2_TAP` | D-01: Rdfu1 100 k | +| 44 | PA11 | /DFU_DM | USB FS D− (J11) | — | F-14: ESD in-line | +| 45 | PA12 | /DFU_DP | USB FS D+ (J11) | — | F-14 | +| 46 | PA13 | /SWDIO | SWD (TP3) | — | D-12 | +| 47 | VSS | GND | ground | — | | +| 48 | VDD | /3V3 | supply | — | | +| 49 | PA14 | /SWCLK | SWD (TP4) | — | D-12 | +| 50 | PA15 | /ETH_RST | W5500 reset (JTDI pull-up at reset) | `PIN_ETH_RST` | **E-02: 4.7 k (C23162) to GND** | +| 51 | PC10 | /MODEM_PWR_EN | U20 EN (R113 100 k PD) | `PIN_MODEM_PWR_EN` | A-01: U20 input source only | +| 52 | PC11 | /MODEM_RST | modem RESET via Q21 | `PIN_MODEM_RST` | | +| 53 | PC12 | /GNSS_RESET_N | F9P reset, open-drain only | `PIN_GNSS_RESET_N` | | +| 54 | PD2 | NC (spare) | EXTI2 | `PIN_ETH_PWR_EN` | **E-01: U12 EN + 100 k PD** (D-08 conflict) | +| 55 | PB3 | /CHRG_STAT | LOW = charging | `PIN_CHRG_STAT` | | +| 56 | PB4 | /CHRG_FAULT | LOW = fault / NTC pause | `PIN_CHRG_FAULT` | | +| 57 | PB5 | /BYP_CTRL | K1 Mode B (TC pin, output) | `PIN_BYP_CTRL` | | +| 58 | PB6 | /I2C_SCL | I2C1 SCL (AF4) | `PIN_I2C_SCL` | F-51: TMP102 at 0x48 | +| 59 | PB7 | /I2C_SDA | I2C1 SDA (AF4) | `PIN_I2C_SDA` | | +| 60 | BOOT0 | /BOOT0 | R98 10 k PD + SW2 | — | G-05: silk "BOOT0 (DFU)" | +| 61 | PB8 | /SER_IRQ | SC16IS752 IRQ, EXTI8 | `PIN_SER_IRQ` | | +| 62 | PB9 | /ACC_INT1 | SC7A20 INT1, EXTI9 | `PIN_ACC_INT1` | | +| 63 | VSS | GND | ground | — | | +| 64 | VDD | /3V3 | supply | — | D-15 | + +Count: 50 GPIO pads + 6 special (NRST, BOOT0, VBAT, VCAP1, VDDA, VSSA) + 4 VDD + 4 VSS = 64. Spares as drawn: PA9, PB10, PC5, PD2; after the adopted fixes only PA9 remains. + +--- +## 5. Ranked change list + +Ranking criterion within each severity: hardware-damage path first, then repeat of a paid-for lesson, then requirement R1–R5, then reliability/EMC, then process. Owner: **Sch** = schematic (applied by script on the copy `hbox-watchdog-v6-audit.*`, Leo reviews); **Lay** = layout (Michelle); **FW** = firmware; **Leo** = decision or purchasing. Effort: S = schematic-only, L = layout, B = both, F = firmware-only. + +### Part 1 — Blockers (must change before ordering) + +| # | ID | Change | Owner | LCSC / numbers | Effort | Closes | +|---|---|---|---|---|---|---| +| 1 | A-01 | U20 fed from `/MAIN5V` only (delete D20 + 48 mm `/VIN_MODEM` run, D21 → copper); fan from `/VEH5V` (U2 block DNP, JP1 bridged); Q10/DzG1/Rrp1/C10/C11/C22 DNP; F2 → 3 A ahead of D10 | Sch + Lay | F2 **C206912** (4 A C206914 only for 9 V); JP1 bridged footprint | B | Damage path; R1/R3 (+0.30 V at U20); F1, F8 | +| 2 | F-02 | Rig1 ≤ 3 mm of copper from P1.3 (long run becomes `/IGN_SENSE`); SMBJ33A `/IGN_IN` → GND at P1.3; `/24V_IN` off In1 or ≥ 1.0 mm from LV | Sch + Lay | **C224019**; Rig1 C88614 moves | B | 23-Jul short lesson; damage | +| 3 | F-01 | Netclass table + corrected `.kicad_dru` (incl. HV24↔HV24); refill; DRC gate; fix the 15 outer spots (F-15) | Lay (rules drafted in §2 4-F) | floor 0.15 · HV24↔HV24 0.2 · HV24 outer 0.3 · HV24 inner 0.5 mm | L | 23-Jul short lesson | +| 4 | H-04 | Delete `LCSC Part` from U25 on the board and in `Drogheda-v6.pretty/SO-8_L4.9-…-EP.kicad_mod` | Sch | U25 stays **C524806** | S | Damage (40 V part behind 53 V clamp) | +| 5 | C-01 | TPS2552 current-limited antenna feed: ANT_OFF → EN̅ (100 k PD), FAULT̅ → ANT_SHORT_N (10 k to 3V3_GNSS), U18.7 NC | Sch + Lay | **C46506**, C25803, C25804 | B | Damage; field faults H0005/H0014 | +| 6 | B-03 | D28 → bidirectional 24 V ESD on an 0402 land, or DNP | Sch + Lay | **C1975527** | B | R3 (link); homologation | +| 7 | A-02 | U6 re-cluster: L6 ≤ 5 mm, C30/C31 ≤ 3 mm, C32–C34 ≤ 2 mm; `/SW_BAT` pour ≥ 2 mm; `/BAT_PLUS` ≥ 1.5 mm; EP ≥ 9 vias; In1/In2 solid ≥ 5 mm | Lay | 3 × 3 vias 0.3/0.6 mm at 0.9 × 1.2 mm | L | R5, R4, ECO §E #1 #2; F5 | +| 8 | A-03 | R50 825 Ω → 1.43 kΩ | Sch | **C22840** | S | R5, R3′; F4 | +| 9 | H-01 | U15 footprint → `Package_SO:SOIC-16_3.9x9.9mm_P1.27mm` (sch + PCB), re-place C84–C88; fix the stale field in V5.x too | Sch + Lay | U15 stays **C15846** | B | Manufacturability | +| 10 | H-02 | U10 → SC16IS752; R53 → HKR 499 k | Sch | **C57156**, **C177479** | S | Order gate; R1 (R53 = boost set-point) | +| 11 | G-01 *(conditional)* | Restore MH4 at (193.2, 90.3); place MH11 + partner near U19; ≥ 4 mm copper-free radius | Leo (backplate) + Lay | coordinates | L | Enclosure fit; thermal gate T1 | + +### Part 2 — Majors (change before ordering unless Leo writes a reason) + +| # | ID | Change | Owner | LCSC / numbers | Effort | Closes | +|---|---|---|---|---|---|---| +| 1 | V1-01 | F2 electrically first: P1 → F2 → D10 ∥ Q23 (D10 moves to the F2 output) | Sch + Lay | F2 C206912 (A-01) | B | Damage on reversed P1 | +| 2 | D-01 | U27 74LVC1G125 on `/3V3_GNSS` between `/DOUT_4G` and U18.26 (+100 nF); Rdfu1 22 k → 100 k | Sch + Lay | **C12518**, C14663, C25803 | B | R1; 0.5.5/0.5.6 back-feed lesson | +| 3 | A-04 | R121 53.6 k → 57.6 k (5.18/5.32/5.46 V) | Sch | **C23082** | S | R3′, R5; F7 | +| 4 | B-02 | C130/C131 → polymer; R116 113 k, C141 6.8 nF, C142 56 pF; + 2 × 22 µF at L20.2; C131 ≤ 5 mm from U19 | Sch + Lay | **C881921** ×2, **C22862**, **C1542**, **C1572**, **C86817** ×2 | B | R1, R3; F1 | +| 5 | E-01 | `/ETH_PWR_EN`: U12.2 EN → PD2, 100 k to GND | Sch + Lay | C25803 | B | R1, R3; F8 | +| 6 | A-05 | CSYS + 2 × 47 µF 1210 at U6 VSYS pins 1/24 | Sch + Lay | **C5440143** ×2 | B | R1, R3; F1, F2 | +| 7 | F-51 | TMP102 between U6 and L6 (0x48); pack-NTC tap `/NTC` → PC5 (100 k / 120 k + 10 nF) | Sch + Lay | **C99269**, C14663, C25803, **C25808** (120 k), C1589 | B | R4; F5, F6 | +| 8 | F-12 | Ground vias: EP arrays (U25/U20 6, U12 6), U19 ≥ 30–40, U18 ≥ 24, U.FL 2 per pad, islands ≥ 2, edge fence ≤ 5 mm, board ≥ 400; pad-level solid on EPs/module GND | Lay | 0.3/0.6 mm vias; 0 empty 20 mm cells | L | R3, R4, ECO §E #6 | +| 9 | F-03 | Hot loops U25/U20/U12 (Cin ≤ 2 mm, one GND island, loop ≤ 1 cm², FB ≤ 3 mm); U20 + 2 × 22 µF + 220 µF | Lay + Sch | **C86817** ×2, **C881921** | B | ECO §E #4 | +| 10 | A-07 | `/VEH5V`, `/VIN_SW`, `/MAIN5V` ≥ 2 mm F.Cu or pour; Kelvin CLN/VIN sense at RS1; 1 oz inner or 1.65× width | Lay | ≥ 2 mm; ≥ 4 vias per transition | L | R5; prerequisite of A-01 | +| 11 | F-06 | Real stackup + impedance control; RF CPWG 0.30/0.20 on F.Cu over solid In1; LTE rerouted off In1; fence ≤ 3 mm; RF netclass; GNSS bias line ≥ 1 mm | Lay | JLC04161H-7628 | L | R3 (link, desense) | +| 12 | F-05 | Clear In1 under USB, crystals, switch nodes, VBAT/RF, SIM and the 3 broadside parallels; ≤ 3 In1 islands | Lay | no critical net over a void > 1 mm | L | ECO §E (return paths), Copper Plan | +| 13 | C-04 | Q1/Q5/R1/R2 into the GNSS island; `/SW_5V` ≤ 15 mm, 0 mm on In1 | Lay | — | L | R3 (desense) | +| 14 | G-02 | USBLC6-2SC6 at J9, ≤ 3 mm, flow-through | Sch + Lay | **C7519** | B | ECO §E #5; F8 | +| 15 | C-02 | U21 AP2112K → TPS7A2033P (soft-start 239–367 µs/V) | Sch | **C2862740** | S | R1 (52 000 starts/year) | +| 16 | A-08 | U17 AMS1117 → TLV1117LV33 (not C48937499) | Sch | **C15578** | S | R1 (sleep floor); F2 | +| 17 | E-02 | 4.7 k `/ETH_RST` → GND at U11.37 (Minor once E-01 is in) | Sch | **C23162** | S | R1; F8 | +| 18 | A-09 | C78 → polymer | Sch | **C881921** | S | Lifetime | +| 19 | H-02b | C103211 ×9 → C25803; pre-order U18, U19 (qty ≳ 100) and J14 | Sch + Leo | **C25803** | S | Order | + +### Part 3 — Minors (brief; can ride along or go to v6.1) + +| ID | Change | Owner | LCSC / numbers | Effort | +|---|---|---|---|---| +| A-10 | VEH5V over-voltage protection (LTC4040 OVP circuit or 5 V TVS crowbar) | Sch + Lay | no LCSC selected in the findings | B | +| A-11 | R56 re-netted to `/3V3` (charger OFF by default) | Sch + Lay | C25803 | B | +| A-13 | PFO → PB10 + 100 k pull-up (absorbs D-10) | Sch + Lay | C25803 | B | +| A-14 | R53/R54 ≤ 3 mm from U6.18/10, Q7 ≤ 5 mm, IGATE ≤ 8 mm on F.Cu (absorbs F-10) | Lay | — | L | +| B-08 | `/VBAT_MODEM` pour ≥ 3 mm into pins 55–57 | Lay | — | L | +| B-09 | R132–R134 → 22 Ω; 100 nF at J14.C1; SIM ESD next to J14 | Sch + Lay | C23345, C1525 | B | +| B-10 | 100 k `/MODEM_STATUS` → GND; 100 k `/DIN_4G` → 3V3; R106 → 1 k (absorbs D-14) | Sch | C25803 ×2, C14676 | S | +| C-07 | Test pads on U18.50 SAFEBOOT_N and U18.49 RESET_N | Sch + Lay | no part | B | +| D-02 | Y3 → 3225 CL 10 pF + 12 pF caps, ≤ 3 mm (absorbs F-11 Y3) | Sch + Lay | C2901684, C38523 (alt. C9006 + C1644) | B | +| D-03 | Y4 → FC-135 CL 7 pF + 6.8 pF caps, ≤ 3 mm | Sch + Lay | C48615, C1679 | B | +| D-05 | Rigb1 3.3 k → 2.2 k; firmware reads PA5 on the ADC | Sch + FW | C4190 | S/F | +| D-08 | Board-ID strap 10 k → GND (pin unresolved: PD2 taken by E-01) | Leo + Sch | C25804 | B | +| D-09 | 100 k `/BASE_LS` → GND (absorbs A-12) | Sch + Lay | C25803 | B | +| D-12 | TP9 on PA9; optional SWD footprint | Lay | no part | L | +| E-03 | Y1 → 3225 CL 12 pF, keep 18 pF, ≤ 3 mm (absorbs H-07, F-11 Y1) | Sch + Lay | C9006 (alt. C95/C96 → C1663) | B | +| E-04 | C91 → 10 nF, C90 → 4.7 µF, + 100 nF at AVDD pairs | Sch + Lay | C1589, C1779, C14663 | B | +| E-06 | Ethernet pairs coupled on F.Cu, 100 Ω diff | Lay | optional array: no LCSC | L | +| F-14 | J11 ESD in-line, D15 ≤ 3 mm, via ≤ 1 mm | Lay | — | L | +| F-17 | USB pairs F.Cu only, coupled, ≤ 1 via pair | Lay | — | L | +| F-18 | Silk refs ≥ 0.8/0.15 mm; DRU text rule; clear 14 silk items | Lay | — | L | +| F-52 | Modem temperature: `AT+CPMUTEMP` or TMP102 at 0x49 | FW or Sch + Lay | C99269 | F/B | +| G-03 | Sch footprints for P11/P12/J10 + DNP parity (absorbs E-05, H-06) | Sch + Leo | — | S | +| G-04 | JP_CUT solder jumper across P5 | Sch + Lay | no part | B | +| G-05 | Silk labels: delete "4G NTRIP RESET", RESET MCU, BOOT0 (DFU), JP2 CHEM, P1 legend, function names | Lay | — | L | +| G-08 | PESD5V0S1BA at P6.1, P7.1, P8.1 | Sch + Lay | C2827694 ×3 (opt. C22775) | B | +| H-03 | New `IND-SMD_MWSA0804S` footprint for L2/L6/L8/L20 | Lay (+ lib) | parts unchanged | B | +| H-08 | Value fields: C22, Y2 (3.6864 MHz), U10, C103, C130/C131/C78 (absorbs D-16) | Sch | — | S | +| J-02 | Residual: `/3V3_ETH` → Default; relax T15 on benign nets | Lay (rules) | — | L | +| J-03 | Retype `unspecified` pins in `Drogheda-v6.kicad_sym` | Sch (lib) | — | S | +| J-04 | Delete 27 NC flags + 3 wire stubs; re-link 10 missing symbols (absorbs B-11, D-11) | Sch | — | S | + +--- +## 6. Layout instruction list for Michelle + +Self-contained: every instruction carries its numbers; the finding ID is only for traceability. Work on the audit copy `hbox-watchdog-v6-audit.kicad_pcb` after the schematic changes of §7 have been synced (Update PCB **without** "replace footprints", see L-45). Units mm. Vias 0.3 mm drill / 0.6 mm pad unless stated. Coordinates are v6 board coordinates. Order: set rules and stackup first (L-1 … L-4), then the Blocker copper (L-5 … L-17), then Majors, then Minors, then the acceptance checks (L-48). + +**A. Board setup (before touching copper)** +1. **Stackup (F-06):** Board Setup → Physical Stackup = JLC04161H-7628: Cu 0.035 / prepreg 0.2104 (εr 4.4) / Cu 0.035 / core 1.065 (εr 4.6) / Cu 0.035 / prepreg 0.2104 (εr 4.4) / Cu 0.035; copper finish ENIG. Order note: impedance control; **1 oz inner copper** (or widen every inner power run 1.65×, L-19). +2. **Netclasses (F-01):** create/assign by exact net name (one pattern per line, leading `/`). HV24 (clearance 0.3, track 1.0, via 0.8/0.4): `/24V_IN` `/VIN_FUSED` `/VIN_PROT` `/24V` `/IGN_IN` `/Q10_GATE` `/Q23_GATE` `/SW_PWRIN` `/BOOT_PWRIN` `/SW_MODEM` `/BST_MODEM` (plus `/VIN_MODEM`, `/SW_FAN`, `/BST_FAN` only if A-01 is **not** adopted). PWR_HI (0.15 / 1.5 / 0.8/0.4): `/BAT_PLUS` `/SW_BAT` `/MAIN5V` `/VEH5V` `/SYS5V` `/VIN_SW`. PWR_MID (0.15 / 0.6 / 0.8/0.4): `/SW_5V` `/SW_IN` `/5V_FAN` `/FAN_RET`. PWR_MODEM (0.15 / 1.5 / 0.8/0.4): `/VBAT_MODEM`. RF (clearance = CPWG gap 0.20, width 0.30, no vias, excluded from autoroute): `/RF_GNSS` `/RF_ANT_GNSS` `/RF_LTE` `/RF_ANT_LTE`. Default (0.15 / 0.2 / 0.6/0.3): everything else, including `/3V3_ETH`. Delete all un-prefixed duplicate patterns and the dead `/3V3_MODEM`, `/SW3_NODE` patterns. +3. **Custom rules (F-01):** replace the rules "Minimum clearance 1", "HV24 clearance", "HV24 exception" with, in this order: floor 0.15 mm for non-HV24 non-RF pairs; HV24↔HV24 0.2 mm; HV24↔other 0.3 mm on outer layers; HV24↔other **0.5 mm on inner layers**; pad-to-pad 0.15 mm inside U2/U20/U25 footprints (exact text in §2 4-F, F-01). Set the text rule to min height 0.8 mm / min thickness 0.15 mm (F-18). Relax the T15 width warnings for the low-current nets (`/5V_FAN`, `/FAN_RET`, `/SW_FAN`, `/SW_5V`, `/SW_IN`, `/SYS5V`), keep ≥ 0.8 mm on `/VIN_PROT`/`/VIN_FUSED` (J-02). +4. **Check the rules resolve:** Inspect → Clearance Resolution on one `/24V`–GND-zone pair (expect 0.5 mm on In1) and one GND-zone–Default pair (expect 0.15 mm). After every GUI save of the project, re-check that the netclasses survived. + +**B. Vehicle input and 24 V (Blockers A-01, F-02, V1-01, F-01)** +5. **Fuse first (V1-01, A-01):** place F2 (now 3 A, C206912, same Nano2 holder) electrically first: P1.1 → F2 → then D10 (SMBJ33A) and Q23 in parallel on the F2 output. Nothing but F2 on the P1.1 copper. +6. **Remove the unfused branch (A-01):** Q10, DzG1, Rrp1, C10, C11, C22 and the U2 fan-buck block (U2, L2, Dbk1, Cbst1, Rcomp1, Ccomp1, Rfreq1, Ren1, Ren2, R20, R21) become DNP: delete their `/24V`, `/SW_FAN`, `/BST_FAN` copper. JP1 becomes a bridged solder jumper (`SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm`), so `/5V_FAN` = `/VEH5V`. +7. **Modem buck input (A-01):** delete D20 and the 48 mm `/VIN_MODEM` run from D20 (136.5, 113.8) to U20; remove D21 and join its two nets in copper (`/VIN_MODEM` becomes part of `/MAIN5V`). The `/MAIN5V` path from Q7/U6 to U20.2 is ≥ 1.5 mm wide all the way (A-05/A-07). +8. **Ignition (F-02):** move Rig1 (22 k, 0603) so that the copper from P1.3 to Rig1.1 is ≤ 3 mm, on F.Cu only. Add the new SMBJ33A (DO-214AA) from `/IGN_IN` to GND right at P1.3. The long run from Rig1.2 to the MCU is now `/IGN_SENSE` (Default class); keep Rig2, Rigb1, C9, D5 at the MCU. Remove the old In2 `/IGN_IN` run (106.5 mm) and the In1 via at (127.3, 50.5). +9. **`/24V_IN` off In1 (F-16):** reroute the 27 mm In1 run (167.5, 128.65) → (143.25, 121.75) to F.Cu along the south edge; if In1 must be used, keep ≥ 1.0 mm from every LV net with nothing crossing it. +10. **Outer-layer 24 V spots (F-15):** after refill + DRC (L-48), fix: `/VIN_PROT` 1.5 mm track vs `/VEH5V` 0.8 mm track at (176.24, 116.28) → **≥ 0.5 mm**, and tent the `/VEH5V` via there; `/USB_VBUS` away from Q23 (≥ 0.3 mm from `/Q23_GATE` and `/VIN_PROT`); remove the U20 GND neck (L-22); `/SW_PWRIN` and `/BST_MODEM` ≥ 0.3 mm from GND tracks. Tent every via except test vias. + +**C. LTC4040 charger/backup (Blocker A-02; A-07, A-14, F-51, A-05)** +11. **Re-cluster U6:** L6 pad 1 ≤ 5 mm (edge) from U6 pins 21/22; C30/C31 ≤ 3 mm from U6 pin 6; C32/C33/C34 and the two new 47 µF 1210 CSYS caps ≤ 2 mm from VSYS pins 1/24, GND pads on the EP copper; C35 (or the new 22 µF 0805) at L6.2 next to BAT pin 23. L6 may not sit on (193.2, 90.3) if MH4 is restored (L-40). +12. **`/SW_BAT`:** F.Cu polygon ≥ 2 mm wide from the combined pin 21+22 fan-out to L6.1, compact (switch node), no 0.25/0.30 mm necks beyond the pin fan-out. +13. **`/BAT_PLUS`:** P3 → L6.2 ≥ 1.5 mm F.Cu or pour; if any part runs inner, ≥ 4 vias per layer change and ≥ 1.5 × 1.65 = 2.5 mm on 0.5 oz inner copper. Take the BAT-pin sense (U6.23) as a Kelvin tap from L6.2/C35. +14. **`/MAIN5V`:** pour from U6 pins 1/24 over C32–C34 to the Q7 drain, ≥ 2 mm, no 0.3/0.5 mm necks. +15. **U6 EP:** 9 vias, 3 × 3 at 0.9 × 1.2 mm pitch, 0.3/0.6 mm, plugged/capped (JLC via-in-pad) or tented; pad `zone_connect` solid. +16. **Planes under U6:** In1 and In2 GND solid for ≥ 5 mm around U6 and L6: move the 7 `/VFB_BST` segments, `/IGATE`, `/CHRG_*` off In1 there. +17. **Temperature sensor (F-51):** place the new TMP102 (SOT-563) between U6 and L6, ≤ 5 mm from the U6 EP, 100 nF at its VDD, on I²C1. Route the pack-NTC tap: `/NTC` → 100 k → PC5 (U16 pad 25), with 120 k (C25808) and 10 nF (C1589) from the PC5 node to GND. +18. **BSTFB / IGATE (A-14):** R53/R54 ≤ 3 mm from U6 pins 18/10, top leg Kelvin-tapped at the CSYS pads, `/VFB_BST` on F.Cu; Q7 ≤ 5 mm from U6.15; `/IGATE` ≤ 8 mm on F.Cu, flanked by `/MAIN5V` copper. +19. **5 V path (A-07):** `/VEH5V` L22.2 → RS1.1 on F.Cu ≥ 2 mm (move L22/C153/C154 toward RS1), or ≥ 2 mm inner with ≥ 4 vias per transition; `/VIN_SW` RS1.2 → Q7 on F.Cu ≥ 2 mm, Q7 ≤ 5 mm from RS1/U6. Route U6.7 (CLN) and U6.6 (VIN) sense traces from the inner edges of the RS1 pads (Kelvin), not 1.66 mm down the trace as today. + +**D. Switchers (Major F-03)** +20. **Common rule for U25, U20, U12:** input caps (VIN and GND pads) ≤ 2 mm from the IC VIN and GND/EP pins; Cin GND, catch-diode anode and EP on **one solid F.Cu area**, no GND neck narrower than 1 mm; ≥ 2 vias ≤ 1 mm from each Cin GND pad; catch diode ≤ 3 mm from SW; inductor ≤ 5 mm from SW; SW copper ≤ 25 mm²; FB divider ≤ 3 mm from the FB pin; nothing on In1 under any SW copper. Acceptance: input loop area ≤ 1 cm² (U25 today ≈ 3.1 cm²). +21. **U25:** C149/C150 ≤ 2 mm from pins 2/7 on the EP/D34 copper (today C149/C150/C151 GND is on the U6 island); D34 cathode ≤ 2–3 mm from pin 8, anode on the Cin GND copper; L22 ≤ 5 mm from pin 8 (today 13.75 mm) with `/SW_PWRIN` ≤ 25 mm² (today 45.8 mm²) and not above In1 signal tracks; 4 GND vias around the Cin/D34 node within 2 mm; D34 GND pad solid. +22. **U20:** delete the 0.25 mm GND track between U20.1 and U20.2; C127/C128 GND pads face the EP, bonded by solid F.Cu; add the two new 22 µF 0805 caps ≤ 3 mm from U20.2 and the new 220 µF polymer (6.3 × 7.7) at U20.2; R110/R111 ≤ 2 mm from U20.5 on the side away from pin 8; VBAT sense by a dedicated trace from C131; delete the 5.6 mm In1 FB detour; keep `/VIN_MODEM` (now MAIN5V) ≥ 0.3 mm from the EN/RT/EP pads. +23. **U12:** C101 ≤ 2 mm from U12.7 (VIN; today 6.40 mm) with GND next to pin 5; D11 ≤ 2 mm from pin 1 with its anode on C101's GND copper (today 11.92 mm, different island); L8 ≤ 5 mm (today 15.10 mm); R87/R88 ≤ 3 mm from U12.4, R87 top fed by a Kelvin trace from C102/C94; `/ETH_FB` ≤ 5 mm on F.Cu with nothing under `/ETH_SW`; replace the 0.2 mm GND ties with pour. + +**E. Grounding and stitching (Major F-12)** +24. **EP via arrays:** U25 and U20 (EP 3.2 × 2.5): 2 × 3 = 6 vias at 1.0 mm pitch, or 2 × 4 = 8 at 0.8 mm with 0.3/0.5 vias (3 × 3 at 1.0 mm does not fit the 2.5 mm side); U12 (EP 2.29 × 3.0): 2 × 3; U6: see L-15. +25. **Pad connection:** set `zone_connect` solid **per pad** on: all EPs, all U18 and U19 GND pads, D34/D11 anodes, buck Cin/Cout GND pads. Leave the zone default thermal relief (≥ 2 spokes) for small passives (do **not** set the zones to "thermal reliefs for PTH only": that makes 23 × 0402 and 142 × 0603 GND pads solid and risks tombstoning). +26. **U19 A7670SA:** one tented via in each 1.7 mm gap between adjacent 2.1 mm centre GND pads (0.55 mm clearance per side) plus a via ring on the perimeter GND pads: **≥ 30, target 40**, never inside a pad. +27. **U18 ZED-F9P:** vias at the diagonal interstitial centres of the 2.1 mm GND pad grid (0.41 mm to pad corners): **≥ 24**; no microvias needed. Under U18/U19 use tented or JLC "epoxy filled & capped" vias. +28. **U.FL and ESD grounds:** 2 GND vias ≤ 1 mm from each GND pad of J12 and J13, and at D28. +29. **Stitching:** every F.Cu GND island ≥ 20 mm² gets ≥ 2 vias; no F.Cu GND pour point > 5 mm from a GND via (today median 10.4 mm, max 29.5 mm in the east pour); edge fence at ≤ 5 mm pitch within 1.5 mm of the 0.5 mm edge clearance (≈ 96 vias); **board total ≥ 400 GND vias** (today 69). Acceptance: 0 empty 20 × 20 mm cells (today 10 of 35). + +**F. RF, GNSS supply and planes (Majors F-06, C-04, F-05; Blocker B-03)** +30. **RF lines (F-06):** both RF runs on F.Cu only, CPWG over solid In1, start at **w 0.30 / gap 0.20 mm**, finalise with JLC's impedance calculator for 50 Ω on JLC04161H-7628. +31. **LTE (F-06, B-03):** reroute U19.60 → R118/C146/C147 → D28 → J13 entirely on F.Cu (rotate J13 or move it toward U19's RF pad side); remove the 22 mm In1 section and its two vias at (174.25, 58.25) and (194.27, 53.72). Nothing on any layer above or below the line; `/VBAT_MODEM` ≥ 3 mm away. Replace D28's SOD-923 land with an **0402** land in the same in-line spot (new part PESD0402-240, or leave DNP). +32. **Fences (F-06):** GND vias on both sides of RF_LTE/RF_ANT_LTE and RF_GNSS/RF_ANT_GNSS at **≤ 3 mm pitch**, ≤ 1 mm from the gap edge. +33. **GNSS bias (F-06, C-01):** place the new TPS2552 (SOT-23-6) near L21/J12; its output net `/ANT_BIAS` (was `/VCC_RF_GNSS`) runs ≥ 1 mm from the RF line with a stitched GND strip between (or on In2 after 100 pF + 100 nF decoupling); L21 taps the RF line stub-free at J12; move D27 onto the J12 pad (no stub). +34. **GNSS supply switch (C-04):** move Q1, Q5, R1, R2 (F1 optional) into the GNSS island next to U21/C3/C40/C119; bring `/SYS5V` (or `/SW_IN`) to them; `/PWR_CTRL` becomes the long signal; `/SW_5V` ≤ 15 mm and 0 mm on In1 (today 181 mm on In1). +35. **In1 plane (F-05):** at minimum clear In1 under: the USB pairs (J9 and J11), every crystal and its lines, all switch nodes, `/VBAT_MODEM` and the RF area, the SIM lines, and the three broadside parallels (I2C_SDA over `/SER_TXB` 14.2 mm, ETH_XO over `/ETH_RST` 6.95 mm, NRST over `/USART6_RX` 7.2 mm). Move In1 tracks to In2/B.Cu (or F.Cu where short), priority `/SW_5V`, `/MAIN5V`, `/KCOIL`, `/USART6_TX/RX`, `/DOUT_4G`, `/CHRG_*`, `/SER_TXB/RXB`, `/ETH_*`, `/VFB_BST`, `/IGATE`. Acceptance: ≤ 3 In1 islands, no critical net over a void longer than 1 mm. + +**G. Modem power (Major B-02, Minor B-08)** +36. **VBAT_MODEM:** F.Cu pour ≥ 3 mm from L20.2 → C130 → C131 → C132–C136 → U19 pins 55/56/57 (fan out to all three pads; no 0.5 mm neck); C131 (now polymer) ≤ 5 mm from the pads; the two new 22 µF 0805 caps ≤ 3 mm from L20.2. + +**H. New parts and footprint swaps** +37. **Footprint swaps:** U15 → `SOIC-16_3.9x9.9mm_P1.27mm` (narrow; re-place C84–C88 hard against it) (H-01); D28 → 0402 (L-31); Y1 and Y3 → 3225-4P crystal footprint (E-03, D-02); L2/L6/L8/L20 → new `IND-SMD_MWSA0804S` land (pads 2.75 × 4.0 mm, 5.5 mm inner gap, courtyard 9.4 × 9.8 mm, confirm against the Sunlord drawing) and re-check neighbours for the 0.4 mm body growth (H-03). U17 and U21 keep their footprints (drop-ins). +38. **New parts to place:** U27 74LVC1G125 (SOT-753) + 100 nF at U18.26, powered from `/3V3_GNSS` (D-01); USBLC6-2SC6 at J9 (L-41); 4.7 k at U11.37 (E-02); 100 k at U12.2 (E-01, new net `/ETH_PWR_EN` to U16 pad 54); 100 k at Q5 base (D-09); 100 k pull-up on `/PFO` routed U6.20 → PB10 (A-13); 100 k `/MODEM_STATUS` → GND and 100 k `/DIN_4G` → 3V3 (B-10); 100 nF 0402 at J14.C1 and D23–D25 moved next to J14 (B-09); PESD5V0S1BA at P6.1, P7.1, P8.1, each ≤ 3 mm from its connector (G-08); R56 re-netted to `/3V3` (A-11); JP_CUT open solder jumper across P5 `/MAIN5V`–`/SYS5V`, silk "CUTOFF BYPASS" (G-04); TP9 1.5 mm pad on PA9 next to TP3–TP5 (D-12); 1 mm test pads on U18.50 and U18.49 next to a GND pad (C-07). +39. **Crystals (E-03, D-02, D-03):** Y1 ≤ 3 mm from U11.30/31, Y3 ≤ 3 mm from U16 PH0/PH1, Y4 ≤ 3 mm from PC14/PC15; load caps adjacent to the crystal, 2 GND vias, no inner-layer track under any crystal or its lines (Y3 today has In1 `/USART6_RX` under both HSE lines and `/BAT_PLUS` on all 4 layers beside it). + +**I. Mechanics, connectors, silkscreen** +40. **Mounting holes (G-01, after Leo's answer):** if the V5.5 backplate is reused, restore MH4 (Ø3.2 NPTH) at **(193.2, 90.3)** and add the modem heatsink-clamp pair near U19 (V5.5 MH11 was at (168.3, 84.6), now 0.6 mm from the U19 courtyard, so its position must be re-chosen). Keep a ≥ 4.0 mm copper-free radius on F.Cu/B.Cu around every mounting hole (move the `/3V3` track at MH6 out by ≥ 0.5 mm) or specify nylon washers. +41. **J9 ESD (G-02):** USBLC6-2SC6 ≤ 3 mm of copper from the J9 pads, D± routed through its pads (pins 1/6 `/USB_DM`, 3/4 `/USB_DP`, 5 `/USB_VBUS`, 2 GND), GND via ≤ 1 mm. +42. **J11 ESD (F-14):** route DFU D+/D− through the D14/D15 pads (no T-stubs); D15 ≤ 3 mm of copper from J11 (today 10.9 mm); each ESD GND pad with its own via ≤ 1 mm. +43. **USB pairs (F-17):** J9 and J11 pairs on F.Cu only over solid In1, coupled (≈ 0.2/0.15 mm for 90 Ω on JLC7628, confirm in the calculator), ≤ 1 via pair, no slot crossings. +44. **Ethernet (E-04, E-06):** C90/C91 ≤ 2 mm from U11.20/22; 100 nF at the AVDD 4/8 and 11/21 pairs; each TX/RX pair coupled on F.Cu only (100 Ω diff), ≤ 1 via pair; J10.8 per the HR911105A drawing. +45. **Library hygiene (J-05):** do **not** run "Update footprints from library" (it would swap P11/P12 and reset pads); when syncing from the schematic, do not tick "replace footprints". +46. **Silkscreen (F-18, G-05):** all reference texts ≥ 0.8 mm height / 0.15 mm stroke (1.0/0.15 where space allows); delete "4G NTRIP RESET" at (187.0, 124.1); SW1 "RESET MCU", SW2 "BOOT0 (DFU)"; JP2 "CHEM 1-2 Li-ion / 2-3 LFP"; P1 pin legend "VIN 9-36V · GND · IGN · GND · NC"; a function name at every connector (FAN, RESET, NTC1, NTC2, LED, BATT, CUTOFF, 5V BENCH); P2 "bench only, no reverse protection" (A-20c); clear the 14 DRC silk items; check the D27/D28/Q10 polarity marks in the 3D view. +47. **Small cleanups:** extend the `/SW_5V` track end at (86.35, 121.88) 0.3 mm to the U21.3 pad centre (F-21); VDD decoupling caps ≤ 2 mm from their pins where convenient (D-15); Cu4 ≤ 2 mm from U18.36 (C-09). + +**J. Acceptance before generating fab files** +48. Refill all zones → DRC with the new rules: **0 clearance errors** (the 6 inner and 15 outer spots of F-01/F-02 must be gone), `track_width` warnings only on nets deliberately left at T15, 0 unconnected; then check: GND vias ≥ 400 and 0 empty 20 mm cells; every GND pad of U19/U18/U20/U25/J12/J13 in an F.Cu cluster with ≥ 1 plane via ≤ 2 mm; each buck input loop ≤ 1 cm²; ≤ 3 In1 islands; RF lines at the calculator's 50 Ω geometry with fences ≤ 3 mm; U6 EP 9 vias; `/SW_BAT` ≥ 2 mm; no HV24 net on an inner layer within 0.5 mm of LV copper. Generate BOM/CPL only after H-04's field deletion (or from the schematic with kicad-cli). + +--- +## 7. Schematic change list (for the "apply" phase, brief §7) + +To be applied only if Leo says "apply", on a copy `hbox-watchdog-v6-audit.*` following the V5.6 method: copy → backup per step under `kicad/_to_delete/v6-audit-/` → KiCad MCP edits by ref/UUID (UUIDs preserved) → ERC → netlist diff = only the intended pins → PDF → change report. "From" values are the current v6 fields (`evidence/components.csv`). New parts have no refdes yet except U27, JP_CUT and TP9 (named in the findings). + +### 7.1 Blockers + +| Finding | Ref | From | To | LCSC | Note | +|---|---|---|---|---|---| +| A-01 | D20 | SS34 (C8678), `/24V` → `/VIN_MODEM` | **remove** | — | delete the `/24V`→`/VIN_MODEM` path | +| A-01 | D21 | PMEG3050EP (C50603) | **remove; merge `/VIN_MODEM` into `/MAIN5V`** | — | U20.2, C127, C128 now on `/MAIN5V` | +| A-01 | U2, L2, Dbk1, Cbst1, Rcomp1, Ccomp1, Rfreq1, Ren1, Ren2, R20, R21 | fan buck (U2 MP1584EN C15051 …) | **DNP** | — | fan now from `/VEH5V` | +| A-01 | JP1 | `SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm` | `Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm` | no part | `/5V_FAN` = `/VEH5V` | +| A-01 | Q10, DzG1, Rrp1, C10, C11, C22 | IRFR5305 (C2624), BZX84C15, 10 k, 47 µF/50 V, 100 nF, "22uF/50V" | **DNP** | — | `/24V` left without loads | +| A-01 + V1-01 | F2 | 2A/125V Nano2 (C206910) | **0154003.DR 3 A**, same holder; topology P1.1 → F2 → {D10, Q23} | **C206912** | 4 A C206914 only for sustained 9 V operation | +| V1-01 | D10 | SMBJ33A on `/24V_IN` (ahead of F2) | SMBJ33A on the F2 output (`/VIN_FUSED`) | C224019 (unchanged) | reversed P1 now blows F2 | +| A-03 | R50 | 825R/1% (C50214) | **1.43 kΩ 1 % 0603** | **C22840** | 1.316–1.483 A | +| B-03 | D28 | ESD9L5.0ST5G (C82326), SOD-923 | **PESD0402-240, 0402** (or DNP) | **C1975527** | bidirectional 24 V | +| C-01 | new U (antenna switch) | — | **TPS2552DBVR**: 1 IN = `/3V3_GNSS`, 2 GND, 3 EN̅ = U18.5 ANT_OFF, 4 FAULT̅ = `/GNSS_ANT_SHORT_N`, 5 ILIM = IN, 6 OUT = new `/ANT_BIAS` | **C46506** | 75 mA limit | +| C-01 | new R | — | 100 k, EN̅ → GND | C25803 | antenna ON by default | +| C-01 | new R | — | 10 k, `/GNSS_ANT_SHORT_N` → `/3V3_GNSS` | C25804 | FAULT̅ pull-up | +| C-01 | L21, C144, C145 / U18.7 | on `/VCC_RF_GNSS` with U18.7 | on `/ANT_BIAS`; **U18.7 VCC_RF → NC** | unchanged | | +| F-02 | new D (IGN TVS) | — | **SMBJ33A**, `/IGN_IN` → GND at P1.3 | **C224019** | optional BAT54S C19726 at the MCU | +| F-02 | Rig1 | 22 k 0603 (C88614) | unchanged value; placed at P1.3 (layout) | C88614 | net split: `/IGN_IN` = {P1.3, Rig1.1, TVS} | +| H-01 | U15 | footprint `Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm` | **`Package_SO:SOIC-16_3.9x9.9mm_P1.27mm`** | C15846 (unchanged) | also fix the stale field in the V5.x schematics | +| H-02 | U10 | SC16IS762IPW (C729142) | **SC16IS752IPW,128** | **C57156** | I²C mode, drop-in | +| H-02 | R53 | 499k/1% (C131054) | **499 k 1 % 0603 HKR RCT03499KFLF** | **C177479** | drop-in | +| H-04 | U25 | fields `LCSC` = C524806 **and** `LCSC Part` = C2071691 | **delete `LCSC Part`** (board, schematic and `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod`) | C524806 | or strip `LCSC Part` from all 10 library footprints | +| G-01 | MH4 (+ heatsink pair) | absent | board-only mounting holes (layout) | — | only if the V5.5 backplate is reused | +| F-01 | project | netclass patterns and `.kicad_dru` | per §2 4-F (F-01) | — | project settings, not schematic symbols | + +### 7.2 Majors + +| Finding | Ref | From | To | LCSC | Note | +|---|---|---|---|---|---| +| A-04 | R121 | 53.6k/1% (C23074) | **57.6 kΩ 1 % 0603** | **C23082** | 5.18/5.32/5.46 V | +| A-05 | new C ×2 | — | **47 µF 16 V X7R 1210** on `/MAIN5V` at U6 pins 1/24 | **C5440143** | same part as C32/C33 | +| A-08 | U17 | AMS1117-3.3 (C6186) | **TLV1117LV33DCYR** (same SOT-223 pinout) | **C15578** | not C48937499 | +| A-09 | C78 | 220uF/10V MVG (C2827940) | **220 µF 16 V polymer** | **C881921** | same 6.3 × 7.7 land | +| B-02 | C130, C131 | 220uF/10V MVG (C2827940) | **220 µF 16 V polymer** | **C881921** ×2 | change together with R116/C141/C142 | +| B-02 | R116 | 14k (C22803) | **113 kΩ 1 % 0603** | **C22862** | | +| B-02 | C141 | 3.3 nF 0402 (C1536) | **6.8 nF X7R 0402** | **C1542** | | +| B-02 | C142 | 47 pF 0402 (C1567) | **56 pF C0G 0402** | **C1572** | | +| B-02 | new C ×2 | — | **22 µF 0805** on `/VBAT_MODEM` at L20.2 | **C86817** | | +| F-03 | new C ×2 | — | **22 µF 16 V 0805** at U20.2 (`/MAIN5V`) | **C86817** | 16 V valid only with A-01 | +| F-03 | new C | — | **220 µF 16 V polymer** at U20.2 | **C881921** | | +| F-51 | new U (TMP102) | — | **TMP102AIDRLR**, I²C1, ADD0 → GND (0x48), 100 nF at VDD | **C99269**, C14663 | placed between U6 and L6 | +| F-51 | new R/R/C | — | `/NTC` → 100 k → new net → PC5 (U16 pad 25); 120 k and 10 nF from that net to GND | C25803; **C25808** (120 k); C1589 | remove PC5 NC flag | +| C-02 | U21 | AP2112K-3.3 (C51118) | **TPS7A2033PDBVR** (same SOT-23-5 pinout) | **C2862740** | soft-start 239–367 µs/V | +| E-01 | U12.2 EN | tied to `/SYS5V` | new net **`/ETH_PWR_EN`** → U16 pad 54 (PD2); new 100 k to GND | C25803 | remove PD2 NC flag | +| E-02 | new R | — | **4.7 kΩ 0603**, `/ETH_RST` → GND at U11.37 | **C23162** | tell V5.6: R112 100 k → 4.7 k | +| D-01 | U27 (new) | — | **74LVC1G125GV,125**: 1 OE̅ = GND, 2 A = `/DOUT_4G`, 3 GND, 4 Y = new `/DOUT_4G_F9P` → U18.26, 5 VCC = `/3V3_GNSS`; 100 nF at VCC | **C12518**, C14663 | U18.26 leaves `/DOUT_4G` | +| D-01 | Rdfu1 | 22k (C88614) | **100 kΩ** | **C25803** | | +| G-02 | new U (J9 ESD) | — | **USBLC6-2SC6**: 1/6 `/USB_DM`, 3/4 `/USB_DP`, 5 `/USB_VBUS`, 2 GND | **C7519** | | +| H-02b | R56, R57, R58, R85, R87, Rgs1 (+ R20, Ren1, Rfreq1 if U2 stays) | 100k 5 % (C103211) | **100 kΩ 1 %** | **C25803** | stock 702 limits the order to 78 boards | +| V1-01, F-12, F-05, F-06, C-04, A-07 | — | layout-only | — | — | see §6 | + +### 7.3 Minors + +| Finding | Ref | From | To | LCSC | +|---|---|---|---|---| +| A-11 | R56 | 100 k to GND | 100 k to `/3V3` (default charge OFF) | C25803 | +| A-13 | new R + net | `/PFO_TP` = {U6.20, TP2} | `/PFO` → U16 pad 29 (PB10) + 100 k to `/3V3`; remove PB10 NC flag | C25803 | +| B-09 | R132, R133, R134 | 0R (C304185) | **22 Ω 0603** | C23345 | +| B-09 | new C | — | 100 nF 0402 at J14.C1 (`/SIM_VDD`) | C1525 | +| B-10 | new R ×2 | — | 100 k `/MODEM_STATUS` → GND; 100 k `/DIN_4G` → `/3V3` | C25803 ×2 | +| B-10 | R106 | 100R (C22775) | **1 kΩ** | C14676 | +| C-07 | new TP ×2 | — | test pads on U18.50 SAFEBOOT_N, U18.49 RESET_N | no part | +| D-02 | Y3 | 25 MHz HC-49SD (C14872) | **25 MHz 3225-4P CL 10 pF**, footprint `Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm` | C2901684 (alt. C9006) | +| D-02 | C113, C114 | 15 pF (C1644) | **12 pF C0G** (keep 15 pF C1644 if C9006) | C38523 | +| D-03 | Y4 | 32.768 kHz FC-135 CL 12.5 pF (C32346) | **FC-135 CL 7 pF** | C48615 | +| D-03 | C115, C116 | 12 pF (C38523) | **6.8 pF C0G** | C1679 | +| D-05 | Rigb1 | 3.3k (C22978) | **2.2 kΩ** | C4190 | +| D-08 | new R | — | 10 k strap → GND on the board-ID pin (**pin unresolved**, see §10) | C25804 | +| D-09 | new R | — | 100 k `/BASE_LS` → GND | C25803 | +| D-12 | TP9 (new) | PA9 NC flag | test pad on PA9 (remove NC flag) | no part | +| E-03 | Y1 | 25 MHz HC-49SD (C14872) | **25 MHz 3225 CL 12 pF**; keep C95/C96 18 pF (C1647) | C9006 (alt.: keep Y1, C95/C96 → 33 pF C1663) | +| E-04 | C91 | 4.7 µF (C1779) | **10 nF 0603 X7R** | C1589 | +| E-04 | C90 | 10 µF (C440198) | **4.7 µF 0805** | C1779 | +| E-04 | new C ×2 | — | 100 nF at W5500 AVDD 4/8 and 11/21 | C14663 ×2 | +| F-52 (option) | new U | — | TMP102 at 0x49 (ADD0 → 3V3) between U19 and U20 | C99269 | +| G-03 | P11, P12 | fp `…MC_1,5_3-G-3.5_1x03_P3.50mm_Vertical` | `Connector_Phoenix_MC:PhoenixContact_MC_1,5_3-G-3.5_1x03_P3.50mm_Horizontal`; DNP per Leo | C5160226 | +| G-03 | J10 | fp nickname `Connector_RJ45:…` | `Connector_RJ:RJ45_Hanrun_HR911105A_Horizontal`; DNP per Leo | C12074 | +| G-04 | JP_CUT (new) | — | `Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm` across P5 (`/MAIN5V`–`/SYS5V`) | no part | +| G-08 | new D ×3 | — | PESD5V0S1BA at P6.1, P7.1, P8.1 → GND (opt. 100 Ω series on NRST, C22775) | C2827694 ×3 | +| H-03 | L2, L6, L8, L20 | fp `Inductor_SMD:L_Bourns-SRU8028_8.0x8.0mm` | new `Drogheda-v6:IND-SMD_MWSA0804S` | parts unchanged | +| H-08 | C22, Y2 | value text "22uF/50V", "1.8432MHz" | "10uF/50V" (unless 22 µF was intended), "3.6864MHz"; C103/C130/C131/C78 texts are harmless or replaced by B-02/A-09 | — | +| J-03 | library | `unspecified` pin types in `Drogheda-v6.kicad_sym` | power_in / power_out / input / output / passive | — | +| J-04 | 23 orphan NC flags, NC flags on U16.37/38 and U10.13/14, wire stubs uuid 2b755f7f…, 46f71e27…, 7c1dbfc0… | present | delete; copy the 10 missing symbols into `Drogheda-sym` and re-link | — | +| B-15 (Note) | R107, R108 | DNP 0 Ω bypass | delete or mark "never fit" | — | + +**Expected netlist diff** (acceptance for the apply phase): only the nets and pins named in §7.1–7.3 change; no UUID changes on untouched symbols; ERC shows no new errors, and the J-04 items disappear. + +--- +## 8. Firmware requirements (`board_v6.h`, FW 0.7.x) + +Sources: firmware sections of the four findings files and `pinmap-v6.md` §5 (draft header). Items tagged *(if fix)* apply only when the named hardware change is adopted. + +**8.1 Build and identity** +1. New `board_v6.h` from `pinmap-v6.md` §5. A binary must never cross between V5.6 and v6: a V5.6 build drives PC3 (RTK_STAT, an F9P push-pull output on v6) and PC1/PC2 (F9P inputs). File names carry the board (`drogheda-firmware-por-tarjeta`). *(if D-08)* read the board-ID strap with INPUT_PULLUP at boot; mismatch → outputs off, print `BOARD MISMATCH`. +2. `$PHID,<96-bit UID>,,,,` on the **modem uplink** at every connect and every 5 min, not only on Ethernet (C-08). Backend `retranslator` must map UID → H-number before v6 ships. +3. `$PHLG` stays append-only; new fields at the end: `tchg`, `tcell` (F-51), `tmodem` (F-52 / AT), `tntc2`, `rtcm_bps`, `modem_status`, `vign` (D-05), `iin` only if CLPROG ever gets a pin. + +**8.2 Boot defaults** +4. First lines of `setup()`, before any delay or USB init, drive LOW: PC10 `MODEM_PWR_EN`, PC8 `PWRKEY`, PC11 `MODEM_RST`, PA1 `GNSS_PWR`, PB5 `BYP_CTRL`, **PA15 `ETH_RST`** (JTDI pull-up at reset), PA6 fan, PB0 panel LED; *(if E-01)* PD2 `ETH_PWR_EN`. PA8 `CHRG_EN` belongs to the governor (HIGH = charge off until it decides). +5. Keep hi-Z/analog: PA9, and PB10/PC5/PD2 unless their fixes are adopted; PC1/PC2 (F9P inputs; PC2 becomes a real antenna-short input *(if C-01)*, no MCU pull); PC12 open-drain only, never push-HIGH. +6. F9P back-feed rule (0.5.5/0.5.6 lesson): while PA1 is LOW keep PA2 INPUT no-pull, PA10 no pull (its internal pull-up is 7–14 kΩ), PC7 no pull-up, PC12 released, PA7/PC3 no pull-up. **Never hold PC10 HIGH with PA1 LOW** and never run F9P-only power cycles with the modem up, until the D-01 gate (U27) is fitted. + +**8.3 Pins and peripherals** +7. Modem: USART6 PC6 TX (via K1 NO, Mode B) / PC7 RX (always connected, AT replies + RTCM3 byte counter), 115 200 Bd. PC8 PWRKEY (HIGH = pressed via Q20), PC11 RESET (HIGH = asserted via Q21), PC9 STATUS (INPUT_PULLDOWN, poll it), PC10 buck enable. +8. GNSS: USART2 PA2/PA3 = F9P UART1 (`GNSS = Serial2`); USART1 **RX-only** on PA10 (F9P TXD2 tap, no pull; remove the V5 `RELAY(PA10, PA9)` TX); PA7 PPS on TIM3_CH2 capture or EXTI7; PC3 RTK_STAT (poll ≥ 10 Hz, or EXTI3 if blink timing is wanted, then poll PB3); PC12 RESET_N open-drain (prefer UBX-CFG-RST). +9. EXTI9 → PB9 (SC7A20 INT1 at 0x18, LIS3DH-compatible registers, motion wake); poll PC9 and PB3 (D-13). Fan stays GPIO ON/OFF so TIM3 is free for PPS. +10. ADC: IN0 BAT_SENSE, IN4 5V_SENSE, IN5 IGN_SENSE (**read analog**; as-drawn ratio thresholds ON > 0.60 V ≈ 5.2 V, OFF < 0.35 V, no internal pull; ratio 0.0833 *(if D-05)*), IN9 NTC, IN14 NTC2, *(if F-51)* IN15 pack NTC on PC5 (ratio 120/220; Rntc = R55·Vntc/(VEH5V − Vntc) with VEH5V from PA4; valid only with VEH5V present). +11. Delete: TMP102 at 0x48/0x49 as the V5 cell sensor and the PCF8574 P7 modem-reset bodge (`PCF_MODEM_RST_BIT`, `ENABLE_MODEM_RST`); *(if F-51)* re-add a TMP102 at 0x48 as the **charger** sensor (`tchg`); *(if F-52)* 0x49 near the modem. +12. `BOARD_SER_XTAL_HZ 3686400UL` (Y2 is the 3.6864 MHz part despite the "1.8432MHz" text); U10 SC16IS762 → SC16IS752 is register-compatible (H-02). If H-01 were not fixed, report `rs232=absent`. +13. *(if A-13)* PB10 EXTI10 falling = PFO (backup entry at VEH5V < 4.40 V). *(if E-01)* PD2 `ETH_PWR_EN`. + +**8.4 Power constants and ADC** +14. `V5_PFI` 4.60 → **4.40 V** (falling; rising 4.51 V). With R121 = 57.6 k keep `CHG_RAIL_ON 5.05` / `CHG_RAIL_OFF 4.90`; if R121 stayed 53.6 k the governor could not be retuned safely (ON ≤ 4.80 V is not possible with PFI rising max 4.66 V and ADC error), so the hardware change is preferred (A-04). The v6 supply cannot fold (RS1 2.14–2.41 A < U25 4.5 A minimum limit): the governor is a safety net. +15. Compute VDDA every window from VREFINT (`VREFINT_CAL` at 0x1FFF7A2A); never assume 3.30 V, especially on battery (A-08). +16. Charger status decode (LTC4040 DS table p.14, per the power auditor): "pausa NTC" = CHRG low ∧ FAULT low; bad battery = CHRG high ∧ FAULT low. (The pin-map note on PB4 words it differently; the datasheet-cited decode governs.) +17. BSTOFF is hard-wired to GND, so firmware cannot switch the boost off: at `VBAT_BACKUP_MIN` go to STOP with every load off; the hardware floor is the LTC4040 BAT UVLO (2.45 V) plus the pack PCM. + +**8.5 Thermal** +18. `CHG_CELL_HOT/COOL` on `tcell` (Li-ion 45/40 °C; LFP 55–60 °C) *(if F-51)*; shed charge on `tchg` > 85 °C; include the NTC in `thermalCtlTemp()` (`drogheda-fan-policy`). Fan policy `vehiclePower && ignitionOn` unchanged; with A-01 the fan supply exists exactly when `vehiclePower`. +19. Modem temperature via `AT+CPMUTEMP` (confirm on the A7670SA firmware) when no TMP102 is fitted. + +**8.6 Backup entry and duty window (R1/R3)** +20. On backup entry (PFO EXTI or 5V_SENSE < `V5_OFF`): `ETH_PWR_EN` = 0 (or hold ETH_RST low), `BYP_CTRL` = 0 except inside the TX window, modem to **LTE-only** (`AT+CNMP=38`) to avoid 2 A GSM bursts (2.8 A peaks exceed the 2.5 A backup limit). +21. Window power-up: `PWR_CTRL` HIGH → F9P settled (≥ 1–4 s) → BAT_SENSE ≥ 3.4 V (refuse a modem cold start below ≈ 3.4 V) → W5500 off → `MODEM_PWR_EN` HIGH → wait ≥ 100 ms (2 ms soft-start + bank charge) → PWRKEY asserted 100–500 ms (≥ 50 ms) → wait STATUS HIGH (typ 7–11.2 s, timeout 20 s) or AT `RDY` → `BYP_CTRL` HIGH (Mode B) → AT sync at 115 200 → `AT+CNMP=38` on battery → attach / NTRIP / report → ≥ 2 `$PHLG` with `pwr=BATT` → power-down. +22. Window power-down: `AT+CPOF` (or PWRKEY ≥ 2.5 s) → STATUS LOW (≤ ≈ 2–3 s) → `MODEM_PWR_EN` LOW → hold ≥ 2 s → `BYP_CTRL` LOW → `PWR_CTRL` LOW → MCU STOP with the LSE RTC (`LSEMOD` high-drive before `LSEON`, LSI fallback, D-03). +23. Any MCU reset power-cycles the modem (R113) and the F9P (PA1 floats): recovery logic must assume a cold modem after every reset and re-run the full sequence. + +**8.7 Modem recovery and watch (R2)** +24. Ladder (vehicle or battery, modem only): AT timeout → RESET asserted ≈ 2.5 s → PWRKEY off/on → HARD_CYCLE (EN LOW ≥ 2 s; VBAT decays to 47 mV) → 3 strikes → log `MODEM_DARK`, retry next window. Never cycle `PWR_CTRL` for a link problem; no stack cycle on battery. +25. Replace the V5 `sag5` heuristic with STATUS + AT responses + RTCM byte count on PC7; VBAT via `AT+CBC`. +26. K1 energised only while the modem is on (150 mW coil). + +**8.8 F9P configuration and NTRIP transport** +27. BBR + flash: UART2 baud = modem baud (115 200), UART2 in-protocol RTCM3 only (UBX/NMEA/SPARTN off); UART2 out NMEA GGA only if the K1-NC path is still wanted; UART1 NMEA/UBX for the MCU; *(if C-01)* `CFG-HW-ANT_CFG_VOLTCTRL` / `SHORTDET` = 1. u-center passthrough follows the CDC line coding → USART2 baud. +28. Caster socket transparent (`AT+CIPMODE=1`); if multi-socket is needed for `$PHLG`, disable RTCM on UART2 and forward re-assembled RTCM from the MCU on USART2 TX → F9P UART1. RTCM age from GGA field 13 plus an RTCM3 frame walker on PC7. + +**8.9 Ethernet** +29. `ETH_PWR_EN` LOW on battery and at boot until needed *(if E-01)*; RSTn LOW ≥ 500 µs before release; SPI2 pins LOW or Hi-Z while 3V3_ETH is off. + +--- + +## 9. Verdict + +### Ready to order? **NO.** + +**What blocks the order (all must be closed):** +1. The 10 Blockers: **A-01** (unfused 24 V branch, D21 30 V), **F-02** (raw ignition on In2 at 0.221 mm from VEH5V), **F-01** (netclasses/DRC blind to 24 V spacing), **H-04** (U25 `LCSC Part` = AP64350), **C-01** (unlimited GNSS antenna bias), **B-03** (unidirectional LTE ESD), **A-02** (LTC4040 copper/EP/placement), **A-03** (R50 825 Ω), **H-01** (U15 on the wrong land), **H-02** (U10/R53 unobtainable). +2. **G-01:** Leo's backplate answer. If the V5.5 standoffs are reused, MH4 at (193.2, 90.3) and the heatsink-clamp pair must be restored (Blocker); if the backplate is re-drilled, publish the 130 × 90 mm pattern (documentation). +3. **DRC gate:** refill + DRC with the F-01 rules shows 0 clearance errors (the 6 inner `/IGN_IN` spots and 15 outer spots gone). +4. BOM/CPL generated after the H-04 field deletion (or from the schematic with kicad-cli); stock re-checked on order day (H-02, H-02b); J14 pre-ordered; U18/U19 pre-ordered for quantities ≳ 100. + +**Conditions for YES:** items 1–4 done, plus the 19 Majors done or waived in writing (severity scale: "should change before ordering unless there's a written reason"). The Majors are BOM values, three new small ICs (TMP102, 74LVC1G125, USBLC6-2SC6), two drop-in regulator swaps (TPS7A2033, TLV1117LV) and layout work that falls in the same layout pass as the Blockers; four of them (A-04, A-05 CSYS, A-07 and the F-03 U20 input caps) are **prerequisites of A-01**, so A-01 cannot be taken alone. Firmware 0.7.x (§8) is required for R1/R3 but does not gate the fab order. + +**What can follow in v6.1:** the 30 Minors (they can also ride along where they touch the same area) and the 21 Notes; items the findings defer explicitly: K1 → direct PC6 → DIN_4G link (B-13), PoE (E-07), U12 → AP64350 (A-20a), P3 → JST-XH-5/VH if the pack harness is remade (G-07), modem TMP102 (F-52 option). + +**Impact on V5.6 (found in passing):** R112 on `ETH_RST` must be 4.7 k (C23162), not 100 k (E-02); the V5.x schematics still carry the stale SOIC-16W footprint field for U15, so fix it before any Update-PCB on V5.6 (H-01). + +**Bench validation before accepting the v6 boards** (from the findings): thermal camera on U6/L6 at 1.4 A charge and 2.3 A backup, 1 h each (A-02); battery-only cold start at VBAT 3.5 V with MAIN5V/VIN(U20) scope and a `/BAT_PLUS` current probe (A-05, ECO §I-1); 0.1 → 2 A load step on VBAT_MODEM, droop ≤ 150 mV (B-02); `/3V3_GNSS` rise 100–1000 µs/V (C-02); antenna short test (C-01); `/3V3_GNSS` < 0.3 V with PA1 LOW and the modem on (D-01); G3 desense: modem TX power vs F9P C/N0 (F-06/F-12); D34/U25 IR at full load (A-06 → F-03); frequency counter on Y1, target ±10 ppm (E-03); H0008 follow-ups: clamp meter on the pack lead and U6/L6 IR during charge (A-02/A-03). + +**Cost note:** v6 BOM ≈ **$131.98 per board at qty 20 / $124.40 at qty 100** (DB snapshot, parts only, excluding PCB, assembly and THT fees); **+$91.30 / +$90.14 vs V5.6** ($40.69 / $33.83), 94 % of it ZED-F9P ($80.11) + A7670SA ($6.07), which replace the external simpleRTK2B and 4G NTRIP Master, so the system cost almost certainly drops (Leo's unit prices needed). JLC setup: 79 Extended parts × $3 = $237 per order ($11.85/board at 20, $2.37 at 100); four cheap consolidations save 4 fees. The fixes move cost both ways: U10 → SC16IS752 saves $3.52, the U2 fan-buck block goes DNP (MP1584 alone $2.21 at 100), while the new and swapped parts (TPS2552, TMP102, 74LVC1G125, USBLC6-2SC6, four 220 µF polymer caps (three swaps, one new), 2 × 47 µF, 4 × 22 µF, TPS7A2033, TLV1117LV) are not priced in the findings: re-run the BOM costing after the apply phase. + +--- + +## 10. Inputs needed from Leo + +| # | Question | Affects | Assumption used in this audit | +|---|---|---|---| +| 1 | Backplate / enclosure hole pattern: are the V5.5 standoffs (incl. (193.2, 90.3)) reused? Is the modem heatsink clamp (MH11 + partner, thermal gate T1) still planned? | G-01 (Blocker or documentation), L-40 | Unknown → G-01 kept as conditional Blocker | +| 2 | Decision on the modem supply topology: U20 from MAIN5V only (D20/D21 removed), fan from VEH5V (U2 DNP), F2 3 A ahead of D10 | A-01, V1-01, A-04/A-05/A-07/F-03 prerequisites | Adopted as the verified single topology | +| 3 | Fleet supply systems: 24 V only, or 12 V machines too? Alternator load-dump suppression present? Unsuppressed ISO 7637/16750 transients on the ignition wire (terminal tractors, RTGs)? | F2 3 A vs 4 A, A-16 (U25 UVLO), A-19, D-05, F-02 | 9–36 V (T9), 24 V systems present, transients possible | +| 4 | Is GSM/2G fallback required **on battery**, or is LTE-only acceptable? | A-05, B-16, firmware §8 | LTE-only on battery | +| 5 | Fab stackup and copper: JLC04161H-7628 with impedance control, ENIG, and 1 oz inner copper? | F-06, A-07, J-02, L-1 | JLC04161H-7628, 0.5 oz inner by default | +| 6 | Order quantity (20 vs 100) | H-02b (C103211, U18, U19 limits), setup cost per board | Both computed | +| 7 | BOM tool for the JLC order: Fabrication Toolkit (board fields) or kicad-cli (schematic fields)? | H-04 (Blocker in either case until the field is deleted) | Fabrication Toolkit (per the 25-Sep pre-fab audit) | +| 8 | J10 (Ethernet) and P11/P12 (RS-485/RS-232): JLC-assembled, hand-fitted THT, or not fitted on v6? Ethernet on the prototypes? | G-03, E-01, H-01 relevance, U11/U12/Y1 population | Populated | +| 9 | Allocation of PD2: `ETH_PWR_EN` (E-01, verify_1) or board-ID strap (D-08)? If E-01 keeps PD2, is PA9 given to the board ID (losing D-12's debug TX pad)? | E-01, D-08, D-12 | PD2 = ETH_PWR_EN; board-ID pin open | +| 10 | Is "temperature sensor ≤ 10 mm of U6" binding for R4? (would promote F-51 to Blocker) | F-51 | No (Major) | +| 11 | R50: 1.43 kΩ (≥ 1.3 A at every corner) or 1.5 kΩ (V5.6 commonality, 1.254 A minimum)? | A-03 | 1.43 kΩ | +| 12 | LTE antenna ESD: fit PESD0402-240 (C1975527) or leave D28 DNP? | B-03 | Either; needs the 0402 land | +| 13 | Pack details: capacity (Ah), PCM cut-off, NTC β (B3380 vs B3950), chemistry decision D1 (LFP-HT + JP2 2-3 + RNTB 5.6 k, or Li-ion) | A-02, A-03, F-51 thresholds, G-07 | ≈ 11.6–12 Ah Li-ion, RNTB 10 k | +| 14 | Fan part and current | A-01 (U25 load), J-02 | 5 V, 2-wire, 0.2–0.3 A | +| 15 | Must Ethernet work on battery? | E-01 | No (gated off on battery) | +| 16 | Enclosure internal temperature at 45 °C ambient | A-09, B-02 (electrolytic life), H-07/D-02 (−20…+70 °C crystals), U6/D34 thermals | 60–65 °C local near the regulators | +| 17 | H0008 bench data: clamp-meter charge current and U6/L6 temperature | A-02/A-03 causality | Not yet measured | +| 18 | GNSS antenna model: bias voltage range and current | C-01 (75 mA limit) | 3.0–3.3 V, ≤ 30 mA | +| 19 | Will technicians use J9 (modem USB) in the field? | G-02 | Yes, occasionally | +| 20 | Are field harness cables labelled by P-number (V5 names)? | G-05 (P6 FAN / P6 RESET-EXT collision) | Unknown | +| 21 | Low-power plan: STOP + RTC (LSE), or duty cycle with the MCU running? | D-03 severity | STOP + LSE | +| 22 | SWD header wanted on the fab board, or DFU plus pads only? | D-12 | Pads only | +| 23 | Unit prices of the ArduSimple simpleRTK2B and 4G NTRIP Master (500-unit order) | H-10 system-level cost delta | — | +| 24 | Record as a decision: U20 sits upstream of the P5 cutoff (ECO §A intent met functionally via R113) | A-01, G-04 | — | + +--- +## 11. Appendices + +### Appendix A — ERC summary (`evidence/erc_summary.md`) + +KiCad 10.0.4 ERC via kicad-cli: **166 violations = 0 errors + 166 warnings** (same total on the original file and a byte-identical copy). The MCP prints 30 items per run, so the full list was built by running one check group at a time on the copy: 22 + 10 + 30 items are KiCad's exact output; the 104 pin-to-pin markers are a model whose totals equal KiCad's (104 and 70 in two pin-map settings) and which reproduces 29 of 30 visible positions. + +| Category | Count | Source | Classification (`ercdrc_classified.csv`) | Owner finding | +|---|---|---|---|---| +| pin_to_pin | 104 | model (count = KiCad) | pre-existing-benign | J-03 | +| no_connect_dangling (orphan NC flags at x = 453.898 / 484.378 mm) | 23 | KiCad exact | needs-fix-cosmetic | J-04 | +| lib_symbol_mismatch | 22 | KiCad exact | pre-existing-benign | J-04 (leave) | +| lib_symbol_issues (Q_*MOS_G?S ×7, D_Zener_ANK ×2, PCF8574) | 10 | KiCad exact | needs-fix-cosmetic | J-04 | +| footprint_link_issues (P11, P12 Vertical footprint not in library; J10 `Connector_RJ45` nickname) | 3 | KiCad exact | **real** | G-03 | +| no_connect_connected (markers on R31.2 `/I2C_SDA` and K1.10 `/USART6_TX`; flags on U16.37/38, U10.13/14) | 2 | KiCad exact | needs-fix-cosmetic | J-04 | +| unconnected_wire_endpoint (P1.4, R52.2) | 2 | KiCad exact | needs-fix-cosmetic | J-04 | +| **Total** | **166** | | real 3 · benign 126 · cosmetic 37 | | + +Pin-to-pin markers by net: GND 55, `/3V3` 5, `/1V8_MODEM` 4, `/VBAT_MODEM` 4, `/VIN_MODEM` 2, `/DIN_4G_M` 2, `/DOUT_4G_M` 2, `/RF_ANT_LTE` 2, `/RF_ANT_GNSS` 2, and 1 each on 26 modem/U20/U23/U24/U26 nets. Message mix: Unspecified–Passive 50, Unspecified–Unspecified 46, Unspecified–Bidirectional 5, Unspecified–Power output 2, Unspecified–Input 1. Root cause: easyeda-imported symbols in `Drogheda-v6.kicad_sym` with all pins typed `unspecified`. + +### Appendix B — DRC summary (`evidence/drc_summary.md`) + +KiCad DRC (swig backend, KiCad 10, stored fills) on `hbox-watchdog-v6.kicad_pcb` (sha256 6ddec80d…): **283 violations — 0 errors, 283 warnings; 0 unconnected items.** Ignored in the project: missing courtyard, track not centred on via, tuning profile, footprint filters mismatch, footprint type mismatch. The Sep-25 stale report had 303 warnings (199 track_width). + +| Type | Count | Classification | Owner finding | +|---|---|---|---| +| track_width (custom T15 warning rules) | 183 | 59 real per CSV → **verified 63 hits on 6 real nets**; 124 benign | A-02, A-07, B-08 (copper); J-02 (rules) | +| lib_footprint_mismatch | 82 | pre-existing-benign (KiCad 10 library revisions) | J-05 | +| silk_overlap | 11 | needs-fix-cosmetic | F-18 | +| lib_footprint_issues (MountingHole nickname) | 4 | needs-fix-cosmetic | J-05 | +| silk_over_copper (Rigb1 on C9.2, C10 on C10.2) | 2 | needs-fix-cosmetic | F-18 | +| silk_edge_clearance (P1 outline) | 1 | needs-fix-cosmetic | F-18 | +| **Total** | **283** | real 59 (63 verified) · benign 206 · cosmetic 18 | | + +`track_width` per net (count; widths; verdict per J-02 as verified): `/3V3_ETH` 54 (0.25–0.5 mm) benign · `/MAIN5V` 21 (0.3/0.5) **real** · `/VEH5V` 15 (0.25–0.8, incl. In1) **real** · `/5V_FAN` 14 (0.5) benign · `/VIN_SW` 10 (0.25–0.8, incl. In2) **real** · `/SW_5V` 9 benign · `/VIN_MODEM` 9 (0.3/0.5) neck only (0.1 mm under capacity) · `/SW_FAN` 8 benign · `/VBAT_MODEM` 7 (0.25/0.5) **real** · `/FAN_RET` 7 benign · `/SW_IN` 7 benign · `/SYS5V` 6 benign · `/SW_BAT` 6 (0.25/0.3/0.5) **real** · `/VIN_PROT` 5 benign (keep 0.8 mm rule) · `/BAT_PLUS` 4 (0.25/0.5) **real** · `/VIN_FUSED` 1 benign. + +**Rule-set caveat (F-01):** these 0 errors come from a 0.15 mm catch-all rule that overrides every netclass. With the corrected rules: 6 inner-layer errors (`/IGN_IN`), 15 outer-layer errors at 0.3 mm, ≈ 178 zone proximities that re-pour on refill. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-28 | Auditoría completa (inglés) con resumen ejecutivo en español. | +| 1.1 | 2026-09-29 | Resumen en español al frente, índice del cuerpo, hashes / índice de evidencia / mapa de IDs al anexo de trazabilidad. Sin cambios técnicos. | + +??? note "Anexo técnico — trazabilidad" + **Hashes del snapshot** (idénticos al inicio y al final de la recolección de evidencia, 20:22–20:58 UTC): + + | File | sha256 | mtime (UTC) | + |---|---|---| + | `hbox-watchdog-v6.kicad_sch` | `ecee9fed851f02e74074340bf8361bced7c385b2502b19c368861b9851c2f04a` | 2026-09-25 20:27:58 | + | `hbox-watchdog-v6.kicad_pcb` | `6ddec80d1c15f79e69dff6c1a850b28345a5d826389f79cee8c61998240b36bf` | 2026-09-28 17:36:06 | + | `hbox-watchdog-v6.kicad_pro` | `25c57f3936b96a4e31cb5947668c172d318189258d6a5d2fa34d230df8958028` | 2026-09-28 20:16:16 | + | `hbox-watchdog-v6.kicad_dru` | `47538e6cfadc0c53421ff59dadabc0e7f0ad5f11d9e2250618728788080aca1a` | 2026-09-25 18:57:05 | + + **Proceso de auditoría (del §1 original):** + + - **Evidence pack** (read-only, built 2026-09-28 20:22–21:00 UTC): on the Mac at `03-Architecture-Hardware/kicad/_to_delete/v6-audit-20260928/evidence/` (KiCad exports) with the parsed tree under `evidence/pack/`; container copy `/home/claude/v6audit/`. It holds kicad-cli netlists (v6, V5.6, V5.5 as-fabbed), ERC (166 items) and DRC (283 items) outputs, BOM, CPL, IPC-D-356, per-layer PDF/SVG plots, pad/track/via/zone tables parsed from the board file, 64-pin MCU table, per-IC pin tables, 24 V clearance sweep, schematic↔PCB sync report and the firmware pin/constant tables. Self-checks: parsed pads match KiCad's IPC-356 on 1191/1191 pads (worst Δ 1.77 µm, 0 net mismatches); counts match KiCad on every table. Index in Appendix C. + - **Attachments kept with this report** (tracked in the repo, unlike the gitignored evidence folder): `03-Architecture-Hardware/2026-09-28_v6-audit-attachments/`. It holds `erc_summary.md`, `drc_summary.md`, `ercdrc_classified.csv` (all 166 ERC + 283 DRC items with their classification), `bom_check.csv` (152 BOM lines: stock, package, rating), the two verification files `verify_1.md` / `verify_2.md`, and the four block findings files these IDs come from. + - **Audit:** four block auditors, each writing one findings file: power + temperature/fan (A-xx, F-51…F-53), modem/GNSS/Ethernet (B-, C-, E-xx), MCU pin map + connectors (D-, G-xx, plus `pinmap-v6.md`), layout/EMC + BOM + ERC/DRC (F-, H-, J-xx, plus `bom_check.csv` and `ercdrc_classified.csv`). + - **Tools:** KiCad 10.0.4 through the KiCad MCP server on Leo's Mac (kicad-cli ERC, DRC, netlist, BOM, CPL, IPC-356, courtyard check, zone query); Python `sexpdata` S-expression parsers (`scripts/kisexp.py`; no numeric regex on KiCad files); `shapely` for pad-edge distances, copper islands, plane voids and clearances; a 2-D finite-difference field solver and closed-form (Hammerstad–Jensen, Wadell CPWG) impedance checks; an averaged current-mode model of U20 for burst droop (verify_1 `vbat_sim.py`); JLC parts DB snapshot (`get_jlcpcb_part`, `search_jlcpcb_parts`) for stock, package and price; the Fabrication-Toolkit source (GitHub) for BOM field priority; manufacturer datasheets cited per finding (LTC4040 Rev B, TPS54360B, AP64350 DS41976 Rev 5-2, MP1584, AMS1117, PMEG3050EP, SIMCom A7672X/A7670X HD V1.03 and A7670 HD V1.00, u-blox ZED-F9P-04B DS UBX-21044850 R05 and IM UBX-18010802, AP2112, TPS7A20, TPS2552, W5500 v1.0.2, ST DS10314 Rev 7 / RM0383, Maxim MAX3232 19-0273 Rev 10, Sunlord MWSA, Nexperia 74LVC1G125, IPC-2221B, ISO 7637-2 / ISO 16750-2 levels via TI TIDUC41). + + **Appendix C — Evidence file index** + + Mac: `03-Architecture-Hardware/kicad/_to_delete/v6-audit-20260928/evidence/` (KiCad exports) and `…/evidence/pack/` (tree below). Container: `/home/claude/v6audit/`. + + | Path | Content | + |---|---| + | `INDEX.md`, `evidence/MANIFEST.md`, `evidence/_verification.md` | map and gotchas; hashes and provenance; self-checks (IPC-356 vs parser, counts, 64-pin MCU) | + | `evidence/netlists/*.xml` | kicad-cli netlists: v6, V5.6 (ECO copy), V5.5 as-fabbed, v5 current (stale) | + | `evidence/components.csv`, `nets.json`, `ref_pins.json` | 328 symbols with fields; net → pins; ref → pin → net | + | `evidence/mcu_pins.csv`, `evidence/ic_pins_.csv` | U16 64/64 pins; per-IC pin tables (U19, U18, U11, U6, U25, U20, U2, U12, U17, U21, U23, U24, U10, U13, U14, U15, U26, U3, U22) | + | `evidence/erc_summary.md`, `erc_full.json/.txt`, `erc/kicad_run_*.txt` | ERC (Appendix A) | + | `evidence/drc_summary.md`, `drc_full.rpt/.json`, `drc_items.csv` | DRC (Appendix B) | + | `evidence/bom.csv`, `bom_ungrouped.csv`, `cpl.csv`, `v6-pcb.ipc356` | kicad-cli BOM (correct LCSC fields), position file, IPC-D-356 | + | `evidence/pcb_footprints.csv`, `pcb_pads.csv`, `pcb_tracks.csv`, `vias.csv`, `zones.csv`, `net_routing_summary.csv` | parsed board geometry (1999 segments, 210 vias, 5 zones), per-net routing and resolved netclass | + | `evidence/stackup.md`, `clearance_24v.md/.csv`, `outline_and_holes.md`, `sch_pcb_sync.md` | stackup/rules/netclass resolution; 24 V clearance sweep; outline and holes; schematic↔PCB sync | + | `evidence/diff_v56_v6.md`, `diff_v5_v56.md` | UUID-matched semantic diffs with focus table | + | `evidence/firmware_pins.md/.csv`, `firmware_constants.csv` | every `PIN_*` in V5/V4 firmware vs the v6 net on the same pin; 84 constants | + | `evidence/v6-sch.pdf`, `v6-pcb-layers.pdf`, `svg/*.svg`, `mcp/*.json` | schematic PDF; per-layer plots; verbatim MCP results (courtyards, zones, rules) | + | `findings/A_power.md`, `BCE_modem_gnss_eth.md`, `DG_mcu_connectors.md`, `FHJ_layout_bom_ercdrc.md` | block auditor findings | + | `findings/verify_1.md`, `verify_2.md` | independent verification (power/RF; layout/BOM/MCU) | + | `findings/pinmap-v6.md`, `bom_check.csv`, `ercdrc_classified.csv` | auditor pin map; 152-line BOM check; 449 classified ERC/DRC items | + | `work//`, `work/verifier1/`, `work/verifier2/` | auditor and verifier scripts, renders (`in1_full.png`, `rf_lte.png`, `rf_gnss.png`, `u20.png`, `u25.png`, `fcu_gnd_pieces.png`), `hv24_violations_corrected_rule.csv`, `critical_crossings.csv` | + | `scripts/` | shared parsers (`kisexp.py` sexpdata helpers, `parse_pcb.py`, `parse_netlist.py`, `clearance_24v.py`, …) | + + **Appendix D — ID → working-file map (all 117 IDs)** + + "Final" = severity after verification and merges; "—" = absorbed into the primary named in "State". v1 = `verify_1.md`, v2 = `verify_2.md`. + + | ID | Working file | Auditor severity | Final | State | Report § | Verification | + |---|---|---|---|---|---|---| + | A-01 | `A_power.md` | Blocker | Blocker | primary | §2 4-A | verified-with-correction (v1) | + | A-02 | `A_power.md` | Blocker | Blocker | primary | §2 4-A | verified (v1) | + | A-03 | `A_power.md` | Blocker | Blocker | primary | §2 4-A | verified (v1) | + | A-04 | `A_power.md` | Major | Major | primary | §2 4-A | verified (v1) | + | A-05 | `A_power.md` | Major | Major | primary | §2 4-A | verified-with-correction (v1) | + | A-06 | `A_power.md` | Major | — | absorbed → F-03 (loops), F-12 (EP vias), A-01 (U2 row) | §2 4-F | verified (v1, v2) | + | A-07 | `A_power.md` | Major | Major | primary | §2 4-A | verified (v1) | + | A-08 | `A_power.md` | Major | Major | primary | §2 4-A | verified (v1) | + | A-09 | `A_power.md` | Major | Major | primary (C78); C130/C131 → B-02 | §2 4-A | verified (v1) | + | F-51 | `A_power.md` | Major | Major | primary | §2 4-F | verified (v1) | + | A-10 | `A_power.md` | Minor | Minor | primary | §2 4-A | not independently verified | + | A-11 | `A_power.md` | Minor | Minor | primary | §2 4-A | not independently verified | + | A-12 | `A_power.md` | Minor | — | absorbed → D-09 | §2 4-D | not independently verified | + | A-13 | `A_power.md` | Minor | Minor | primary (absorbs D-10) | §2 4-A | not independently verified; pin per v1 (h) | + | A-14 | `A_power.md` | Minor | Minor | primary (absorbs F-10; In1 part → A-02) | §2 4-A | not independently verified | + | A-15 | `A_power.md` | Minor | — | absorbed → H-04 | §2 4-H | verified via H-04 (v2) | + | F-52 | `A_power.md` | Minor | Minor | primary | §2 4-F | not independently verified | + | A-16 | `A_power.md` | Note | Note | primary | §2 4-A | not independently verified | + | A-17 | `A_power.md` | Note | — | absorbed → B-02 | §2 4-B | verified via B-02, conflict (c) (v1) | + | A-18 | `A_power.md` | Note | Note | primary | §2 4-A | not independently verified | + | A-19 | `A_power.md` | Note | Note | primary | §2 4-A | not independently verified | + | A-20 | `A_power.md` | Note | Note | primary | §2 4-A | not independently verified | + | F-53 | `A_power.md` | Note | — | absorbed → A-01 | §2 4-A | verified via A-01 merge (v1) | + | B-01 | `BCE_modem_gnss_eth.md` | Blocker | — | absorbed → A-01 | §2 4-A | verified (v1) | + | B-02 | `BCE_modem_gnss_eth.md` | Blocker | Major | primary (absorbs A-09 C130/C131, A-17) | §2 4-B | verified, severity Blocker → Major (v1) | + | B-03 | `BCE_modem_gnss_eth.md` | Blocker | Blocker | primary | §2 4-B | verified-with-correction (v1) | + | B-04 | `BCE_modem_gnss_eth.md` | Blocker | — | absorbed → F-12 | §2 4-F | verified, severity Blocker → Major (v1, v2) | + | C-01 | `BCE_modem_gnss_eth.md` | Blocker | Blocker | primary (absorbs D-07) | §2 4-C | verified (v1) | + | B-05 | `BCE_modem_gnss_eth.md` | Major | — | absorbed → F-06 | §2 4-F | verified (v1) | + | B-06 | `BCE_modem_gnss_eth.md` | Major | — | absorbed → F-03 | §2 4-F | verified (v1) | + | B-07 | `BCE_modem_gnss_eth.md` | Major | — | absorbed → G-02 (ESD); routing → F-17 | §2 4-G | verified (v1) | + | C-02 | `BCE_modem_gnss_eth.md` | Major | Major | primary | §2 4-C | verified (v1) | + | C-03 | `BCE_modem_gnss_eth.md` | Major | — | absorbed → F-12 | §2 4-F | verified-with-correction (v1) | + | C-04 | `BCE_modem_gnss_eth.md` | Major | Major | primary | §2 4-C | verified (v1) | + | E-01 | `BCE_modem_gnss_eth.md` | Major | Major | primary (absorbs A-05 fix 1) | §2 4-E | verified (v1) | + | E-02 | `BCE_modem_gnss_eth.md` | Major | Major | primary (absorbs D-04); Minor once E-01 is in | §2 4-E | verified-with-correction (v1) | + | E-03 | `BCE_modem_gnss_eth.md` | Major | Minor | primary (absorbs H-07, F-11 Y1) | §2 4-E | verified, severity Major → Minor (v1) | + | B-08 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary | §2 4-B | not independently verified | + | B-09 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary | §2 4-B | not independently verified | + | B-10 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary (absorbs D-14) | §2 4-B | not independently verified | + | B-11 | `BCE_modem_gnss_eth.md` | Minor | — | absorbed → J-04 | §2 4-J | not independently verified | + | C-05 | `BCE_modem_gnss_eth.md` | Minor | — | absorbed → F-06 | §2 4-F | verified via F-06 (v2) | + | C-06 | `BCE_modem_gnss_eth.md` | Minor | — | absorbed → D-01 | §2 4-D | verified via D-01 (v2) | + | C-07 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary | §2 4-C | not independently verified | + | E-04 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary | §2 4-E | not independently verified | + | E-05 | `BCE_modem_gnss_eth.md` | Minor | — | absorbed → G-03 | §2 4-G | not independently verified | + | E-06 | `BCE_modem_gnss_eth.md` | Minor | Minor | primary | §2 4-E | not independently verified | + | B-12 | `BCE_modem_gnss_eth.md` | Note | — | absorbed → F-01 (netclasses), F-06 (stackup) | §2 4-F | verified via merges (v1, v2) | + | B-13 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-B | not independently verified | + | B-14 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-B | not independently verified | + | B-15 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-B | not independently verified | + | B-16 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-B | not independently verified | + | C-08 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-C | not independently verified | + | C-09 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-C | not independently verified | + | E-07 | `BCE_modem_gnss_eth.md` | Note | Note | primary | §2 4-E | not independently verified | + | D-01 | `DG_mcu_connectors.md` | Major | Major | primary (absorbs C-06) | §2 4-D | verified-with-correction (v2) | + | D-06 | `DG_mcu_connectors.md` | Major | — | absorbed → F-02 (Blocker) | §2 4-F | verified, severity Major → Blocker (v2) | + | G-01 | `DG_mcu_connectors.md` | Major | Blocker (conditional) | primary | §2 4-G | verified-with-correction (v2) | + | G-02 | `DG_mcu_connectors.md` | Major | Major | primary (absorbs B-07 ESD, F-14 J9) | §2 4-G | verified (v1, v2) | + | D-02 | `DG_mcu_connectors.md` | Minor | Minor | primary (absorbs F-11 Y3) | §2 4-D | verified (v2) | + | D-03 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-D | not independently verified | + | D-04 | `DG_mcu_connectors.md` | Minor | — | absorbed → E-02 (alternative rejected) | §2 4-E | verified via E-02 (v1) | + | D-05 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-D | not independently verified | + | D-07 | `DG_mcu_connectors.md` | Minor | — | absorbed → C-01 | §2 4-C | verified via C-01 (v1) | + | D-08 | `DG_mcu_connectors.md` | Minor | Minor | primary (pin unresolved) | §2 4-D | not independently verified | + | D-09 | `DG_mcu_connectors.md` | Minor | Minor | primary (absorbs A-12) | §2 4-D | not independently verified | + | D-10 | `DG_mcu_connectors.md` | Minor | — | absorbed → A-13 (CLPROG part dropped) | §2 4-A | not independently verified; pin per v1 (h) | + | D-11 | `DG_mcu_connectors.md` | Minor | — | absorbed → J-04 | §2 4-J | not independently verified | + | D-12 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-D | not independently verified | + | G-03 | `DG_mcu_connectors.md` | Minor | Minor | primary (absorbs E-05, H-06) | §2 4-G | not independently verified | + | G-04 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-G | not independently verified | + | G-05 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-G | not independently verified | + | G-08 | `DG_mcu_connectors.md` | Minor | Minor | primary | §2 4-G | not independently verified | + | D-13 | `DG_mcu_connectors.md` | Note | Note | primary | §2 4-D | not independently verified | + | D-14 | `DG_mcu_connectors.md` | Note | — | absorbed → B-10 | §2 4-B | not independently verified | + | D-15 | `DG_mcu_connectors.md` | Note | Note | primary | §2 4-D | not independently verified | + | D-16 | `DG_mcu_connectors.md` | Note | — | absorbed → H-08 | §2 4-H | not independently verified | + | G-06 | `DG_mcu_connectors.md` | Note | Note | primary | §2 4-G | not independently verified | + | G-07 | `DG_mcu_connectors.md` | Note | Note | primary | §2 4-G | not independently verified | + | F-01 | `FHJ_layout_bom_ercdrc.md` | Blocker | Blocker | primary (absorbs J-01, F-15, B-12 netclass) | §2 4-F | verified-with-correction (v2) | + | F-02 | `FHJ_layout_bom_ercdrc.md` | Blocker | Blocker | primary (absorbs D-06, F-16) | §2 4-F | verified (v2) | + | F-03 | `FHJ_layout_bom_ercdrc.md` | Major | Major | primary (absorbs A-06 loops, B-06, F-07, F-09) | §2 4-F | verified (v1, v2) | + | F-04 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → F-12 | §2 4-F | verified (v2) | + | F-05 | `FHJ_layout_bom_ercdrc.md` | Major | Major | primary | §2 4-F | verified, fix scope corrected (v2) | + | F-06 | `FHJ_layout_bom_ercdrc.md` | Major | Major | primary (absorbs B-05, C-05, B-12 stackup) | §2 4-F | verified-with-correction (v1, v2) | + | F-07 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → F-03 | §2 4-F | verified (v2) | + | F-08 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → A-01 (moot with U2 DNP) | §2 4-A | verified (v2) | + | F-09 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → F-03 | §2 4-F | verified-with-correction (v2) | + | F-10 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → A-14 | §2 4-A | not independently verified | + | F-11 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → E-03 (Y1), D-02 (Y3) | §2 4-E / 4-D | verified via E-03 (v1) / D-02 (v2) | + | F-12 | `FHJ_layout_bom_ercdrc.md` | Major | Major | primary (absorbs F-13, F-04, B-04, C-03, A-06 vias) | §2 4-F | verified, target corrected to ≥ 400 (v1, v2) | + | F-13 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → F-12 (U6 EP → A-02) | §2 4-F | verified-with-correction (v2) | + | F-14 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary (J9 part → G-02) | §2 4-F | not independently verified | + | F-15 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → F-01 | §2 4-F | verified via F-01 (v2) | + | F-16 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → F-02 | §2 4-F | verified via F-02 (v2) | + | F-17 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary | §2 4-F | not independently verified | + | F-18 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary | §2 4-F | not independently verified | + | F-19 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-F | not independently verified | + | F-20 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-F | not independently verified | + | F-21 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-F | not independently verified | + | H-01 | `FHJ_layout_bom_ercdrc.md` | Blocker | Blocker | primary | §2 4-H | verified-with-correction (v2) | + | H-02 | `FHJ_layout_bom_ercdrc.md` | Blocker | Blocker | primary (U10 + R53 only) | §2 4-H | verified-with-correction (v2) | + | H-03 | `FHJ_layout_bom_ercdrc.md` | Major | Minor | primary | §2 4-H | verified, severity Major → Minor (v2) | + | H-04 | `FHJ_layout_bom_ercdrc.md` | Major | Blocker | primary (absorbs A-15) | §2 4-H | verified, severity Major → Blocker (v2) | + | H-05 | `FHJ_layout_bom_ercdrc.md` | Note | — | absorbed → A-01 | §2 4-A | verified via A-01 (v1) | + | H-06 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → G-03 | §2 4-G | not independently verified | + | H-07 | `FHJ_layout_bom_ercdrc.md` | Minor | — | absorbed → E-03 | §2 4-E | verified via E-03 (v1) | + | H-08 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary (absorbs D-16) | §2 4-H | not independently verified | + | H-09 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-H | not independently verified | + | H-10 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-H | not independently verified | + | J-01 | `FHJ_layout_bom_ercdrc.md` | Major | — | absorbed → F-01 | §2 4-F | verified (v2) | + | J-02 | `FHJ_layout_bom_ercdrc.md` | Major | Minor | primary, residual (copper → A-02/A-07/B-08) | §2 4-J | verified-with-correction (v2) | + | J-03 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary | §2 4-J | not independently verified | + | J-04 | `FHJ_layout_bom_ercdrc.md` | Minor | Minor | primary (absorbs B-11, D-11) | §2 4-J | not independently verified | + | J-05 | `FHJ_layout_bom_ercdrc.md` | Note | Note | primary | §2 4-J | not independently verified | + | V1-01 | `verify_1.md` ("Anything else" #1) | — (new) | Major | primary | §2 4-A | raised by verify_1, not cross-checked | + | H-02b | `verify_2.md` (H-02 split) | (part of H-02, Blocker) | Major | primary | §2 4-H | verified (v2) | diff --git a/docs/hardware/v6-auditoria-prefab.md b/docs/hardware/v6-auditoria-prefab.md index 1046689..8025d69 100644 --- a/docs/hardware/v6-auditoria-prefab.md +++ b/docs/hardware/v6-auditoria-prefab.md @@ -1,5 +1,5 @@ --- -title: HBOX v6 — Auditoría pre-fabricación y lista de trabajo +title: "HBOX v6 — Auditoría pre-fabricación" tags: [project-drogheda, hardware, hbox, v6, pcb, auditoria, jlcpcb] project: Project Drogheda author: Helgen Technologies @@ -11,53 +11,50 @@ audience: Michelle (layout), Leo # HBOX v6 — Auditoría pre-fabricación -**Tarjeta:** `hbox-watchdog-v6` (repo **HBox_PCB**) · **Pedido previsto:** 5 prototipos en JLCPCB -(PCB + ensamble) · **Fecha:** 25-sep-2026 · [English version](v6-prefab-audit.md) +!!! warning "EinarBoard v6 (`hbox-watchdog-v6`): en diseño, no se pide" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. -!!! danger "Veredicto: TODAVÍA NO se ordena" - Lo que dependía de esquemático, BOM y atributos **ya está resuelto** (sección 2). - Faltan **trabajos de layout** (sección 3, Michelle) y **tres decisiones/compras** (sección 4, Leo). - Cuando Michelle suba su trabajo, Claude repite la auditoría completa y da el **GO** final. +Tarjeta: `hbox-watchdog-v6` (repo HBox_PCB) · Pedido previsto: 5 prototipos en JLCPCB +(PCB + ensamble) · Fecha: 25-sep-2026 · [English version](v6-prefab-audit.md) -**Estado hoy:** DRC **0 errores**, 0 sin conectar, 0 pistas colgando · ERC **0 errores** · +!!! warning "Veredicto: todavía no se ordena" + Lo que dependía de esquemático, BOM y atributos ya está resuelto (sección 2). + Faltan trabajos de layout (sección 3, Michelle) y tres decisiones/compras (sección 4, Leo). + Cuando Michelle suba su trabajo se repite la auditoría completa y se da el GO final. + +Estado hoy: DRC **0 errores**, 0 sin conectar, 0 pistas colgando · ERC **0 errores** · BOM: todas las piezas pobladas tienen número LCSC verificado. ---- - -## 1. ¿Por qué "DRC 0" no basta? +## 1. Por qué "DRC 0" no basta El DRC solo compara la geometría contra las reglas de separación del propio archivo. **No ve**: -- un regulador conmutado con su diodo a 18 mm (debe estar a ≤ 4 mm), -- una pista de 0.25 mm llevando 2.5 A, +- un regulador conmutado con su diodo a 18 mm (debe estar a ≤ 4 mm), +- una pista de 0.25 mm llevando 2.5 A, - una pieza sin número LCSC (JLC simplemente **no la coloca**), - un chip de potencia **sin vías** bajo su pad térmico. Eso es lo que revisó esta auditoría. ---- - -## 2. Lo que YA quedó resuelto (no hay que hacer nada) +## 2. Lo que ya quedó resuelto (no hay que hacer nada) | # | Qué | Detalle | |---|---|---| -| ✅ | **SIM: el porta-SIM físico es ahora el principal** | Telcel no dará la MFF2. **J14** (nano-SIM JAE, LCSC C2977286) + R131–R134 **se montan**; U22 (MFF2) + R127–R130 quedan **sin montar (DNP)**. La huella de la MFF2 se queda en la tarjeta como opción futura. | +| ✅ | SIM: el porta-SIM físico es ahora el principal | Telcel no dará la MFF2. **J14** (nano-SIM JAE, LCSC C2977286) + R131–R134 se montan; U22 (MFF2) + R127–R130 quedan **sin montar (DNP)**. La huella de la MFF2 se queda en la tarjeta como opción futura. | | ✅ | **U19 (módem) y L22** marcados SMD | Estaban como "through-hole" y JLC los habría dejado fuera de la línea SMT. Corregido también en la librería. | | ✅ | **64 piezas sin número LCSC** | Todas con número verificado en la base de JLC (Basic cuando se pudo). JP1–JP5 (puentes de soldadura) fuera del BOM. | -| ✅ | **Fusible de entrada F2** | Ahora es **fusible en porta-fusible**: Littelfuse **0154002.DR** (C206910), bloque SMD 9.7 × 5 mm con fusible NANO2 de 2 A / 125 V. En campo se **saca y se cambia el fusible sin soldar**. *(Falta cambiar la huella en el PCB → tarea M2.)* | -| ✅ | **Barrenos de montaje** | Los 4 en un rectángulo exacto de **130.0 × 90.0 mm**, a 5 mm de cada orilla; nombres únicos MH5–MH8. | +| ✅ | **Fusible de entrada F2** | Ahora es fusible en porta-fusible: Littelfuse **0154002.DR** (C206910), bloque SMD 9.7 × 5 mm con fusible NANO2 de 2 A / 125 V. En campo se saca y se cambia el fusible sin soldar. *(Falta cambiar la huella en el PCB → tarea M2.)* | +| ✅ | Barrenos de montaje | Los 4 en un rectángulo exacto de **130.0 × 90.0 mm**, a 5 mm de cada orilla; nombres únicos MH5–MH8. | | ✅ | Limpieza | 6 tramos de pista colgando borrados; copias "respaldo" fuera de git; reglas de ancho de potencia en el DRC. | ---- - ## 3. Lo que falta — lista de trabajo de **Michelle** !!! warning "Antes de empezar — tres reglas" - 1. **Primero `git pull`.** Claude cambió el `.kicad_pcb` hoy (atributos, LCSC, barrenos, fusible). + 1. **Primero `git pull`.** El `.kicad_pcb` cambió hoy (atributos, LCSC, barrenos, fusible). Si trabajas sobre una copia vieja y la guardas, se pierde todo eso. 2. **NO usar "Actualizar PCB desde esquemático"** hasta que Leo decida J10/P11/P12 (sección 4): los volvería a poner como montados. - 3. Si KiCad avisa que el archivo **cambió en disco**, elegir **Recargar**. Nunca guardar encima una copia vieja. + 3. Si KiCad avisa que el archivo cambió en disco, elegir Recargar. Nunca guardar encima una copia vieja. Orden recomendado (de mayor a menor impacto): @@ -68,50 +65,50 @@ Orden recomendado (de mayor a menor impacto): ### M2 · Cambiar la huella de F2 (fusible) - [ ] En el PCB: clic derecho en **F2** → *Change Footprint…* → `Fuse:Fuseholder_Littelfuse_Nano2_154x`. -- [ ] El bloque mide **9.7 × 5 mm** (antes 4.5 × 3.2). Acomodarlo cerca de donde está (159.5, 127), - entre **P1** (entrada 24 V) y **Q23**. Pistas **/24V_IN** y **/VIN_FUSED** de **≥ 1.5 mm**. -- [ ] Dejar **acceso con pinzas** al fusible (se saca hacia arriba): nada alto a menos de 2 mm de sus lados largos. +- [ ] El bloque mide **9.7 × 5 mm** (antes 4.5 × 3.2). Acomodarlo cerca de donde está (159.5, 127), + entre **P1** (entrada 24 V) y **Q23**. Pistas **/24V_IN** y **/VIN_FUSED** de **≥ 1.5 mm**. +- [ ] Dejar acceso con pinzas al fusible (se saca hacia arriba): nada alto a menos de 2 mm de sus lados largos. -### M3 · Rehacer el grupo del regulador U25 (24 V → 5 V) — **la más importante** +### M3 · Rehacer el grupo del regulador U25 (24 V → 5 V) — **la más importante** -**Problema:** U25 (TPS54360B) está 15 mm al norte de sus piezas de potencia: +Problema: U25 (TPS54360B) está 15 mm al norte de sus piezas de potencia: | Medida | Hoy | Objetivo | |---|---|---| -| Diodo **D34** (cátodo) → pin 8 (SW) de U25 | **18.2 mm** | **≤ 4 mm** | -| Capacitores de entrada **C149/C150** → pin 2 (VIN) | 5–8 mm | **≤ 3 mm** | -| Inductor **L22** (pad 1) → pin 8 | **25.9 mm** | ≤ 12 mm (L22 es grande; se acepta) | -| Cobre del nodo SW (pin 8 → D34 → L22) | pista 0.5 mm | **polígono ≥ 2 mm**, lo más corto posible | +| Diodo **D34** (cátodo) → pin 8 (SW) de U25 | **18.2 mm** | **≤ 4 mm** | +| Capacitores de entrada **C149/C150** → pin 2 (VIN) | 5–8 mm | **≤ 3 mm** | +| Inductor **L22** (pad 1) → pin 8 | **25.9 mm** | ≤ 12 mm (L22 es grande; se acepta) | +| Cobre del nodo SW (pin 8 → D34 → L22) | pista 0.5 mm | **polígono ≥ 2 mm**, lo más corto posible | | Vías GND bajo el pad térmico de U25 | **0** | **≥ 6** (a In1 e In2) | -| R120–R123, C155, C156 (compensación/FB/RT) | cerca | ≤ 5 mm de los pines 3–6, **lejos de SW** | +| R120–R123, C155, C156 (compensación/FB/RT) | cerca | ≤ 5 mm de los pines 3–6, lejos de SW |
![Orden correcto del grupo U25](img/u25-lazo-caliente.svg){ width="100%" }
-**Idea clave:** junto a U25 ya no hay lugar (el cargador U6 y sus piezas ocupan el noreste). +Idea clave: junto a U25 ya no hay lugar (el cargador U6 y sus piezas ocupan el noreste). Entonces **U25 baja a donde están sus piezas grandes**, en vez de subir las piezas grandes. Pasos: -- [ ] **Paso 1 — Sacar C151** (electrolítico 100 µF, hoy en 173.75, 123.9). Es solo reserva de - energía: funciona igual a 10–20 mm. Sugerencia: rotado 90°, centrado en ≈ **(169.5, 112)**, +- [ ] **Paso 1 — Sacar C151** (electrolítico 100 µF, hoy en 173.75, 123.9). Es solo reserva de + energía: funciona igual a 10–20 mm. Sugerencia: rotado 90°, centrado en ≈ **(169.5, 112)**, el hueco que deja U25. Sigue conectado a **/VIN_PROT**. - [ ] **Paso 2 — Poner U25 donde estaba C151**, centro aprox. **(175.5, 124.5)**, girado para que: el **pin 8 (SW)** quede en la esquina **más cercana al cátodo de D34** (el pad sur de D34, en 182.5, 126.65), - y el **pin 2 (VIN)** mire al **oeste**. -- [ ] **Paso 3 — C149 y C150 pegados al pin 2 (VIN)**, a ≤ 3 mm, con su lado GND hacia el pad + y el **pin 2 (VIN)** mire al oeste. +- [ ] **Paso 3 — C149 y C150 pegados al pin 2 (VIN)**, a ≤ 3 mm, con su lado GND hacia el pad térmico de U25. Este es el lazo que radia: **entrada → U25 → D34 → GND → entrada**. Chiquito. -- [ ] **Paso 4 — D34 se queda** donde está (182.5, 123.25). Su **ánodo (GND)** va a la misma isla de +- [ ] **Paso 4 — D34 se queda** donde está (182.5, 123.25). Su ánodo (GND) va a la misma isla de GND que C149/C150 y el pad de U25. - [ ] **Paso 5 — L22 se queda.** Unir pin 8 → cátodo de D34 → pad 1 de L22 (193.5, 126.9) con **un - polígono de ≥ 2 mm**. No más ancho de lo necesario (es la parte que "grita"). + polígono de ≥ 2 mm**. No más ancho de lo necesario (es la parte que "grita"). - [ ] **Paso 6 — Piezas chicas junto con U25:** C152 (BOOT) entre pin 1 y pin 8; R120, R121, R122, R123, - C155, C156 del lado de los pines 3–6 (**lado silencioso**). El divisor FB (R121/R122) toma el 5 V - **en los capacitores de salida** C153/C154, no en el pad del inductor. + C155, C156 del lado de los pines 3–6 (lado silencioso). El divisor FB (R121/R122) toma el 5 V + en los capacitores de salida C153/C154, no en el pad del inductor. - [ ] **Paso 7 — Tierra:** una sola isla de GND en F.Cu bajo todo el grupo, **≥ 6 vías bajo el pad térmico de U25** y 2–3 vías junto al GND de cada capacitor y del ánodo de D34. -- [ ] **Paso 8 — /VIN_PROT** desde Q23 hasta C149/C150: **≥ 1.5 mm** (o polígono). +- [ ] **Paso 8 — /VIN_PROT** desde Q23 hasta C149/C150: **≥ 1.5 mm** (o polígono). !!! tip "Referencia" Es el mismo acomodo que el diseño de referencia de TI para el TPS54360 y que la @@ -121,12 +118,12 @@ Pasos: | Medida | Hoy | Objetivo | |---|---|---| -| L20 (pad SW) → pin 8 (SW) de U20 | 7.6 mm, pista de **23 mm** a 0.25 mm | **≤ 3 mm**, pista corta **≥ 1 mm** | -| C127 (10 µF) → pin 2 (VIN) de U20 | 5.4 mm | **≤ 3 mm** | +| L20 (pad SW) → pin 8 (SW) de U20 | 7.6 mm, pista de **23 mm** a 0.25 mm | **≤ 3 mm**, pista corta **≥ 1 mm** | +| C127 (10 µF) → pin 2 (VIN) de U20 | 5.4 mm | **≤ 3 mm** | | Vías GND bajo el pad de U20 | 0 | **≥ 4** | - [ ] Acercar **L20** al pin 8 de U20 y rutear **/SW_MODEM** directo y ancho. -- [ ] Acercar **C127** al pin 2. (C128 ya está bien, a 2 mm.) +- [ ] Acercar **C127** al pin 2. (C128 ya está bien, a 2 mm.) - [ ] Vías bajo el pad térmico de U20. ### M5 · Vías bajo los otros chips de potencia @@ -140,56 +137,50 @@ Usa esta tabla (la lista de avisos del DRC está incompleta: no marca SW_BAT ni | Prioridad | Red | Hoy | Objetivo | Por qué | |---|---|---|---|---| -| 1 | **/SW_BAT** | 0.25 mm, 12 mm | **≥ 1.0 mm** o polígono | ~2.5 A de batería. Ya se marcó crítica en la v5.5 (0.3 mm); en v6 está más delgada. | -| 2 | **/VEH5V** | cuello 0.25 + 0.5 mm, ~110 mm | **≥ 1.0 mm** | Salida de U25, hasta ~3 A | -| 3 | **/MAIN5V**, **/SYS5V** | 0.25–0.5 mm, 100–150 mm c/u | **≥ 1.0 mm** en el tronco | 5 V principal de toda la tarjeta | -| 4 | **/BAT_PLUS** | 0.25–0.5 mm, 118 mm | **≥ 1.0 mm** | Corriente de batería | -| 5 | **/SW_MODEM** | 0.25 mm, 23 mm | ≥ 1.0 mm **y corta** | Se resuelve con M4 | -| 6 | **/VBAT_MODEM** | cuello 0.25 (1 mm), 0.5 (11 mm) | **≥ 1.0 mm** | Picos de 2 A al transmitir | -| 7 | /VIN_MODEM, /SW_IN, /VIN_SW | 0.25–0.5 mm | ≥ 0.8 mm | Entradas de reguladores | -| — | /VIN_PROT, /SW_PWRIN | 0.5 mm | — | Se resuelven con M3 | -| No | /3V3_ETH, /5V_FAN, /SW_FAN, /FAN_RET | 0.25–0.5 mm | dejar | Menos de 0.3 A | +| 1 | **/SW_BAT** | 0.25 mm, 12 mm | **≥ 1.0 mm** o polígono | ~2.5 A de batería. Ya se marcó crítica en la v5.5 (0.3 mm); en v6 está más delgada. | +| 2 | **/VEH5V** | cuello 0.25 + 0.5 mm, ~110 mm | **≥ 1.0 mm** | Salida de U25, hasta ~3 A | +| 3 | **/MAIN5V**, **/SYS5V** | 0.25–0.5 mm, 100–150 mm c/u | **≥ 1.0 mm** en el tronco | 5 V principal de toda la tarjeta | +| 4 | **/BAT_PLUS** | 0.25–0.5 mm, 118 mm | **≥ 1.0 mm** | Corriente de batería | +| 5 | **/SW_MODEM** | 0.25 mm, 23 mm | ≥ 1.0 mm y corta | Se resuelve con M4 | +| 6 | **/VBAT_MODEM** | cuello 0.25 (1 mm), 0.5 (11 mm) | **≥ 1.0 mm** | Picos de 2 A al transmitir | +| 7 | /VIN_MODEM, /SW_IN, /VIN_SW | 0.25–0.5 mm | ≥ 0.8 mm | Entradas de reguladores | +| — | /VIN_PROT, /SW_PWRIN | 0.5 mm | — | Se resuelven con M3 | +| No | /3V3_ETH, /5V_FAN, /SW_FAN, /FAN_RET | 0.25–0.5 mm | dejar | Menos de 0.3 A | - [ ] Prioridades 1 a 7. ### M7 · Cerrar -- [ ] **Rellenar zonas** (tecla **B**) — los barrenos se movieron y el relleno es viejo. +- [ ] Rellenar zonas (tecla B) — los barrenos se movieron y el relleno es viejo. - [ ] **DRC → 0 errores.** (Los avisos amarillos de ancho de pista que queden en redes "No" de la tabla están bien.) - [ ] Revisar en el visor 3D que **J14** (porta-SIM) tenga el frente libre: la tarjeta entra por un - extremo corto; confirmar cuál en el dibujo de JAE y dejar ~6 mm libres enfrente. -- [ ] `git add` + `commit` + `push` (sección 6) y **avisar a Leo**. - ---- + extremo corto; confirmar cuál en el dibujo de JAE y dejar ~6 mm libres enfrente. +- [ ] `git add` + `commit` + `push` (sección 6) y avisar a Leo. ## 4. Lo que falta — **Leo** - [ ] **Pre-ordenar J14** (C2977286) en la cuenta de JLC: es parte "Pre-ordered", sin eso no la colocan. - [ ] **Decidir J10 (RJ45), P11 y P12:** ¿se montan en esta corrida? Hoy están DNP solo en el PCB. -- [ ] **Revisar las piezas donde la elección importa:** L20 Sunlord MWSA0804S-4R7MT (C17700167; checar que sus pads +- [ ] Revisar las piezas donde la elección importa: L20 Sunlord MWSA0804S-4R7MT (C17700167; checar que sus pads entren en la huella SRU8028), L21 Murata LQG18HN68NJ00D (C162555, choke de la antena GNSS), - C149/C150 2.2 µF 100 V (C153036), C151 Nichicon 100 µF 50 V (C116241), RS1 10 mΩ 1 W (C105362), + C149/C150 2.2 µF 100 V (C153036), C151 Nichicon 100 µF 50 V (C116241), RS1 10 mΩ 1 W (C105362), F2 0154002.DR (C206910). ---- - ## 5. Parámetros del pedido en JLCPCB (cuando haya GO) | Opción | Valor | |---|---| -| Capas / espesor | 4 capas, 1.6 mm, stackup **JLC04161H-7628** | +| Capas / espesor | 4 capas, 1.6 mm, stackup **JLC04161H-7628** | | Acabado | **ENIG** (obligatorio por los módulos LGA U19 y U18) | -| Ensamble | **Standard PCBA**, solo lado superior | +| Ensamble | Standard PCBA, solo lado superior | | Rayos X | Pedir en **U19** (A7670SA) y **U18** (ZED-F9P) | | Pre-orden | **J14 C2977286** antes del pedido | | Piezas through-hole | H4, J9, J11, K1, P1–P10, SW1, SW2 (16): soldar a mano en 5 piezas es razonable | -| Archivos | BOM/CPL generados **del PCB** (Fabrication Toolkit). Revisar rotaciones en la vista previa de JLC: U19, U18, J14, SOT-23 | - ---- +| Archivos | BOM/CPL generados del PCB (Fabrication Toolkit). Revisar rotaciones en la vista previa de JLC: U19, U18, J14, SOT-23 | ## 6. Comandos de git -**Michelle** (clon de HBox_PCB): +Michelle (clon de HBox_PCB): ```bash git pull @@ -199,20 +190,25 @@ git commit -m "v6 layout: U25/U20 regrouped, thermal vias, power widths, F2 hold git push ``` -**Leo** (proyecto Drogheda, después de que Michelle suba): +Leo (proyecto Drogheda, después de que Michelle suba): ```bash cd ~/Documents/Claude/Projects/Drogheda/03-Architecture-Hardware/kicad && git pull helgen main cd ~/Documents/Claude/Projects/Drogheda && git add 03-Architecture-Hardware/kicad && git commit -m "bump kicad" && git push ``` ---- - ## 7. Historial de cambios de esta auditoría (HBox_PCB) | Commit | Qué | |---|---| | `bb78cb8` · `0288bd0` | T14: J14 principal, U22 DNP, errores ERC corregidos, LCSC de J14 | | `91d2049` · `8a49327` | T15: LCSC en 64 piezas, JP fuera del BOM, SIM + U19/L22 en el PCB, pistas colgando, avisos de ancho; librería | -| `61652cc` | T16: barrenos 130 × 90 mm, MH5–MH8 | +| `61652cc` | T16: barrenos 130 × 90 mm, MH5–MH8 | | `d2db77f` · `03d83d1` | T17: fusible F2 → porta-fusible 0154002.DR | + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-25 | Auditoría pre-fabricación v6 y lista de trabajo. | +| 1.1 | 2026-09-29 | Presentación: vocabulario de avisos. Sin cambios técnicos. | diff --git a/docs/hardware/v6-cambios-esquematico.md b/docs/hardware/v6-cambios-esquematico.md new file mode 100644 index 0000000..f4fbfe1 --- /dev/null +++ b/docs/hardware/v6-cambios-esquematico.md @@ -0,0 +1,448 @@ +--- +title: "EinarBoard v6 — Informe de cambios al esquemático" +tags: [project-drogheda, hardware, einarboard, v6, esquematico, auditoria, kicad] +date: 2026-09-28 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard v6 — Informe de cambios al esquemático + +!!! warning "EinarBoard v6 (`hbox-watchdog-v6`): en diseño, no se pide" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. + +Fecha: 2026-09-28 · Proyecto: `kicad/hbox-watchdog-v6.*`, editado en su lugar (D17) · Implementa: [Auditoría completa v6](v6-auditoria-completa.md) §7.1 (Bloqueantes), §7.2 (Mayores), §7.3 Menores según D19, y las reglas de proyecto F-01 / D18 · Decisiones: `DECISIONS.md` D1–D19 (tomadas por delegación de Leo) · Autor: Helgen Technologies (elaborado con asistencia de Claude; ediciones por script sobre el texto S-expression con guarda de UUID; KiCad MCP solo para netlist, ERC, PDF, BOM, DRC y consultas de librería) · Estado: esquemático, reglas de proyecto y librería listos; **`hbox-watchdog-v6.kicad_pcb` no se tocó** (Michelle ejecuta *Update PCB from Schematic*, §10). + +Traducido del original en inglés (28-sep-2026). + +## Resumen + +Se aplicaron al esquemático de v6 todos los Bloqueantes y Mayores de la auditoría que son de esquemático, y los Menores de la lista D19. El módem (U20) ahora se alimenta sólo de MAIN5V (D20/D21 eliminados), el ventilador sale de VEH5V (bloque U2 y rama Q10 en DNP) y F2 (3 A) queda antes de D10. Se añadieron limitador de antena GNSS (TPS2552), TVS en ignición, sensores TMP102 del cargador (0x48) y del módem (0x49), buffer U27 hacia el F9P, ESD en J9 y en P6/P7/P8, y se corrigieron valores (R50 1.43 k, R121 57.6 k, compensación de U20, cristales). Cada grupo se comprobó con un diff de netlist: lo esperado coincide exactamente con lo obtenido (137 cambios de componentes/campos/pines + 16 cambios de clase de red). ERC: **0 errores** (166 → 134 avisos, todos explicados). El PCB no se tocó; Michelle debe ejecutar *Update PCB* marcando «Delete footprints with no symbols». + +## 0. Tabla resumen + +| Ítem | Resultado | +|---|---| +| Archivos editados en su lugar | `hbox-watchdog-v6.kicad_sch`, `hbox-watchdog-v6.kicad_pro` (solo clases de red), `hbox-watchdog-v6.kicad_dru`, `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod` | +| `hbox-watchdog-v6.kicad_pcb` | Byte-idéntico (SHA-256 `6ddec80d…` antes y después) | +| Cambios aplicados | Grupo 1 Bloqueantes: 10 hallazgos · Grupo 2 Mayores: 13 · Grupo 3 Menores: 19 (lista D19) · Grupo 4 reglas/librería: F-01, H-04 | +| Partes | **37 añadidas** (U27–U31, R135–R144, C161–C174, D35–D38, TP9–TP11, JP6), **3 eliminadas** (D20, D21, PWR_FLAG PF15), **17 puestas en DNP**, 1 símbolo sustituido (Y3 → `Device:Crystal_GND24`) | +| Prueba por netlist | En cada grupo: esperado == obtenido (0 inesperados, 0 faltantes). Línea base → final: 37 añadidos / 3 eliminados / 125 campos / 22 pin-net / 16 clases de red; la composición de las expectativas por grupo = netlist final con **0 diferencias** (`netlist_diff_total.md`) | +| ERC (kicad-cli 10.0.4) | **0 errores** antes y después · avisos 166 → 134 (§5) | +| Solapes / cruces de cables | 30 → 30 solapes (todos preexistentes, por caja envolvente) · 8 → 9 cruces de cable (+1 es un artefacto de caja envolvente de la herramienta en U30, comprobado en el PDF) | +| BOM | Toda parte poblada tiene número LCSC salvo los pads de cobre preexistentes TP1–TP8 (sin cambio). Los pads nuevos TP9–TP11 y JP6 quedan fuera del BOM | +| PDF | `03-Architecture-Hardware/hbox-watchdog-v6-schematic.pdf` | + +## 1. Integridad de archivos + +Los hashes SHA-256 de cada archivo antes y después están en el anexo de trazabilidad. Comprobación previa: los hashes de sch y pro coincidían con la línea base de la auditoría; no había `~hbox-watchdog-v6.*.lck` (solo existen los bloqueos de v5). No se ejecutó `git` en la carpeta montada. + +## 2. Cambios por hallazgo + +Método: cada edición es un empalme sobre el texto original, acotado a un nodo S-expression (valor de propiedad, átomo de bandera, nombre de etiqueta, punto de cable, o el nodo completo en las eliminaciones). Antes de escribir, una guarda compara el multiconjunto de UUID: ningún UUID preexistente puede desaparecer o cambiar salvo en los elementos eliminados a propósito, y no pueden aparecer duplicados nuevos. Todos los bytes no tocados quedan idénticos. Los símbolos, cables y etiquetas nuevos se escriben en el formato canónico de KiCad; cada parte nueva se cablea con un cable de 2.54 mm a una etiqueta local con el nombre exacto de la net existente (etiquetas `GND` locales, como en el resto de la hoja). El único símbolo de librería no estándar es el TPS2552 (§7). + +### 2.1 Bloqueantes (§7.1) + +| Hallazgo | Ref | De → A | LCSC | Pines / nets | +|---|---|---|---|---| +| A-01 | D20 | SS34 (C8678) → eliminado | — | sus etiquetas `VIN_MODEM` (K) y `24V` (A) borradas | +| A-01 | D21 | PMEG3050EP (C50603) → eliminado | — | sus etiquetas `VIN_MODEM` (K) y `MAIN5V` (A) borradas | +| A-01 | PF15 | PWR_FLAG en `/VIN_MODEM` → eliminado con su etiqueta | — | la net ya no existe; PF2 ya marca `/MAIN5V` | +| A-01 | U20.2, C127.1, C128.1 | `/VIN_MODEM` → **`/MAIN5V`** (etiquetas renombradas) | — | no queda ninguna etiqueta `VIN_MODEM` (6 de 6 atendidas) | +| A-01 | U2, L2, Dbk1, Cbst1, Rcomp1, Ccomp1, Rfreq1, Ren1, Ren2, R20, R21 | montado → DNP | sin cambio | el ventilador ahora sale de `/VEH5V` vía JP1 | +| A-01 | JP1 | `…SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm` → **`Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm`** | sin parte | `/5V_FAN` = `/VEH5V` en cobre (huella tipo net-tie) | +| A-01 | Q10, DzG1, Rrp1, C10, C11, C22 | montado → DNP | sin cambio | cargas de `/24V` revisadas primero: {C10, C11, C22, D20, DzG1, Q10, Ren1, U2} + PF6 virtual → no queda nada montado | +| A-01 + V1-01 | F2 | `2A/125V-NANO2-in-holder` C206910 → **`3A/125V-NANO2-in-holder`**, MPN 0154003.DR, Littelfuse; misma huella de portafusible | **C206912** | P1.1 → F2 → `/VIN_FUSED` | +| V1-01 | D10 | pin 1 en `/24V_IN` → **`/VIN_FUSED`** | C224019 (sin cambio) | `/VIN_FUSED` = {F2.2, D10.1, Q23.2}; topología en §8 | +| A-03 | R50 | 825R/1% C50214 → **1.43k/1%** | **C22840** | 1.316–1.483 A | +| B-03 | D28 | ESD9L5.0ST5G C82326, SOD-923 → **PESD0402-240**, `Diode_SMD:D_0402_1005Metric`, Littelfuse | **C1975527** | pin 1 `/RF_ANT_LTE`, pin 2 GND (símbolo conservado; pines 1/2 mapean a los pads 0402) | +| C-01 | **U28 (nuevo)** | TPS2552DBVR, SOT-23-6 | **C46506** | 1 IN `/3V3_GNSS` · 2 GND · 3 ~EN `/GNSS_ANT_OFF` · 4 ~FAULT `/GNSS_ANT_SHORT_N` · 5 ILIM `/3V3_GNSS` (75 mA) · 6 OUT **`/ANT_BIAS`** | +| C-01 | **R135 (nuevo)** | 100k, ~EN → GND (antena encendida por omisión) | C25803 | `/GNSS_ANT_OFF` – GND | +| C-01 | **R136 (nuevo)** | 10k, pull-up de FAULT | C25804 | `/3V3_GNSS` – `/GNSS_ANT_SHORT_N` | +| C-01 | L21.2, C144.1, C145.1 | `/VCC_RF_GNSS` → **`/ANT_BIAS`** | sin cambio | | +| C-01 | U18.7 VCC_RF | `/VCC_RF_GNSS` → NC (etiqueta borrada, bandera no-connect añadida) | — | | +| C-01 | U18.5 ANT_OFF | bandera NC → etiqueta **`/GNSS_ANT_OFF`** | — | | +| F-02 | **D35 (nuevo)** | SMBJ33A, `Diode_SMD:D_SMB` (mismo símbolo que D10) | **C224019** | 1 (cátodo) `/IGN_IN`, 2 GND; colocar en P1.3 | +| F-02 | Rig1 | sin cambio (22k C88614); moverlo a P1.3 es layout | — | `/IGN_IN` = {P1.3, Rig1.1, D35.1} | +| H-01 | U15 | `Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm` → **`Package_SO:SOIC-16_3.9x9.9mm_P1.27mm`** | C15846 (sin cambio) | | +| H-02 | U10 | C729142 (SC16IS762) → **C57156**, MPN SC16IS752IPW,128 (el valor ya era SC16IS752IPW; símbolo conservado) | **C57156** | pinout idéntico | +| H-02 | R53 | 499k/1% C131054 → mismo valor, MPN RCT03499KFLF, HKR | **C177479** | | +| H-04 | U25 | sin `LCSC Part` en el símbolo del esquemático; el campo venía de la huella de librería → eliminado ahí (§7) | C524806 | | +| F-01 | proyecto | clases de red + `.kicad_dru` (§6) | — | | +| G-01 | MH4 + par de disipador | **no aplicado** — solo tarjeta (§10) | — | | + +### 2.2 Mayores (§7.2) + +| Hallazgo | Ref | De → A | LCSC | Pines / nets | +|---|---|---|---|---| +| A-04 | R121 | 53.6k/1% C23074 → **57.6k/1%** | **C23082** | U25 5.18/5.32/5.46 V | +| A-05 | **C161, C162 (nuevos)** | 47uF X7R 1210 | **C5440143** | `/MAIN5V` – GND (en U6 VSYS 1/24) | +| A-08 | U17 | AMS1117-3.3 C6186 → **TLV1117LV33DCYR** (TI); símbolo `Regulator_Linear:AMS1117-3.3` conservado (mismo 1 GND / 2 OUT / 3 IN, lengüeta = OUT) | **C15578** | pines sin cambio | +| A-09 | C78 | 220uF/10V MVG C2827940 → **220uF/16V polímero**, Lelon OVZ221M1CTR-0608, misma CP_Elec_6.3x7.7 | **C881921** | pin 1 `/VEH5V` = pad + | +| B-02 | C130, C131 | igual que C78 → **220uF/16V polímero** | **C881921** | | +| B-02 | R116 | 14k C22803 → **113k/1%** | **C22862** | | +| B-02 | C141 | 3.3nF C1536 → **6.8nF** X7R 0402 | **C1542** | | +| B-02 | C142 | 47pF C1567 → **56pF** C0G 0402 | **C1572** | | +| B-02 | **C166, C167 (nuevos)** | 22uF 16 V X5R 0805 | **C86817** | `/VBAT_MODEM` – GND (en L20.2) | +| F-03 | **C163, C164 (nuevos)** | 22uF 16 V 0805 | **C86817** | `/MAIN5V` – GND (en U20.2) | +| F-03 | **C165 (nuevo)** | 220uF/16V polímero, `Device:C_Polarized`, CP_Elec_6.3x7.7 | **C881921** | 1 (+) `/MAIN5V`, 2 GND | +| F-51 | **U29 (nuevo)** | TMP102AIDRLR, SOT-563, **I²C 0x48** | **C99269** | 1 SCL `/I2C_SCL` · 2 GND · 3 ALERT NC · 4 ADD0 GND · 5 V+ `/3V3` · 6 SDA `/I2C_SDA` | +| F-51 | **C168 (nuevo)** | 100nF 0603 | C14663 | `/3V3` – GND | +| F-51 | **R137 / R138 / C169 (nuevos)** | 100k/1% arriba · 120k/1% abajo · 10nF 0603 | C25803 · **C25808** · C1589 | `/NTC` → R137 → **`/NTC_CELL`** → R138/C169 → GND | +| F-51 | U16.25 PC5 | bandera NC → etiqueta **`/NTC_CELL`** (ADC1_IN15) | — | | +| C-02 | U21 | AP2112K-3.3 C51118 → **TPS7A2033PDBVR** (TI); símbolo `Drogheda-sym:LDO_SOT23-5` conservado (su pinout genérico 1 VIN / 2 GND / 3 EN / 4 NC / 5 VOUT es el del TPS7A20 DBV) | **C2862740** | pines sin cambio | +| E-01 | U12.2 EN | `/SYS5V` → **`/ETH_PWR_EN`** (etiqueta renombrada; U12.7 VIN sigue en `/SYS5V`) | — | | +| E-01 | U16.54 PD2 | bandera NC → etiqueta **`/ETH_PWR_EN`** | — | | +| E-01 | **R139 (nuevo)** | 100k PD | C25803 | `/ETH_PWR_EN` – GND | +| E-02 | **R140 (nuevo)** | 4.7k | **C23162** | `/ETH_RST` – GND (en U11.37) | +| D-01 | **U27 (nuevo)** | 74LVC1G125GV,125 (Nexperia), SOT-753 sobre `Package_TO_SOT_SMD:SOT-23-5` (mismo land SC-74A) | **C12518** | 1 ~OE GND · 2 A `/DOUT_4G` · 3 GND · 4 Y **`/DOUT_4G_F9P`** · 5 VCC `/3V3_GNSS` | +| D-01 | **C170 (nuevo)** | 100nF 0603 | C14663 | `/3V3_GNSS` – GND | +| D-01 | U18.26 RXD2 | `/DOUT_4G` → **`/DOUT_4G_F9P`** | — | PC7/R106 siguen en `/DOUT_4G` | +| D-01 | Rdfu1 | 22k C88614 → **100k** | **C25803** | | +| G-02 | **U30 (nuevo)** | USBLC6-2SC6, SOT-23-6 | **C7519** | 1,6 `/USB_DM` · 3,4 `/USB_DP` · 5 `/USB_VBUS` · 2 GND | +| H-02b | R56, R57, R58, R85, R87, Rgs1 | C103211 (100k 5 %) → **C25803** (100k 1 %) | **C25803** | texto de valor conservado `100k`. R20/Ren1/Rfreq1 sin cambio (el bloque U2 es DNP) | +| V1-01, F-12, F-05, F-06, C-04, A-07, A-02 | — | solo layout → §10 | | | + +### 2.3 Menores (lista D19) + +| Hallazgo | Ref | De → A | LCSC | Pines / nets | +|---|---|---|---|---| +| A-11 | R56.2 | GND → **`/3V3` (etiqueta renombrada): CHGOFF con pull-up → cargador apagado** sin MCU | C25803 | | +| A-13 | U6.20, TP2.1 | `/PFO_TP` → **`/PFO`** (etiquetas renombradas) | — | | +| A-13 | U16.29 PB10 | bandera NC → etiqueta **`/PFO`** | — | | +| A-13 | **R141 (nuevo)** | 100k PU | C25803 | `/3V3` – `/PFO` | +| B-09 | R132, R133, R134 | 0R C304185 → **22R** | **C23345** | R131 (VDD) sigue en 0R | +| B-09 | **C171 (nuevo)** | 100nF 0402 en J14.C1 | **C1525** | **`/SIMB_VDD`** – GND (J14.C1 está en `/SIMB_VDD`, después de R131; el «(`/SIM_VDD`)» del informe nombra el lado del módem) | +| B-10 | **R142 (nuevo)** | 100k PD | C25803 | `/MODEM_STATUS` – GND | +| B-10 | **R143 (nuevo)** | 100k PU | C25803 | `/3V3` – `/DIN_4G` | +| B-10 | R106 | 100R C22775 → **1k** | **C14676** | | +| C-07 | U18.50 SAFEBOOT_N | bandera NC → etiqueta **`/GNSS_SAFEBOOT_N`** | — | | +| C-07 | **TP10, TP11 (nuevos)** | `TestPoint:TestPoint_Pad_D1.0mm`, fuera del BOM | sin parte | TP10 `/GNSS_SAFEBOOT_N`, TP11 `/GNSS_RESET_N` | +| D-02 | Y3 | `Device:Crystal` HC-49SD C14872 → **`Device:Crystal_GND24`**, `Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm`, SCTF SX3B25.000F1010F30 (25 MHz, CL 10 pF, ESR 30 Ω) | **C2901684** | pin 1 `/HSE_IN` · **pin 3 `/HSE_OUT`** · pines 2/4 **GND** (cable nuevo + etiqueta GND). Hacía falta cambiar el símbolo: uno de 2 pines sobre el land de 4 pads habría puesto HSE_OUT en el pad 2 de GND. El pin 3 nuevo queda exactamente donde estaba el pin 2 viejo, así que la etiqueta `HSE_OUT` conecta sin cambio | +| D-02 | C113, C114 | 15pF C1644 → **12pF** C0G | **C38523** | | +| D-03 | Y4 | FC-135 CL 12.5 pF C32346 → **FC-135 CL 7 pF** (Epson Q13FC13500002; 7 pF confirmado en listados de distribuidores) | **C48615** | huella sin cambio | +| D-03 | C115, C116 | 12pF C38523 → **6.8pF** C0G | **C1679** | | +| D-05 | Rigb1 | 3.3k C22978 → **2.2k** | **C4190** | relación 0.0833 | +| D-09 | **R144 (nuevo)** | 100k PD en la base de Q5 | C25803 | `/BASE_LS` – GND | +| D-12 | U16.42 PA9 | bandera NC → etiqueta **`/USART1_TX`** | — | | +| D-12 | **TP9 (nuevo)** | `TestPoint:TestPoint_Pad_D1.5mm`, fuera del BOM | sin parte | `/USART1_TX` | +| E-03 | C95, C96 | 18pF C1647 → **33pF** C0G (Y1 conservado) | **C1663** | | +| E-04 | C91 | 4.7uF C1779 0805 → **10nF** X7R, `C_0603_1608Metric` | **C1589** | `/ETH_1V2` | +| E-04 | C90 | 10uF C440198 → **4.7uF** 0805 | **C1779** | `/ETH_TOCAP` | +| E-04 | **C172, C173 (nuevos)** | 100nF 0603 en AVDD 4/8 y 11/21 | C14663 | `/3V3_ETH` – GND | +| F-52 | **U31 (nuevo)** | TMP102AIDRLR, **I²C 0x49** (ADD0 → V+) | **C99269** | 1 `/I2C_SCL` · 2 GND · 3 NC · 4 `/3V3` · 5 `/3V3` · 6 `/I2C_SDA` | +| F-52 | **C174 (nuevo)** | 100nF 0603 | C14663 | `/3V3` – GND | +| G-03 | P11, P12 | `…MC_1,5_3-G-3.5_1x03_P3.50mm_Vertical` (no está en la librería) → **`Connector_Phoenix_MC:PhoenixContact_MC_1,5_3-G-3.5_1x03_P3.50mm_Horizontal`**; poblados (D10) | C5160226 (sin cambio) | | +| G-03 | J10 | `Connector_RJ45:…` (alias no configurado) → **`Connector_RJ:RJ45_Hanrun_HR911105A_Horizontal`**; poblado | C12074 (sin cambio) | | +| G-04 | **JP6 (nuevo)** = JP_CUT | `Jumper:SolderJumper_2_Open`, huella abierta, valor CUTOFF_BYPASS, fuera del BOM | sin parte | 1 `/MAIN5V`, 2 `/SYS5V` | +| G-08 | **D36, D37, D38 (nuevos)** | PESD5V0S1BA, `Diode_SMD:D_SOD-323` (igual que D14–D16) | **C2827694** | pin 1 `/NRST` / `/NTC_TEMP` / `/NTC2`, pin 2 GND | +| H-08 | C22, Y2 | texto de valor "22uF/50V" → **"10uF/50V"**; "1.8432MHz" → **"3.6864MHz"** | sin cambio | | +| B-15 | R107, R108 | valor "0R-DNP" → **"0R-NEVER-FIT"** + campo `Note` (siguen DNP) | — | | +| J-04 | 23 banderas NC huérfanas (x = 453.898 / 484.378) | borradas | — | | +| J-04 | banderas NC en U16.37, U16.38, U10.13, U10.14 | borradas (los pines siguen en sus nets) | — | | +| J-04 | tramos de cable | **2b755f7f borrado** (el tramo colgante sobre P1.4); **7c1dbfc0 recortado** de y 219.71 a 218.948 para que termine en su etiqueta GND (R52.2 sigue en GND); **46f71e27 conservado** (lleva la etiqueta GND de P1.4) y la unión de P1.4 conservada. Ver §12 | — | sin cambio de net | + +## 3. Partes nuevas — dónde están en la hoja + +Todas las partes nuevas van en espacio libre encontrado con un mapa de ocupación de la hoja (símbolos, pines, etiquetas, cables, textos), en la rejilla de 1.27 mm, cada grupo con una nota azul «v6 audit : …» que enuncia la regla de colocación física. Coordenadas en mm de esquemático (hoja A1). + +| Grupo | Refs | Posición en la hoja | Bloque al que pertenece | +|---|---|---|---| +| C-01 | R135, U28, R136 | (402–475, 196) | debajo del bias-T U18 / L21 | +| F-02 | D35 | (94, 36) | junto a P1 | +| A-05 | C161, C162 | (377–391, 226) | a la derecha de C32–C34 | +| F-03 | C163, C164, C165 | (184–213, 295) | a la izquierda de U20 | +| B-02 | C166, C167 | (401–415, 404) | a la derecha de U19 (capacitores de VBAT) | +| F-51 | U29, C168 | (257–287, 141) | arriba de los pasivos del cargador (R50/R55) | +| F-51 | R137, R138, C169 | (264–298, 220) | junto a R50/R56 | +| E-01 | R139 | (674, 217) | en U12 | +| E-02 | R140 | (692, 60) | en U11 | +| D-01 | U27, C170 | (268–304, 458) | debajo de U23/U24 | +| G-02 | U30 | (489, 307) | junto a J9 | +| A-13 | R141 | (218, 246) | cerca de TP1/TP2 | +| B-09 | C171 | (328, 460) | arriba de J14 | +| B-10 | R142, R143 | (284–298, 498) | debajo de U24 | +| C-07 | TP10, TP11 | (522–538, 104) | a la derecha de U18 | +| D-09 | R144 | (137, 113) | en Q5 | +| D-12 | TP9 | (547, 420) | a la derecha de U16 | +| E-04 | C172, C173 | (730–745, 183) | debajo de C94 | +| F-52 | U31, C174 | (188–218, 414) | a la izquierda de U23/U24 (bloque del módem) | +| G-04 | JP6 | (281, 25) | junto a P5 | +| G-08 | D36 / D37, D38 | (328, 133) / (476–503, 232) | en P6 / cerca de P7–P8 | + +## 4. Prueba por netlist + +Netlists exportadas con kicad-cli a través del KiCad MCP después de cada grupo confirmado (`kicad/_to_delete/v6-apply-20260928/netlists/00…05.xml`). `tools/ndiff.py` compara refs, valor, huella, lib_id, todos los campos y propiedades, banderas DNP / BOM / posición, ref.pin → net y clase de red. El conjunto de cambios esperado de cada grupo lo escribió el script de edición *antes* de confirmar el archivo y se verificó contra el diff real. + +| Grupo | Netlist | Esperado (añadidos / eliminados / campos / pin-net / clase) | Obtenido | Resultado | +|---|---|---|---|---| +| 1 Bloqueantes | 00-baseline → 01-blockers | 4 / 3 / 38 / 9 / 0 = 54 | 4 / 3 / 38 / 9 / 0 | **COINCIDE** | +| 2 Mayores | 01 → 02-majors | 17 / 0 / 36 / 4 / 0 = 57 | 17 / 0 / 36 / 4 / 0 | **COINCIDE** | +| 3 Menores | 02 → 03-minors | 16 / 0 / 51 / 9 / 0 = 76 | 16 / 0 / 51 / 9 / 0 | **COINCIDE** (tras la corrección de J-04, §12) | +| 4 Reglas de proyecto | 03 → 04-rules (esquemático sin tocar) | 0 / 0 / 0 / 0 / 16 | 0 / 0 / 0 / 0 / 16 | **COINCIDE** | +| 5 Cosmético (texto de ref de U30) | 04 → 05-final | 0 | 0 | **COINCIDE** | +| Total | 00 → 05-final | composición de los grupos 1–5 | 37 / 3 / 125 / 22 / 16 | **0 diferencias** en cada ref, atributo, pin y clase | + +Los cambios de campo cuentan tanto `footprint` como el campo `Footprint` cuando cambia una huella. Los 22 cambios pin-net: U20.2, C127.1, C128.1 → `/MAIN5V`; D10.1 → `/VIN_FUSED`; L21.2, C144.1, C145.1 → `/ANT_BIAS`; U18.7 → NC; U18.5 → `/GNSS_ANT_OFF`; U12.2 → `/ETH_PWR_EN`; U16.54 → `/ETH_PWR_EN`; U16.25 → `/NTC_CELL`; U18.26 → `/DOUT_4G_F9P`; R56.2 → `/3V3`; U6.20, TP2.1 → `/PFO`; U16.29 → `/PFO`; U16.42 → `/USART1_TX`; U18.50 → `/GNSS_SAFEBOOT_N`; Y3.2 → GND, Y3.3 → `/HSE_OUT`, Y3.4 → GND. Lista completa: `netlist_diff_total.md`; por grupo: `out/0N-*/netlist_diff.md`. + +UUID: ningún símbolo existente cambió de UUID (comprobado por grupo); la guarda también se cumplió en cada escritura. + +## 5. ERC (kicad-cli 10.0.4 vía KiCad MCP) + +Los conteos por categoría salen de copias con severidades de ERC acotadas (`kicad/_to_delete/v6-apply-20260928/erc_work/`), porque el MCP imprime solo 30 elementos. Las categorías de la línea base son las de la auditoría (`evidence/erc_summary.md`, mismo hash de archivo); las finales vienen de corridas sobre el archivo final y suman la corrida completa. + +| Categoría | Antes | Después | Por qué | +|---|---|---|---| +| Errores | 0 | **0** | | +| pin_to_pin | 104 | 102 | −2 por D21 eliminado (símbolo easyeda con pines sin tipo); los símbolos nuevos tienen pines tipados | +| no_connect_dangling | 23 | 0 | banderas huérfanas J-04 borradas | +| lib_symbol_mismatch | 22 | 21 | Y3 ahora usa una copia fresca de `Device:Crystal_GND24` | +| lib_symbol_issues (no está en la librería) | 10 | 11 | +1: `Drogheda-sym:TPS2552DBV` solo embebido (§7). Los 10 viejos siguen (re-enlace omitido, §9) | +| footprint_link_issues | 3 | 0 | G-03 (P11, P12, J10) | +| no_connect_connected | 2 | 0 | J-04 | +| unconnected_wire_endpoint | 2 | 0 | J-04 (tramo borrado / cola recortada) | +| Todas las demás comprobaciones (etiquetas sueltas, pines sin conectar, pines de potencia, …) | 0 | 0 | | +| Total de avisos | **166** | **134** | | + +Durante el grupo 3 una corrida intermedia mostró 3 errores (etiqueta/pin sin conectar en P1.4 y R52.2) por la primera eliminación de tramos de J-04; el diff de netlist marcó los mismos dos pines. Ambos se corrigieron antes de continuar (§12). + +## 6. Reglas de proyecto (F-01, D18) + +### 6.1 Clases de red (`hbox-watchdog-v6.kicad_pro`) + +Todos los patrones viejos se sustituyeron por nombres completos exactos de net (desaparecen los duplicados sin prefijo y los patrones muertos `3V3_MODEM`, `SW3_NODE`). En la netlist final cada patrón resuelve a una net real. + +| Clase | Nets | Clearance | Pista | Vía | Prioridad | +|---|---|---|---|---|---| +| HV24 | `/24V_IN` `/VIN_FUSED` `/VIN_PROT` `/24V` `/IGN_IN` `/Q10_GATE` `/Q23_GATE` `/SW_PWRIN` `/BOOT_PWRIN` `/SW_FAN` `/BST_FAN` | 0.3 (era 0.5) | 1.0 (era 0.5) | 0.8/0.4 | 0 | +| PWR_HI | `/BAT_PLUS` `/SW_BAT` `/MAIN5V` `/VEH5V` `/SYS5V` `/VIN_SW` | 0.15 (era 0.2) | 1.5 | 0.8/0.4 | 1 | +| PWR_MODEM (nueva) | `/VBAT_MODEM` | 0.15 | 1.5 | 0.8/0.4 | 2 | +| PWR_MID | `/SW_5V` `/SW_IN` `/5V_FAN` `/FAN_RET` | 0.15 (era 0.2) | 0.6 (era 1.0) | 0.8/0.4 | 3 | +| RF (nueva) | `/RF_GNSS` `/RF_ANT_GNSS` `/RF_LTE` `/RF_ANT_LTE` | 0.2 (gap CPWG) | 0.3 (ancho CPWG; valor final con la calculadora de JLC) | 0.6/0.3 (no se pretenden vías) | 4 | +| Default | todo lo demás, incl. `/3V3_ETH` (sacada de PWR_MID, J-02), `/EN_FAN`, `/EN_PWRIN`, `/SW_MODEM`, `/BST_MODEM` | 0.15 (era 0.2) | 0.2 | 0.6/0.3 | — | + +Cambios de clase en la netlist (16): a HV24 `/VIN_FUSED` `/VIN_PROT` `/24V` `/IGN_IN` `/Q10_GATE` `/Q23_GATE` `/SW_PWRIN` `/BOOT_PWRIN` `/BST_FAN` (desde Default) y `/SW_FAN` (desde PWR_MID); `/3V3_ETH` PWR_MID → Default; `/VBAT_MODEM` → PWR_MODEM; las cuatro nets RF → RF. + +**Decisión sobre la lista HV24 (difiere de la tabla del informe, anterior a A-01):** `/VIN_MODEM` ya no existe, y **`/SW_MODEM` y `/BST_MODEM` se dejaron fuera de HV24**. Con A-01, U20 corre desde `/MAIN5V` (≤ 5.5 V), así que son nodos de conmutación/boot de clase 5 V; en HV24 levantarían errores falsos de 0.3/0.5 mm alrededor de U20 (como `/ETH_SW`, se quedan en Default con la regla de ancho T15). `/SW_FAN`, `/BST_FAN`, `/24V` y `/Q10_GATE` **siguen en HV24**: las huellas de U2 y Q10 permanecen en la tarjeta como DNP y llevarían voltaje de vehículo si alguna vez se montaran. + +### 6.2 `.kicad_dru` (conjunto corregido por la verificación, textual; sustituye «Minimum clearance 1», «HV24 clearance», «HV24 exception: MP1584EN land pattern») + +``` +(rule "Floor 0.15 (non-HV24, non-RF)" + (condition "A.NetClass != 'HV24' && B.NetClass != 'HV24' && A.NetClass != 'RF' && B.NetClass != 'RF'") + (constraint clearance (min 0.15mm)) +) +(rule "HV24 to HV24" + (condition "A.NetClass == 'HV24' && B.NetClass == 'HV24'") + (constraint clearance (min 0.2mm)) +) +(rule "HV24 outer" + (layer outer) + (condition "A.NetClass == 'HV24' && B.NetClass != 'HV24'") + (constraint clearance (min 0.3mm)) +) +(rule "HV24 inner" + (layer inner) + (condition "A.NetClass == 'HV24' && B.NetClass != 'HV24'") + (constraint clearance (min 0.5mm)) +) +(rule "HV24 IC land patterns" + (layer outer) + (condition "A.Type == 'Pad' && B.Type == 'Pad' && ((A.memberOfFootprint('U2') && B.memberOfFootprint('U2')) || (A.memberOfFootprint('U20') && B.memberOfFootprint('U20')) || (A.memberOfFootprint('U25') && B.memberOfFootprint('U25')))") + (constraint clearance (min 0.15mm)) +) +``` + +Se añadió un encabezado de comentario de 3 líneas sobre el conjunto. La regla de texto de serigrafía y las tres reglas de aviso de ancho de potencia T15 no cambian (la regla T15 todavía nombra `/VIN_MODEM`, ahora un nombre muerto; inofensivo). La cláusula U20 de la regla de land patterns ya no coincide con nada tras la decisión HV24 de arriba; se conservó para mantener el conjunto textual de la verificación. + +## 7. Librería + +- **H-04 corregido:** `(property "LCSC Part" "C2071691")` borrado de `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod` (una línea, acotada; el resto del archivo es byte-idéntico). Esa huella la comparten U20 (AP64350, C2071691) y U25 (TPS54360B, C524806); ambos resuelven ahora por sus campos `LCSC`. La copia de U25 en la tarjeta todavía lleva el campo hasta que Michelle actualice la huella desde la librería (§10). +- **Otros valores `LCSC Part` en `Drogheda-v6.pretty`, cotejados contra sus usuarios (no se quitaron):** IND-SMD_L13.5-W12.5 C840531 = L22 ✓ · LCC-LGA-102 C5120257 = U18 ✓ · LGA-124 C18548276 = U19 ✓ · LGA-12 C5126709 = U26 ✓ · RF-SMD_FRF05002 C88374 = J12, J13 ✓ · SMA_L4.4 C113952 = D22 ✓ · VSSOP-8 C730237 = U23, U24 ✓ · SOD-923 C82326 = D27 ✓ (D28 pasó a 0402) · **SOD-128 C50603 ahora sin uso** (D21 eliminado). Ninguno está mal. +- **Símbolo TPS2552:** KiCad 10 no tiene símbolo TPS2552 (los interruptores MIC2007/2008 SOT-23-6 tienen otro pinout), así que se creó `Drogheda-sym:TPS2552DBV` y se embebió solo en el esquemático: símbolo de caja, 1 IN power_in, 2 GND power_in, 3 ~EN input, 4 ~FAULT open_collector, 5 ILIM passive, 6 OUT power_out, huella SOT-23-6, enlace a la hoja de datos de TI. `Drogheda-sym.kicad_sym` no se editó (fuera del conjunto de archivos de este pase; compartido con v5), que es el +1 aviso ERC «not found in library». Copiarlo a la librería en un pase de librería. +- Símbolos de librería nuevos embebidos desde KiCad 10: `74xGxx:74LVC1G125`, `Power_Protection:USBLC6-2SC6`, `Device:Crystal_GND24`. `Sensor_Temperature:TMP102xxDRL` ya estaba en caché en la hoja y es idéntico en contenido a la librería. + +## 8. Topología de polaridad inversa y fusible después de V1-01 / A-01 + +``` +P1.1 ─ /24V_IN ─ F2 (3 A Nano2, en portafusible) ─ /VIN_FUSED ─┬─ D10 SMBJ33A (pad 1 cátodo) ─ GND + └─ Q23 IRFR5305: D=/VIN_FUSED, S=/VIN_PROT, G=/Q23_GATE + D33 zener clamp S→G, R119 gate a GND +/VIN_PROT ─ D32 SMCJ33A, C149–C151, U25 (TPS54360B) → /VEH5V +/24V_IN también ─ Q10.D (rama Q10 DNP: /24V no lleva ninguna parte montada) +``` + +- Polaridad correcta: la corriente fluye P1 → F2 → diodo de cuerpo de Q23 (drain→source), Q23 se enciende con su gate llevado a GND (V_GS recortado a −15 V por D33) → /VIN_PROT. D10 y D32 recortan transitorios; D10 queda ahora detrás de F2, así que un TVS que falle en corto abre F2 en vez de cargar el arnés. +- **P1 invertido:** /VIN_FUSED se va a negativo; el gate de Q23 (a GND) queda positivo respecto a su source, así que Q23 se mantiene apagado y su diodo de cuerpo en inversa. D10 conduce en directa GND → /VIN_FUSED a través de F2 → **F2 se funde** (en portafusible, reemplazable). Antes de V1-01, D10 estaba en /24V_IN antes de F2 y habría llevado la corriente del fusible del arnés. +- El único cobre sin fusible que queda en /24V_IN es P1.1 → F2.1 y el pad Q10.D del Q10 en DNP. Si la rama Q10 se vuelve a montar algún día, mover primero Q10.D a /VIN_FUSED. +- U20 queda ahora en /MAIN5V, aguas arriba del corte P5 (nota A-01): P5 sigue quitando SYS5V → MCU sin energía → R113 mantiene el EN de U20 en bajo (µA). + +## 9. Elementos omitidos y decisiones + +**No aplicados** + +1. **G-01** (restaurar MH4 en (193.2, 90.3), barrenos de la abrazadera del disipador MH11 + pareja): barrenos de montaje solo de tarjeta; Michelle (D11 lo vuelve Bloqueante). +2. **J-04, re-enlazar los 10 símbolos «not found»** (Q_*MOS_G?S ×7, D_Zener_ANK ×2, PCF8574): requiere escribir sus definiciones en la `Drogheda-sym.kicad_sym` compartida (fuera del conjunto de archivos permitido) y cambiar 10 lib_id. Cosmético; se dejó como avisos. Los 22 desajustes de librería se dejaron como pide el informe (sin actualización masiva). +3. **G-08, resistencia opcional de 100 Ω en serie en NRST:** opcional en el informe; partiría `/NRST`. No aplicada. +4. **D-08** (strap de identificación de tarjeta), **H-03** (land MWSA0804S), **J-03** (tipos de pin de librería): excluidos por D19. +5. Mayores solo de layout (V1-01 layout, F-12, F-05, F-06, C-04, A-07) y A-02: lista de layout, §10. + +**Decisiones tomadas al aplicar (más allá de la letra de §7)** + +- El marcado DNP sigue la convención existente de la hoja (`(dnp yes)` solamente, como en C146/C147, R107/R108, R124/R125, R127–R130, U22): las huellas se quedan en la tarjeta con el atributo DNP, y KiCad deja las partes DNP fuera de las salidas BOM/CPL. +- U17, U21, U10 conservaron sus símbolos (numeración de pines idéntica) y solo cambiaron campos; el diff de netlist muestra en ellos solo cambios de valor/LCSC/MPN. +- Los pads de prueba nuevos (TP9–TP11) y JP6 quedan fuera del BOM y de los archivos de posición (sin parte comprable). TP1–TP8 se dejaron como estaban. +- Lista de nets HV24: §6.1. Eliminación de PF15: §2.1. Net de C171: §2.3. + +## 10. Delta de layout para Michelle + +Ejecutar Tools → Update PCB from Schematic sobre `hbox-watchdog-v6.kicad_pcb` con **«Delete footprints with no symbols» marcado** (corridas anteriores no borraban las huellas eliminadas) y «Update footprints» activo para que se sustituyan las huellas cambiadas. Después correr DRC (reglas nuevas, abajo). + +**Huellas nuevas por colocar (37)** + +| Ref | Huella | Dónde / restricción (de la auditoría) | +|---|---|---| +| U28 | SOT-23-6 | interruptor de polarización GNSS junto a L21/C144/C145 en J12; `/ANT_BIAS` a ≥ 1 mm de la línea RF con una franja de GND cosida (F-06); alimentación corta desde `/3V3_GNSS` | +| R135, R136 | 0603 | en los pines 3 y 4 de U28 | +| D35 | D_SMB | **en P1.3**; con Rig1 movido a ≤ 3 mm de cobre de P1.3 para que `/IGN_IN` mida ≤ 3 mm en F.Cu y el tramo largo pase a ser `/IGN_SENSE` (F-02) | +| C161, C162 | 1210 | a ≤ 2 mm de los pines VSYS 1/24 de U6, GND en el cobre del pad térmico (EP) de U6 (A-05/A-02) | +| C163, C164 | 0805 | a ≤ 2–3 mm de U20.2, GND en el cobre del pad térmico (EP) de U20 (F-03) | +| C165 | CP_Elec_6.3x7.7 | en U20.2 (F-03) | +| C166, C167 | 0805 | a ≤ 3 mm de L20.2 (B-02) | +| U29 + C168 | SOT-563 + 0603 | **entre U6 y L6, a ≤ 5 mm del pad térmico (EP) de U6** (F-51, R4) | +| R137, R138, C169 | 0603 | derivación de la NTC del paquete: R138/C169 en el pad 25 de U16 (PC5); R137 en cualquier punto de `/NTC` | +| R139 | 0603 | en el pin 2 de U12 (EN); pista nueva `/ETH_PWR_EN` al pad 54 de U16 (PD2) | +| R140 | 0603 | en U11.37 (`/ETH_RST`) | +| U27 + C170 | SOT-23-5 (SOT-753) + 0603 | **en U18.26 (RXD2)**; VCC desde `/3V3_GNSS` | +| U30 | SOT-23-6 | **a ≤ 3 mm de cobre de los pads de J9**, D+/D− ruteados a través de los pads del dispositivo, vía a GND a ≤ 1 mm (G-02) | +| R141 | 0603 | pull-up de `/PFO` cerca del pad 29 de U16 (PB10) | +| C171 | 0402 | en J14.C1 | +| R142, R143 | 0603 | en `/MODEM_STATUS` (PC9) y `/DIN_4G`, donde convenga | +| TP10, TP11 | TestPoint_Pad_D1.0mm | cerca de los pines 50 (SAFEBOOT_N) y 49 (RESET_N) de U18, junto a un pad de GND (C-07) | +| R144 | 0603 | en la base de Q5 | +| TP9 | TestPoint_Pad_D1.5mm | pad de TX de depuración PA9 junto a TP3–TP5 (D-12) | +| C172, C173 | 0603 | en los pines AVDD 4/8 y 11/21 del W5500 | +| U31 + C174 | SOT-563 + 0603 | **entre U19 y U20** (F-52) | +| JP6 | SolderJumper de 2 pads, abierto | a través de P5 (`/MAIN5V`–`/SYS5V`), serigrafía «CUTOFF BYPASS» (G-04) | +| D36, D37, D38 | SOD-323 | a ≤ 3 mm de P6.1, P7.1, P8.1 hacia GND (G-08) | + +Huellas eliminadas: D20 (D_SMA), D21 (SOD-128). (PF15 es una bandera de potencia virtual, sin huella.) + +Cambios de huella: U15 → `SOIC-16_3.9x9.9mm` angosto (recolocar C84–C88, re-ruteo local) · D28 → `D_0402_1005Metric` (con el re-ruteo LTE de F-06) · Y3 → `Crystal_SMD_3225-4Pin_3.2x2.5mm` (pad 1 HSE_IN, pad 3 HSE_OUT, pads 2/4 GND; a ≤ 3–5 mm de PH0/PH1, sin pista interna debajo) · C91 → 0603 · JP1 → Bridged (net-tie) · J10 → alias `Connector_RJ:` (misma geometría) · P11/P12 → Horizontal (ya así en la PCB) · U25 → volver a traer la huella de la librería para que su copia en tarjeta pierda `LCSC Part` (H-04) · Y4 y F2 conservan sus huellas. + +Cambios de DNP: poner DNP: U2, L2, Dbk1, Cbst1, Rcomp1, Ccomp1, Rfreq1, Ren1, Ren2, R20, R21, Q10, DzG1, Rrp1, C10, C11, C22. Quitar DNP: J10, P11, P12 (poblados según D10). + +Nets que cambian de ruteo + +- `/VIN_MODEM` desaparece: U20.2, C127, C128 pasan a **`/MAIN5V`** (≥ 1.5–2 mm hasta U20; borrar el tramo de 48 mm de `/VIN_MODEM`, A-01/A-07). +- `/VIN_FUSED` gana D10.1: P1.1 → F2 → {D10, Q23.D}; `/24V_IN` = P1.1, F2.1, Q10.D solamente. +- `/ANT_BIAS` (U28.6 → L21.2, C144, C145); U18.7 ahora es NC; `/GNSS_ANT_OFF` (U18.5 → U28.3, R135); `/GNSS_ANT_SHORT_N` gana U28.4 y R136. +- `/ETH_PWR_EN` (U12.2, U16.54, R139); U12.2 sale de `/SYS5V`. +- `/DOUT_4G_F9P` (U27.4 → U18.26); U18.26 sale de `/DOUT_4G`; U27.2 entra a `/DOUT_4G`. +- `/PFO` (renombrada desde `/PFO_TP`: U6.20, TP2, más U16.29 y R141). +- `/NTC_CELL` (U16.25, R137, R138, C169); `/NTC` gana R137. +- `/GNSS_SAFEBOOT_N` (U18.50, TP10); `/USART1_TX` (U16.42, TP9). +- R56.2 pasa de GND a `/3V3`; pads de Y3 re-asignados como arriba. + +DRC con las reglas nuevas (corrido sobre una copia de la tarjeta actual, todavía sin actualizar): 161 errores de clearance (eran 0). **149 son proximidades de relleno de zona** (rellenos guardados a 0.15 mm de nets HV24 y RF); un refill de zonas los quita. **12 son separaciones de cobre reales:** `/IGN_IN` en In2 vs vía de GND 0.250, `/FAN_PWM` 0.291, vía de `/5V_FAN` 0.300, `/NTC2` 0.305, vía de `/VEH5V` 0.340 (todos F-02, desaparecen con el movimiento a P1.3); `/VIN_PROT` vs `/VEH5V` 0.157 y 0.191 en (175.5, 113.8); `/USB_VBUS` vs Q23.1 `/Q23_GATE` 0.225; `/SW_PWRIN` vs pista de GND 0.270; `/24V` vs `/COMP_FAN` 0.290 ×2 (rama DNP, pero el cobre existe); clase RF: vía de `/RF_LTE` vs `/PWR_CTRL` 0.150 (se va con el re-ruteo F.Cu de F-06). Salvedad: KiCad lista una sola violación entre el segmento largo de `/IGN_IN` en In2 y `/VEH5V` (la vía a 0.340 mm); las pistas paralelas de 1.0 mm de `/VEH5V` a su lado están a 0.221–0.240 mm (recalculado a partir de las coordenadas de las pistas, coincide con los 0.221 mm de la auditoría) y no se listan como elementos separados. Así que no leer el conteo del DRC como la lista completa; el movimiento de F-02 elimina de todos modos todo el tramo de `/IGN_IN` en In2. Los avisos `track_width` bajan 183 → 121 (`/3V3_ETH` ahora en Default, ancho PWR_MID 0.6). Los demás elementos del DRC no cambian (82 lib_footprint_mismatch, 4 lib_footprint_issues, 11 silk_overlap, 2 silk_over_copper, 1 silk_edge). Tras Update PCB, esperar elementos HV24 nuevos en `/VIN_FUSED` en D10 y la desaparición de los de `/VIN_MODEM`. Comprobar una vez con Inspect → Clearance Resolution que las clases sobrevivieron al guardado desde la GUI (protocolo de resincronización §5). + +**Notas de pedido (de las consultas de partes):** C2862740 (TPS7A2033PDBVR, U21) aparece en JLC bajo «Pre-ordered Chips»: pre-ordenarlo en la cuenta como J14. P11/P12 C5160226 stock 512 (suficiente para 20 tarjetas). Volver a revisar stock el día del pedido (D14). + +## 11. Notas de firmware (para FW 0.7.x `board_v6.h`, D15) + +1. **PD2 = `ETH_PWR_EN`**: enable de U12 (3V3_ETH), R139 100 k pull-down → Ethernet APAGADO en reset/DFU/batería; ponerlo en ALTO solo con energía de vehículo cuando se necesite Ethernet; mantener SPI2 y PA15 en bajo mientras esté apagado. +2. **PB10 = `PFO`**: PFO del LTC4040, open-drain, R141 100 k pull-up a 3V3; EXTI10 flanco de bajada = entrada a respaldo (VEH5V < PFI 4.40 V bajando / 4.51 V subiendo). Actualizar `V5_PFI` a 4.40 V. +3. **PC5 = `NTC_CELL`** (ADC1_IN15): NTC del paquete a través de 100 k/120 k (relación 120/220) + 10 nF; Rntc = R55·Vntc/(VEH5V − Vntc) con VEH5V desde PA4; válido solo con VEH5V presente. Alimentar `tcell` a `CHG_CELL_HOT/COOL`. +4. CHGOFF por omisión: R56 ahora es pull-up a 3V3 → PA8 (`CHRG_EN`, maneja CHGOFF del LTC4040) en alto = cargador apagado siempre que el MCU no lo maneje. Polaridad sin cambio: el firmware pone PA8 en BAJO para permitir la carga. +5. **Ignición en PA5 (ADC1_IN5), leer analógico**, sin pull interno: Rigb1 = 2.2 k → relación 2.0 k/24.0 k = **0.0833**: 12 V → 1.00 V, 24 V → 2.00 V, 36 V → 3.00 V, escala completa 39.6 V. Añadir `vign` a `$PHLG`. +6. **TMP102 en 0x48 = sensor del cargador (U29)**, **0x49 = sensor de la zona del módem (U31)**; sin choque de direcciones (0x18 SC7A20, 0x20 PCF8574, 0x44 SHT40, 0x4D SC16IS752). Añadir `tchg`, `tmodem` a `$PHLG`; cortar la carga con `tchg` > 85 °C. +7. Antena GNSS: el ANT_OFF del F9P ahora maneja el ~EN del TPS2552 (poner `CFG-HW-ANT_CFG_VOLTCTRL` = 1, `SHORTDET` = 1). PC2 `GNSS_ANT_SHORT_N` lo maneja el ~FAULT del TPS2552 (open drain, 10 k a 3V3_GNSS): BAJO = corto o riel apagado. PC1 `GNSS_ANT_DETECT` sigue sin manejar (mantener en alta impedancia, inferir antena abierta por C/N0). +8. U27 ahora aísla el RXD2 del F9P: los ciclos de energía solo del F9P con el módem encendido se vuelven seguros en tarjetas que lo tengan; mantener las reglas de retorno de corriente 0.5.5/0.5.6 para PA2/PA10/PC7/PC12. Rdfu1 es 100 k (≤ 27 µA hacia TXD2 con el F9P apagado). +9. `/MODEM_STATUS` (PC9) tiene pull-down de 100 k y `/DIN_4G` pull-up de 100 k en hardware: no hacen falta pulls internos. R106 es 1 k. +10. PA9 es un pad de prueba (TP9, `USART1_TX`): usable como log de depuración solo TX o bootloader USART de ROM. +11. El punto de ajuste de U25 es ahora 5.32 V nominal (R121 57.6 k): mantener `CHG_RAIL_ON` 5.05 V / `CHG_RAIL_OFF` 4.90 V; calcular VDDA desde VREFINT. +12. LSE: Y4 es CL 7 pF → activar `LSEMOD` (alto drive) antes de `LSEON`, respaldo LSI. HSE sigue en 25 MHz (cristal 3225 nuevo); `BOARD_SER_XTAL_HZ` = 3 686 400 (el texto de valor de Y2 ahora coincide). +13. Modo batería (D9): solo LTE (`AT+CNMP=38`), Ethernet apagado. + +## 12. Incidentes y sorpresas + +1. **No todos los tramos de cable de J-04 estaban colgando.** La auditoría listó tres UUID de tramos. Borrar los tres rompió dos conexiones: en P1.4 la etiqueta GND está en el extremo lejano de 46f71e27 (solo 2b755f7f es el sobrante colgante), y en R52.2 la etiqueta GND está a mitad de segmento en 7c1dbfc0 (solo una cola de 0.76 mm pasada la etiqueta colgaba). ERC mostró 3 errores nuevos y el diff de netlist marcó exactamente P1.4 y R52.2 como inesperados. Se corrigió borrando solo 2b755f7f, conservando 46f71e27 y la unión de P1.4, y recortando 7c1dbfc0 para que termine en su etiqueta. Re-verificado: esperado == obtenido, ERC 0 errores. +2. **Y3 necesitaba un cambio de símbolo**, no de huella: `Device:Crystal` (2 pines) sobre el land 3225-4P habría puesto HSE_OUT en el pad 2 de GND. Se cambió a `Device:Crystal_GND24` en su lugar (UUID conservados, pines 3/4 añadidos), probado por la netlist. +3. **El TPS2552 no tiene símbolo en la librería de KiCad** (se creó uno embebido, §7). +4. **El TPS7A2033PDBVR está en la categoría «Pre-ordered Chips» de JLC** (stock 28 370): pre-ordenar como J14. +5. Queda un cruce de cable en U30: es la caja envolvente de la herramienta MCP para el símbolo USBLC6, verticalmente asimétrico; el PDF muestra el cable de VBUS saliendo del pin hacia afuera. + +## 13. Números LCSC nuevos (consulta a la base de datos de JLC vía KiCad MCP, 2026-09-28) + +| LCSC | Parte | Encapsulado | Stock | Tipo | Usado en | +|---|---|---|---|---|---| +| C206912 | Littelfuse 0154003.DR 3 A | SMD 9.7×5 (portafusible Nano2) | 2 217 | Ext | F2 | +| C22840 | 1.43 kΩ 1 % | 0603 | 4 965 | Ext | R50 | +| C1975527 | Littelfuse PESD0402-240 | 0402 | 9 394 | Ext | D28 | +| C46506 | TI TPS2552DBVR | SOT-23-6 | 3 002 | Ext | U28 | +| C224019 | Littelfuse SMBJ33A | DO-214AA | 9 624 | Ext | D35 | +| C57156 | NXP SC16IS752IPW,128 | TSSOP-28 | 2 670 | Ext | U10 | +| C177479 | HKR RCT03499KFLF 499 k | 0603 | 26 862 | Ext | R53 | +| C23082 | 57.6 kΩ 1 % | 0603 | 3 673 | Ext | R121 | +| C5440143 | Samwha 47 µF 16 V X7R | 1210 | 242 640 | Ext | C161, C162 | +| C15578 | TI TLV1117LV33DCYR | SOT-223 | 26 999 | Ext | U17 | +| C881921 | Lelon OVZ221M1CTR-0608 220 µF 16 V polímero | 6.3×7.7 | 2 442 | Ext | C78, C130, C131, C165 | +| C22862 | 113 kΩ 1 % | 0603 | 59 728 | Ext | R116 | +| C1542 | 6.8 nF 50 V X7R | 0402 | 128 063 | Pref | C141 | +| C1572 | 56 pF C0G | 0402 | 83 992 | Ext | C142 | +| C86817 | Murata 22 µF 16 V X5R | 0805 | 4 144 | Ext | C163, C164, C166, C167 | +| C99269 | TI TMP102AIDRLR | SOT-563 | 34 854 | Ext | U29, U31 | +| C25808 | 120 kΩ 1 % | 0603 | 773 686 | Basic | R138 | +| C1589 | 10 nF 50 V X7R | 0603 | 6 584 349 | Ext | C169, C91 | +| C2862740 | TI TPS7A2033PDBVR | SOT-23-5 | 28 370 | Ext (categoría pre-orden) | U21 | +| C23162 | 4.7 kΩ 1 % | 0603 | 21 915 184 | Basic | R140 | +| C12518 | Nexperia 74LVC1G125GV,125 | SOT-753 | 5 234 | Ext | U27 | +| C7519 | ST USBLC6-2SC6 | SOT-23-6 | 1 415 | Ext | U30 | +| C25803 | 100 kΩ 1 % | 0603 | 10 814 547 | Basic | resistencias de pull nuevas, Rdfu1, conjunto H-02b | +| C14663 | 100 nF 50 V X7R | 0603 | 37 493 696 | Basic | C168, C170, C172–C174 | +| C23345 | 22 Ω 1 % | 0603 | 4 031 533 | Basic | R132–R134 | +| C1525 | 100 nF 16 V X7R | 0402 | 43 509 060 | Basic | C171 | +| C14676 | 1 kΩ 5 % | 0603 | 757 955 | Ext | R106 | +| C2901684 | SCTF SX3B25.000F1010F30 25 MHz CL 10 pF | 3225-4P | 11 076 | Ext | Y3 | +| C38523 | 12 pF C0G | 0603 | 3 346 489 | Basic | C113, C114 | +| C48615 | Epson Q13FC13500002 FC-135 CL 7 pF | 3215-2P | 101 342 | Ext | Y4 | +| C1679 | 6.8 pF C0G | 0603 | 1 445 998 | Pref | C115, C116 | +| C4190 | 2.2 kΩ 1 % | 0603 | 2 920 710 | Basic | Rigb1 | +| C1663 | 33 pF C0G | 0603 | 2 808 576 | Basic | C95, C96 | +| C1779 | 4.7 µF 25 V X5R | 0805 | 4 715 349 | Basic | C90 | +| C2827694 | PESD5V0S1BA | SOD-323 | 303 975 | Ext | D36–D38 | +| C25804 | 10 kΩ 1 % | 0603 | (Basic existente) | Basic | R136 | + +BOM final (`kicad/_to_delete/v6-apply-20260928/bom_final*.csv`, kicad-cli): 306 líneas de BOM pobladas; solo TP1–TP8 no tienen LCSC (pads de cobre, como antes). + +## 14. Archivos + +- Editados en su lugar: `03-Architecture-Hardware/kicad/hbox-watchdog-v6.kicad_sch`, `.kicad_pro`, `.kicad_dru`, `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod`. +- PDF: `03-Architecture-Hardware/hbox-watchdog-v6-schematic.pdf`. +- El `.kicad_pcb` no se tocó. Si KiCad estaba abierto en v6 durante este pase, cerrarlo **sin guardar** y reabrir antes de Update PCB (protocolo de resincronización §5). +- Git (lo ejecuta Leo; nada se confirmó desde aquí): commit dentro del submódulo `kicad` (sch, pro, dru, huella SO-8), push a Gitea `HBox_PCB`, después actualizar el gitlink del padre; `_to_delete/` está en gitignore. + +Ver también: [manual v6](../manuales/manual-tarjeta-v6.md) · [auditoría completa v6](v6-auditoria-completa.md) · [mapa de pines MCU v6](v6-pinmap.md) · [revisión contra lecciones V5.5](v6-revision-lecciones-v55.md) · [informe de cambios V5.6](v56-cambios-esquematico.md) (lo que de esta auditoría se llevó a la V5.6). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-28 | Informe original (inglés): aplicación de los hallazgos de la auditoría v6 al esquemático. | +| 1.1 | 2026-09-29 | Traducción al español; hashes, respaldos y notas de proceso al anexo de trazabilidad. Sin cambios técnicos. | + +??? note "Anexo técnico — trazabilidad" + **SHA-256 antes / después:** + + | Archivo | Antes | Después | + |---|---|---| + | `hbox-watchdog-v6.kicad_sch` | `ecee9fed851f02e74074340bf8361bced7c385b2502b19c368861b9851c2f04a` | `d54e330d189910afd58e18fc7cd498bdb3e6e5b7b3c4472b6cae7f95650b34c4` | + | `hbox-watchdog-v6.kicad_pro` | `25c57f3936b96a4e31cb5947668c172d318189258d6a5d2fa34d230df8958028` | `d577aa43076f5f751c291041dbf3054cb93a87facfe9f339ef91b60e073bd6ce` | + | `hbox-watchdog-v6.kicad_dru` | `47538e6cfadc0c53421ff59dadabc0e7f0ad5f11d9e2250618728788080aca1a` | `31ce0f4f23e8178b4b5e837b452e7bb8647d446ffd420559049eaaae78100831` | + | `Drogheda-v6.pretty/SO-8_L4.9-W3.9-P1.27-LS6.0-BL-EP.kicad_mod` | `0171be85ff9bf1d27232731a9931ad9d6c3c2bcdee2f5f3558ee94d2566413f9` | `3f38f26e435c477a7701636d4d5e1c05b4c7bd523e8dd04f9f57128657736313` | + | `hbox-watchdog-v6.kicad_pcb` | `6ddec80d1c15f79e69dff6c1a850b28345a5d826389f79cee8c61998240b36bf` | sin cambio | + | `hbox-watchdog-v6-schematic.pdf` | — | `a2c94a49…` | + + Respaldos (nada se borró): `kicad/_to_delete/v6-apply-20260928/` — `00-pre/` (sch, pro, dru, prl, huella SO-8, archivo lateral de DRC), `01-blockers/`, `02-majors/`, `03-minors/`, `04-rules/`, `05-final/`, `netlists/00-baseline … 05-final.xml`, `erc_work/` (copias de aislamiento de ERC), `drc_work/` (DRC sobre una copia de la tarjeta con las reglas nuevas; reporte + JSON), `scratch/` (PDF intermedios, archivo de extracción de librería), `bom_final.csv`, `bom_final_ungrouped.csv`. Área de trabajo del contenedor: `/home/claude/v6audit/apply/` — este informe, `netlist_diff_total.md`, `out/0N-*/` (logs de edición, conjuntos esperados, diffs por grupo), `tools/` (editor, modelo, diff, scripts por grupo), `drc/`, el PDF. + + **Nota de proceso:** durante el grupo 1 una segunda confirmación de archivo reenvió una copia en caché y escribió la primera versión; se detectó por el hash del archivo en la Mac y desde entonces cada confirmación usó una ruta única. Cada estado confirmado en este informe se comprobó por hash en la Mac. diff --git a/docs/hardware/v6-pinmap.md b/docs/hardware/v6-pinmap.md new file mode 100644 index 0000000..2e0e6b5 --- /dev/null +++ b/docs/hardware/v6-pinmap.md @@ -0,0 +1,251 @@ +--- +title: "EinarBoard v6 — Mapa de pines del MCU (U16 STM32F411RET6, LQFP64) para board_v6.h / FW 0.7.x" +tags: [project-drogheda, hardware, einarboard, v6, pinmap, stm32, firmware] +date: 2026-09-28 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard v6 — Mapa de pines del MCU (U16 STM32F411RET6, LQFP64) para `board_v6.h` / FW 0.7.x + +!!! warning "EinarBoard v6 (`hbox-watchdog-v6`): en diseño, no se pide" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. + +Prosa y encabezados en español; la tabla de 64 pines y el borrador de `board_v6.h` se dejan en inglés (fuente directa para firmware). Fuente: `findings/pinmap-v6.md` de la [auditoría completa v6](v6-auditoria-completa.md) (§4), mismo snapshot del 2026-09-28. La tabla describe **la v6 tal como está dibujada**. Las filas marcadas ▶ audit llevan la consecuencia a nivel de pin de un hallazgo verificado de forma independiente, o de la asignación de pines libres que ambas verificaciones aceptan. Nada de esto se ha aplicado al esquemático (ver el [informe de cambios v6](v6-cambios-esquematico.md) para lo que sí se aplicó); las notas «▶ audit» dicen qué cambia si se adopta la corrección. + +**Correcciones aplicadas al texto original (v1.0, 2026-09-28):** + +1. **PA15 / ETH_RST:** el pull-down es **4.7 kΩ (C23162)**, no 100 kΩ. El RSTn del W5500 tiene su propio pull-up interno de 62–112 kΩ (DS v1.0.2 §5.3) además del pull-up JTDI de 30–50 kΩ de PA15; 4.7 k da ≤ 0.62 V en el peor caso. La alternativa de D-04 «mover a PD2 + 100 k» falla (1.56–2.04 V) y se retira (verificación, E-02 absorbe D-04). +2. Asignación de pines libres (conflicto (h) de la verificación): PD2 = `ETH_PWR_EN` (E-01), PB10 = `PFO` (A-13, absorbe D-10), PC5 = derivación de la NTC del paquete (F-51), PA9 = libre (pad de prueba D-12). El CLPROG → PC5 de D-10 se descarta. Abierto: el strap de identificación de tarjeta de D-08 también quería PD2; no queda pin libre salvo PA9 (Leo decide). +3. **D-01:** la compuerta aislante es la **Nexperia 74LVC1G125GV, C12518** (Ioff verificado), no el clon TECH PUBLIC C3040595; Rdfu1 22 k → 100 k (C25803). La alternativa de 10 k en serie se retira (≈ 0.28 mA, mismo orden que el retorno de corriente de la V5.5). +4. **D-06 se fusiona en F-02 y queda como Bloqueante** (Rig1 a ≤ 3 mm de cobre de P1.3 + SMBJ33A C224019), no ≤ 5 mm/Mayor. +5. Distancias del HSE: borde a borde de pad **8.32 / 11.30 mm** (los 10.30 / 14.21 mm de abajo son centro a centro) (D-02). +6. **C-01 (Bloqueante, absorbe D-07):** con la alimentación de antena por TPS2552, PC2 (`/GNSS_ANT_SHORT_N`) se vuelve una entrada real de falla por corto (FAULT̅, 10 k a /3V3_GNSS); PC1 sigue sin manejar. +7. **Decodificación de PB4:** citando la tabla de la hoja de datos del LTC4040 (p. 14), «pausa NTC» = CHRG bajo ∧ FAULT bajo y batería mala = CHRG alto ∧ FAULT bajo; esto prevalece sobre el texto de la fila PB4. + +**Cobertura: 64 / 64 pines.** Fuentes: `evidence/mcu_pins.csv` (netlist), `evidence/pcb_pads.csv` (distancias centro a centro de pad, misma net), `evidence/firmware_pins.csv` (`board_v5.h` de V5 + `hbox_v5_bringup.ino` 0.6.0), ST DS10314 (DocID026289 Rev 7) tabla 8 (definición de pines, estructura de E/S) y tabla 53 (E/S estática), y la base de datos de funciones alternas de ST (`STM32_open_pin_data`: `mcu/STM32F411R(C-E)Tx.xml` + `mcu/IP/GPIO-STM32F411_gpio_v1_0_Modes.xml`, la fuente de CubeMX para la tabla 9 del DS10314). El símbolo embebido del esquemático se cotejó contra el pinout LQFP64 de ST: **64/64 números y nombres de pin coinciden** (el aviso ERC «symbol differs from library» en U16 es cosmético). + +Leyenda. FT = tolerante a 5 V solo en modo digital (DS10314 tabla 8 nota 4: no en modo analógico ni de oscilador; tabla 53 nota 5: el pull-up/down interno debe estar apagado por encima de VDD+0.3 V). TC = solo 3.3 V. En este LQFP64 solo **PA0** y **PB5** son TC; todos los demás GPIO son FT. PC13–PC15 son pines del dominio de respaldo (tabla 8 nota 2: sumidero ≤ 3 mA, ≤ 2 MHz, ≤ 30 pF, nunca fuente). **Ningún pin del MCU en v6 lleva una señal de 5 V ni de 1.8 V**: todas las líneas de 1.8 V del módem pasan por U23/U24 (74LVC2T45) o por Q20/Q21 en open-drain, y todo pull-up es a /3V3. «¿Igual?» = si la macro de V5 en ese pin significa lo mismo en v6. + +## 1. Tabla de pines (pines físicos 1–64) + +| Pin | Nombre | Net v6 | Partes conectadas (resumen) | Función en v6 | Dir / modo (FW) | Periférico + AF / ADC / EXTI | ¿Necesita 5 V? / pin | Macro V5 en este pin → ¿igual? | Macro v6 propuesta | Notas / conflictos | +|---|---|---|---|---|---|---|---|---|---|---| +| 1 | VBAT | /3V3 | 3V3 big net | Backup-domain supply, tied to 3V3 (no coin cell) | power | — | — / S | — | — | RTC + BKP regs + LSE lost whenever /3V3 drops (P5 cut-off open, no USB) | +| 2 | PC13 | /LED_C13 | D17 blue LED (K) ← R102 1 k ← /3V3 | Board status LED, active LOW (sink) | OUT, LOW = on | GPIO, EXTI13 | No / FT backup-domain | `PIN_LED_C13` → same | `PIN_LED_C13` | I = (3.3 − 2.8 V Vf, C125103) / 1 k ≈ 0.5 mA ≤ 3 mA sink limit ✓ (dim) | +| 3 | PC14-OSC32_IN | /LSE_IN | Y4.1 (32.768 kHz C32346, CL 12.5 pF), C115 12 pF | LSE | oscillator | RCC_OSC32_IN | — | `BOARD_LSE_HZ` → same | `BOARD_LSE_HZ 32768UL` | Y4.1 5.54 mm, C115 2.96 mm. Crystal/caps mismatch → D-03 | +| 4 | PC15-OSC32_OUT | /LSE_OUT | Y4.2, C116 12 pF | LSE | oscillator | RCC_OSC32_OUT | — | same | — | Y4.2 7.91 mm, C116 6.49 mm (> 5 mm) | +| 5 | PH0-OSC_IN | /HSE_IN | Y3.1 (25 MHz HC-49S C14872, CL 20 pF), C113 15 pF | HSE (USB, PLL, ROM DFU needs it) | oscillator | RCC_OSC_IN | — | `BOARD_HSE_HZ` → same | `BOARD_HSE_HZ 25000000UL` | Y3.1 **10.30 mm** ctr (**8.32 mm pad edge**, verify_2), C113 13.72 mm, track 14.5 mm → D-02. ▶ audit: Y3 → C2901684 + C113/C114 12 pF C38523 (alt. C9006 + 15 pF C1644) | +| 6 | PH1-OSC_OUT | /HSE_OUT | Y3.2, C114 15 pF | HSE | oscillator | RCC_OSC_OUT | — | same | — | Y3.2 **14.21 mm** ctr (**11.30 mm pad edge**, verify_2), C114 17.02 mm, track 20.7 mm → D-02 | +| 7 | NRST | /NRST | C104 100 nF (3.26 mm), SW1 RESET, P6.1 RESET-EXT, TP5 | MCU reset only | RST (int. pull-up 30–50 kΩ) | — | — | — (V5: P10) | — | NRST reaches only the MCU. Route 108.6 mm (91.9 F.Cu + 16.8 In2). P6 external cable has no ESD → G-08 | +| 8 | PC0 | /ETH_INT | U11.36 ~INT (W5500) | W5500 interrupt, active LOW | IN pull-up | GPIO, ADC1_IN10, **EXTI0** | No / FT | `PIN_ETH_INT` → same | `PIN_ETH_INT` | BOOT1 trap avoided (V4 had it on PB2) ✓ | +| 9 | PC1 | /GNSS_ANT_DETECT | U18.4 ANT_DETECT — **F9P input** | none usable (see D-07) | ANALOG / hi-Z, never drive HIGH while F9P off | GPIO, ADC1_IN11, EXTI1 | No / FT | V5: NC · **V5.6: MODEM_RST_MCU** → different | `PIN_GNSS_ANT_DET` (reserved) | No antenna-current supervisor on v6: MCU cannot learn antenna state here. ▶ audit C-01: stays undriven (open-antenna detect not implemented; infer from C/N0) | +| 10 | PC2 | /GNSS_ANT_SHORT_N | U18.6 ANT_SHORT_N — **F9P input** | none usable (D-07) | ANALOG / hi-Z | GPIO, ADC1_IN12 (SPI2_MISO AF5 unused) | No / FT | V5: NC · **V5.6: MODEM_LED_MCU** → different | `PIN_GNSS_ANT_SHORT_N` (reserved) | as PC1. ▶ audit C-01: TPS2552DBVR (C46506) FAULT̅ drives this net (10 k C25804 to /3V3_GNSS) → LOW = antenna short; input, no MCU pull; valid only while the F9P rail is on | +| 11 | PC3 | /GNSS_RTK_STAT | U18.20 RTK_STAT (output) | RTK status: 0 = fixed, blinking = corrections in use, 1 = none | IN, pull-DOWN while F9P off | GPIO, ADC1_IN13, **EXTI3** (shared with PB3) | No / FT | V5: NC · **V5.6: MODEM_EN (output!)** → different | `PIN_GNSS_RTK_STAT` | A V5.6 binary would drive this against the F9P output → D-08 | +| 12 | VSSA | GND | — | analog ground | power | — | — | — | — | | +| 13 | VDDA | /VDDA | R104 10 Ω ← 3V3, C109 100 nF (3.13 mm), C112 1 µF (4.61 mm) | ADC reference (VREF+ bonded) | power | — | — | `ADC_REF 3.3f` → same | — | ✓ DS10314 recommendation | +| 14 | PA0-WKUP | /BAT_SENSE | R5 10 k ← /BAT_PLUS, R6 10 k → GND, C5 100 nF (5.6 mm) | Pack voltage / 2 | ANALOG | **ADC1_IN0** (WKUP1 spare) | No (≤ 2.10 V at 4.2 V) / TC | `PIN_BAT_SENSE` → same | `PIN_BAT_SENSE` | `DIV_RATIO 2.0` unchanged. 0.21 mA permanent pack drain | +| 15 | PA1 | /PWR_CTRL | R1 1 k → Q5 MMBT3904 base (**no base pull-down**) → /GATE_LS (R2 10 k to SYS5V) → Q1 AO3401A → /SW_5V → U21 AP2112K → /3V3_GNSS | **F9P rail enable**, HIGH = on | OUT PP, LOW at boot | GPIO / TIM2_CH2 AF1 (soft-start PWM) | No / FT | `PIN_PWR_CTRL` → **CHANGED**: V5 = RTK + 4G stack; v6 = F9P only (modem has PC10) | `PIN_GNSS_PWR` (keep `PIN_PWR_CTRL` alias) | Floats in reset/DFU → D-09 (absorbs A-12). ▶ audit: 100 k C25803 `/BASE_LS` → GND next to Q5 | +| 16 | PA2 | /GNSS_TX | U18.43 RXD (F9P UART1 in) | MCU → F9P UART1 (UBX config) | AF PP only while F9P on; INPUT no-pull when off | **USART2_TX AF7** | No / FT | `PIN_GNSS_TX` → same (was simpleRTK2B UART1) | `PIN_GNSS_TX` | 0.5.5 float rule is mandatory (direct into F9P) | +| 17 | PA3 | /GNSS_RX | U18.42 TXD (F9P UART1 out) | F9P → MCU NMEA/UBX | AF; pull-up only while F9P on | **USART2_RX AF7** | No / FT | `PIN_GNSS_RX` → same | `PIN_GNSS_RX` | `GNSS = Serial2` | +| 18 | VSS | GND | — | ground | power | — | — | — | — | | +| 19 | VDD | /3V3 | nearest C106 3.29 mm | supply | power | — | — | — | — | per-pin cap target ≤ 2 mm (Note) | +| 20 | PA4 | /5V_SENSE | R7 10 k ← /VEH5V, R8 10 k, C7 100 nF (5.5 mm) | VEH5V / 2 (now U25 output or bench P2) | ANALOG | **ADC1_IN4** | No (2.50 V at 5.00 V, 2.66 V at 5.32 V) / FT | `PIN_5V_SENSE` → same net; source is now on-board U25 | `PIN_5V_SENSE` | LTC4040 PFI real threshold 1.19 V × 3.7 = 4.40 V (LTC4040 DS pin 19) | +| 21 | PA5 | /IGN_SENSE | Rig1 22 k ← /IGN_IN (P1.3); Rig2 22 k ∥ Rigb1 3.3 k → GND; C9 100 nF (3.09 mm); D5 BAT54 → /3V3 | Ignition present / vehicle-voltage estimate | **ANALOG** on v6 (V5 read it digital) | **ADC1_IN5** (EXTI5 if digital) | No at the pin (3.23 V at 28 V; clamp ≈ 3.55 V above 30.3 V) / FT (not in analog mode) | `PIN_IGN_SENSE` → same net, **digital read no longer adequate** (12 V vehicles) | `PIN_IGN_SENSE` | Divider midpoint, pin and C9 on one net (junction verified) · D-05, D-06. ▶ audit F-02 (Blocker, absorbs D-06): Rig1 moves ≤ 3 mm of copper from P1.3 + SMBJ33A C224019 at P1.3, so the long run becomes the 22 k-limited `/IGN_SENSE`; pin net unchanged. D-05: Rigb1 3.3 k → 2.2 k C4190 → ratio 0.0833 (12 V → 1.00 V, 24 V → 2.00 V, 36 V → 3.00 V) | +| 22 | PA6 | /FAN_PWM | Rg1 100 Ω → Q2 AO3400A gate, Rgs1 100 k | Fan low-side switch, HIGH = on | OUT PP (ON/OFF policy) | GPIO / **TIM3_CH1 AF2** | No / FT | `PIN_FAN_PWM` → same | `PIN_FAN` | TIM3 is also PA7's capture timer (§2.4) | +| 23 | PA7 | /GNSS_TIMEPULSE | U18.53 TIMEPULSE | F9P 1 PPS | IN, pull-down while F9P off | **TIM3_CH2 AF2** input capture / EXTI7 | No / FT | V5: NC → new | `PIN_GNSS_PPS` | | +| 24 | PC4 | /NTC2 | R126 10 k/1 % → 3V3, C157 100 nF (3.11 mm), P8.1 | External NTC probe 2 (10 k B3950) | ANALOG | **ADC1_IN14** | No / FT | V5: NC (V5.6: MODEM_ON_SLEEP, DNP) → new | `PIN_NTC2` | `$PHLG tntc2` (append) | +| 25 | PC5 | unconnected (NC flag) | — | spare | ANALOG (lowest Idd) | ADC1_IN15 | — | V5: NC (V5.6: MODEM_ASSOC, DNP) | `PIN_SPARE_PC5` → `PIN_NTC_CELL` | ▶ audit F-51 (verify_1 (h)): pack-NTC tap, `/NTC` → 100 k (C25803) / 120 k (C25808) + 10 nF → PC5; PC5 ≤ 2.98 V; valid only with VEH5V present. D-10's CLPROG use dropped | +| 26 | PB0 | /EXT_LED | Q4 AO3400A gate, Rled1 10 k → panel LED D1 at **P9** | Panel LED, HIGH = on | OUT PP | GPIO (TIM3_CH3 AF2) | No / FT | `PIN_EXT_LED` → same (connector P8 → P9) | `PIN_EXT_LED` | | +| 27 | PB1 | /NTC_TEMP | R42 10 k/1 % → 3V3, C24 100 nF (6.63 mm), P7.1 | External NTC probe 1 (hot-spot, `tntc`) | ANALOG | **ADC1_IN9** | No / FT | `PIN_NTC` → same (connector P12 → P7) | `PIN_NTC` | | +| 28 | PB2 | /BOOT1_STRAP | R99 10 k → GND (2.84 mm) | BOOT1 = 0 strap (DFU entry) | never reconfigure | BOOT1 | — | — (V4: ETH_INT!) | — | "never repurpose PB2" ✓ | +| 29 | PB10 | unconnected (NC flag) | — | spare | ANALOG | TIM2_CH3 AF1, I2C2_SCL AF4, SPI2_SCK AF5, EXTI10 | — | V5: NC | `PIN_SPARE_PB10` → `PIN_PFO` | ▶ audit A-13 (absorbs D-10): U6.20 PFO → PB10, 100 k C25803 pull-up to /3V3, EXTI10 falling = backup entry at VEH5V < 4.40 V | +| 30 | VCAP1 | /VCAP1 | C111 4.7 µF (3.19 mm) | core regulator cap | power | — | — | — | — | ✓ | +| 31 | VSS | GND | — | ground | power | — | — | — | — | | +| 32 | VDD | /3V3 | nearest C105 3.65 mm | supply | power | — | — | — | — | | +| 33 | PB12 | /ETH_CS | U11.32 SCSn | W5500 chip select | OUT PP (INPUT_PULLUP while W5500 idle) | GPIO (SPI2_NSS AF5 unused) | No / FT | `PIN_ETH_CS` → same | `PIN_ETH_CS` | | +| 34 | PB13 | /ETH_SCK | U11.33 | SPI2 SCK | AF | **SPI2_SCK AF5** | No / FT | `PIN_ETH_SCK` → same | `PIN_ETH_SCK` | | +| 35 | PB14 | /ETH_MISO | U11.34 | SPI2 MISO (W5500 output) | AF in | **SPI2_MISO AF5** | No / FT | `PIN_ETH_MISO` → same | `PIN_ETH_MISO` | | +| 36 | PB15 | /ETH_MOSI | U11.35 | SPI2 MOSI | AF | **SPI2_MOSI AF5** | No / FT | `PIN_ETH_MOSI` → same | `PIN_ETH_MOSI` | | +| 37 | PC6 | /USART6_TX | K1.10 (NO contact) → /DIN_4G → U23 (3.3 → 1.8 V) → U19.10 RXD | MCU → modem (AT, GGA, `$PHLG`) when K1 energised (Mode B) | AF PP while modem on; INPUT otherwise | **USART6_TX AF8** | No / FT | V5: NC. **Takes over V5 PA9 `PIN_USART1_TX` (RELAY TX)** | `PIN_MODEM_TX` | NC flag on a connected pin (cosmetic) → D-11 | +| 38 | PC7 | /USART6_RX | R106 100 Ω ← /DOUT_4G ← U24 (1.8 → 3.3 V) ← U19.9 TXD; /DOUT_4G also → U18.26 F9P RXD2 | modem → MCU (AT replies + RTCM byte count) | AF, **no pull while F9P off** | **USART6_RX AF8** | No / FT | V5: NC (V5.6 RTCM_TAP, same peripheral) | `PIN_MODEM_RX` | NC flag cosmetic (D-11 → J-04). A pull-up here back-feeds the F9P (D-01). ▶ audit D-01: U27 74LVC1G125GV C12518 on /3V3_GNSS isolates U18.26 (new net `/DOUT_4G_F9P`); PC7/R106 stay on `/DOUT_4G`. B-10: R106 100 Ω → 1 kΩ C14676 | +| 39 | PC8 | /MODEM_PWRKEY | Q20 2N7002 gate, R114 100 k PD → U19.1 PWRKEY (int. pull-up to VBAT) | Modem power key; MCU HIGH = key pressed | OUT PP, LOW at boot | GPIO (TIM3_CH3) | No / FT | V5: NC → new | `PIN_MODEM_PWRKEY` | on ≥ 50 ms, off ≥ 2.5 s (Phase-1 spec / Phase-2 delta) | +| 40 | PC9 | /MODEM_STATUS | U24.6 (2B) ← U19.66 STATUS (1.8 V) | Modem powered/ready (≈ 11.2 s after power-on) | IN pull-DOWN (floats when modem off: U24 Ioff) | GPIO, **EXTI9** (shared with PB9) | No / FT | V5: NC → new | `PIN_MODEM_STATUS` | poll it (EXTI9 belongs to the accelerometer) → D-14 (merged into B-10). ▶ audit B-10: 100 k C25803 `/MODEM_STATUS` → GND | +| 41 | PA8 | /CHRG_EN | U6.4 CHGOFF, R56 100 k → GND | Charger disable; HIGH = charge OFF | OUT PP | GPIO (TIM1_CH1 AF1) | No / FT | `PIN_CHRG_EN` → same | `PIN_CHRG_EN` | In reset/DFU R56 → charger ON (as V5). ▶ audit A-11: R56 100 k re-netted to /3V3 → charger OFF by default; polarity unchanged | +| 42 | PA9 | unconnected (NC flag) | — | spare | ANALOG | USART1_TX AF7, OTG_FS_VBUS AF10 | — | `PIN_USART1_TX` → **REMOVED** (role now PC6) | `PIN_DBG_TX` if a pad is added | USART1 is RX-only on v6 (TX alternates PA15/PB6 are taken). Add a test pad → D-12. ▶ audit: only remaining spare after (h); also the only candidate left for D-08's board-ID strap (open) | +| 43 | PA10 | /USART1_RX | U18.27 TXD2 (F9P UART2 out), K1.1 (NC → modem DIN), Rdfu1 22 k → /3V3 (2.28 mm) | Passive tap on the F9P → modem stream (fail-safe path through K1 NC) | AF RX, **no internal pull** (PA10 pull-up is 7–14 kΩ, DS Table 53) | **USART1_RX AF7** | No / FT | `PIN_USART1_RX` → same (tap), now RX-only | `PIN_F9P_TX2_TAP` | `Uart RELAY(PA10, PA9)` → RX-only instance. ▶ audit D-01: Rdfu1 22 k → 100 k C25803 (back-feed ≤ 27 µA) | +| 44 | PA11 | /DFU_DM | J11 A7/B7, D15 PESD5V0S1BA (6.74 mm from J11) | USB FS D− (ROM DFU + CDC console) | AF | **OTG_FS_DM AF10** | No / FT | `CON SerialUSB` → same | — | route 55.1 mm | +| 45 | PA12 | /DFU_DP | J11 A6/B6, D14 (3.19 mm) | USB FS D+ | AF | **OTG_FS_DP AF10** | No / FT | same | — | route 50.1 mm | +| 46 | PA13 | /SWDIO | TP3 (6.04 mm) | SWD data | AF0 (pull-up at reset) | SYS_JTMS-SWDIO AF0 | — | — | — | | +| 47 | VSS | GND | — | ground | power | — | — | — | — | | +| 48 | VDD | /3V3 | C107 2.10 mm | supply | power | — | — | — | — | ✓ | +| 49 | PA14 | /SWCLK | TP4 (5.43 mm) | SWD clock | AF0 (pull-down at reset) | SYS_JTCK-SWCLK AF0 | — | — | — | | +| 50 | PA15 | /ETH_RST | U11.37 RSTn | W5500 reset, LOW = held | OUT PP, drive LOW first thing | GPIO (**JTDI AF0 at reset, 30–50 kΩ pull-up**) | No / FT | `PIN_ETH_RST` → same | `PIN_ETH_RST` | W5500 is released during MCU reset/boot → E-02 (absorbs D-04). ▶ audit (verified): **4.7 k C23162 `/ETH_RST` → GND at U11.37** → ≤ 0.62 V worst case (W5500 internal 62–112 kΩ pull-up + PA15 30–50 kΩ); 100 k gives 2.75 V and fails | +| 51 | PC10 | /MODEM_PWR_EN | U20.3 EN (AP64350), R113 100 k PD | Modem buck enable, HIGH = on | OUT PP, LOW at boot | GPIO | No / FT | V5: NC (**V5.6 used PC3**) → new | `PIN_MODEM_PWR_EN` | any MCU reset power-cycles the modem (by design). ▶ audit A-01: U20 input moves to /MAIN5V only (D20 removed, no D21); EN control unchanged (R113 100 k PD, EN pull-up 1.5 µA → 0.15 V = OFF) | +| 52 | PC11 | /MODEM_RST | Q21 2N7002 gate, R115 100 k PD → U19.16 RESET | Modem reset; MCU HIGH = asserted | OUT PP, LOW at boot | GPIO | No / FT | V5: NC (**V5.6 used PC1**) → new | `PIN_MODEM_RST` | | +| 53 | PC12 | /GNSS_RESET_N | U18.49 RESET_N, R105 10 k → /3V3_GNSS | F9P hard reset, LOW = reset | **OUTPUT_OPEN_DRAIN** (or INPUT); never push HIGH | GPIO | No / FT | V5: NC → new | `PIN_GNSS_RESET_N` | push-HIGH with F9P off = back-feed | +| 54 | PD2 | unconnected (NC flag) | — | spare | ANALOG | TIM3_ETR AF2, EXTI2 | — | V5: NC | `PIN_ETH_PWR_EN` (▶ audit) | ▶ audit E-01 (verify_1 (h)): `/ETH_PWR_EN` → U12.2 EN, 100 k C25803 → GND; HIGH = 3V3_ETH on. D-08's 10 k board-ID strap on this pin conflicts and is unresolved | +| 55 | PB3 | /CHRG_STAT | U6.8 CHRG (open-drain), R57 100 k → /3V3 | LOW = charging | IN, no pull | GPIO, **EXTI3** (JTDO/SWO AF0 at reset; TIM2_CH2) | No (3V3 pull-up) / FT | `PIN_CHRG_STAT` → same | `PIN_CHRG_STAT` | SWO trace unavailable | +| 56 | PB4 | /CHRG_FAULT | U6.9 FAULT (open-drain), R58 100 k → /3V3 | LOW = fault / NTC pause | IN | GPIO, EXTI4 (NJTRST pull-up at reset) | No / FT | `PIN_CHRG_FAULT` → same | `PIN_CHRG_FAULT` | "pausa NTC" = EN allowed ∧ STAT idle ∧ FAULT low. ▶ audit: the power auditor decodes from the LTC4040 datasheet table (p.14) "pausa NTC" = CHRG low ∧ FAULT low, bad battery = CHRG high ∧ FAULT low; use that decode | +| 57 | PB5 | /BYP_CTRL | R40 1 k → Q6 MMBT3904 (R41 10 k B–E) → K1 coil (/SYS5V) | K1 Mode B; HIGH = energised = modem DIN ← PC6 | OUT PP, LOW at boot | GPIO (TIM3_CH2 AF2) | No / TC (output only ✓) | `PIN_BYP_CTRL` → same pin; NO contact now = PC6 (was PA9) | `PIN_BYP_CTRL` | K1 0.15 W while held | +| 58 | PB6 | /I2C_SCL | R30 4.7 k; U3 SHT40, U10 SC16IS752, U13 PCF8574, U26 SC7A20 | I2C1 SCL | AF OD | **I2C1_SCL AF4** | No / FT | `PIN_I2C_SCL` → same | `PIN_I2C_SCL` | Map: 0x18 SC7A20 (new), 0x20 PCF8574, 0x44 SHT40, 0x4D SC16IS752. **No TMP102** (0x48/0x49) on v6 as drawn. ▶ audit F-51: TMP102 C99269 at 0x48 (ADD0 → GND) between U6 and L6; F-52 option: second TMP102 at 0x49 | +| 59 | PB7 | /I2C_SDA | R31 4.7 k; same devices | I2C1 SDA | AF OD | **I2C1_SDA AF4** | No / FT | `PIN_I2C_SDA` → same | `PIN_I2C_SDA` | | +| 60 | BOOT0 | /BOOT0 | R98 10 k → GND (3.65 mm), SW2 → 3V3 | Boot select | I (B) | — | — | — | — | route 73.2 mm (61.4 mm on In1) | +| 61 | PB8 | /SER_IRQ | U10.15 IRQ (open-drain), R81 10 k → 3V3 | SC16IS752 IRQ | IN | GPIO, **EXTI8** | No / FT | `PIN_SER_IRQ` → same | `PIN_SER_IRQ` | | +| 62 | PB9 | /ACC_INT1 | U26.5 INT1 (push-pull, active HIGH default) | Motion interrupt / STOP wake | IN, EXTI rising | GPIO, **EXTI9** (TIM4_CH4, TIM11_CH1) | No / FT | V5: NC → new | `PIN_ACC_INT1` | owns EXTI9 | +| 63 | VSS | GND | — | ground | power | — | — | — | — | | +| 64 | VDD | /3V3 | C110 3.90 mm (shared with pin 1), C108 4.63 mm | supply | power | — | — | — | — | | + +Count check: 50 GPIO pads (PA0–PA15 = 16, PB0–PB10 + PB12–PB15 = 15, PC0–PC15 = 16, PD2 = 1, PH0/PH1 = 2) + NRST, BOOT0, VBAT, VCAP1, VDDA, VSSA (6) + VDD ×4 + VSS ×4 = **64**. 60 pins are connected; the 4 truly unconnected spares are **PA9, PB10, PC5, PD2**. + +## 2. Conflictos y banderas + +### 2.1 Pines de firmware que desaparecen o cambian de significado en v6 + +| Ítem V5 | Estado en v6 | Sustituto / acción | +|---|---|---| +| `PIN_USART1_TX` PA9 + `Uart RELAY(PA10, PA9)` | PA9 sin conexión (bandera NC) | La **consola nunca estuvo en PA9**: `CON = SerialUSB` (PA11/PA12, J11) no cambia. PA9 era el camino de inyección del Modo B hacia el módem por K1 NO. En v6 ese camino es **PC6 USART6_TX → K1.10 (NO)**, y el MCU ahora también escucha al módem en **PC7 USART6_RX**. USART1 queda como derivación **solo RX** en PA10 (TXD2 del F9P). En v6 no existe pin TX de depuración por UART (D-12). | +| `PIN_PWR_CTRL` PA1 | Solo riel del GNSS | La alimentación del módem es `PIN_MODEM_PWR_EN` PC10. Los ciclos de etapa nunca deben usarse para recuperar el módem. | +| Puente PCF8574 P7 → SW4G1 `MODEM_RST` (`PCF_MODEM_RST_BIT 0x80`, `ENABLE_MODEM_RST`) | U13.12 (P7) sin conexión; no hay SW4G1 | Eliminar el camino del puente; usar PC11 (reset) / PC8 (PWRKEY) / PC10 (alimentación). | +| TMP102 0x48 (`I2C_ADDR_TMP102`, fuente de `CHG_CELL_HOT/COOL`) | **no hay TMP102 en v6** | La temperatura de celda para el gobernador no tiene fuente en la tarjeta. ▶ audit F-51 (Mayor, verificado): TMP102 C99269 en 0x48 junto a U6 (`tchg`) + derivación de la NTC del paquete en PC5 (`tcell`, válida con VEH5V presente). | +| `PIN_ETH_INT` V4 = PB2 | PC0 en v6 (como V5) | ✓ | +| `board_v56.h` de V5.6 (ECO §H): MODEM_EN PC3, MODEM_RST PC1, MODEM_LED PC2, ONSLP PC4, ASSOC PC5, RTCM_TAP PC7 | v6: PC1/PC2 = entradas del F9P, **PC3 = salida RTK_STAT del F9P**, PC4 = NTC2 | `board_v56.h` y `board_v6.h` nunca deben compartir binario: un build V5.6 maneja PC3 en ALTO contra el RTK_STAT push-pull del F9P. Se propuso un strap de identificación de tarjeta (D-08); su pin PD2 ahora lo reclama E-01, así que el pin del strap queda abierto (PA9 es el único libre). | + +### 2.2 Nets de v6 sin contraparte en firmware (nuevas para 0.7.x) + +PA7 GNSS_TIMEPULSE · PC1/PC2 ANT_DETECT/ANT_SHORT_N (entradas del F9P, reserva) · PC3 GNSS_RTK_STAT · PC4 NTC2 · PC6/PC7 USART6 · PC8 PWRKEY · PC9 STATUS · PC10 MODEM_PWR_EN · PC11 MODEM_RST · PC12 GNSS_RESET_N · PB9 ACC_INT1 (SC7A20 en 0x18). + +### 2.3 Comprobaciones de ADC y de 5 V + +- Toda net analógica está en un pad con ADC: BAT_SENSE PA0/IN0, 5V_SENSE PA4/IN4, IGN_SENSE PA5/IN5, NTC_TEMP PB1/IN9, NTC2 PC4/IN14. Pad ADC libre: PC5/IN15. ✅ +- Ninguna señal de 5 V en ningún pin; los dos pines TC llevan PA0 ≤ 2.10 V y PB5 (salida). ✅ +- IGN_SENSE es el único pin que puede exceder VDD: llega a 3.23 V con 28 V, y el clamp BAT54 lo sostiene en ≈ 3.55–3.65 V por encima de ≈ 30.3 V (0.24 mA a 36 V, 1.2 mA a 58 V hacia /3V3). En modo analógico se pierde la tolerancia FT, así que el clamp es lo que lo protege. No hay clamp negativo (D-06). + +### 2.4 Asignación de funciones alternas, temporizadores y EXTI + +- **Sin conflictos de AF.** USART2 PA2/PA3 AF7 · USART6 PC6/PC7 AF8 · USART1_RX PA10 AF7 (sin TX) · SPI2 PB13/PB14/PB15 AF5 (CS PB12 como GPIO) · I2C1 PB6/PB7 AF4 · OTG_FS PA11/PA12 AF10 · SWD PA13/PA14 AF0. Cada periférico usa un conjunto de AF consistente. +- El TX de USART1 no se puede recuperar: sus alternativas son PA9 (NC), PA15 (ETH_RST) y PB6 (I2C1_SCL). +- Temporizadores: ventilador PA6 = TIM3_CH1 y PPS PA7 = TIM3_CH2 comparten la base de tiempo de TIM3. La política del ventilador es ON/OFF (GPIO, `drogheda-fan-policy`), así que TIM3 queda libre para capturar el PPS. Si algún día se restaura el PWM del ventilador, marcar el tiempo del PPS por EXTI7 (contador de ciclos DWT). El arranque suave de PA1 usa TIM2_CH2 (libre). +- Colisiones EXTI (un puerto por línea, SYSCFG_EXTICR): **EXTI3** = PC3 RTK_STAT y PB3 CHRG_STAT; **EXTI9** = PB9 ACC_INT1 y PC9 MODEM_STATUS. Asignar EXTI9 al acelerómetro (despertar por movimiento) y sondear STATUS. Asignar EXTI3 a RTK_STAT solo si se quiere medir el parpadeo, y sondear CHRG_STAT. EXTI0 (ETH_INT), EXTI7 (PPS) y EXTI8 (SER_IRQ) son únicos. + +### 2.5 Pines que tocan al ZED-F9P (regla de retorno de corriente, lección 0.5.5/0.5.6) + +Mientras `PIN_GNSS_PWR` esté en BAJO: PA2 INPUT sin pull; PA10 sin pull (su pull-up interno es de 7–14 kΩ); PC7 sin pull-up; PC12 liberado (open-drain); PA7/PC3 sin pull-up; PC1/PC2 analógicos. **El camino de hardware U24 → /DOUT_4G → U18.26 no se puede corregir por firmware** salvo manteniendo el módem apagado siempre que el F9P esté apagado (D-01, Mayor, absorbe C-06). ▶ audit (corrección verificada): U27 = Nexperia 74LVC1G125GV **C12518** (Ioff ±2 µA) alimentado de /3V3_GNSS, OE̅ = GND, 100 nF C14663; Rdfu1 → 100 k C25803. Comprobación de banco: /3V3_GNSS < 0.3 V con PA1 en BAJO y el módem encendido. + +## 3. Arranque y depuración + +| Ítem | v6 | Veredicto | +|---|---|---| +| BOOT0 | R98 10 k → GND a 3.65 mm; SW2 a 3V3 (serigrafía «BOOT») | ✅ | +| BOOT1 / trampa DFU en PB2 | PB2 solo en R99 10 k → GND (2.84 mm); ETH_INT en PC0 | ✅ (memoria `drogheda-einarboard-30-mcu-integration`) | +| El DFU de ROM necesita HSE | Y3 25 MHz está soportado, pero la colocación del cristal y el margen de gm son pobres | ⚠ D-02 | +| NRST | C104 100 nF (3.26 mm, valor del DS10314) · SW1 (táctil 6 mm, NRST en el par de pads de 6.5 mm, GND en el otro) · P6 RESET-EXT (JST-XH, era P10 en V5) · TP5. Llega solo al MCU. | ✅ circuito / ⚠ sin ESD en P6 (G-08) | +| SWD | TP3 SWDIO (6.04 mm), TP4 SWCLK (5.43 mm), TP5 NRST, TP6 GND (a 17.6 mm), TP7 3V3. Sin header. SWO imposible (PB3 = CHRG_STAT). | ⚠ usable con pinzas; D-12 | +| USB DFU | PA11/PA12 → J11 (USB-C, CC 5.1 k ×2), D14/D15/D16 PESD5V0S1BA a 3.19 / 6.74 / 6.83 mm de J11; VBUS → D13 → AMS1117 (OR con SYS5V vía D12, sin retorno hacia SYS5V) | ✅ ECO E.5 (parte DFU) cumplida | +| HSE | Y3 C14872 YXC HC-49S 25 MHz, **CL 20 pF**, −20…+70 °C, con C113/C114 15 pF → CL_eff = 7.5 + (5…10) pF parásitos = 12.5–17.5 pF. Pads a 8.32/11.30 mm borde (10.30/14.21 mm centro) de PH0/PH1 (objetivo ≤ 5). | ❌ D-02 (Menor, verificado) | +| LSE | Y4 C32346 Epson FC-135, **CL 12.5 pF, ESR 70 kΩ**, con capacitores de 12 pF → CL_eff ≈ 9 pF. Pads a 5.54/7.91 mm. | ⚠ D-03 | + +## 4. Señales específicas + +- **CHRG_STAT PB3 / CHRG_FAULT PB4:** open-drain del LTC4040 (máx. absoluto 6 V), R57/R58 100 k a /3V3 (riel del MCU siempre encendido, así que no hay retorno). ✅ PFO (U6.20) va solo a TP2, sin pull-up y sin pin del MCU. RST (U6.11) sin conexión. **CLPROG** va solo a TP1 (D-10). ▶ audit: PFO → PB10 (A-13); CLPROG se queda en TP1 (no queda pin ADC una vez que PC5 toma la NTC del paquete). +- **IGN_SENSE:** 22 k / (22 k ∥ 3.3 k = 2.870 k) → relación 0.1154 (partes ±1 %: 0.1134–0.1174). Voltaje en el pin: **12 V → 1.385 V** (1.30 V con el pull-down interno que habilita el firmware V5), **24 V → 2.769 V**, **28 V → 3.231 V**, **36 V → 4.154 V en circuito abierto, recortado a ≈ 3.55 V** (BAT54 0.24 mA). 58 V: 1.2 mA de corriente de clamp; Rig1 disipa 0.135 W (> 0.1 W del 0603, solo transitorio). La escala completa del ADC se alcanza a 28.6 V. Umbrales digitales (DS10314 tabla 53, probados en producción VIL 0.3 VDD = 0.99 V, VIH 0.7 VDD = 2.31 V): un ALTO está garantizado solo por encima de **20.0 V**. **Una ignición de 12–14.4 V queda en la banda indefinida.** Comprobación de unión: /IGN_SENSE = {Rig1.2, Rig2.1, Rigb1.1, C9.1, D5.2 (A), U16.21}, una sola net en la netlist y en la PCB (6 pads, 1 grupo conectado, 14.2 mm en F.Cu). **La pérdida de unión de la V5.6 no está presente en v6.** ✅ ▶ audit F-02 (Bloqueante): el `/IGN_IN` crudo corre 106.47 mm en In2 a 0.221 mm de `/VEH5V`; mover Rig1 a P1.3 convierte ese tramo en `/IGN_SENSE` limitado en corriente (≤ 1.4 mA a 36 V, 2.5 mA a 58 V); C9 en el MCU mantiene τ = 0.25 ms. D-05 cambia la relación a 0.0833 si Rigb1 = 2.2 k. +- Control del módem: PC10 → U20 EN (R113 100 k PD); PC8 → Q20 → PWRKEY (R114 PD); PC11 → Q21 → RESET (R115 PD); PC9 ← U24 ← STATUS 1.8 V. Todos apagados o liberados por omisión en reset/DFU. ✅ +- **GNSS:** RESET_N PC12 con R105 10 k a /3V3_GNSS (manejo open-drain) ✅; TIMEPULSE PA7 ✅; RTK_STAT PC3 ✅; ANT_DETECT/ANT_SHORT_N son entradas del receptor sin nada que las maneje (D-07). +- **INT1 del acelerómetro (T11):** PB9 EXTI9, push-pull ✅. +- **NTC2:** PC4, R126 10 k/1 % + C157 100 nF (3.11 mm), P8 ✅. +- **USART6 PC6/PC7:** AF8 en ambos ✅. TX va por K1 NO (solo Modo B). RX va por R106 100 Ω y siempre está conectado. +- **Banderas NC de ERC en U16.37/38 y U10.13/14:** cosméticas. Los cuatro pines están en sus nets en la netlist (U16.37 ∈ /USART6_TX {K1.10}; U16.38 ∈ /USART6_RX {R106.2}; U10.13/14 ∈ /I2C_SCL/SDA), los pads de la PCB llevan las mismas nets (verificado por IPC-356) y las cuatro nets están ruteadas. Las banderas deben borrarse de todos modos (D-11). + +## 5. Lista de cambios de firmware — `board_v6.h` / FW 0.7.x + +**Pines cuyo significado cambia respecto a V5:** PA1 (solo GNSS), PA9 (desaparece), PA10 (derivación solo RX, F9P directo), PB5 (el NO de K1 ahora es PC6), PA5 (leer analógico), PC1/PC2/PC3/PC4/PC6–PC12/PA7/PB9 (nuevos), TMP102 y el reset por P7 del PCF (desaparecen). + +Periféricos nuevos por inicializar: USART6 (PC7 RX, PC6 TX, 115200, AT + contador de bytes RTCM); USART1 solo RX en PA10; captura TIM3_CH2 o EXTI7 en PA7 (PPS); EXTI9 en PB9 y el SC7A20 en 0x18 (compatible LIS3DH: CTRL_REG1/3, INT1_CFG/THS/DURATION); canales ADC IN5 (IGN) e IN14 (NTC2); LSE en modo de alto drive (`LSEMOD`) con respaldo LSI para el despertar por RTC; W5500 como en V5. + +**En BAJO por omisión en las primerísimas líneas de `setup()`** (antes de cualquier delay o inicialización de USB): PC10 MODEM_PWR_EN, PC8 PWRKEY, PC11 MODEM_RST, PA1 GNSS_PWR, PB5 BYP_CTRL, **PA15 ETH_RST** (sale del reset en ALTO por el pull-up JTDI; el 4.7 k de E-02 lo mantiene bajo hasta entonces), PA6 FAN, PB0 EXT_LED y **PD2 ETH_PWR_EN** si se adopta E-01. PA8 CHRG_EN pertenece al gobernador (ALTO hasta que decida). + +Entradas nuevas si se adoptan las correcciones de la auditoría: PB10 PFO (EXTI10 flanco de bajada, A-13); PC5 ADC1_IN15 NTC del paquete, relación 120/220 (F-51); TMP102 en 0x48 (F-51) y opcionalmente 0x49 (F-52); PC2 falla de corto de antena desde el TPS2552 (C-01). + +Dejar en alta impedancia / analógico: PA9, PB10, PC5, PD2 (salvo que se adopten E-01 / A-13 / F-51, que toman PD2 / PB10 / PC5), PC1, PC2; todos los pines hacia el F9P mientras el F9P esté apagado (§2.5); PC7/PC9 mientras el módem esté apagado (PC9 con pull-down). + +Open-drain: PC12. Los drivers de PC8/PC11 son FET externos, así que los pines del MCU son push-pull. + +Secuencia: PA1 ALTO → ≥ 4 s → PC10 ALTO → 100 ms → pulso PC8 ALTO ≥ 50 ms → esperar PC9 ALTO (≈ 11.2 s) o `RDY` por AT → trabajo → apagado por AT o PC8 ALTO ≥ 2.5 s → PC10 BAJO → PA1 BAJO. **Nunca** dejar PC10 en ALTO con PA1 en BAJO (D-01) salvo que esté montada la corrección de hardware de D-01. Cualquier reset del MCU apaga y enciende el módem (R113) y el F9P (PA1 flota), así que la lógica de recuperación debe asumir un módem frío después de cada reset. + +Borrador del encabezado: + +```c +// board_v6.h — EinarBoard v6 (hbox-watchdog-v6), STM32F411RET6 LQFP64 +#define HBOX_BOARD_NAME "EinarBoard v6 (HBOX v6)" +#define HBOX_BOARD_MCU "STM32F411RET6 LQFP64" +#define BOARD_HSE_HZ 25000000UL +#define BOARD_LSE_HZ 32768UL +#define BOARD_SER_XTAL_HZ 3686400UL // Y2 = C2238 (3.6864 MHz; schematic value text says 1.8432 MHz) +// power / analog +#define PIN_BAT_SENSE PA0 // ADC1_IN0, /2 +#define PIN_GNSS_PWR PA1 // HIGH = F9P rail on (Q5->Q1->SW_5V->U21). Was PIN_PWR_CTRL (stack) +#define PIN_PWR_CTRL PIN_GNSS_PWR +#define PIN_5V_SENSE PA4 // ADC1_IN4, /2 (VEH5V = U25 or P2) +#define PIN_IGN_SENSE PA5 // ADC1_IN5 — READ ANALOG (12 V: 1.39 V, 24 V: 2.77 V) +#define PIN_NTC PB1 // ADC1_IN9, P7 probe 1 +#define PIN_NTC2 PC4 // ADC1_IN14, P8 probe 2 +#define PIN_CHRG_EN PA8 // HIGH = charger OFF (R56 PD -> ON in reset) +#define PIN_CHRG_STAT PB3 // LOW = charging (OD, R57 100k) +#define PIN_CHRG_FAULT PB4 // LOW = fault / NTC pause (OD, R58 100k) +#define PIN_FAN PA6 // HIGH = fan on (TIM3_CH1 if PWM) +#define PIN_LED_C13 PC13 // active LOW +#define PIN_EXT_LED PB0 // HIGH = panel LED (P9) +// GNSS (ZED-F9P U18) +#define PIN_GNSS_TX PA2 // USART2_TX AF7 -> F9P RXD (hi-Z when F9P off!) +#define PIN_GNSS_RX PA3 // USART2_RX AF7 <- F9P TXD +#define PIN_F9P_TX2_TAP PA10 // USART1_RX AF7 <- F9P TXD2 (RX-only, no pull) +#define PIN_GNSS_PPS PA7 // TIM3_CH2 AF2 / EXTI7 +#define PIN_GNSS_RTK_STAT PC3 // 0 fixed / blink corrections / 1 none +#define PIN_GNSS_RESET_N PC12 // OPEN-DRAIN only +#define PIN_GNSS_ANT_DET PC1 // F9P INPUT — keep analog/hi-Z +#define PIN_GNSS_ANT_SHORT_N PC2 // F9P INPUT — keep analog/hi-Z +// modem (A7670SA U19) +#define PIN_MODEM_TX PC6 // USART6_TX AF8 -> K1 NO -> U23 -> RXD (Mode B) +#define PIN_MODEM_RX PC7 // USART6_RX AF8 <- R106 <- U24 <- TXD +#define PIN_MODEM_PWRKEY PC8 // HIGH = key pressed (Q20) +#define PIN_MODEM_STATUS PC9 // INPUT_PULLDOWN, HIGH = modem on +#define PIN_MODEM_PWR_EN PC10 // HIGH = U20 on (R113 PD) +#define PIN_MODEM_RST PC11 // HIGH = reset asserted (Q21) +#define PIN_BYP_CTRL PB5 // HIGH = K1 energised (modem DIN <- PC6) +// I2C1 / expanders / sensors +#define PIN_I2C_SCL PB6 +#define PIN_I2C_SDA PB7 +#define PIN_SER_IRQ PB8 // SC16IS752 IRQ, EXTI8 +#define PIN_ACC_INT1 PB9 // SC7A20 INT1, EXTI9 +#define I2C_ADDR_SC7A20 0x18 +#define I2C_ADDR_PCF8574 0x20 +#define I2C_ADDR_SHT40 0x44 +#define I2C_ADDR_SC16IS 0x4D +// Ethernet (W5500 U11, SPI2) +#define PIN_ETH_CS PB12 +#define PIN_ETH_SCK PB13 +#define PIN_ETH_MISO PB14 +#define PIN_ETH_MOSI PB15 +#define PIN_ETH_INT PC0 +#define PIN_ETH_RST PA15 // JTDI pull-up at reset: drive LOW first (E-02: 4.7k PD C23162) +// spare as drawn: PA9 (USART1_TX), PB10, PC5 (ADC1_IN15), PD2 +// --- only if the audit fixes are adopted (verify_1 conflict (h)) --- +// #define PIN_ETH_PWR_EN PD2 // E-01: HIGH = 3V3_ETH on (100k PD) +// #define PIN_PFO PB10 // A-13: LTC4040 PFO, LOW = backup, EXTI10 falling +// #define PIN_NTC_CELL PC5 // F-51: ADC1_IN15, /NTC * 120/220, valid with VEH5V +// #define I2C_ADDR_TMP102_CHG 0x48 // F-51: charger die area (U6/L6) +// #define I2C_ADDR_TMP102_MODEM 0x49 // F-52 option +// PA9 stays spare (D-12 test pad); board-ID strap (D-08) pin unresolved +``` + +Ver también: [manual v6](../manuales/manual-tarjeta-v6.md) · [auditoría completa v6](v6-auditoria-completa.md) · [informe de cambios al esquemático v6](v6-cambios-esquematico.md) · [revisión contra lecciones V5.5](v6-revision-lecciones-v55.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-28 | Mapa de pines de la auditoría v6, republicado con 7 correcciones editoriales (inglés). | +| 1.1 | 2026-09-29 | Prosa y encabezados en español; tabla y borrador de `board_v6.h` sin cambios. | + +??? note "Anexo técnico — trazabilidad" + Snapshot: sch `ecee9fed…` / pcb `6ddec80d…` (paquete de evidencia 2026-09-28). Los archivos `evidence/*.csv` citados arriba están en `03-Architecture-Hardware/kicad/_to_delete/v6-audit-20260928/evidence/`. diff --git a/docs/hardware/v6-prefab-audit.md b/docs/hardware/v6-prefab-audit.md index 2a6919a..eaf472e 100644 --- a/docs/hardware/v6-prefab-audit.md +++ b/docs/hardware/v6-prefab-audit.md @@ -1,9 +1,9 @@ --- -title: HBOX v6 — Pre-fabrication audit and work list +title: "HBOX v6 — Auditoría pre-fabricación y lista de trabajo (versión en inglés)" tags: [project-drogheda, hardware, hbox, v6, pcb, audit, jlcpcb] +date: 2026-09-25 project: Project Drogheda author: Helgen Technologies -date: 2026-09-25 version: 1.0 status: ACTIVE — do NOT order until section 3 is closed audience: Michelle (layout), Leo @@ -11,13 +11,19 @@ audience: Michelle (layout), Leo # HBOX v6 — Pre-fabrication audit +!!! note "Versión en inglés" + Versión en inglés — la versión en español es [Auditoría pre-fabricación v6](v6-auditoria-prefab.md). + +!!! warning "Tarjeta: EinarBoard **v6** — proyecto KiCad `hbox-watchdog-v6` (EN DISEÑO, no se pide todavía) / Board: v6, in design" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. + **Board:** `hbox-watchdog-v6` (repo **HBox_PCB**) · **Planned order:** 5 prototypes at JLCPCB (PCB + assembly) · **Date:** 25-Sep-2026 · [Versión en español](v6-auditoria-prefab.md) -!!! danger "Verdict: NOT ready to order yet" +!!! warning "Verdict: not ready to order yet" Everything that depended on the schematic, BOM and attributes **is already fixed** (section 2). What's left is **layout work** (section 3, Michelle) and **three decisions/purchases** (section 4, Leo). - When Michelle pushes her work, Claude re-runs the full audit and gives the final **GO**. + When Michelle pushes her work, the full audit is re-run and the final **GO** is given. **Status today:** DRC **0 errors**, 0 unconnected, 0 dangling tracks · ERC **0 errors** · BOM: every populated part has a verified LCSC number. @@ -28,8 +34,8 @@ BOM: every populated part has a verified LCSC number. DRC only compares geometry against the file's own clearance rules. It **cannot see**: -- a switching regulator with its diode 18 mm away (it must be ≤ 4 mm), -- a 0.25 mm track carrying 2.5 A, +- a switching regulator with its diode 18 mm away (it must be ≤ 4 mm), +- a 0.25 mm track carrying 2.5 A, - a part with no LCSC number (JLC simply **doesn't place it**), - a power chip with **no vias** under its thermal pad. @@ -44,8 +50,8 @@ That's what this audit checked. | ✅ | **SIM: the physical SIM holder is now the primary SIM** | Telcel won't supply the MFF2. **J14** (JAE nano-SIM, LCSC C2977286) + R131–R134 are **fitted**; U22 (MFF2) + R127–R130 are **not fitted (DNP)**. The MFF2 footprint stays on the board as a future option. | | ✅ | **U19 (modem) and L22** set to SMD | They were marked "through-hole", so JLC would have left them off the SMT line. Also fixed in the library. | | ✅ | **64 parts with no LCSC number** | All given verified numbers from the JLC database (Basic where possible). JP1–JP5 (solder jumpers) removed from the BOM. | -| ✅ | **Input fuse F2** | Now a **fuse in a holder**: Littelfuse **0154002.DR** (C206910), 9.7 × 5 mm SMD block with a 2 A / 125 V NANO2 fuse. In the field the **fuse pulls out and is replaced without soldering**. *(The PCB footprint still has to be swapped → task M2.)* | -| ✅ | **Mounting holes** | All 4 on an exact **130.0 × 90.0 mm** rectangle, 5 mm from each edge; unique names MH5–MH8. | +| ✅ | **Input fuse F2** | Now a **fuse in a holder**: Littelfuse **0154002.DR** (C206910), 9.7 × 5 mm SMD block with a 2 A / 125 V NANO2 fuse. In the field the **fuse pulls out and is replaced without soldering**. *(The PCB footprint still has to be swapped → task M2.)* | +| ✅ | **Mounting holes** | All 4 on an exact **130.0 × 90.0 mm** rectangle, 5 mm from each edge; unique names MH5–MH8. | | ✅ | Cleanup | 6 dangling track pieces deleted; "respaldo" copies out of git; power-width rules added to DRC. | --- @@ -53,7 +59,7 @@ That's what this audit checked. ## 3. What's left — **Michelle's** work list !!! warning "Before you start — three rules" - 1. **`git pull` first.** Claude changed the `.kicad_pcb` today (attributes, LCSC, holes, fuse). + 1. **`git pull` first.** The `.kicad_pcb` changed today (attributes, LCSC, holes, fuse). If you work on an old copy and save it, all of that is lost. 2. **Do NOT use "Update PCB from Schematic"** until Leo decides J10/P11/P12 (section 4): it would set them back to fitted. @@ -68,22 +74,22 @@ Recommended order (highest impact first): ### M2 · Swap the F2 (fuse) footprint - [ ] In the PCB: right-click **F2** → *Change Footprint…* → `Fuse:Fuseholder_Littelfuse_Nano2_154x`. -- [ ] The block is **9.7 × 5 mm** (was 4.5 × 3.2). Keep it near its current spot (159.5, 127), - between **P1** (24 V input) and **Q23**. Tracks **/24V_IN** and **/VIN_FUSED** **≥ 1.5 mm**. -- [ ] Leave **tweezer access** to the fuse (it pulls straight up): nothing tall within 2 mm of its long sides. +- [ ] The block is **9.7 × 5 mm** (was 4.5 × 3.2). Keep it near its current spot (159.5, 127), + between **P1** (24 V input) and **Q23**. Tracks **/24V_IN** and **/VIN_FUSED** **≥ 1.5 mm**. +- [ ] Leave **tweezer access** to the fuse (it pulls straight up): nothing tall within 2 mm of its long sides. -### M3 · Rebuild the U25 regulator group (24 V → 5 V) — **the most important one** +### M3 · Rebuild the U25 regulator group (24 V → 5 V) — **the most important one** -**Problem:** U25 (TPS54360B) sits 15 mm north of its power parts: +**Problem:** U25 (TPS54360B) sits 15 mm north of its power parts: | Measurement | Now | Target | |---|---|---| -| Diode **D34** (cathode) → U25 pin 8 (SW) | **18.2 mm** | **≤ 4 mm** | -| Input capacitors **C149/C150** → pin 2 (VIN) | 5–8 mm | **≤ 3 mm** | -| Inductor **L22** (pad 1) → pin 8 | **25.9 mm** | ≤ 12 mm (L22 is big; acceptable) | -| SW node copper (pin 8 → D34 → L22) | 0.5 mm track | **polygon ≥ 2 mm**, as short as possible | +| Diode **D34** (cathode) → U25 pin 8 (SW) | **18.2 mm** | **≤ 4 mm** | +| Input capacitors **C149/C150** → pin 2 (VIN) | 5–8 mm | **≤ 3 mm** | +| Inductor **L22** (pad 1) → pin 8 | **25.9 mm** | ≤ 12 mm (L22 is big; acceptable) | +| SW node copper (pin 8 → D34 → L22) | 0.5 mm track | **polygon ≥ 2 mm**, as short as possible | | GND vias under U25's thermal pad | **0** | **≥ 6** (to In1 and In2) | -| R120–R123, C155, C156 (compensation/FB/RT) | nearby | ≤ 5 mm from pins 3–6, **away from SW** | +| R120–R123, C155, C156 (compensation/FB/RT) | nearby | ≤ 5 mm from pins 3–6, **away from SW** |
![Correct U25 part order](img/u25-lazo-caliente.svg){ width="100%" } @@ -94,24 +100,24 @@ So **U25 moves down to its big parts**, instead of moving the big parts up. Steps: -- [ ] **Step 1 — Move C151 out** (100 µF electrolytic, now at 173.75, 123.9). It's only an energy - reservoir and works the same 10–20 mm away. Suggestion: rotated 90°, centred at ≈ **(169.5, 112)**, +- [ ] **Step 1 — Move C151 out** (100 µF electrolytic, now at 173.75, 123.9). It's only an energy + reservoir and works the same 10–20 mm away. Suggestion: rotated 90°, centred at ≈ **(169.5, 112)**, the gap U25 leaves behind. It stays on **/VIN_PROT**. - [ ] **Step 2 — Put U25 where C151 was**, centre ≈ **(175.5, 124.5)**, rotated so that **pin 8 (SW)** is the corner **closest to D34's cathode** (D34's south pad, at 182.5, 126.65) and **pin 2 (VIN)** faces **west**. -- [ ] **Step 3 — C149 and C150 right against pin 2 (VIN)**, ≤ 3 mm, with their GND end toward U25's +- [ ] **Step 3 — C149 and C150 right against pin 2 (VIN)**, ≤ 3 mm, with their GND end toward U25's thermal pad. This is the loop that radiates: **input → U25 → D34 → GND → input**. Keep it tiny. - [ ] **Step 4 — D34 stays** where it is (182.5, 123.25). Its **anode (GND)** goes to the same GND island as C149/C150 and U25's pad. - [ ] **Step 5 — L22 stays.** Join pin 8 → D34 cathode → L22 pad 1 (193.5, 126.9) with **one polygon - ≥ 2 mm wide**. No wider than needed (this is the node that "shouts"). + ≥ 2 mm wide**. No wider than needed (this is the node that "shouts"). - [ ] **Step 6 — Small parts go with U25:** C152 (BOOT) between pin 1 and pin 8; R120, R121, R122, R123, - C155, C156 on the pin 3–6 side (**quiet side**). The FB divider (R121/R122) senses 5 V **at the + C155, C156 on the pin 3–6 side (**quiet side**). The FB divider (R121/R122) senses 5 V **at the output capacitors** C153/C154, not at the inductor pad. - [ ] **Step 7 — Ground:** one GND island on F.Cu under the whole group, **≥ 6 vias under U25's thermal pad**, and 2–3 vias next to each capacitor GND and D34's anode. -- [ ] **Step 8 — /VIN_PROT** from Q23 to C149/C150: **≥ 1.5 mm** (or a polygon). +- [ ] **Step 8 — /VIN_PROT** from Q23 to C149/C150: **≥ 1.5 mm** (or a polygon). !!! tip "Reference" This is the same arrangement as TI's reference layout for the TPS54360 and the @@ -121,12 +127,12 @@ Steps: | Measurement | Now | Target | |---|---|---| -| L20 (SW pad) → U20 pin 8 (SW) | 7.6 mm, **23 mm** track at 0.25 mm | **≤ 3 mm**, short track **≥ 1 mm** | -| C127 (10 µF) → U20 pin 2 (VIN) | 5.4 mm | **≤ 3 mm** | +| L20 (SW pad) → U20 pin 8 (SW) | 7.6 mm, **23 mm** track at 0.25 mm | **≤ 3 mm**, short track **≥ 1 mm** | +| C127 (10 µF) → U20 pin 2 (VIN) | 5.4 mm | **≤ 3 mm** | | GND vias under U20's pad | 0 | **≥ 4** | - [ ] Move **L20** next to U20 pin 8 and route **/SW_MODEM** short and wide. -- [ ] Move **C127** next to pin 2. (C128 is already fine, at 2 mm.) +- [ ] Move **C127** next to pin 2. (C128 is already fine, at 2 mm.) - [ ] Vias under U20's thermal pad. ### M5 · Vias under the other power chips @@ -140,15 +146,15 @@ Use this table (the DRC warning list is incomplete: it misses SW_BAT and the mod | Priority | Net | Now | Target | Why | |---|---|---|---|---| -| 1 | **/SW_BAT** | 0.25 mm, 12 mm | **≥ 1.0 mm** or polygon | ~2.5 A battery path. Already flagged critical in v5.5 (0.3 mm); v6 is thinner. | -| 2 | **/VEH5V** | 0.25 neck + 0.5 mm, ~110 mm | **≥ 1.0 mm** | U25 output, up to ~3 A | -| 3 | **/MAIN5V**, **/SYS5V** | 0.25–0.5 mm, 100–150 mm each | **≥ 1.0 mm** on the trunk | Main 5 V for the whole board | -| 4 | **/BAT_PLUS** | 0.25–0.5 mm, 118 mm | **≥ 1.0 mm** | Battery current | -| 5 | **/SW_MODEM** | 0.25 mm, 23 mm | ≥ 1.0 mm **and short** | Solved by M4 | -| 6 | **/VBAT_MODEM** | 0.25 neck (1 mm), 0.5 (11 mm) | **≥ 1.0 mm** | 2 A bursts when transmitting | -| 7 | /VIN_MODEM, /SW_IN, /VIN_SW | 0.25–0.5 mm | ≥ 0.8 mm | Regulator inputs | -| — | /VIN_PROT, /SW_PWRIN | 0.5 mm | — | Solved by M3 | -| No | /3V3_ETH, /5V_FAN, /SW_FAN, /FAN_RET | 0.25–0.5 mm | leave | Under 0.3 A | +| 1 | **/SW_BAT** | 0.25 mm, 12 mm | **≥ 1.0 mm** or polygon | ~2.5 A battery path. Already flagged critical in v5.5 (0.3 mm); v6 is thinner. | +| 2 | **/VEH5V** | 0.25 neck + 0.5 mm, ~110 mm | **≥ 1.0 mm** | U25 output, up to ~3 A | +| 3 | **/MAIN5V**, **/SYS5V** | 0.25–0.5 mm, 100–150 mm each | **≥ 1.0 mm** on the trunk | Main 5 V for the whole board | +| 4 | **/BAT_PLUS** | 0.25–0.5 mm, 118 mm | **≥ 1.0 mm** | Battery current | +| 5 | **/SW_MODEM** | 0.25 mm, 23 mm | ≥ 1.0 mm **and short** | Solved by M4 | +| 6 | **/VBAT_MODEM** | 0.25 neck (1 mm), 0.5 (11 mm) | **≥ 1.0 mm** | 2 A bursts when transmitting | +| 7 | /VIN_MODEM, /SW_IN, /VIN_SW | 0.25–0.5 mm | ≥ 0.8 mm | Regulator inputs | +| — | /VIN_PROT, /SW_PWRIN | 0.5 mm | — | Solved by M3 | +| No | /3V3_ETH, /5V_FAN, /SW_FAN, /FAN_RET | 0.25–0.5 mm | leave | Under 0.3 A | - [ ] Priorities 1 to 7. @@ -157,7 +163,7 @@ Use this table (the DRC warning list is incomplete: it misses SW_BAT and the mod - [ ] **Refill zones** (key **B**) — the holes moved and the fill is stale. - [ ] **DRC → 0 errors.** (Yellow track-width warnings left on the "No" nets in the table are fine.) - [ ] Check in the 3D viewer that **J14** (SIM holder) has a clear front: the card enters from one - short end; confirm which on the JAE drawing and leave ~6 mm clear in front of it. + short end; confirm which on the JAE drawing and leave ~6 mm clear in front of it. - [ ] `git add` + `commit` + `push` (section 6) and **tell Leo**. --- @@ -168,7 +174,7 @@ Use this table (the DRC warning list is incomplete: it misses SW_BAT and the mod - [ ] **Decide J10 (RJ45), P11 and P12:** fitted on this run? Today they're DNP on the PCB only. - [ ] **Review the parts where the choice matters:** L20 Sunlord MWSA0804S-4R7MT (C17700167; check its pads fit the SRU8028 footprint), L21 Murata LQG18HN68NJ00D (C162555, GNSS antenna choke), - C149/C150 2.2 µF 100 V (C153036), C151 Nichicon 100 µF 50 V (C116241), RS1 10 mΩ 1 W (C105362), + C149/C150 2.2 µF 100 V (C153036), C151 Nichicon 100 µF 50 V (C116241), RS1 10 mΩ 1 W (C105362), F2 0154002.DR (C206910). --- @@ -177,7 +183,7 @@ Use this table (the DRC warning list is incomplete: it misses SW_BAT and the mod | Option | Value | |---|---| -| Layers / thickness | 4 layers, 1.6 mm, stackup **JLC04161H-7628** | +| Layers / thickness | 4 layers, 1.6 mm, stackup **JLC04161H-7628** | | Finish | **ENIG** (required for the LGA modules U19 and U18) | | Assembly | **Standard PCBA**, top side only | | X-ray | Request on **U19** (A7670SA) and **U18** (ZED-F9P) | @@ -214,5 +220,14 @@ cd ~/Documents/Claude/Projects/Drogheda && git add 03-Architecture-Hardware/kica |---|---| | `bb78cb8` · `0288bd0` | T14: J14 primary, U22 DNP, ERC errors fixed, J14 LCSC | | `91d2049` · `8a49327` | T15: LCSC on 64 parts, JP out of BOM, SIM + U19/L22 on the PCB, dangling tracks, width warnings; library | -| `61652cc` | T16: holes 130 × 90 mm, MH5–MH8 | +| `61652cc` | T16: holes 130 × 90 mm, MH5–MH8 | | `d2db77f` · `03d83d1` | T17: fuse F2 → 0154002.DR holder | + +--- + +## Historial de revisiones + +| Versión | Fecha | Autor | Cambios | +|---|---|---|---| +| 1.0 | 2026-09-25 | Helgen Technologies | Pre-fabrication audit v6 and work list (English). | +| 1.1 | 2026-09-29 | Helgen Technologies | Nota de versión en inglés y vocabulario de avisos. Sin cambios técnicos. | diff --git a/docs/hardware/v6-revision-lecciones-v55.md b/docs/hardware/v6-revision-lecciones-v55.md new file mode 100644 index 0000000..71f9fee --- /dev/null +++ b/docs/hardware/v6-revision-lecciones-v55.md @@ -0,0 +1,251 @@ +--- +title: "EinarBoard v6 — Revisión contra las lecciones de la V5.5 (26–27 sep 2026)" +tags: [project-drogheda, hardware, einarboard, v6, v5.5, revision, lecciones] +date: 2026-09-28 +project: Project Drogheda +author: Helgen Technologies +--- + +# EinarBoard v6 — Revisión contra las lecciones de la V5.5 (26–27 sep 2026) + +!!! warning "EinarBoard v6 (`hbox-watchdog-v6`): en diseño, no se pide" + Diseño nuevo con ZED-F9P y módem A7670SA soldados a bordo. **No es la V5.6** que se manda a fabricar esta semana (`hbox-watchdog-v5`, zócalos para simpleRTK2B y 4G NTRIP Master). Los hallazgos marcados «Impacto en V5.6» ya se aplicaron a la V5.6 y están en su informe de cambios. + +Fecha: 2026-09-28 · Diseño revisado: `kicad/hbox-watchdog-v6.kicad_sch` / `.kicad_pcb` (estado del 25-sep, después de T15) · Documentos de referencia: [ECO V5.6](v56-eco.md), [informe de cambios V5.6](v56-cambios-esquematico.md), [auditoría pre-fabricación v6](v6-auditoria-prefab.md), `CHANGELOG.md` del firmware 0.5.8 → 0.6.0 · Autor: Helgen Technologies (elaborado con asistencia de Claude) · Alcance: revisión de solo lectura; no se modificó ningún archivo de KiCad. La [auditoría completa v6](v6-auditoria-completa.md) del mismo día profundiza y supera esta revisión; lo aplicado está en el [informe de cambios v6](v6-cambios-esquematico.md). + +## Resumen ejecutivo + +1. La v6 ya resuelve por arquitectura el hallazgo más grave de la semana (F1): el módem A7670SA tiene su propio buck AP64350 (U20) con `MODEM_PWR_EN` en PC10, `PWRKEY` en PC8, `STATUS` en PC9 y `RST` en PC11, y su UART llega al MCU por USART6 (PC6/PC7). El módem se puede arrancar solo, sobre riel asentado, y se sabe si está vivo. +2. Con eso, el ciclo de 10 min en batería (F2) y la recuperación de enlace sin matar el módem (F3) son posibles en v6: falta solo el firmware (`ENABLE_DUTY 1` con la secuencia `PWR_CTRL` → 4 s → `MODEM_PWR_EN`). +3. Cargador (F4): `RS1` ya es 10 mΩ (C105362, límite 2.5 A) ✅, pero **`R50` sigue en 825 Ω (2.4 A)** ❌ → 1.5 kΩ (C22843). +4. Térmico del LTC4040 (F5): **`/SW_BAT` es una pista de 0.25 mm** (peor que los 0.3 mm de la V5.5), `/BAT_PLUS` 0.25–0.5 mm, el EP de U6 **no tiene vías térmicas**, L6 está a 15 mm de U6 y no hay ningún sensor de temperatura junto a U6/L6 (el TMP102 se eliminó; el SHT40 U3 está a 71 mm). ❌ — es el cambio nº 1. +5. Ventana NTC (F6): `R55` (RNTB) 10 k y `JP2` puenteado a Li-ion, igual que la V5.5; la pausa a ~40–42 °C se repite en v6 hasta decidir la química (LFP-HT + JP2 2-3 + 5.6 k). `CHRG_FAULT` sí llega al MCU (PB4) para mostrar «pausa NTC». +6. Fuente de 5 V (F7): **U25 TPS54360B está fijada a 5.00 V** (R121 53.6 k / R122 10.2 k) → solo 0.56 V sobre el PFI (4.44 V) y **0.10 V sobre la línea de corte del gobernador (4.90 V)**: el cargador se cortaría en cada ráfaga LTE. ❌ → R121 57.6 k (5.32 V). +7. Robustez (F8): ESD del DFU ya está junto a J11 (3–7 mm) ✅ y `ETH_INT` va a PC0 (sin trampa BOOT1) ✅; pero **J9 (USB del módem) no tiene ESD**, **`ETH_RST` (PA15) no tiene pull-down** y no hay puente en paralelo a P5 (corte). F1 PPTC 3 A queda solo en el riel del F9P (inocuo, sobredimensionado). Sin PoE en J10 por diseño. +8. Software (F9): la v6 pierde el `$GPTXT H00xx` del NTRIP Master de ArduSimple (el módem ahora es nuestro) → la identidad debe generarla el MCU (`$PHID` por UID, ya existe en 0.6.0-eth) también por 4G. +9. Veredicto: **3 ✅ (F1, F2, F3) · 4 ⚠ (F4, F6, F8, F9) · 2 ❌ (F5, F7)**. Todos los ❌ y ⚠ son cambios de valor de BOM o de layout; ninguno cambia la arquitectura. +10. Los cinco cambios por riesgo: (1) cobre + vías + sensor en U6/L6; (2) U25 a 5.3 V; (3) R50 1.5 k; (4) condensadores de VBAT_MODEM pegados a U19 y pistas del módem ≥ 0.8 mm; (5) pull-down en `ETH_RST` + USBLC6 en J9 + decidir RNTB/JP2. + +## Índice del cuerpo del informe + +El cuerpo está en inglés. Vocabulario: *finding* = hallazgo · *footprint* = huella · *track* = pista · *via* = vía · *pour* = vertido de cobre · *EP* = pad térmico. + +| Sección | Qué contiene | +|---|---| +| 0. Method | Cómo se extrajeron los datos de la tarjeta y del esquemático; mapa pad → pin del LQFP-64. | +| 1. Lesson-by-lesson review (F1–F9) | Cada lección de banco de la V5.5 contra lo que hace la v6 tal como está dibujada: módem en batería, ciclo de 10 min, recuperación de enlace, cargador, térmico del LTC4040, ventana NTC, margen de la fuente de 5 V, robustez, software. | +| 2. Specific v6 checks requested | Comprobaciones puntuales pedidas por Leo. | +| 3. What to carry from V5.6 into v6 | Qué cambios de la V5.6 deben llevarse a la v6. | +| 4. Checklist ordered by risk | Checklist por riesgo con responsable. | +| 5. Notes and non-findings | Notas y lo que se revisó y no resultó hallazgo. | + +## Cuerpo del informe (inglés) + +## 0. Method + +- Board: pad→net dump of every footprint (`padnets2.py`), track widths/lengths per net, via positions, footprint positions and pad-to-pad distances computed from `hbox-watchdog-v6.kicad_pcb`. +- Schematic: symbol values, `LCSC` and `Note` properties and block texts from `hbox-watchdog-v6.kicad_sch`. +- STM32F411RET6 LQFP-64 pad → pin mapping used throughout (pad 15 = PA1, 24 = PC4, 25 = PC5, 37 = PC6, 38 = PC7, 39 = PC8, 40 = PC9, 41 = PA8, 43 = PA10, 50 = PA15, 51 = PC10, 52 = PC11, 55 = PB3, 56 = PB4, 57 = PB5, 8 = PC0, 28 = PB2). +- Ground truth for the lessons: the bench findings of 26–27 Sep on V5.5 with firmware 0.5.7–0.6.0 (F1–F9 below). + +Where a fact could not be found in the v6 files, it is stated as such. + +--- + +## 1. Lesson-by-lesson review + +### F1 — Modem never cold-starts on battery (shared Q1 switch, MP1584 UVLO, no MCU visibility) + +**What v6 does today (found in the files):** + +| Item | v6 | +|---|---| +| Modem power path | `U20` AP64350SP-13 (C2071691), `L20` 4.7 µH/5 A (C17700167), output `/VBAT_MODEM` = 0.8 V × (1 + R110 75 k / R111 20 k) = **3.80 V**. Input `/VIN_MODEM` fed by **`D20` SS34 from `/24V`** (vehicle side, via Q10) **or `D21` PMEG3050EP from `/MAIN5V`** (LTC4040 boost output on battery). The modem no longer hangs from Q1, F1 or `/SW_5V`. | +| Modem enable | `U20.3 EN` = `/MODEM_PWR_EN` = **U16 pad 51 = PC10**, with `R113` 100 k to GND (modem OFF while the MCU is in reset/DFU). No series resistor (direct drive; fine for the AP64350 EN pin). | +| PWRKEY / RST / STATUS | `/MODEM_PWRKEY` = **PC8** (pad 39) → `Q20` 2N7002 open-drain → `U19.1 PWRKEY`, `R114` 100 k pull-down on the gate. `/MODEM_RST` = **PC11** (pad 52) → `Q21` 2N7002 → `U19.16 RESET`, `R115` 100 k. `U19.66 STATUS` (1.8 V) → `U24` 74LVC2T45 → `/MODEM_STATUS` = **PC9** (pad 40). `U19.52 NETLIGHT` only drives `D4G1` via `R109`/`Q22` — not read by the MCU (STATUS covers the need). | +| Modem UART visibility | `U19.9 TXD` → `U24` → `/DOUT_4G` → **`U18.26` (ZED-F9P UART2 RXD, RTCM in)** *and* `R106` 100 Ω → **`/USART6_RX` = PC7 (pad 38)**. `U19.10 RXD` ← `U23` ← `/DIN_4G` ← `K1` relay common: NC = `/USART1_RX` (ZED-F9P `U18.27` TXD2 → also MCU PA10), NO = **`/USART6_TX` = PC6 (pad 37)**. So the MCU always hears the modem's TX (RTCM byte count = "modem registered and NTRIP flowing"), and talks to it on USART6 when K1 is in Mode B. This is the RTCM_TAP of V5.6 built in. | +| F9P power | `Q1` AO3401A (gate via `Q5`/`R1` from `/PWR_CTRL` = **PA1**, pad 15) → `/SW_5V` → `U21` AP2112K-3.3 → `/3V3_GNSS` → `U18`. Independent of the modem. | +| UVLO margin on battery | `/MAIN5V` (boost, R53 499 k / R54 100 k → 4.79 V nominal, 4.6 V measured under load on V5.5) − `D21` forward drop (≈0.3–0.45 V at 1–2 A) ≈ **4.2–4.5 V at U20 VIN** vs AP64350 VIN(min) 3.8 V → ≈ **0.4–0.7 V margin** (V5.5 had ≈ 0.1 V). Adequate but not generous: the buck runs at ~90 % duty (3.8 V out of 4.3 V in) during a 2 A burst. | +| Input capacitance at U20 | `C127` 10 µF (5.4 mm from U20.2) + `C128` 1 µF (2.0 mm). The V5.6 ECO specifies 2 × 22 µF + 10 µF at VIN (< 3 mm). | +| Output bulk at U19 | `C130` 220 µF, `C131` 220 µF, `C132` 22 µF, `C133` 1 µF, `C134` 100 nF, `C135` 33 pF, `C136` 10 pF, `D22` SMAJ5.0A. Distances from the VBAT pads (U19.55/56/57): **C130 17.8–19.7 mm, C131 10.5–12.4 mm**, C132 5.6–7.3 mm, C133 4.1–5.5 mm, D22 23–25 mm. The 440 µF sits 10–20 mm away, behind `/VBAT_MODEM` tracks of 0.25–3.0 mm (58.9 mm total, 6.3 mm on In1 at 0.5 mm). | + +**Verdict: ✅ covered (architecture) — 4 layout/value follow-ups.** + +**Changes:** +1. Move `C131` (and ideally `C130`) to ≤ 5 mm of U19 pads 55–57; pour `/VBAT_MODEM` on F.Cu from L20 to U19 (≥ 1.5 mm, no 0.25/0.5 mm necks; the T15 DRC rule already flags ≥ 0.8 mm). +2. Add 2 × 22 µF 0805 (C86817) at `U20.2 VIN` (< 3 mm), keep `C127`/`C128`; widen `/VIN_MODEM` (0.25/0.5 mm today) and `/SW_MODEM` (0.25 mm, 23 mm long) to ≥ 0.8 mm. +3. Battery-mode headroom (choose one, bench-decided): (a) `R53` 499 k → 511 k (C188257) → boost 4.89 V (+0.1 V at U20 VIN); (b) replace `D21` with a low-Vf Schottky in a bigger package or a P-FET ideal-diode; (c) lower `/VBAT_MODEM` to 3.6 V (`R110` 75 k → 70 k) — A7670SA VBAT range is 3.4–4.2 V, 3.8 V typical; 3.6 V keeps the buck out of dropout. Not required to order; required before the 20-cycle battery test. +4. Firmware (v6 `board_v6.h`): `PIN_MODEM_PWR_EN PC10`, `PIN_MODEM_PWRKEY PC8`, `PIN_MODEM_STATUS PC9`, `PIN_MODEM_RST PC11`, modem UART = **USART6 (PC6 TX / PC7 RX)**; K1 Mode B via `BYP_CTRL` = PB5 (pad 57, `R40` → `Q6` → `K1` coil). + +Note on behaviour: because `R113` is a pull-down, **any MCU reset (DFU, IWDG, `NVIC_SystemReset`) drops `MODEM_PWR_EN` and power-cycles the modem**. That is the intended V5.6 policy (modem OFF while the MCU is not in control), but firmware must re-run the settled-rail sequence after every reset, and a watchdog reset costs a ~30 s re-registration. + +### F2 — 10-min duty cycle on battery impossible on V5.5 + +**What v6 does today:** `/PWR_CTRL` (PA1) switches only the F9P rail (`Q1` → `/SW_5V` → `U21`); `/MODEM_PWR_EN` (PC10) switches only the modem buck. `/MODEM_STATUS` (PC9) and the RTCM tap on PC7 give a real "modem up" signal. `NRST` reaches only the MCU (`SW1`, `P6` RESET-EXT, `TP5`, `C104`), as on V5.5. + +**Verdict: ✅ covered (hardware).** Firmware: `ENABLE_DUTY 1` on the v6 build with the V5.6 window — `PWR_CTRL` high → ≥ 4 s → `MODEM_PWR_EN` high → PWRKEY pulse → wait `STATUS` high / first RTCM bytes on PC7 → ≥ 2 `$PHLG` with `pwr=BATT` and fresh fix → `MODEM_PWR_EN` low → `PWR_CTRL` low → sleep 10 min. End of window decided by STATUS/RTCM, not by a timer. Note `K1` (G5V-1, coil on `/SYS5V` via `Q6`) draws its 0.15 W whenever Mode B is held on battery. + +### F3 — Link-recovery stack cycles on battery kill the modem + +**What v6 does today:** the modem can be reset (`MODEM_RST` PC11), PWRKEY-cycled (PC8) or power-cycled alone (`MODEM_PWR_EN` PC10) without touching the F9P, and `MODEM_STATUS` (PC9) confirms the result. + +**Verdict: ✅ covered (hardware).** Firmware rule for v6 stays as 0.5.9: no stack cycle on battery, ever; recovery escalates modem-only — `MODEM_RST` 500 ms → PWRKEY off/on → `MODEM_PWR_EN` OFF 5 s / ON — and only after `PWR_CTRL` has been high ≥ 4 s. Never cycle `PWR_CTRL` for a link problem. + +### F4 — Charger input limit above the supply (RS1 8 mΩ), charge current 2.4 A (R50 825 Ω) + +**What v6 does today:** `RS1` = **10 mΩ/1 % 1206 (C105362)** between `/VEH5V` and `/VIN_SW` → LTC4040 input limit 25 mV / 10 mΩ = **2.5 A** ✅, below U25's 3 A. **`R50` = 825 Ω/1 % (C50214)** on `PROG` → 2000/825 = **2.42 A** charge ❌. `CHRG_EN` = PA8 (pad 41) with `R56` 100 k pull-down — the 0.6.0 governor works unchanged. `CHRG_STAT` = PB3, `CHRG_FAULT` = PB4 (pull-ups `R57`/`R58` 100 k). + +**Verdict: ⚠ partial.** Change: **`R50` 825 Ω → 1.5 kΩ 0603 1 % (C22843)** → 1.33 A (12 Ah in ~9 h). Governor 0.6.0 stays as the second layer. On v6 the supply is U25 (3 A rated, 3.5 A switch) — same reasoning as the SD-15B. + +### F5 — Slow charge on H0008: LTC4040 die-temperature cycling from thin copper / no thermal vias + +**What v6 does today (measured on the board file):** + +| Item | v6 | Target (ECO D2 / Copper Plan) | +|---|---|---| +| `/SW_BAT` (U6.21/22 → L6.1) | **4 segments, 0.25 mm, 12.3 mm total, F.Cu, no pour** | ≥ 2 mm polygon | +| `/BAT_PLUS` (P3.1 → L6.2 → U6.23, C35, R5) | 0.25 mm (5.4 mm) + 0.5 mm (42 mm F.Cu + 70.5 mm In2) + 1.0 mm (4.9 mm); 2 vias; no pour | ≥ 1.5 mm + via farm | +| U6 exposed pad (pad 25, 2.65 × 3.65 mm) | footprint `QFN-24-1EP_4x5mm_P0.5mm_EP2.65x3.65mm` (no ThermalVias variant); **0 vias inside the EP**; nearest GND via 4.4 mm away | ≥ 9 thermal vias to In1 GND | +| `L6` 2.2 µH/8 A distance to U6 | 15.2 mm (pad-to-pad 10.2–11.1 mm) | ≤ 5 mm | +| Input cap `C30` 10 µF / `C31` 2.2 µF to U6 | 11.2 mm / 10.0 mm | ≤ 3 mm | +| Temperature sensor at U6/L6 | **None.** `U4` TMP102 was deleted in v6 (schematic note); `U3` SHT40 is at (122.4, 77.3), **71 mm** from U6; `P7` NTC-HOTSPOT / `P8` NTC-PROBE-2 are JST jacks for external probes (PB1 / PC4) at 100 mm. | On-board sensor at U6/L6 | + +**Verdict: ❌ missing.** This is the highest-risk item: v6 repeats the V5.5 boost copper and makes it slightly worse (0.25 vs 0.3 mm), and the charger will run its ~2.5 A input / 1.3–2.4 A charge through it at 45 °C ambient. + +**Changes:** +1. Re-cluster U6: `L6` ≤ 5 mm from pads 21/22, `C30`/`C31` ≤ 3 mm from pads 6/16, `C35` at pad 23 (pre-fab audit B5). +2. `/SW_BAT` as an F.Cu polygon ≥ 2 mm wide; `/BAT_PLUS` ≥ 1.5 mm F.Cu from P3 to L6/U6 with a via farm to an In2 copper area (drop the 70 mm 0.5 mm inner run). +3. Replace the U6 footprint with the `…_ThermalVias` variant or add ≥ 9 × 0.3 mm vias in the EP to the In1 GND plane; keep the In1 plane solid under U6 (it is split into islands today — pre-fab audit §7). +4. Add a temperature sensor at U6/L6: **TMP102 SOT-563 (C99269, address 0x48 — free on v6; SC16IS752 is 0x4D, SHT40 0x44, SC7A20 0x18) placed between U6 and L6**, or an on-board 10 k NTC to **PC5 (pad 25, ADC1_IN15, free)** with the same 10 k/100 nF network as `R42`/`C24`. Firmware: `tchg` append field in `$PHLG`; governor uses it instead of the V5 `U4` cell sensor. Also log `tmax`. +5. Bench: thermal camera on U6/L6 during 1 h of charge at 1.3 A and 1 h of backup at 2.5 A; the 60 mV/30 s pulsing seen on H0008 must not appear. + +### F6 — NTC pause invisible; charge window with RNTB 10 k pauses above ~40–42 °C + +**What v6 does today:** `R55` (= RNTB) **10 k/1 % (C25804)** from `/VEH5V` to `/NTC` (`U6.17`, `P3.3`). `JP2` value `F2:Li-ion`, bridged 1-2 → `/F2_SEL` = `/MAIN5V` (high) = Li-ion 4.0/4.1 V float. `JP3` F1:0, `JP4` F0:1 as on V5.5. `CHRG_FAULT` → PB4 with pull-up: the firmware can show `cflt=1` as "pausa NTC" (LTC4040 keeps CHRG low during an NTC pause; only FAULT goes low). + +**Verdict: ⚠ partial** (visibility ✅, window ❌ until the chemistry decision). + +**Changes (BOM/solder-jumper only, PCB unchanged):** if LFP-HT 26650 is chosen (ECO D1a): `JP2` 2-3 (F2 low, 3.50 V float) + `R55` **5.6 k** with a B3380 NTC (window +10…+60 °C). If Li-ion stays: keep 10 k and accept the pause (or 6.6 k = pause at 55 °C, hard on the cell). Firmware/monitor: `ltc=PAUSA NTC` when `CHRG_EN` allowed ∧ `CHRG_STAT` idle ∧ `CHRG_FAULT` low; cell-temperature inhibit threshold per chemistry (Li-ion 45 °C / LFP 55–60 °C). Silkscreen `JP2 = F2 (Li-ion / LFP)`. + +### F7 — Power-supply margin: 5.25–5.57 V trimmed units vs PFI 4.44 V / warning 4.60 V / shed 4.90 V + +**What v6 does today:** `U25` TPS54360B (C524806), feedback `R121` **53.6 k/1 %** / `R122` **10.2 k/1 %** → V_out = 0.8 V × (1 + 53.6/10.2) = **5.00 V** (pre-fab audit: "5.00 V, ~620 kHz"; `R120` 162 k). `R124` 523 k / `R125` 84.5 k (EN UVLO divider) are DNP → EN floats high (internal pull-up), U25 runs from ≈ 4.5 V input. LTC4040: PFI `R51` 270 k / `R52` 100 k → 1.2 V × 3.7 = **4.44 V**; boost `R53` 499 k / `R54` 100 k → 0.8 V × 5.99 = **4.79 V**. `5V_SENSE` = `/VEH5V` × 10 k/(10 k + 10 k) (`R7`/`R8`) → PA4, so the ADC scale is fine up to 6.6 V. `P2` (bench SD-15B) is in parallel on `/VEH5V` ("one source at a time"). + +Margins with 5.00 V: to PFI **0.56 V**; to the 0.6.0 governor shed line (4.90 V) **0.10 V**; to the governor start line (5.05 V) **−0.05 V** — the charger would never be enabled, and a 100–200 mV LTE sag (V5.5 measured) would hit the shed line on every burst. + +**Verdict: ❌ missing.** + +**Changes:** `R121` 53.6 k → **57.6 k/1 % 0603** → 0.8 × (1 + 57.6/10.2) = **5.32 V** (56.2 k → 5.21 V is the minimum acceptable). Within LTC4040 VIN range (3.5–5.5 V) and U25 rating; `5V_SENSE` unchanged. Pick the LCSC number in the sourcing pass (basic 0603 1 %). Governor thresholds (5.05 start / 4.90 shed / 4.60 warn / 4.44 PFI) then have the same 0.3–0.9 V ladder as the field units. Also re-cluster U25 (`L22` 25.9 mm, `D34` 18–23 mm, `C149`/`C150` 5.4–8.8 mm from pins today) — pre-fab audit B5. + +### F8 — Robustness items (F1 PPTC, ETH_RST float, J9 ESD, DFU ESD placement, BOOT1 trap, PoE) + +| Item | v6 today | Verdict | Change | +|---|---|---|---| +| F1 PPTC 3 A (C20627123) | `F1` between `/SYS5V` and `/SW_IN` → `Q1` → `/SW_5V` → `U21` LDO → F9P only (`/SW_5V` nodes: Q1.3, C3, C40, C119, U21). The modem is not behind it. | ⚠ | Harmless (≈ 15 mV at 150 mA) but pointless at 3 A; resize to 1–1.5 A hold so it actually protects the F9P/LDO, or keep and note. Not a blocker. | +| `ETH_RST` (PA15, pad 50 → `U11.37`) | Only two nodes; **no pull resistor**. `U12` (3V3_ETH buck) has EN tied to VIN (`U12.2` = `/SYS5V`) → `/3V3_ETH` is always up, on battery too. During an MCU reset PA15 floats, the W5500 leaves reset and draws ~130 mA for the ~4 s. | ❌ | Add 100 k 0603 (C103211) `ETH_RST` → GND (= V5.6 `R112`). Optional: drive `U12` EN from a free MCU pin (PD2 pad 54 or PB10 pad 29) with a 100 k pull-down so `/3V3_ETH` is fully off on battery and in reset. | +| J9 modem USB-C ESD | `/USB_DP`, `/USB_DM`, `/USB_VBUS` nodes: J9 and U19 only. **No ESD device.** `Rcc1`/`Rcc2` 5.1 k present. | ❌ | Add USBLC6-2SC6 SOT-23-6 (C7519) at J9 (= V5.6 `D19`): I/O1 → USB_DM, I/O2 → USB_DP, VBUS → USB_VBUS. | +| DFU ESD at J11 | `D14` (DFU_DP) 3.0 mm, `D15` (DFU_DM) 3.7 mm, `D16` (DFU_VBUS) 6.6 mm from J11 centre. | ✅ | — | +| BOOT1 trap | `ETH_INT` = **PC0** (pad 8); PB2 (pad 28) = `/BOOT1_STRAP` with `R99` 10 k to GND; schematic note "never repurpose PB2". | ✅ | — | +| PoE on J10 | `J10` HR911105A pins 7/8 unconnected; no PoE PD circuit. Firmware 0.6.0-eth documents "sin PoE". | ⚠ (decision) | Keep no PoE (external splitter). Record the decision; if PoE is ever wanted it is a v6.1 feature (PD controller + isolated DC-DC), not a patch. | +| Cutoff bypass | `P5` CUTOFF-SW between `/MAIN5V` and `/SYS5V`; no solder-jumper in parallel (JP1 = fan, JP5 = RS-485 term). | ⚠ | Add `JP_CUT` (SolderJumper_2_Open) across P5, open by default (= V5.6 `JP6`). | +| Silkscreen | Not checked here (pre-fab audit: all labels 0.5 mm/0.1 mm). | — | `SW1 = RESET MCU`, `JP2 = F2 (Li-ion / LFP)`, `P5 = CUTOFF`, labels ≥ 0.8/0.15 mm. | + +**Verdict: ⚠ partial.** + +### F9 — Software/process lessons + +| Lesson | v6 implication | Verdict | +|---|---|---| +| Unit identity = modem `$GPTXT H00xx` | **v6 has no ArduSimple NTRIP Master**: the A7670SA is driven by the MCU, so nobody emits `$GPTXT H00xx`. The MCU must generate the identity on every path (4G and Ethernet) — `$PHID,,,,,` from 0.6.0-eth is the right vehicle; the server (`retranslator`) needs to accept `$PHID` as the primary ID before v6 ships. | ⚠ | +| `$PHLG` append-only fields | New v6 fields (`tchg`, `rtcm_bps`, `modem_status`, `tmodem` if read from the module) go at the end. | ✅ (rule) | +| Deploy with conflict markers broke the dashboard | Process: pre-deploy syntax check (`node --check` / `python -m py_compile`) in the deploy script; never `git stash pop` on the production tree. Not a board item. | ⚠ (process) | +| Monitor shows power source and charger state explicitly; history stores `pwr`, `v5min`, `vbat_min` | v6 adds `MODEM_STATUS` and `CHRG_FAULT` (PB4) → columns "Módem" and "pausa NTC". | ✅ (rule) | +| Modem temperature | v6 can read it from the module over USART6 (`AT+CPMUTEMP` on SIMCom A76xx, to be confirmed on the A7670SA firmware) — no extra sensor needed for the modem; the charger sensor (F5) is still needed. | — | + +**Verdict: ⚠ partial** (identity path must change for v6). + +--- + +## 2. Specific v6 checks requested + +| Check | Found in v6 | Assessment | +|---|---|---| +| U25 output divider and margin to PFI / VSYS | `R121` 53.6 k / `R122` 10.2 k → 5.00 V; PFI 4.44 V (`R51` 270 k / `R52` 100 k); boost 4.79 V (`R53` 499 k / `R54` 100 k) | ❌ 0.56 V to PFI, 0.10 V to the 4.90 V shed line → `R121` 57.6 k (5.32 V) | +| Modem buck input on battery and UVLO margin | `/VIN_MODEM` ← `D21` PMEG3050EP ← `/MAIN5V` (boost) on battery; ← `D20` SS34 ← `/24V` on vehicle power | ⚠ ≈ 4.2–4.5 V at U20 VIN vs 3.8 V min → 0.4–0.7 V; improve with R53 511 k, lower-Vf D21 or VBAT_MODEM 3.6 V | +| MODEM_PWR_EN / PWRKEY / STATUS / RST to MCU | PC10 (pad 51) / PC8 (39, via Q20) / PC9 (40, via U24) / PC11 (52, via Q21); pull-downs R113/R114/R115 100 k | ✅ | +| Modem UART to MCU | USART6: PC7 RX ← `R106` 100 Ω ← `/DOUT_4G` (always); PC6 TX → `K1` NO → `/DIN_4G` (Mode B) | ✅ | +| Modem VBAT bulk near U19 | 440 µF (`C130`/`C131`) at 10.5–19.7 mm from pads 55–57; `C132` 22 µF at 5.6–7.3 mm | ⚠ move to ≤ 5 mm, pour VBAT_MODEM | +| `/SW_BAT` and `/BAT_PLUS` copper | 0.25 mm × 12.3 mm; 0.25–0.5 mm (+70 mm on In2); no pours | ❌ | +| LTC4040 EP thermal vias | 0 in the EP; footprint has no ThermalVias variant | ❌ | +| RNTB and JP2 default | `R55` 10 k; `JP2` 1-2 = Li-ion | ⚠ pending D1 | +| F1 / F2 fuses | `F1` PPTC 3 A on the F9P rail only; `F2` 2 A/125 V nano fuse in holder on `/24V_IN` (LCSC still TBD per pre-fab audit) | ⚠ resize F1 (optional); pick F2 part | +| ETH_RST pull | none | ❌ 100 k to GND | +| J9 / J11 ESD | J11 ✅ (D14/D15/D16 at 3–7 mm); J9 ❌ none | add USBLC6-2SC6 at J9 | +| W5500 PoE | none (J10 pins 7/8 open) | decision: stay without PoE | +| Switcher EP vias (U20, U25) | 0 vias within 3 mm of either EP | add thermal vias (secondary to U6) | + +--- + +## 3. What to carry from V5.6 into v6 + +| V5.6 item | Already in v6? | Action for v6 | +|---|---|---| +| `MODEM_EN` sequencing (F9P first, modem 4 s later on a settled rail) | Hardware ✅ (`MODEM_PWR_EN` PC10 + `PWR_CTRL` PA1) | Firmware `board_v6.h` + `ENABLE_DUTY 1`; identical window logic to V5.6 0.7.0, plus PWRKEY pulse and `STATUS` wait. | +| RTCM / modem-UART visibility (`RTCM_TAP` PC7 = USART6_RX) | ✅ built in (`R106` → PC7; `K1` → PC6) | Byte counter on USART6 RX = "NTRIP flowing"; `rtcm_bps` field. | +| Thermal copper for U6 (ECO D2 / EMC #1 #2) | ❌ | `/SW_BAT` ≥ 2 mm pour, `/BAT_PLUS` ≥ 1.5 mm + vias, EP ≥ 9 vias, L6/C30 re-clustered. | +| `RS1` 10 mΩ (C105362) | ✅ | — | +| `R50` 1.5 k (C22843) | ❌ (825 Ω) | Change value. | +| `RNTB` 5.6 k + `JP2` 2-3 (if LFP) | ❌ (10 k, Li-ion) | Decide chemistry (D1); BOM/jumper only. | +| PSU set-point ≥ 5.2 V | ❌ (5.00 V) | `R121` 57.6 k → 5.32 V. | +| ESD at connectors | J11 ✅ / J9 ❌ | USBLC6-2SC6 (C7519) at J9. | +| Fuse in the F9P rail | ⚠ (3 A PPTC) | Resize to 1–1.5 A or leave; document. | +| `ETH_RST` pull-down 100 k | ❌ | Add (C103211). | +| PoE decision | none by design | Keep; write it in the schematic block-N note. | +| Second TMP102 / NTC at U6 | ❌ (no sensor near U6; TMP102 deleted in v6) | TMP102 SOT-563 (C99269, 0x48) between U6 and L6, or NTC → PC5. | +| `JP_CUT` across the cutoff connector | ❌ | Solder jumper across `P5`. | +| 220 µF polymer on the F9P rail (`C3`) | `C3` 47 µF elco on `/SW_5V` | Optional on v6: `/SW_5V` only feeds the AP2112K LDO now. | +| 2 × 22 µF + 10 µF at the modem buck input | `C127` 10 µF + `C128` 1 µF | Add 2 × 22 µF (C86817) at `U20.2`. | +| AP64350 compensation (Rcomp 14 k, Ccomp 3.3 nF, 47 pF, RT 200 k, BST 100 nF) | v6 is the source (`R116` 14 k, `C141` 3.3 nF, `C142` 47 pF, `R117` 200 k, `C129` 100 nF) | Verify against the AP64350 datasheet application table for 3.8 V / 4.7 µH / 2 × 220 µF + 22 µF (same open point as V5.6 §6.1). | + +--- + +## 4. Checklist ordered by risk + +| # | Risk | Lesson | Item | Refdes / value / net | Owner | +|---|---|---|---|---|---| +| 1 | 🔴 | F5 | LTC4040 copper + thermal vias + re-cluster | `/SW_BAT` 0.25 → ≥ 2 mm pour; `/BAT_PLUS` ≥ 1.5 mm + via farm; `U6` EP ≥ 9 × 0.3 mm vias; `L6` ≤ 5 mm; `C30`/`C31` ≤ 3 mm | Michelle | +| 2 | 🔴 | F7 | Vehicle PSU set-point | `R121` 53.6 k → **57.6 k/1 %** (5.32 V); re-cluster `L22`/`D34`/`C149`/`C150` | Leo (value) / Michelle (layout) | +| 3 | 🔴 | F4 | Charge current | `R50` 825 Ω → **1.5 k/1 %** (C22843) | Leo | +| 4 | 🟠 | F1 | Modem rail integrity on battery | `C130`/`C131` ≤ 5 mm from U19.55–57; pour `/VBAT_MODEM`; `/VIN_MODEM`, `/SW_MODEM` ≥ 0.8 mm; + 2 × 22 µF at `U20.2`; optional `R53` 511 k / D21 low-Vf / VBAT 3.6 V | Michelle / Leo | +| 5 | 🟠 | F5 | Temperature sensor at the charger | TMP102 SOT-563 (C99269, 0x48) between U6 and L6 + 100 nF, or NTC → PC5 | Leo | +| 6 | 🟠 | F8 | W5500 in reset while MCU resets | 100 k (C103211) `/ETH_RST` → GND; optional `U12` EN from PD2/PB10 | Leo | +| 7 | 🟠 | F8 | Modem USB ESD | USBLC6-2SC6 (C7519) at `J9` | Leo | +| 8 | 🟠 | F6 | NTC window / chemistry | `R55` 10 k → 5.6 k + `JP2` 2-3 if LFP-HT; else keep and display "pausa NTC" | Leo (decision D1) | +| 9 | 🟡 | F8 | Cutoff bypass | `JP_CUT` solder jumper across `P5` | Michelle | +| 10 | 🟡 | F8 | F9P rail fuse | `F1` 3 A PPTC → 1–1.5 A hold (or document) ; `F2` part number (TBD) | Leo | +| 11 | 🟡 | F9 | Identity without `$GPTXT` | `$PHID` from MCU UID on 4G too; server accepts it | Firmware / backend | +| 12 | 🟡 | F1/F2/F3 | Firmware v6 | `board_v6.h` pins (PC10/PC8/PC9/PC11, USART6, PB5 K1), duty window, modem-only recovery, no stack cycle on battery | Firmware | +| 13 | 🟡 | F8 | PoE | Record "no PoE, external splitter" in block N | Leo | +| 14 | ⚪ | F1 | AP64350 compensation vs datasheet table | `R116`/`C141`/`C142`/`R117`/`C129` | Leo | +| 15 | ⚪ | F5 | Bench validation | Thermal camera U6/L6 at 1.3 A charge and 2.5 A backup, 1 h each; 20 battery duty cycles; U20 VIN scope at 3.5 V cell | Jesús / Leo | + +**Tally: ✅ 3 (F1, F2, F3) · ⚠ 4 (F4, F6, F8, F9) · ❌ 2 (F5, F7).** + +--- + +## 5. Notes and non-findings + +- The v5.5 `DzG1` gate-clamp fix, the `R51` 270 k PFI choice (E-PFI 24-Jul) and the `RS1` 10 mΩ are already in v6. +- `U12` (3V3_ETH, MP1584EN from `/SYS5V`) keeps the MP1584 UVLO issue but Ethernet is not used on battery; firmware 0.6.0-eth holds the W5500 in reset without 5 V. Combined with the `ETH_RST` pull-down that is acceptable for v6. +- `C3` 47 µF and `C40` 22 µF on `/SW_5V` now only buffer the AP2112K LDO input; the V5.6 polymer upgrade is optional here. +- Free MCU pins after this review: PC5 (25, ADC), PB10 (29), PA9 (42), PD2 (54). PC5 is the natural home for an on-board charger NTC; PD2/PB10 for a `U12` EN. +- Nothing in this review changes the v6 architecture; every item is a value, a footprint or a layout change, so the pre-fab audit's B5/B6 pass (Michelle) can absorb items 1, 2 (layout part), 4 and 9 in one go. + +Ver también: [manual v6](../manuales/manual-tarjeta-v6.md) · [mapa de pines MCU v6](v6-pinmap.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-28 | Revisión original (inglés) con resumen ejecutivo en español. | +| 1.1 | 2026-09-29 | Resumen en español al frente, índice del cuerpo, enlaces. Sin cambios técnicos. | diff --git a/docs/img/favicon.png b/docs/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..41e4f323ca0539bbc2ed4b429b4a12a2369d120e GIT binary patch literal 12461 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 anpU4__Gw}Niuf7=psJ+#x>CXN^Zx_;y-yMV literal 0 HcmV?d00001 diff --git a/docs/img/helgen-logo-white.png b/docs/img/helgen-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a3080f41482355cb4665dc18d9bdd659214a3fd4 GIT binary patch literal 12800 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 37d7cf3..400d410 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,180 +1,136 @@ --- +title: "HBOX — Documentación técnica" hide: - toc --- # HBOX — Documentación técnica -Sitio interno de Helgen Technologies. **Busca abajo lo que vas a hacer hoy.** +
+La lupa busca por unidad (H00xx), conector (P15, J10), evento (MODEM_DARK) o procedimiento. +
-## 🔧 Trabajo de campo y taller +## Tareas
-- ### 🚜 Una unidad falla en la máquina +- ### Llegaron tarjetas nuevas V5.6 --- - Diagnóstico paso a paso **en sitio**, con el gabinete todavía montado. Empieza por el - permiso de acceso y termina con la unidad clasificada. + Inspección, flasheo con el binario vigente y autoprueba, tarjeta por tarjeta. - [**▶ Llenar el acta de diagnóstico en campo**](formularios/diagnostico.html){ .md-button .md-button--primary } + [**Acta de tarjeta V5**](formularios/v5.html){ .md-button .md-button--primary } + [Procedimiento: prueba y flasheo](procedimientos/v5-prueba-y-flasheo.md) - [Leer el procedimiento primero](diagnostico/procedimiento-diagnostico-campo.md) - -- ### 🔬 Una unidad ya está en la mesa +- ### Armar y configurar una unidad --- - Diagnóstico **en banco** con fuente y multímetro: continuidad, rampa de corriente, - rieles y las tres capturas por USB. + Módulos RTK/4G, ensamble en gabinete, prueba final y parámetros de la unidad. - [**▶ Llenar el acta de diagnóstico en banco**](formularios/banco.html){ .md-button .md-button--primary } + [Acta de ensamble](formularios/ensamble.html){ .md-button .md-button--primary } + [Ensamble](procedimientos/v5-ensamble.md) · [Configuración](procedimientos/v5-configuracion-unidad.md) · [Flujo completo](produccion/index.md) - [Leer el procedimiento primero](procedimientos/diagnostico-banco.md) - -- ### ⚡ Reflashear una unidad +- ### El cliente usa Ethernet o puertos serie --- - Solo en taller y **solo después** de subir la captura del diagnóstico. + Prueba de banco con el binario `-eth`, cable directo a la laptop. - [Procedimiento de reflasheo](procedimientos/reflasheo-unidades.md) + [Acta: Ethernet y serie](formularios/ethernet-serie.html){ .md-button .md-button--primary } + [Procedimiento](procedimientos/v5-prueba-ethernet-serie.md) -- ### 🧪 Probar una tarjeta V4 con 0.5.6 +- ### Una unidad falla en la máquina --- - Puente de reset del módem, flasheo y las pruebas con 24 V, en batería y regreso de 24 V. - Un acta por tarjeta. + Diagnóstico en sitio con el gabinete montado. No reinicies nada antes de capturar la evidencia. - [**▶ Llenar el acta de prueba V4**](formularios/v4.html){ .md-button .md-button--primary } + [Acta de diagnóstico en campo](formularios/diagnostico.html){ .md-button .md-button--primary } + [Procedimiento](diagnostico/procedimiento-diagnostico-campo.md) - [Leer el procedimiento primero](procedimientos/v4-prueba-fw-0.5.6.md) - -- ### 🚨 Algo se dañó +- ### Una unidad está en la mesa --- - Tarjeta con corto, módulo golpeado, unidad mojada. Registra el daño y la serie queda - **marcada**: cualquier acta que la elija mostrará el aviso. + Diagnóstico en banco: continuidad, rampa de corriente, rieles y capturas por USB. - [**▶ Acta de daño o incidente**](formularios/dano.html){ .md-button .md-button--primary } + [Acta de diagnóstico en banco](formularios/banco.html){ .md-button .md-button--primary } + [Procedimiento](procedimientos/diagnostico-banco.md) -- ### 📦 Sale o llega una unidad +- ### Reflashear una unidad --- - Qué salió en la caja y en qué estado llegó, antes de entrar al puerto. + Solo en taller y solo después de subir la captura del diagnóstico. - [Acta de envío](formularios/envio.html) · [Acta de recepción](formularios/recepcion.html) · [Ciclo de vida](procedimientos/ciclo-de-vida.md) + [Acta de reflasheo](formularios/reflasheo.html){ .md-button .md-button--primary } + [Procedimiento](procedimientos/reflasheo-unidades.md) -- ### 🗂 Todo sobre una unidad +- ### Instalar en el puerto --- - El expediente completo de un número de serie: cada acta, cada foto y cada archivo de log - que se ha subido, en una sola línea de tiempo. + Checklist de puesta en marcha de una página: imprimir y llevar, una hoja por unidad. - [**▶ Abrir expediente**](unidad.html){ .md-button } + [Checklist de puesta en marcha](procedimientos/v5-checklist-puesta-en-marcha.md){ .md-button .md-button--primary } + [Manual del cliente](manuales/manual-cliente.md) -- ### 📊 ¿Qué se ha revisado? +- ### Enviar, recibir o reportar un daño --- - Todas las visitas, sus fotos y sus archivos, unidad por unidad. + Qué salió en la caja, en qué estado llegó y qué se dañó. La serie queda marcada. - [Tablero de campo](diagnostico/tablero-campo.html) + [Acta de envío](formularios/envio.html){ .md-button .md-button--primary } + [Recepción](formularios/recepcion.html) · [Daño](formularios/dano.html) · [Ciclo de vida](procedimientos/ciclo-de-vida.md) + +- ### Consultar pinout u hoja de datos + + --- + + Conectores, puentes, LEDs y límites eléctricos de cada tarjeta. + + [**Pinout V5.6**](hardware/v56-pinout.md){ .md-button .md-button--primary } + [Hoja de datos V5.6](hardware/v56-datasheet.md) · [Todas las tarjetas](hardware/index.md) + +- ### Descargar firmware + + --- + + Binario por tarjeta (nunca por número de versión), SHA-256, parámetros 4G y ZED-F9P. + + [Descargas](descargas/index.md){ .md-button .md-button--primary } + [README bring-up v5](descargas/hbox-v5-bringup-README.md) + +- ### Todo sobre una unidad + + --- + + Expediente de un número de serie: cada acta, foto y log en una línea de tiempo. + + [Abrir expediente](unidad.html){ .md-button .md-button--primary } + [Tablero de producción](tablero.html) · [Tablero de campo](diagnostico/tablero-campo.html) + +- ### Primera vez en el sitio + + --- + + Reglas de trabajo, acceso y cómo se llenan las actas. + + [Guía del ingeniero](guia-ingeniero.md){ .md-button .md-button--primary } + [Índice de actas](actas/index.md)
-## 🏭 Producción — lote v5 +## Estado -
+| Tarjeta / firmware | Estado | +|---|---| +| V5.5 | 15 unidades en campo · fw 0.6.0 | +| V5.6 | Esquemático cerrado · PCB en layout · pedido pendiente | +| v6 | En diseño (GNSS + 4G a bordo) — no pedir | +| firmware 0.6.1 | En desarrollo | -- ### 🔌 Probar y flashear tarjetas - - --- - - Las 15 tarjetas EinarBoard v5, una por una. - - [Procedimiento](procedimientos/v5-prueba-y-flasheo.md) · [Acta V5](formularios/v5.html) - -- ### 📡 Módulos RTK y 4G - - --- - - simpleRTK2B Pro, módem 4G NTRIP Master y la integración de la pareja. - - [Procedimiento](procedimientos/v5-modulos-integracion.md) · [ArduSimple](formularios/ardusimple.html) · [4G](formularios/modem4g.html) · [Integración](formularios/integracion.html) - -- ### 🧰 Ensamblar la unidad - - --- - - Armado, energizado y prueba final antes de embarcar. - - [Ensamble](procedimientos/v5-ensamble.md) · [Prueba final](procedimientos/v5-prueba-final-unidad.md) · [Acta de ensamble](formularios/ensamble.html) - -- ### 🔩 Arneses y gabinete - - --- - - Pinout de conectores, BOM dividido y guía de ensamble. - - [Pinout](montaje/pinout-arneses.md) · [BOM](montaje/bom-split.md) · [Guía](montaje/assembly-guide.md) - -
- -## 📥 Archivos y referencia - -
- -- ### 💾 Descargas - - --- - - Firmware por generación de tarjeta, parámetros del módem 4G y configuración del ZED-F9P. - - [Ir a Descargas](descargas/index.md) - -- ### 📋 Todas las actas - - --- - - Índice completo de formularios y cómo se usan. - - [Índice de actas](actas/index.md) · [Tablero de producción](tablero.html) - -- ### 👤 Mi cuenta - - --- - - Cambiar tu contraseña del sitio. Si la olvidaste, Leo te la restablece desde ahí mismo. - - [Cambiar mi contraseña](cuenta.html) - -- ### 🌿 Git y archivos de diseño - - --- - - Para quien toque KiCad o el repositorio. - - [Guía en español](git/guia-git-es.md) · [English](git/git-guide-en.md) - -
- ---- - -## Reglas de la casa - -1. Los procedimientos se siguen **en orden y completos**; una tarjeta que falla una sección no - avanza a la siguiente. -2. Toda medición fuera de rango se anota **con su valor**, no solo "FALLA". -3. En campo, **no reinicies ni desconectes nada** antes de capturar la evidencia: el estado en que - encontraste la unidad es el dato que no se puede recuperar después. -4. Si algo del documento no coincide con lo que ves en la tarjeta, **detente y pregunta** a - ingeniería antes de continuar. - -*La fuente de verdad es el repositorio **Drogheda**: no edites estas páginas a mano, se regeneran -con el script de sincronización. Contacto: leo@helgen.tech* +Reglas de trabajo: [Guía del ingeniero](guia-ingeniero.md). Fuente: repositorio Drogheda. Contacto: leo@helgen.tech diff --git a/docs/manuales/Drogheda-HBOX-Datasheet_v2.0.pdf b/docs/manuales/Drogheda-HBOX-Datasheet_v2.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da50d99f4a5594893a4a598f35feb8a4ec69fa87 GIT binary patch literal 49225 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 literal 0 HcmV?d00001 diff --git a/docs/manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf b/docs/manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d010cca42ea901b41430c71d6537472de82601f GIT binary patch literal 72135 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� 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 + +## 1. Cómo reconocerla + +| Rasgo | V3 | +|---|---| +| Blackpill en zócalo, sin RJ45, sin clemas verdes, sin P14 | Sí (la V4 tiene RJ45 y clemas; la V5 no tiene Blackpill) | +| Un solo USB-C en la tarjeta (J9, módem); consola por el USB del Blackpill | Sí | +| Medidor DB1–DB4 cableado directo a PB12–PB15 (sin expansor) | Sí | +| Serigrafía | `Advanced Engineering Division · www.helgen.tech`, `STM32F411 BLACKPILL`, `ArduSimple simpleRTK2B Pro`, `4G NTRIP MASTER`, `BP3.0`; etiquetas de J1/J2 `G-TX G-RX U-TX U-RX CHEN CSTA CFLT PCTL BSNS FPWM ELED FTAC` | +| Conectores DNP con huella vacía | P3 (RTK2B-UART1), P13 (MODO-B-UPLINK), H3 (USART1-RSV) | + +## 2. Conectores + +Pinout pin a pin (generado de la netlist V3): [Pinout de arneses y conectores (V3)](../montaje/pinout-arneses.md). + +| Ref | Qué se conecta | Pines | +|---|---|---| +| P1 | Vehículo GX16-5 | 1 = +24 V · 2 = GND · 3 = ignición cruda 12–24 V · 4–5 = n/c | +| P2 | SD-15B-05 | 1 = +5 V · 2 = GND. Ajustar a 5.2–5.4 V en P2 (errata E-PFI) | +| P4 | Paquete Li-ion | 1 = BAT+ · 2 = GND · 3 = NTC | +| P5 | Sonda T/RH externa I²C | 1 = 3V3 · 2 = GND · 3 = SDA · 4 = SCL | +| P6 | Ventilador | 1 = +5V_FAN · 2 = retorno · 3 = GND · 4 = tach (no usado) | +| P8 | LED de panel | 1 = ánodo · 2 = cátodo | +| P10 | Reset externo | 1 = NRST · 2 = GND | +| P11 | Interruptor de corte | 1 = MAIN5V · 2 = SYS5V (abierto = todo apagado salvo el cargador) | +| P12 | NTC de punto caliente | 1 = NTC · 2 = GND | +| J9 | USB del módem | Configuración del 4G NTRIP Master | +| MOD1 · J7/J8 | simpleRTK2B · 4G NTRIP Master | J8 pad k = pin XBee 21−k | +| J1 / J2 | Blackpill | Errata E-J1 (§3) | + +## 3. Erratas de la V3 + +!!! warning "Erratas E-J1 y E-CLR" + E-J1, zócalo J1 espejado. Con el Blackpill sentado de la única forma posible, J2 queda correcto y J1 invertido extremo por extremo (J1.k → pin 21−k del módulo). J1.20 (5 V) cae en VBAT del módulo: nunca energices una V3 con el Blackpill sentado directamente. En banco: módulo fuera del zócalo + arnés "adaptador inversor" Dupont en J1 (5→NRST · 6→A0 · 7→A1 · 8→A2 · 9→A3 · 10→A4 · 11→A5 · 12→A6 · 14→B0 · 15→B1 · 18→3V3 · 19→GND · 20→5V; 1–4/13/16 sin conectar; 17 se omite); J2 directo pad n → pin n. No hay parche por software. + + E-CLR, prueba de recepción obligatoria (corto interno de 24 V). Sin energía, continuidad P2.1 ↔ P1.1 y P11.1 ↔ P1.1: en una tarjeta sana ambas abiertas. Un bip = puente interno 24 V → 5 V = tarjeta chatarra (no retrabajable). + +E-PFI — hipo del módem en banco sin batería: con menos de 5.2 V en P2 y sin paquete, las ráfagas del módem cruzan el PFI (4.60 V en V3) y el LTC4040 desconecta la entrada en bucle. Fuente a 5.2–5.4 V medidos en P2 (nunca > 5.4) o paquete conectado ([reglas de banco](../procedimientos/diagnostico-banco.md#reglas-de-banco)). + +## 4. Puentes, botones y LEDs + +| Ref | Default / función | +|---|---| +| JP2 / JP3 / JP4 | F2:Li-ion (1-2) / F1:0 / F0:1 → 4.00 V. No tocar | +| JP1 | Abierto (5V_FAN ↔ VEH5V). Nunca cerrar | +| SW1 | Reset del MCU (= P10 = NRST del Blackpill) | +| SW4G1 | Reset del módem | +| KEY (Blackpill) | BOOT0 para DFU | +| DB1–DB4 | Medidor de batería, directo en PB12–PB15 (330 Ω) | +| LED de panel (P8) | PB0 vía Q4 | +| D4G1 | Actividad del módem (tenue) | +| TP1 / TP2 | CLPROG / PFO del LTC4040 | + +## 5. Flasheo + +Solo el USB-C del Blackpill; KEY (BOOT0) + NRST → `0483:DF11`; `hbox-tarjetaV3_4.0.0.bin` en `0x08000000`. Verifica en consola la versión 4.0.0 y que llega telemetría al monitor. Procedimiento: [reflasheo](../procedimientos/reflasheo-unidades.md). Solo binarios `hbox-tarjetaV3_…` ([Descargas](../descargas/index.md#firmware-del-hbox-que-binario-va-en-que-tarjeta)). + +## 6. Limitaciones conocidas + +- Sin Ethernet, sin RS-485/RS-232, sin LED RGB, sin expansor I²C. +- Módem oscuro en batería (igual que V4/V5.5); sin puente de reset posible (no hay PCF8574): solo SW4G1 o 24 V. +- PFI 4.60 V (más alto que V4/V5: 4.40–4.44 V) → más sensible a caídas de la fuente. +- Firmware 4.0.0 (blackpillrtkcode_v4) con consola y comandos propios, distintos de `hbox_v5_bringup`; la ventilación sigue la política v3.0.3 ([prueba de banco](../procedimientos/fan-policy-bench-test.md)). + +## 7. Referencias + +[Diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) · [Diagnóstico en banco](../procedimientos/diagnostico-banco.md) · [Pinout V3](../montaje/pinout-arneses.md) · [Bring-up EinarBoard 1.0](../procedimientos/einarboard-1.0-bringup.md) · [Reflasheo](../procedimientos/reflasheo-unidades.md) · Informe técnico V3+V4 (PDF, repo `03-Architecture-Hardware/Informe-Tecnico-V3-V4/`). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión. | +| 1.1 | 2026-09-29 | Edición breve; flasheo remite al reflasheo. | + +Versiones anteriores en git. diff --git a/docs/manuales/manual-tarjeta-V4.md b/docs/manuales/manual-tarjeta-V4.md new file mode 100644 index 0000000..a18c06e --- /dev/null +++ b/docs/manuales/manual-tarjeta-V4.md @@ -0,0 +1,118 @@ +--- +title: "Manual de tarjeta — EinarBoard V4 (EinarBoard 2.0)" +project: Project Drogheda +date: 2026-09-29 +version: "1.1" +tags: [project-drogheda, hardware, einarboard, v4, manual, tecnicos, blackpill] +author: Helgen Technologies +audience: técnicos de banco y de campo +--- + +# Manual de tarjeta — EinarBoard V4 (EinarBoard 2.0) + +Blackpill en zócalo + Ethernet y puertos serie. Es el diseño de la V5 con el MCU en un módulo Blackpill enchufado: mismas redes, pines y direcciones I²C. Fuente: `board_v4.h` (verificado pad a pad contra `hbox-watchdog-v4.kicad_pcb` el 21-sep-2026) y el *Informe técnico interno V3+V4* (`03-Architecture-Hardware/Informe-Tecnico-V3-V4/…_v1.5.pdf`, §6). + +| Ítem | Valor | +|---|---| +| Proyecto KiCad | `kicad/hbox-watchdog-v4.*` (cuadro de título rev. 2.0) | +| Serigrafía | `EINARBoard 2.0` · `HBOX v4 - 2026-07` · `Advanced Engineering` · `www.helgen.tech`; etiquetas `STM32F411 BLACKPILL`, `ArduSimple simpleRTK2B Pro`, `4G NTRIP MASTER`, `MASTER RESET`, `4G NTRIP RESET` | +| Tamaño | 155 × 100 mm (20 mm más ancha que la V3, lado derecho) | +| MCU | WeAct Blackpill STM32F411CEU6 en zócalos J1/J2 (J1 con pads renumerados: corrige la errata E-J1 de la V3) | +| Fabricación | JLCPCB, orden preparada 02/03-ago-2026 (lote Y5) | +| Firmware | `hbox-tarjetaV4_0.6.0.bin` (mismo sketch `hbox_v5_bringup` compilado con `-DHBOX_BOARD_V4` para Blackpill). SHA-256 `1458470bbdd95b49…` | +| Paquete | Li-ion 18650 1S4P · JP2 en 1-2 (`F2:Li-ion`) · R55 10 k | + + + +## 1. Cómo reconocerla + +| Rasgo | V4 | Comparar con | +|---|---|---| +| Blackpill enchufado + RJ45 + clemas verdes P15/P16 | Sí | V3: Blackpill sin RJ45 ni clemas. V5: RJ45 y clemas sin Blackpill | +| USB-C en la tarjeta | Solo J9 (módem); consola y DFU por el USB-C del Blackpill | V5 tiene J11 | +| Botones | SW1 RESET (`MASTER RESET`), SW4G1 (`4G NTRIP RESET`) + los dos del Blackpill (NRST y KEY = BOOT0) | — | +| Silk de J1/J2 | `E-CS / E-SCK / E-MISO / E-MOSI`, `CHEN`, `U-TX / U-RX`, `CSTA / CFLT / BYP / SCL / SDA`… | — | + +## 2. Conectores + +Como la V5.5 ([pinout V5.6](../hardware/v56-pinout.md), tabla de diferencias al final) más P5 (sonda T/RH externa, JST 4) y P6 de 4 pines. Sin J11. `P3`, `P13` y `H3` de la V3 ya no existen. + +| Ref | Qué se conecta | Pines | +|---|---|---| +| P1 | Vehículo (GX16-5) | 1 = +24 V · 2 = GND · 3 = ignición 12–24 V · 4 = GND · 5 = n/c | +| P2 | SD-15B-05 | 1 = +5 V · 2 = GND (ajustar a 5.2–5.4 V en P2) | +| P4 | Paquete Li-ion | 1 = BAT+ · 2 = GND · 3 = NTC | +| P5 | Sonda externa I²C (opcional) | 1 = 3V3 · 2 = GND · 3 = SDA · 4 = SCL | +| P6 | Ventilador | 1 = +5V_FAN · 2 = retorno · 3 = GND · 4 = tacómetro (no usado) | +| P8 / P10 / P11 / P12 | LED de panel / reset externo / interruptor de corte / NTC de punto caliente | Como en V5 | +| P14 | LED RGB externo | 1 = 3V3 · 2 = R · 3 = G · 4 = B | +| P15 / P16 / H4 | RS-485 / RS-232 / TTL del canal B | Como en V5 (no usar P16 y H4 a la vez) | +| J9 | USB del módem | Solo configuración del 4G NTRIP Master | +| J10 | Ethernet (sin PoE) | Solo con 5 V presente | +| MOD1 · J7/J8 | simpleRTK2B · 4G NTRIP Master | Como en V5 | +| J1 / J2 | Blackpill | J1 = fila VBAT…5V; J2 = fila PB12…3V3. Módulo con el USB hacia J2 | + +## 3. Puentes y botones + +| Ref | Default | Función | +|---|---|---| +| JP2 | 1-2 (`F2:Li-ion`) | Química: Li-ion 4.00 V. Solo cambia con paquete LFP (2-3 + R55 5.6 k) | +| JP3 / JP4 | 1-2 | Straps F1/F0 — no tocar | +| JP1 | abierto | Nunca cerrar | +| JP5 | abierto | Terminación 120 Ω RS-485 ([regla](../procedimientos/v5-prueba-ethernet-serie.md#conexion-en-la-instalacion)) | +| SW1 | — | Reset del MCU (= NRST del Blackpill = P10) | +| SW4G1 | — | Reset del módem. Con el puente U13-P7 el firmware lo pulsa solo (tecla `M` y 3 s después de cada STACK ON) | +| KEY (Blackpill) | — | BOOT0: para entrar en DFU | + +Puente de reset del módem (necesario para que el MCU resetee el módem): diodo Schottky de señal del pin 12 de U13 (P7, SOIC-16 ancho) al pad 1 de SW4G1 (`MODEM_RST`), cátodo en U13. Diodo, soldadura y prueba con `M`: [V4 — preparación 1](../procedimientos/v4-prueba-fw-0.5.6.md#preparacion-1-puente-de-reset-del-modem). + +## 4. LEDs + +| LED | Significado | +|---|---| +| DB1–DB4 (medidor, vía PCF8574) | Batería 3.60 / 3.75 / 3.90 / 3.97 V | +| RGB (P14, vía PCF8574) | Verde RTK fix · Azul etapa ON sin RTK · Magenta sin NMEA · Amarillo en batería · Rojo etapa OFF | +| LED azul del Blackpill (PC13) | Lo maneja el firmware (parpadeo rápido = esperando consola) | +| LED de panel (P8) | Respaldo cableado en duro (PB0) | +| D4G1 | Actividad del módem (tenue) | +| J10 LINK / ACT | Ethernet | + +## 5. Flasheo + +Solo el USB-C del Blackpill, nada en P2 (con el W5500 alimentado, `ETH_INT` = PB2 = BOOT1 puede impedir el DFU). KEY (BOOT0) + NRST (o SW1) → `0483:DF11`. Solo `hbox-tarjetaV4_…` ([Descargas](../descargas/index.md#firmware-del-hbox-que-binario-va-en-que-tarjeta)). La consola debe decir `board=EinarBoard v4 (HBOX v4)`; si dice `v5`, es el binario equivocado. Procedimiento: [V4 — flasheo](../procedimientos/v4-prueba-fw-0.5.6.md#flasheo-de-060). + +## 6. Consola y autotest + +Iguales a la V5 (mismo firmware): teclas `h l r s t i g v P Y n A B M R C`, línea `STAT` cada 5 s, `$PHLG` cada 10 s, autotest con `CLOCK_HSE`, `LSE`, I²C (0x20 / 0x44 / 0x48 / 0x4D), `SC16IS752`, `GAUGE_WALK`. Ver el [manual V5](manual-tarjeta-V5.md) §7–§8. + +## 7. Diferencias eléctricas frente a la V5.5 + +| Tema | V4 | V5.5 | +|---|---|---| +| MCU | Blackpill F411CE en zócalo (cristales del módulo) | F411RET6 soldado, Y3/Y4 en tarjeta | +| `ETH_INT` | **PB2** (J1.16) — es BOOT1: DFU solo con USB | PC0 | +| Consola/DFU | USB-C del Blackpill | J11 | +| Sonda externa | P5 presente | P5 presente (se elimina en V5.6) | +| Ventilador | P6 de 4 pines (tach sin uso) | P6 de 2 pines | +| Ignición | Divisor 22 k / 3.3 k (nodo ≈ 3.1 V a 24 V) | Igual | +| PFI / amortiguación | 4.40 V (R51 270 k) + C78 220 µF | Igual | +| Lo demás | Mismo cargador, mismo módem (MP1584 desde `SW_5V`), mismo Ethernet/serie/expansor | — | + +## 8. Limitaciones conocidas (iguales a V5.5) + +- Módem oscuro en batería: no arranca sobre el boost; solo SW4G1 (o el puente 0.5.6 + `M`) o los 24 V lo reviven. Firmware ≥ 0.5.9: sin ciclos de etapa en batería; reset del MCU al volver el 5 V. +- Cargador: apagado en firmware < 0.6.0; el gobernador de 0.6.0 lo habilita con 24 V y riel estable. +- Ethernet y serie sin prueba en hardware real. + +## 9. Procedimientos relacionados + +[V4 — preparación y prueba con firmware 0.6.0](../procedimientos/v4-prueba-fw-0.5.6.md) · [Política de ventilador (banco)](../procedimientos/fan-policy-bench-test.md) · [Acta V4](../formularios/v4.html) · [Reflasheo de unidades](../procedimientos/reflasheo-unidades.md) · [Prueba módem en batería](../procedimientos/prueba-bateria-modem.md) · [Manual V5](manual-tarjeta-V5.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión. | +| 1.1 | 2026-09-29 | Edición breve; puente y flasheo remiten al procedimiento V4 (el manual listaba 1N5819, que el procedimiento prohíbe). | + +Versiones anteriores en git. diff --git a/docs/manuales/manual-tarjeta-V5.md b/docs/manuales/manual-tarjeta-V5.md new file mode 100644 index 0000000..8c30d45 --- /dev/null +++ b/docs/manuales/manual-tarjeta-V5.md @@ -0,0 +1,174 @@ +--- +title: "Manual de tarjeta — EinarBoard V5 (V5.5 y V5.6)" +project: Project Drogheda +date: 2026-09-29 +version: "1.1" +tags: [project-drogheda, hardware, einarboard, v5, v5.5, v5.6, manual, tecnicos] +author: Helgen Technologies +audience: técnicos de banco y de campo +--- + +# Manual de tarjeta — EinarBoard V5 (V5.5 y V5.6) + +Valores de ingeniería: [hoja de datos V5.6](../hardware/v56-datasheet.md). Pin a pin: [pinout V5.6](../hardware/v56-pinout.md). + +| | V5.5 | V5.6 | +|---|---|---| +| Estado | 15 tarjetas fabricadas (JLCPCB, 22-ago-2026), en ensamble y en campo | Esquemático listo (ECO 27/28-sep); PCB y pedido pendientes | +| Proyecto KiCad | `kicad/hbox-watchdog-v5.*` (etiqueta git `v5.5-as-fabbed`) | `kicad/hbox-watchdog-v5.*` (ECO aplicada) | +| Firmware | `hbox-v5-bringup_0.6.0.bin` | `hbox-v5-bringup_0.6.0.bin` (0.6.x añadirá el control del módem) | +| Paquete de batería | Li-ion 18650 1S4P · JP2 en 1-2 · R55 10 k | LFP-HT 26650 · JP2 en 2-3 · R55 5.6 k · NTC B3380 | + +## 1. Identificación + + + + +| Rasgo | Cómo reconocerla | +|---|---| +| Serigrafía | `EINARBoard 4.0` · `HBOX v5 - 2026-08` · `www.helgen.tech` (la serigrafía dice 4.0; la tarjeta es V5) | +| MCU | STM32F411 soldado (LQFP-64, U16), sin Blackpill. Con Blackpill es V3 o V4 | +| Dos USB-C | J11 DFU/consola (junto a SW1/SW2 y al RJ45) y J9 USB del módem (junto al zócalo XBee) | +| RJ45 | J10 con LEDs integrados, sin PoE | +| Clemas verdes | P15 RS-485 y P16 RS-232 (Phoenix 3.5 mm) | +| Cristales | Y3 25 MHz (MCU), Y1 25 MHz (W5500), Y2 3.6864 MHz (SC16IS752), Y4 32.768 kHz | +| V5.5 vs V5.6 | V5.6: U7 en SO-8 con exposed pad (AP64350), tres 220 µF polímero (C3, C43, C78), sin P5, JP6 junto a P11, U18 (SOT-563) junto al zócalo XBee (§9) | + +## 2. Conectores + +V5.5 igual al [pinout V5.6](../hardware/v56-pinout.md) salvo lo listado en §9. + +| Ref | Qué va | Pines | Cuidado | +|---|---|---|---| +| P1 | Arnés del vehículo (GX16-5) | 1 = +24 V · 2 = GND · 3 = ignición (12–24 V cruda) · 4 = GND · 5 = n/c | Solo alimenta el ventilador y la lectura de ignición | +| P2 | Mean Well SD-15B-05 | 1 = +5 V · 2 = GND | Ajustar a 5.2–5.4 V medidos en P2; cable corto, ≥ 3 A | +| P4 | Paquete de batería | 1 = BAT+ · 2 = GND · 3 = NTC | Química = JP2 ([ensamble §2](../procedimientos/v5-ensamble.md#2-tarjeta-sin-energia)). Nunca en pruebas de tarjeta desnuda | +| P6 | Ventilador 5 V, 2 hilos | 1 = +5V_FAN · 2 = retorno conmutado | — | +| P8 | LED de panel | 1 = ánodo · 2 = cátodo | — | +| P10 | Botón de reset externo | 1 = NRST · 2 = GND | Solo reinicia el MCU | +| P11 | Interruptor de corte | 1 = MAIN5V · 2 = SYS5V | Abierto = tarjeta apagada. En banco, jumper | +| P12 | NTC de punto caliente (opcional) | 1 = NTC · 2 = GND | Sin sonda, `tntc=n/c` | +| P14 | LED RGB externo (ánodo común) | 1 = 3V3 · 2 = R · 3 = G · 4 = B | — | +| P15 | RS-485 | 1 = A · 2 = B · 3 = GND | JP5 = terminación 120 Ω | +| P16 | RS-232 | 1 = TX · 2 = RX · 3 = GND | No usar a la vez que H4 (TTL) | +| J11 | USB-C DFU + consola | — | Alimenta solo el 3.3 V (MCU + sensores); no enciende módem ni F9P | +| J9 | USB-C del módem | — | Solo para configurar el módem desde la laptop | +| J10 | Ethernet RJ45 | — | Sin PoE; solo con 5 V (con USB solo el W5500 queda en reset) | +| MOD1 | simpleRTK2B (zócalo UNO) | — | Interruptores del módulo: [módulos RTK y 4G](../procedimientos/v5-modulos-integracion.md) | +| J7/J8 | Módem (zócalo XBee) | — | Pin 1 (VCC) en J7.1 | +| P5 | Sonda T/RH externa | 1 = 3V3 · 2 = GND · 3 = SDA · 4 = SCL | Solo V5.5 | + +## 3. Puentes de soldadura + +| Ref | V5.5 | V5.6 | Función | +|---|---|---|---| +| JP2 | 1-2 (`F2:Li-ion`) | 2-3 (`F2:LFP`) | Química del paquete: Li-ion flota a 4.00 V, LFP a 3.50 V. Regla: [ensamble §2](../procedimientos/v5-ensamble.md#2-tarjeta-sin-energia) | +| JP3 / JP4 | 1-2 / 1-2 | Igual | Straps F1/F0 del LTC4040; no tocar | +| JP1 | Abierto | Abierto | Une el 5 V del ventilador con el de la SD-15B; nunca cerrar | +| JP5 | Abierto | Abierto | Terminación 120 Ω del RS-485 ([regla](../procedimientos/v5-prueba-ethernet-serie.md#conexion-en-la-instalacion)) | +| JP6 | — | Abierto | Puentea P11; cerrar solo en unidades sin interruptor de corte | + +## 4. Botones + +| Ref | Serigrafía | Función | +|---|---|---| +| SW1 | RESET | Reinicia el MCU (igual que P10); no apaga módem ni F9P | +| SW2 | BOOT / BOOT0 | SW2 pulsado + SW1 → modo DFU | +| SW4G1 | 4G NTRIP RESET | Reinicia el módem. Con los 24 V, lo único que revive un módem oscuro en una V5.5 en batería | + +## 5. LEDs + +| LED | Estado | Significado | +|---|---|---| +| D18 PWR (verde) | Encendido | Hay 3.3 V (USB en J11, o 5 V en P2 con P11 cerrado) | +| D17 C13 (azul) | Parpadeo rápido al arrancar | Espera la consola USB (máx. 4 s). Chip virgen: apagado | +| DB1–DB4 (medidor) | 1–4 encendidos | Batería 3.60 / 3.75 / 3.90 / 3.97 V (umbrales Li-ion; LFP en 0.6.x) | +| RGB (P14) | Verde | RTK FIX | +| | Azul | Etapa ON, sin RTK FIX | +| | Magenta | Etapa ON, sin NMEA (el F9P no habla) | +| | Amarillo | En batería (sin 5 V en P2) | +| | Rojo | Etapa OFF (sin 5 V, batería < 3.40 V, > 60 °C o apagada por operador) | +| D4G1 (junto al XBee) | Parpadeo tenue | Actividad del módem (tenue por diseño) | +| J10 LINK / ACT | Verde / amarillo | Enlace y actividad Ethernet | + +## 6. Flasheo + +DFU por J11, solo USB, sin P1/P2 ni batería: mantén SW2, pulsa y suelta SW1, suelta SW2 (`STM32 BOOTLOADER`, `0483:DF11`). Procedimiento completo: [prueba y flasheo §5](../procedimientos/v5-prueba-y-flasheo.md#5-flasheo-por-usb-dfu-j11-5-min). Binario: [Descargas](../descargas/index.md). La consola debe decir `hbox_v5_bringup 0.6.0` y `board=EinarBoard v5 (HBOX v5)`. + +Nunca flashees `blackpillrtkcode` (V3) en una V5: usa PB12–PB15 como LEDs y en la V5 son el SPI del W5500. + +## 7. Consola + +USB CDC en J11 a 115200 (CoolTerm, `screen`, monitor de Arduino), CR+LF. `h` = ayuda, `l` = leyenda. Cada 5 s sale `STAT …` y cada 10 s `$PHLG,…`. Para reportar: líneas `EVT` + la última `STAT`. + +| Tecla | Uso | +|---|---| +| `r` | Repetir el autotest (§8) | +| `s` / `t` | `STAT` / `$PHLG` ahora | +| `i` / `g` | Escaneo I²C / recorrido de LEDs (DB1→DB4, R, G, B) | +| `v` | Puntos de medición (SYS5V, PWR_CTRL, GATE_LS, SW_5V, 3V3_MODEM, MODEM_RST) | +| `P` → `Y` | Encender la etapa RTK (solo con 5 V en P2); `P` otra vez apaga | +| `n` | NMEA 20 s (fix 4 = RTK FIX) | +| `A` | AUTO ↔ MANUAL (de fábrica AUTO: la etapa enciende sola con 5 V) | +| `M` | Pulso de reset al módem (V5.5: requiere el puente U13-P7 → SW4G1) | +| `R` | Reset por software del MCU | +| `C` | Bloquear/permitir el cargador | + +## 8. Autotest + +Al arrancar y con `r`. Termina en `>>> BOARD OK` o `>>> BOARD CHECK FAILED`. + +| Línea | PASS significa | Si FAIL | +|---|---|---| +| `[PASS] CLOCK_HSE` | Y3 25 MHz y PLL a 96 MHz | Y3 / C113 / C114 | +| `[PASS] LSE_Y4` | Y4 32.768 kHz oscila | Y4 / C115 / C116 (no impide operar) | +| `[PASS] I2C PCF8574 U13 @0x20` | Expansor de LEDs | U13, pull-ups R30/R31 | +| `[PASS] I2C SHT40 U3 @0x44` | Sensor de aire | U3 | +| `[PASS] I2C TMP102 U4 @0x48` | Sensor de temperatura | U4 | +| `[PASS] I2C SC16IS752 U10 @0x4D` | Puente serie | U10, Y2 | +| `[PASS] TMP102` / `[PASS] SHT40` | Lecturas entre −20 y 85 °C | Sensor o bus | +| `[PASS] SC16IS752` | Scratchpad OK | U10 | +| `[PASS] GAUGE_WALK` | Visual: DB1→DB4 y R, G, B en orden | LED, RB1–4 / R89–91, U13 | +| `[PASS] ADC` | Informativo: `vbat v5 ntc mcu` | Con solo USB, `v5≈0` y `vbat≈0` es normal | +| `[PASS] DIN` | Informativo: `ign chrg fault ser_irq eth_int` | — | + +En V5.6 el escaneo I²C (`i`) muestra además 0x49 (U18, sensor del módem). + +## 9. Diferencias V5.5 → V5.6 + +| Tema | V5.5 | V5.6 | +|---|---|---| +| Módem en batería | Cuelga del riel de la etapa; apagado en batería no vuelve hasta SW4G1 o 24 V | Regulador propio (U7 AP64350) desde SYS5V; el MCU lo enciende (`MODEM_EN`) y resetea (`MODEM_RST`) sin puente | +| Puente U13 pin 12 → SW4G1 | Necesario para `M` | No hace falta (PC1 hace el reset) | +| Paquete | Li-ion 18650 1S4P, JP2 1-2 | LFP-HT 26650, JP2 2-3, R55 5.6 k | +| Corriente de carga | 2.4 A (la fuente se plegaba) | 1.4 A, límite de entrada 2.5 A | +| Sonda externa | P5 (JST 4) | No existe. U4 mide el cargador, U18 (0x49) el módem; el MCU también lee el NTC del paquete | +| Interruptor de corte | Solo P11 | P11 o JP6 puenteado | +| USB del módem J9 | Sin ESD | Con ESD (D19) | +| Ethernet | El W5500 puede salir de reset solo (130 mA en batería) | Queda en reset hasta que el MCU lo levante (R112) | +| Regulador 3.3 V | AMS1117 | TLV1117LV (funciona con batería baja) | + +## 10. Ethernet y puertos serie + +- Ethernet (J10): solo con el build de banco `0.6.0-eth`; DHCP o `192.168.7.2/24`, TCP a `192.168.7.1:5010` con NMEA + `$PHLG` + `$PHEV` + `$PHID`. Tecla `E`. +- RS-485 (P15) / RS-232 (P16): 0.6.0 solo comprueba que el SC16IS752 responde; loopback previsto en 0.6.1. +- Procedimiento: [Ethernet y puertos serie](../procedimientos/v5-prueba-ethernet-serie.md), obligatorio en una V5.5 antes de pedir la V5.6. + +## 11. Limitaciones de la V5.5 + +- Módem oscuro en batería: si el módem se apaga en batería (ciclo de etapa, brown-out) no arranca sobre el boost del LTC4040; solo lo reviven SW4G1 o los 24 V. Por eso el firmware ≥ 0.5.9 nunca cicla la etapa en batería y resetea el MCU al volver el 5 V ([hallazgos](../procedimientos/prueba-bateria-modem.md#3-hallazgos-2527-sep)). +- Hasta 0.5.9 el cargador estaba apagado por firmware. 0.6.0 carga con 24 V, etapa ON > 120 s y riel ≥ 5.05 V, y corta bajo 4.90 V. Reflashea unidades con firmware anterior. +- La consola no sabe si el módem está vivo: `modem=vivo|SOSPECHOSO|?` es una inferencia por RTCM y caídas del riel. +- Ethernet y serie no se han probado en hardware real (sep-2026). +- Y2: la pieza dice 3.6864; el esquemático V5.6 dice `1.8432MHz` . + +Procedimientos V5: [Producción](../produccion/index.md) · [Taller](../taller/index.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión (V5.5 fabricada + V5.6 en esquemático). | +| 1.1 | 2026-09-29 | Edición breve; flasheo, química/JP2 y JP5 remiten a su procedimiento. | + +Versiones anteriores en git. diff --git a/docs/manuales/manual-tarjeta-v6.md b/docs/manuales/manual-tarjeta-v6.md new file mode 100644 index 0000000..d3b1231 --- /dev/null +++ b/docs/manuales/manual-tarjeta-v6.md @@ -0,0 +1,22 @@ +--- +title: "Manual de tarjeta — EinarBoard v6 (en diseño)" +project: Project Drogheda +date: 2026-09-29 +version: "0.2" +tags: [project-drogheda, hardware, einarboard, v6, manual, placeholder] +author: Helgen Technologies +--- + +# Manual de tarjeta — EinarBoard v6 (en diseño) + +En diseño (`kicad/hbox-watchdog-v6.*`). No hay tarjetas fabricadas y no aplica a ningún procedimiento de técnicos. Este manual se escribe con el primer lote. + +- Qué cambia: GNSS (u-blox ZED-F9P) y módem 4G (A7670SA) soldados en la tarjeta, sin zócalos MOD1/J7-J8; fuente de 5 V a bordo (U25) en lugar de la Mean Well externa. +- Referencia técnica: [auditoría pre-fabricación](../hardware/v6-auditoria-prefab.md) ([inglés](../hardware/v6-prefab-audit.md)) · [plan de cobre y colocación EMC](../hardware/EinarBoard-v6_Plan-de-Cobre_ES.html) · [revisión contra lecciones V5.5](../hardware/v6-revision-lecciones-v55.md) · [auditoría completa](../hardware/v6-auditoria-completa.md) · [cambios al esquemático](../hardware/v6-cambios-esquematico.md) · [mapa de pines del MCU](../hardware/v6-pinmap.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 0.1 | 2026-09-29 | Marcador de posición. | +| 0.2 | 2026-09-29 | Edición breve. | diff --git a/docs/montaje/assembly-guide.md b/docs/montaje/assembly-guide.md index 5ce065f..45d0ee6 100644 --- a/docs/montaje/assembly-guide.md +++ b/docs/montaje/assembly-guide.md @@ -1,8 +1,17 @@ -# Guía de ensamble (PDF) +--- +title: "Guía de ensamble del gabinete (PDF)" +tags: [project-drogheda, hbox, montaje, gabinete, pdf] +date: 2026-09-19 +project: Project Drogheda +author: Helgen Technologies +--- -La guía de ensamble completa del gabinete HBOX es un PDF: +# Guía de ensamble del gabinete (PDF) -**[Abrir 0007-1000_Assembly_Guide.pdf](0007-1000_Assembly_Guide.pdf){:target="_blank"}** (≈9 MB) +[0007-1000_Assembly_Guide.pdf](0007-1000_Assembly_Guide.pdf){:target="_blank"} (≈ 9 MB). Descárgala en la tablet o laptop del banco antes de empezar. Orden de trabajo y reglas de calidad: [guía de ensamble y QC](guia-ensamble-qc.md). -Se recomienda descargarla en la tablet o laptop del banco antes de empezar, para no -depender de la red durante el armado. +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-19 | Página de descarga del PDF 0007-1000. | diff --git a/docs/montaje/bom-split.md b/docs/montaje/bom-split.md index a016014..ca62332 100644 --- a/docs/montaje/bom-split.md +++ b/docs/montaje/bom-split.md @@ -1,32 +1,35 @@ --- -title: HBOX Watchdog v3 PROD — Assembly BOM Split +title: "HBOX Watchdog V3 (PROD) — BOM dividido para ensamble" project: Project Drogheda date: 2026-07-05 -tags: [project-drogheda, hardware, pcb, assembly, jlcpcb, bom] -status: Board routed, DRC fab-clean — assembly reference for JLCPCB PCBA order +tags: [project-drogheda, hardware, pcb, assembly, jlcpcb, bom, v3] +author: Helgen Technologies +status: HISTÓRICO — referencia de ensamble del pedido PCBA V3 en JLCPCB (jul-2026) --- -# HBOX Watchdog v3 PROD — Assembly BOM Split +# HBOX Watchdog V3 (PROD) — BOM dividido para ensamble -Audit of the routed board (`kicad/hbox-watchdog-v3-PROD.kicad_pcb`, 126 footprints) -for the JLCPCB assembly order. Three buckets: **(A)** what JLC solders onto the -board, **(B)** the plug-in modules that sit on top (you install), and **(C)** what -lives off-board and connects through the JST harness. +Tarjeta: V3 (EinarBoard 1.0, `kicad/hbox-watchdog-v3-PROD`, 126 huellas). -| Bucket | Count | JLC assembles? | +!!! note "Solo V3 — para V5.6 usa [Pinout V5.6](../hardware/v56-pinout.md)" + El BOM de la V5.6 (94 LCSC) se exporta desde el esquemático `hbox-watchdog-v5`; ver [hoja de datos V5.6 §11](../hardware/v56-datasheet.md). + +Traducido del original en inglés (05-jul-2026). + +Auditoría de la tarjeta ruteada (`kicad/hbox-watchdog-v3-PROD.kicad_pcb`, 126 huellas) para el pedido de ensamble en JLCPCB. Tres grupos: (A) lo que JLC suelda en la tarjeta, (B) los módulos enchufables que van encima (los instala Helgen) y (C) lo que vive fuera de la tarjeta y se conecta por el arnés JST. + +| Grupo | Cantidad | ¿JLC lo ensambla? | |---|---|---| -| A. On-board parts (SMD + THT) | 103 parts + 12 connectors + 5 sockets | **Yes** | -| B. Plug-in modules (on top) | 3 modules | No — you install | -| C. External via JST harness | wired to 12 connectors | No — off-board | -| Fab features (2 test points, 4 mounting holes) | 6 | n/a | +| A. Partes en la tarjeta (SMD + THT) | 103 partes + 12 conectores + 5 zócalos | Sí | +| B. Módulos enchufables (encima) | 3 módulos | No — los instala Helgen | +| C. Externos por el arnés JST | cableados a 12 conectores | No — fuera de la tarjeta | +| Elementos de fabricación (2 puntos de prueba, 4 barrenos de montaje) | 6 | n/a | ---- +## A. Ensamblado por JLC — en la PCB -## A. Assembled by JLC — on the PCB +### A1 · Partes SMD (PCBA estándar — 98 partes) -### A1 · SMD parts (standard PCBA — 98 parts) - -| Qty | Value | Package | Refs | +| Cant. | Valor | Encapsulado | Refs | |---|---|---|---| | 10 | 10k | R0603 | R2, R5, R6, R7, R8, R41, Rigb, Rled, Rrp, Rtp | | 8 | 100k | R0603 | R20, R56, R57, R58, Ren1, Rfreq, Rfreq2, Rgs | @@ -37,7 +40,7 @@ lives off-board and connects through the JST harness. | 3 | SS34 | D_SMA | D2, Dbk, Dbk2 | | 3 | 22uF | C0805 | C35, C40, C41 | | 3 | 100k/1% | R0603 | R52, R54, R60 | -| 2 | MP1584EN | SOIC-8-EP | U2 (fan buck), U7 (modem buck) | +| 2 | MP1584EN | SOIC-8-EP | U2 (buck del ventilador), U7 (buck del módem) | | 2 | 2.2nF | C0603 | Ccomp, Ccomp2 | | 2 | 100R | R0603 | Rg, Rig | | 2 | 10uF | C0805 | C30, C34 | @@ -48,7 +51,7 @@ lives off-board and connects through the JST harness. | 2 | AO3400A | SOT-23 | Q2, Q4 | | 2 | 10k/1% | R0603 | R42, R55 | | 2 | 47uF | C1210 | C32, C33 | -| 1 | **LTC4040EUFD** | QFN-24 | U6 (backup-supply/charger) | +| 1 | **LTC4040EUFD** | QFN-24 | U6 (respaldo/cargador) | | 1 | AO4406A | SOIC-8 | Q7 | | 1 | AO3401A | SOT-23 | Q1 | | 1 | IRFR5305 | TO-252 | Q10 | @@ -56,85 +59,81 @@ lives off-board and connects through the JST harness. | 1 | BAT54 | SOD-123 | D5 | | 1 | 1N4148W | SOD-123 | D6 | | 1 | SMBJ33A | D_SMB | D10 | -| 1 | **SHT40-AD1B** | DFN-4 | U3 (humidity/temp) | -| 1 | **TMP102** | SOT-563 | U4 (temp) | -| 1 | 8mR/1% | R1206 | RS1 (current sense) | +| 1 | **SHT40-AD1B** | DFN-4 | U3 (humedad/temperatura) | +| 1 | **TMP102** | SOT-563 | U4 (temperatura) | +| 1 | 8mR/1% | R1206 | RS1 (sensado de corriente) | | 1 | PPTC 3A | Fuse1812 | F1 | | 3 | 2.2uH / 10uH / 10uH-2A | SRU8028 8×8 | L6, L2, L7 | | 1 | 22uF/50V | C1210 | C22 | | 1 | 22uF/16V | C0805 | C23 | | 1 | 2.2uF | C0603 | C31 | -| — | *(single-value R's)* | R0603 | Ren2 20k, Rdfu 22k, R21 19.1k, R50 825R, R51 287k, R53 499k, R61 31.6k | -| 4 | jumpers | SolderJumper | JP1 (0R), JP2 (F2), JP3 (F1), JP4 (F0) | +| — | *(resistencias de un solo valor)* | R0603 | Ren2 20k, Rdfu 22k, R21 19.1k, R50 825R, R51 287k, R53 499k, R61 31.6k | +| 4 | puentes | SolderJumper | JP1 (0R), JP2 (F2), JP3 (F1), JP4 (F0) | -### A2 · Through-hole parts (THT — JLC "through-hole assembly" surcharge, or hand-solder) +### A2 · Partes through-hole (THT — recargo de JLC por «through-hole assembly», o soldar a mano) -| Ref | Part | Note | +| Ref | Parte | Nota | |---|---|---| -| K1 | Omron G5V-1 DC5 relay | Modo-B fail-safe bypass | -| SW1 | 6 mm push (RESET) | | -| C3, C10, C43 | Radial electrolytics (47µF, 47µF/50V, 100µF) | | +| K1 | Relevador Omron G5V-1 DC5 | Bypass fail-safe del Modo B | +| SW1 | Botón de 6 mm (RESET) | | +| C3, C10, C43 | Electrolíticos radiales (47 µF, 47 µF/50 V, 100 µF) | | -### A3 · Connectors & module sockets (THT — soldered to board) +### A3 · Conectores y zócalos de módulos (THT — soldados a la tarjeta) -| Ref | Part | Purpose | +| Ref | Parte | Propósito | |---|---|---| -| P1 | Phoenix MKDS 1.5-5 (5-pos terminal) | GX16 machine power in | -| P2, P8, P10, P11, P12 | JST-XH 2-pin | see bucket C | +| P1 | Phoenix MKDS 1.5-5 (terminal de 5 posiciones) | Entrada de energía de la máquina (GX16) | +| P2, P8, P10, P11, P12 | JST-XH 2-pin | ver grupo C | | P4, P13 | JST-XH 3-pin | | | P3, P5, P6 | JST-XH 4-pin | | -| H3 | 1×3 pin header | USART1 reserved | -| **J1, J2** | 1×20 female 2.54 | **Blackpill socket** | -| **J7, J8** | 1×10 female 2.00 | **4G XBee socket** | -| **MOD1** | Arduino-UNO-form female headers | **simpleRTK2B Pro socket** | +| H3 | Header de 1×3 pines | USART1 reservado | +| **J1, J2** | Hembra 1×20 de 2.54 mm | Zócalo del Blackpill | +| **J7, J8** | Hembra 1×10 de 2.00 mm | **Zócalo XBee del 4G** | +| **MOD1** | Headers hembra formato Arduino UNO | **Zócalo del simpleRTK2B Pro** | -> ⚠️ **Confirm before ordering:** engineering notes flag **P3 / P13 / H3 as DNP** -> (Modo-B + K1 NC bypass makes them redundant), but they are **not** marked DNP in -> the board file — so JLC would populate them. Decide per-connector. +!!! warning "Confirmar antes de pedir" + Las notas de ingeniería marcan **P3 / P13 / H3 como DNP** (Modo B + el bypass NC de K1 los vuelven redundantes), pero **no** están marcados DNP en el archivo de la tarjeta — JLC los poblaría. Decidir conector por conector. ---- +## B. Módulos enchufables — montados encima (los instala Helgen; no van en el pedido a JLC) -## B. Plug-in modules — mounted ON TOP (you install, NOT in the JLC order) +Son tarjetas completas que se asientan en los zócalos de arriba. **No** añadirlos al BOM de JLC — se colocan a mano cuando llega el PCBA. -These are complete boards that seat into the sockets above. Do **not** add them to -the JLC BOM — they're hand-fitted after the PCBA arrives. - -| Module | Seats into | Notes | +| Módulo | Se asienta en | Notas | |---|---|---| -| **simpleRTK2B Pro** (ZED-F9P) | MOD1 (Arduino headers) | GNSS RTK receiver | -| **STM32F411 Blackpill** | J1 + J2 (2×20) | watchdog MCU | -| **4G NTRIP Master** (XBee LTE) | J7 + J8 (2×10, 2 mm) | modem, 3V3 socket | +| **simpleRTK2B Pro** (ZED-F9P) | MOD1 (headers Arduino) | receptor GNSS RTK | +| **STM32F411 Blackpill** | J1 + J2 (2×20) | MCU del watchdog | +| **4G NTRIP Master** (XBee LTE) | J7 + J8 (2×10, 2 mm) | módem, zócalo a 3V3 | ---- +## C. Externos — conectados por el arnés JST (NO en la tarjeta) -## C. External — connected via the JST harness (NOT on the board) +Todo lo que se enchufa en los conectores de borde y vive fuera del HBOX (o en el gabinete). Cablear según el [pinout de arneses](pinout-arneses.md). -Everything that plugs into the edge connectors and lives outside the HBOX (or in the -cabinet). Wire per the harness pinout (`harness-connector-pinout.md`). - -| Conn | Wires to (external) | Key pins | +| Conector | Se cablea a (externo) | Pines clave | |---|---|---| -| **P1** GX16-5 | Machine power + ignition from the cabinet | 1 = 24V_IN ⚡, 3 = IGN_IN, 2 = GND | -| **P2** 5V-IN | Mean Well SD-15B-05 5 V supply (VEH5V rail) | 1 = VEH5V ⚡, 2 = GND | -| **P3** RTK2B-UART1 | RTK2B UART1 tap (GNSS TX/RX) | 1 = SW_5V ⚡, 3 = GNSS_TX, 4 = GNSS_RX | -| **P4** BATT | 1S4P 12 Ah pack + NTC | 1 = BAT_PLUS ⚡, 3 = NTC, 2 = GND | -| **P5** TEMP_PROBE | External I²C temp/probe header | 1 = 3V3, 3 = SDA, 4 = SCL | -| **P6** FAN | Cooling fan (5 V, tach) | 1 = 5V_FAN ⚡, 2 = FAN_RET, 4 = TACH | -| **P8** PANEL_LED | Panel status LED | 1 = LED_A, 2 = LED_K | -| **P10** RESET-EXT | External reset button | 1 = NRST, 2 = GND | -| **P11** CUTOFF-SW | Power cutoff switch (SYS→MAIN 5 V) | 1 = MAIN5V ⚡, 2 = SYS5V ⚡ | -| **P12** NTC-HOTSPOT | Cabinet hotspot NTC | 1 = NTC_TEMP, 2 = GND | -| **P13** MODO-B-UPLINK | Modo-B uplink to 4G | 1 = USART1_RX, 2 = DIN_4G, 3 = GND | +| **P1** GX16-5 | Energía de la máquina + ignición desde el gabinete | 1 = 24V_IN ⚡, 3 = IGN_IN, 2 = GND | +| **P2** 5V-IN | Fuente Mean Well SD-15B-05 de 5 V (riel VEH5V) | 1 = VEH5V ⚡, 2 = GND | +| **P3** RTK2B-UART1 | Derivación del UART1 del RTK2B (GNSS TX/RX) | 1 = SW_5V ⚡, 3 = GNSS_TX, 4 = GNSS_RX | +| **P4** BATT | Paquete 1S4P 12 Ah + NTC | 1 = BAT_PLUS ⚡, 3 = NTC, 2 = GND | +| **P5** TEMP_PROBE | Header externo de sonda I²C de temperatura | 1 = 3V3, 3 = SDA, 4 = SCL | +| **P6** FAN | Ventilador de enfriamiento (5 V, tacómetro) | 1 = 5V_FAN ⚡, 2 = FAN_RET, 4 = TACH | +| **P8** PANEL_LED | LED de estado del panel | 1 = LED_A, 2 = LED_K | +| **P10** RESET-EXT | Botón de reset externo | 1 = NRST, 2 = GND | +| **P11** CUTOFF-SW | Interruptor de corte de energía (SYS→MAIN 5 V) | 1 = MAIN5V ⚡, 2 = SYS5V ⚡ | +| **P12** NTC-HOTSPOT | NTC de punto caliente del gabinete | 1 = NTC_TEMP, 2 = GND | +| **P13** MODO-B-UPLINK | Enlace de subida Modo B al 4G | 1 = USART1_RX, 2 = DIN_4G, 3 = GND | ---- +## Pendientes antes del pedido a JLCPCB -## Action items before the JLCPCB order +1. Añadir números de parte LCSC al BOM (`fab-jlcpcb/…-BOM.csv`) — exporta solo valor + huella; el PCBA de JLC empareja por número LCSC. Cuidado con los raros: **LTC4040EUFD, SHT40-AD1B, TMP102, MP1584EN, AO4406A, Bourns SRU8028** — verificar stock en JLC/LCSC. +2. Decidir el ensamble THT — JLC cobra extra por through-hole (K1, SW1, C3/C10/C43, todos los conectores/zócalos). Enfoque común: JLC hace SMD y los conectores + zócalos se sueldan a mano (también evita pagarle a JLC las partes grandes Phoenix/JST). +3. **Resolver la pregunta DNP de P3 / P13 / H3** de arriba. +4. **No** poner en el BOM los tres módulos enchufables (grupo B). -1. **Add LCSC part numbers** to the BOM (`fab-jlcpcb/…-BOM.csv`) — it exports value + - footprint only; JLC PCBA matches on LCSC part #. Watch the odd ones: - **LTC4040EUFD, SHT40-AD1B, TMP102, MP1584EN, AO4406A, Bourns SRU8028** — verify JLC/LCSC stock. -2. **Decide THT assembly** — JLC charges extra for through-hole (K1, SW1, C3/C10/C43, - all connectors/sockets). Common approach: JLC does SMD, you hand-solder the - connectors + sockets (also avoids paying JLC for the big Phoenix/JST parts). -3. **Resolve the P3 / P13 / H3 DNP question** above. -4. Do **not** BOM the three plug-in modules (bucket B). +Ver también: [manual V3](../manuales/manual-tarjeta-V3.md) · [guía de ensamble y QC](guia-ensamble-qc.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-07-05 | Auditoría original (inglés). | +| 1.1 | 2026-09-29 | Traducción al español, nota de alcance V3 / V5.6 y enlaces. Tablas sin cambios. | diff --git a/docs/montaje/guia-ensamble-qc.md b/docs/montaje/guia-ensamble-qc.md index 75a5cb5..021d2f4 100644 --- a/docs/montaje/guia-ensamble-qc.md +++ b/docs/montaje/guia-ensamble-qc.md @@ -1,52 +1,54 @@ +--- +title: "Guía de ensamble y control de calidad — HBOX" +tags: [project-drogheda, hbox, procedimiento, ensamble, qc, v3, borrador] +date: 2026-09-19 +project: Project Drogheda +author: Helgen Technologies +version: 0.9.2 +--- + # Guía de ensamble y control de calidad — HBOX -!!! warning "Borrador para revisión" - Esta guía es un **borrador** basado en el BOM de ensamble y el pinout de arneses. - Ingeniería debe validarla antes de adoptarla como procedimiento oficial. El - **checklist interactivo** que la acompaña está en - [Actas → Checklist de ensamble](../actas/index.md). - -El objetivo es que cada HBOX se arme siempre igual y quede un registro firmado por -unidad. El ensamble parte de una **PCBA ya probada y aprobada** en su acta de prueba -(V4 o V5); esta guía cubre lo que ocurre *después* de esa prueba: montaje de módulos, -mecánica, arnés y energizado final. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Estado: borrador V3 basado en el BOM de ensamble y el pinout de arneses; ingeniería debe validarlo. Para V5.5/V5.6: [Ensamble de la unidad](../procedimientos/v5-ensamble.md) y [pinout V5.6](../hardware/v56-pinout.md). + - Para quién: técnicos de banco. + - Cuándo: después de la prueba eléctrica aprobada de la tarjeta y antes del energizado final. + - Tiempo: 45–60 min por unidad. + - Necesitas: PCBA aprobada, módulos, gabinete y arnés, cautín, separadores, etiquetas, actas de [prueba](../formularios/v5.html) y [ensamble](../formularios/ensamble.html). ## Orden de trabajo -1. **Recepción de la PCBA.** Inspección visual de la tarjeta que llega de JLCPCB: - componentes completos, sin soldadura fría ni puentes, conectores rectos. -2. **Soldadura manual** (si el lote la requiere): terminal de potencia P1, conectores - JST, relevador K1, botón SW1, electrolíticos radiales y zócalos de módulos. Cuidar - polaridad de diodos y electrolíticos. -3. **Prueba eléctrica de la tarjeta** → se registra en su acta de prueba - ([V5](../formularios/v5.html) / [V4](../formularios/v4.html)). **No se montan módulos - hasta que la tarjeta pase.** -4. **Módulos enchufables** sobre la tarjeta aprobada: MCU, simpleRTK2B en MOD1, módulo - 4G. Verificar orientación **antes** de energizar. -5. **Mecánica:** fijar la tarjeta con separadores en sus barrenos, montar ventilador - (dirección de flujo), alinear conectores de panel con el gabinete. -6. **Arnés:** conectar cada JST contra el pinout, sin intercambiar conectores. -7. **Etiquetado:** número de serie del equipo, visible y legible. -8. **Energizado final** del equipo armado y registro del acta de ensamble. +1. Recepción de la PCBA: componentes completos, sin soldadura fría ni puentes, conectores rectos. +2. Soldadura manual si el lote la requiere: P1, JST, K1, SW1, electrolíticos radiales y zócalos. Cuida la polaridad de diodos y electrolíticos. +3. Prueba eléctrica de la tarjeta en su acta ([V5](../formularios/v5.html) / [V4](../formularios/v4.html)). Sin PASS no se montan módulos. +4. Módulos: MCU, simpleRTK2B en MOD1, módem. Verifica orientación antes de energizar. +5. Mecánica: separadores en los barrenos, ventilador (dirección de flujo), conectores alineados con el panel. +6. Arnés: cada JST contra el pinout, sin intercambiar conectores. +7. Etiqueta con el número de serie, visible. +8. Energizado final y acta de ensamble. -## Referencia de conectores (arnés) +## Conectores del arnés (V3) -| Conector | Función | Puntos clave | +| Conector | Función | Pines | |---|---|---| -| **P1** GX16-5 | Alimentación de máquina + ignición | 1 = 24V ⚡, 3 = ignición, 2 = GND | -| **P2** | Entrada 5 V (Mean Well SD-15B) | 1 = VEH5V ⚡, 2 = GND | -| **P4** | Batería 1S4P + NTC | 1 = BAT+ ⚡, 3 = NTC, 2 = GND | -| **P6** | Ventilador | 1 = 5V_FAN ⚡, 2 = retorno, 4 = tacómetro | -| **P11** | Corte de energía (SYS→MAIN 5 V) | 1 = MAIN5V ⚡, 2 = SYS5V ⚡ | -| **MOD1** | Zócalo simpleRTK2B Pro | pin "5V" debe estar en 0 V con la tarjeta virgen | +| P1 GX16-5 | Alimentación de máquina + ignición | 1 = 24V ⚡, 3 = ignición, 2 = GND | +| P2 | Entrada 5 V (Mean Well SD-15B) | 1 = VEH5V ⚡, 2 = GND | +| P4 | Batería 1S4P + NTC | 1 = BAT+ ⚡, 3 = NTC, 2 = GND | +| P6 | Ventilador | 1 = 5V_FAN ⚡, 2 = retorno, 4 = tacómetro | +| P11 | Corte de energía (SYS→MAIN 5 V) | 1 = MAIN5V ⚡, 2 = SYS5V ⚡ | +| MOD1 | Zócalo simpleRTK2B Pro | Pin "5V" en 0 V con la tarjeta virgen | -*(Pinout completo en [Pinout de arneses](pinout-arneses.md). La guía de ensamble -detallada del gabinete es el [PDF 0007-1000](assembly-guide.md).)* +Completo: [pinout V3](pinout-arneses.md). Gabinete: [PDF 0007-1000](assembly-guide.md). -## Reglas de calidad +## Calidad -- Cada unidad lleva **dos actas**: la de **prueba de la tarjeta** y la de **ensamble**. - La de ensamble anota el número de serie de la tarjeta usada, para trazabilidad. -- Una tarjeta con FALLA **no se ensambla**; va a la bolsa de rechazos con su nota. -- Cualquier diferencia entre lo que ves y lo que dice el documento: **detente y - pregunta** a ingeniería antes de continuar. +- Cada unidad lleva dos actas: prueba de la tarjeta y ensamble (con la serie de la tarjeta usada). +- Una tarjeta con FALLA no se ensambla; va a la bolsa de rechazos con su nota. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 0.9 | 2026-09-19 | Borrador para revisión de ingeniería. | +| 0.9.1 | 2026-09-29 | Encabezado uniforme y nota de alcance V3 / V5.6. | +| 0.9.2 | 2026-09-29 | Edición breve. | diff --git a/docs/montaje/pinout-arneses.md b/docs/montaje/pinout-arneses.md index e6a0a90..1a3f7b2 100644 --- a/docs/montaje/pinout-arneses.md +++ b/docs/montaje/pinout-arneses.md @@ -1,15 +1,21 @@ --- -title: HBOX Watchdog v3 PROD — Harness / Connector Pinout +title: "HBOX Watchdog V3 (PROD) — Pinout de arneses y conectores" project: Project Drogheda date: 2026-07-04 -tags: [project-drogheda, hardware, harness, pinout] +tags: [project-drogheda, hardware, harness, pinout, v3] +author: Helgen Technologies --- -# HBOX Watchdog v3 PROD — Harness / Connector Pinout +# HBOX Watchdog V3 (PROD) — Pinout de arneses y conectores -Auto-generated from the PCB netlist (placement-independent). `GND` = the board ground plane (In1.Cu); its full pad list is omitted. Power nets flagged for wire gauge. +Tarjeta: V3 (EinarBoard 1.0, `kicad/hbox-watchdog-v3-PROD`). -| Conn | Function | Pins | +!!! note "Solo V3 — para V5.6 usa [Pinout V5.6](../hardware/v56-pinout.md)" + Este pinout es de la tarjeta V3 (registro congelado tal como se fabricó). La V4 comparte conectores con la V5 salvo lo indicado en el [manual V4](../manuales/manual-tarjeta-V4.md). + +Generado automáticamente desde la netlist de la PCB (independiente de la colocación). `GND` = plano de tierra de la tarjeta (In1.Cu); se omite su lista completa de pads. Las nets de potencia van marcadas ⚡ para elegir el calibre del cable. + +| Conector | Función | Pines | |---|---|---| | **P1** | GX16-5 | 5 | | **P2** | 5V-IN-SD15B05 | 2 | @@ -25,88 +31,97 @@ Auto-generated from the PCB netlist (placement-independent). `GND` = the board g ## P1 — GX16-5 -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `24V_IN` ⚡power | D10.1, Q10.2 | -| 2 | `GND` | board ground plane | +| 1 | `24V_IN` ⚡ potencia | D10.1, Q10.2 | +| 2 | `GND` | plano de tierra de la tarjeta | | 3 | `IGN_IN` | Rig.1 | -| 4 | — | *(no net)* | -| 5 | — | *(no net)* | +| 4 | — | *(sin net)* | +| 5 | — | *(sin net)* | ## P2 — 5V-IN-SD15B05 -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `VEH5V` ⚡power | C30.1, C31.1, JP1.2, R51.1, R55.1, R7.1, RS1.1, U6.6, U6.16 | -| 2 | `GND` | board ground plane | +| 1 | `VEH5V` ⚡ potencia | C30.1, C31.1, JP1.2, R51.1, R55.1, R7.1, RS1.1, U6.6, U6.16 | +| 2 | `GND` | plano de tierra de la tarjeta | ## P3 — RTK2B-UART1 -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `SW_5V` ⚡power | C3.1, C40.1, MOD1.5, Q1.3, U7.2, U7.7 | -| 2 | `GND` | board ground plane | +| 1 | `SW_5V` ⚡ potencia | C3.1, C40.1, MOD1.5, Q1.3, U7.2, U7.7 | +| 2 | `GND` | plano de tierra de la tarjeta | | 3 | `GNSS_TX` | J1.8, MOD1.16 | | 4 | `GNSS_RX` | J1.9, MOD1.15 | ## P4 — BATT-1S4P+NTC -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `BAT_PLUS` ⚡power | C35.1, L6.2, R5.1, U6.23 | -| 2 | `GND` | board ground plane | +| 1 | `BAT_PLUS` ⚡ potencia | C35.1, L6.2, R5.1, U6.23 | +| 2 | `GND` | plano de tierra de la tarjeta | | 3 | `NTC` | R55.2, U6.17 | ## P5 — TEMP_PROBE -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `3V3` ⚡power | Cu3.1, Cu4.1, D5.1, J1.18, J2.20, MOD1.2, R3.1, R30.1, R31.1, R42.1, R57.1, R58.1, Rdfu.2, Rtp.1, U3.3, U4.5 | -| 2 | `GND` | board ground plane | +| 1 | `3V3` ⚡ potencia | Cu3.1, Cu4.1, D5.1, J1.18, J2.20, MOD1.2, R3.1, R30.1, R31.1, R42.1, R57.1, R58.1, Rdfu.2, Rtp.1, U3.3, U4.5 | +| 2 | `GND` | plano de tierra de la tarjeta | | 3 | `I2C_SDA` | J2.15, R31.2, U3.1, U4.6 | | 4 | `I2C_SCL` | J2.14, R30.2, U3.2, U4.1 | ## P6 — FAN -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `5V_FAN` ⚡power | C23.1, D2.1, JP1.1, L2.2, R20.1 | +| 1 | `5V_FAN` ⚡ potencia | C23.1, D2.1, JP1.1, L2.2, R20.1 | | 2 | `FAN_RET` | D2.2, Q2.3 | -| 3 | `GND` | board ground plane | +| 3 | `GND` | plano de tierra de la tarjeta | | 4 | `FAN_TACH_RAW` | Rts.1 | ## P8 — PANEL_LED -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| | 1 | `LED_A` | D1.2, R3.2 | | 2 | `LED_K` | D1.1, Q4.3 | ## P10 — RESET-EXT -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| | 1 | `NRST` | J1.5, SW1.1 | -| 2 | `GND` | board ground plane | +| 2 | `GND` | plano de tierra de la tarjeta | ## P11 — CUTOFF-SW -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| -| 1 | `MAIN5V` ⚡power | C32.1, C33.1, C34.1, JP2.1, JP3.3, JP4.1, Q7.1, Q7.2, Q7.3, R53.1, U6.1, U6.24 | -| 2 | `SYS5V` ⚡power | D6.1, F1.1, J1.20, J2.18, K1.2, R2.2 | +| 1 | `MAIN5V` ⚡ potencia | C32.1, C33.1, C34.1, JP2.1, JP3.3, JP4.1, Q7.1, Q7.2, Q7.3, R53.1, U6.1, U6.24 | +| 2 | `SYS5V` ⚡ potencia | D6.1, F1.1, J1.20, J2.18, K1.2, R2.2 | ## P12 — NTC-HOTSPOT -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| | 1 | `NTC_TEMP` | C24.1, J1.15, R42.2 | -| 2 | `GND` | board ground plane | +| 2 | `GND` | plano de tierra de la tarjeta | ## P13 — MODO-B-UPLINK -| Pin | Net | Ties to | +| Pin | Net | Conecta con | |---|---|---| | 1 | `USART1_RX` | H3.2, J2.7, K1.1, MOD1.23, Rdfu.1 | | 2 | `DIN_4G` | J7.3, K1.5, K1.6 | -| 3 | `GND` | board ground plane | +| 3 | `GND` | plano de tierra de la tarjeta | + +Ver también: [manual V3](../manuales/manual-tarjeta-V3.md) · [BOM dividido para ensamble (V3)](bom-split.md) · [guía de ensamble y QC](guia-ensamble-qc.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-07-04 | Generado desde la netlist V3 PROD (inglés). | +| 1.1 | 2026-09-29 | Encabezados en español, nota de alcance V3 / V5.6 y enlaces. Tablas sin cambios. | diff --git a/docs/procedimientos/ciclo-de-vida.md b/docs/procedimientos/ciclo-de-vida.md index afc0b76..b2bc543 100644 --- a/docs/procedimientos/ciclo-de-vida.md +++ b/docs/procedimientos/ciclo-de-vida.md @@ -1,125 +1,92 @@ -# El ciclo de vida de una unidad HBOX — qué acta en qué momento - -**Versión:** 1.0 · 19-sep-2026 · **Responsable:** Leo Rodríguez - -Una unidad pasa por nueve momentos entre la tarjeta desnuda y la máquina en el patio. Cada uno -tiene su procedimiento y su acta, y **todas las actas cuelgan del número de serie**, así que el -[expediente](../unidad.html) de cualquier tarjeta, módulo o unidad cuenta la historia completa — -incluidos los daños. - -## El mapa - -| # | Momento | Dónde | Procedimiento | Acta | Estado | -|---|---|---|---|---|---| -| 1 | **Tarjeta desnuda** llega de fábrica | Banco QRO | [Prueba y flasheo](v5-prueba-y-flasheo.md) | [Tarjeta V5](../formularios/v5.html) | ✅ | -| 2 | **Módulos** RTK y 4G, uno por uno | Banco QRO | [Módulos §2–3](v5-modulos-integracion.md) | [ArduSimple](../formularios/ardusimple.html) · [Módem 4G](../formularios/modem4g.html) | ✅ | -| 3 | **Pre-ensamble**: la pareja que irá junta | Banco QRO | [Módulos §4](v5-modulos-integracion.md) | [Integración](../formularios/integracion.html) | ✅ | -| 4 | **Ensamble** de la unidad | Banco QRO | [Ensamble](v5-ensamble.md) | [Ensamble](../formularios/ensamble.html) — no acepta módulos sin acta aprobada ni ya usados | ✅ | -| 5 | **Prueba final** antes de embarcar | Banco QRO | [Prueba final](v5-prueba-final-unidad.md) | *(se registra en la de ensamble)* | ✅ | -| 6 | **Envío** | QRO → terminal | [abajo](#6-envio) | [Envío](../formularios/envio.html) | 🆕 | -| 7 | **Recepción e inspección**, cada caja, antes de entrar al puerto | Taller Veracruz | [abajo](#7-recepcion-e-inspeccion-cada-caja-antes-de-entrar-al-puerto) | [Recepción](../formularios/recepcion.html) — inspección + multímetro + prueba de vida | 🆕 | -| 8 | **Instalación** en la máquina | Patio | ⬜ pendiente | ⬜ `instalacion-campo` (el servidor ya lo acepta) | ⬜ | -| 9 | **Vida en campo**: falla, diagnóstico, reflasheo | Patio / taller | [Campo](../diagnostico/procedimiento-diagnostico-campo.md) · [Banco](diagnostico-banco.md) · [Reflasheo](reflasheo-unidades.md) | [Campo](../formularios/diagnostico.html) · [Banco](../formularios/banco.html) · [Reflasheo](../formularios/reflasheo.html) | ✅ | -| ⚡ | **Daño o incidente**, en cualquier momento | Donde sea | [abajo](#dano-en-cualquier-momento) | [Daño](../formularios/dano.html) — **marca la serie** | 🆕 | - -Lo único que falta del ciclo es el **8 · Instalación**. Se escribe con el mismo motor cuando -lo decidas: checklist de gabinete, GX16, antenas, foto final y primera posición vista en el servidor. - -## Las tres reglas que cruzan todo el ciclo - -**1 · Nada avanza sin acta.** Un módulo sin acta aprobada no entra al ensamble (el formulario lo -impide). Una unidad sin prueba final aprobada no se envía (el acta de envío lo pide). Una unidad -que no coincide con su acta de envío no entra al puerto (la de recepción lo pide). - -**2 · Una serie dañada se ve desde cualquier acta.** Registrar un daño **marca** la serie. Desde -ese momento, todo formulario que la elija —banco, campo, ensamble, envío— muestra el aviso en -amarillo, con la fecha y el resumen. Así una tarjeta con un corto no puede acabar dentro de un -ensamble sin que alguien lo vea. La marca se levanta con otra acta de daño cuya disposición sea -**«Reparada»**, o se vuelve permanente con **«Baja»** (aviso en rojo). - -**3 · La serie es la llave.** Tarjeta (`V5-06`), módulo (`ARD-010`, `RTK-0006`), unidad de campo -(`RTK-014`) o unidad ensamblada (`HBOX5-E06-A010-R0006`): todo lo que se registre contra una serie -aparece en su expediente, y un módulo además aparece en el expediente de la unidad que lo lleva. - +--- +title: "Ciclo de vida de una unidad HBOX — qué acta en qué momento" +tags: [project-drogheda, hbox, procedimiento, ciclo-de-vida, actas, envio, recepcion] +date: 2026-09-19 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 --- -## 6 · Envío +# Ciclo de vida de una unidad HBOX — qué acta en qué momento -Se llena **al cerrar la caja**, no después. Fija el estado exacto en que salió la unidad para que -la recepción tenga contra qué comparar. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco (QRO), taller Veracruz y operaciones. + - Cuándo: cada vez que una unidad cambia de manos: envío, recepción, instalación, daño. + - Tiempo: acta de envío o recepción 15–30 min por unidad. + - Necesitas: los [formularios](../actas/index.md); para recepción, fuente de 24 V (≥ 1 A; límite en 1 A si lo tiene), multímetro, cable USB con datos y laptop. -Requisitos que el acta exige antes de dejar enviar: +Todas las actas cuelgan del número de serie; el [expediente](../unidad.html) de cualquier tarjeta, módulo o unidad cuenta la historia completa, daños incluidos. -- Acta de **prueba final aprobada** en el sitio. -- **Sin marca de daño** en la serie. -- Firmware que trae (línea `BOOT`), **ICCID** de la SIM, ID de estación del módem. -- Configuración del ZED-F9P guardada en **FLASH**. +## Mapa -Contenido de la caja (cada punto es una casilla): unidad etiquetada · antena GNSS · 2 antenas LTE · -arnés GX16 · material de gabinete si aplica · hoja impresa con serie, máquina destino y contacto. +| # | Momento | Dónde | Procedimiento | Acta | +|---|---|---|---|---| +| 1 | Tarjeta desnuda llega de fábrica | Banco QRO | [Prueba y flasheo](v5-prueba-y-flasheo.md) | [Tarjeta V5](../formularios/v5.html) | +| 2 | Módulos RTK y 4G, uno por uno | Banco QRO | [Módulos §1–2](v5-modulos-integracion.md) | [ArduSimple](../formularios/ardusimple.html) · [Módem 4G](../formularios/modem4g.html) | +| 3 | Pareja que irá junta | Banco QRO | [Módulos §3](v5-modulos-integracion.md) | [Integración](../formularios/integracion.html) | +| 4 | Ensamble | Banco QRO | [Ensamble](v5-ensamble.md) | [Ensamble](../formularios/ensamble.html) (rechaza módulos sin acta aprobada o ya usados) | +| 5 | Prueba final | Banco QRO | [Prueba final](v5-prueba-final-unidad.md) | Se registra en la de ensamble | +| 6 | Envío | QRO → terminal | [§6](#6-envio) | [Envío](../formularios/envio.html) | +| 7 | Recepción e inspección, cada caja | Taller Veracruz | [§7](#7-recepcion-e-inspeccion) | [Recepción](../formularios/recepcion.html) | +| 8 | Instalación en la máquina | Patio | [Checklist de puesta en marcha](v5-checklist-puesta-en-marcha.md) | Impreso, subido al expediente (acta digital `instalacion-campo` pendiente; el servidor ya la acepta) | +| 9 | Falla, diagnóstico, reflasheo | Patio / taller | [Campo](../diagnostico/procedimiento-diagnostico-campo.md) · [Banco](diagnostico-banco.md) · [Reflasheo](reflasheo-unidades.md) | [Campo](../formularios/diagnostico.html) · [Banco](../formularios/banco.html) · [Reflasheo](../formularios/reflasheo.html) | +| — | Daño o incidente, en cualquier momento | Donde sea | [Abajo](#dano-o-incidente) | [Daño](../formularios/dano.html) (marca la serie) | -!!! warning "Batería" - Una batería de litio **no viaja en avión** como carga normal. Si va por paquetería, confirmar - que va por tierra, y anotar su voltaje al empacar. +## Reglas del ciclo -Fotos: la caja abierta con todo adentro, la unidad con su etiqueta legible, la caja cerrada y rotulada. +1. Nada avanza sin acta. Un módulo sin acta aprobada no entra al ensamble; una unidad sin prueba final aprobada no se envía; una unidad que no coincide con su acta de envío no entra al puerto. Los formularios lo impiden. +2. Una serie dañada se ve desde cualquier acta. El acta de daño marca la serie y todo formulario que la elija muestra el aviso en amarillo con fecha y resumen. La marca se levanta con otra acta de daño con disposición "Reparada", o queda permanente con "Baja" (aviso rojo). +3. La serie es la llave: tarjeta (`V5-06`), módulo (`ARD-010`, `RTK-0006`), unidad de campo (`RTK-014`) o unidad ensamblada (`HBOX5-E06-A010-R0006`). Un módulo aparece también en el expediente de la unidad que lo lleva. -## 7 · Recepción e inspección — cada caja, antes de entrar al puerto +## 6. Envío -Se llena **al abrir la caja, antes de entrar al puerto** — la última oportunidad de regresar por un -cable o de detectar un golpe de transporte. **Una acta por unidad, sin excepción**, aunque lleguen diez -en el mismo envío. Se compara contra el acta de envío de esa unidad (está en su expediente). +Se llena al cerrar la caja: fija el estado exacto en que salió para que la recepción compare. -**Kit del técnico:** fuente de 24 V (≥ 1 A; si tiene límite de corriente, en 1 A) · multímetro · cable -USB con datos · laptop. No hace falta osciloscopio: lo que puede romperse en un camión se ve con el -multímetro y con los ojos. +El acta exige antes de enviar: prueba final aprobada, serie sin marca de daño, firmware (línea `BOOT`), ICCID de la SIM, ID de estación del módem y configuración del ZED-F9P guardada en FLASH. -**Orden obligatorio:** inspección → multímetro sin energía → energizar → prueba de vida. Nunca al revés. +Caja: unidad etiquetada · antena GNSS · 2 antenas LTE · arnés GX16 · material de gabinete si aplica · hoja impresa con serie, máquina destino y contacto. -1. **Paquete, antes de abrir:** foto tal como llegó; si viene golpeado, mojado o abierto, foto del daño. -2. **Contenido contra el envío:** misma serie, mismas piezas. Lo que falte o sobre, se anota. -3. **Inspección física, tapa abierta, sin energía.** Sacudir la unidad junto al oído (nada suelto). - Gabinete y prensaestopas sin golpes. **Módulos asentados en sus zócalos** — el Blackpill, el - simpleRTK2B en los headers UNO y el módem en el zócalo XBee viajan enchufados, y la vibración los - saca: empujar cada uno con el dedo. Prueba de meneo en conectores, Dupont y SMA. Tarjeta sin - componentes desprendidos ni marcas de quemado. Batería normal (hinchada, con fuga o caliente → se - desconecta, no entra, acta de daño). Foto del interior. -4. **Multímetro sin energía — continuidad a tierra.** Entrada 24 V a GND > 10 kΩ · riel 5 V a GND > - 1 kΩ · riel 3.3 V a GND > 1 kΩ · voltaje de batería en vacío 3.0 – 4.2 V (comparar con el del - envío). **Cualquier lectura fija entre 0 y 20 Ω es un corto: no se energiza**, acta de daño. -5. **Energizar y medir.** 24 V al GX16 (pines 1-2), antenas conectadas. LED de estado parpadea · - entrada 23 – 26 V · **riel 5 V 4.9 – 5.4 V** (por debajo de 4.8 V el módem se cae con cada ráfaga - LTE) · 3.3 V 3.20 – 3.40 V · corriente a los 60 s 150 – 400 mA si la fuente la muestra. Si la fuente - entra en límite o algo se calienta: apagar, no entra. -6. **Prueba de vida (5 min):** `BOOT` reporta el **mismo firmware** que el envío · el módem registra - (LED lento o fijo a los 3 min) · la SIM es la misma (ICCID) · si hay cielo, ve satélites · alguien - con acceso confirma que **aparece en el monitor**. Apagar, cerrar la tapa, apretar prensaestopas. -7. **Veredicto:** lista para entrar · entra con observaciones · se queda en el taller · rechazada. +!!! danger "Batería de litio" + No viaja en avión como carga normal. Por paquetería, confirma envío terrestre y anota su voltaje al empacar. -!!! danger "Corto, no enciende, 5 V bajo o firmware distinto: no entra" - Instalarla y descubrirlo arriba de una máquina cuesta una visita más y un permiso más de ICAVE. Si - no entra, además del veredicto se registra un **acta de daño**: así la serie queda marcada y nadie la - instala por error. +Fotos: caja abierta con todo adentro, unidad con etiqueta legible, caja cerrada y rotulada. -## ⚡ Daño en cualquier momento +## 7. Recepción e inspección -Para cualquier cosa con número de serie: tarjeta, módulo, unidad completa, o incluso un cable o -antena. No es para asignar culpas; es para que el daño **no se pierda de vista**. +Al abrir la caja y antes de entrar al puerto: última oportunidad de regresar por un cable o detectar un golpe de transporte. Una acta por unidad, aunque lleguen diez juntas. Se compara con el acta de envío (en el expediente). Orden obligatorio: inspección → multímetro sin energía → energizar → prueba de vida. -Qué registra: qué es y dónde ocurrió · tipo de daño (corto, sobrevoltaje, quemado, golpe, agua, -batería, error de ensamble, sin causa aparente) · si estaba energizada y con qué · **resumen en -una línea** (es lo que ven los demás formularios) · descripción · foto del daño · componentes -afectados · **disposición**. +1. Paquete sin abrir: foto como llegó; si viene golpeado, mojado o abierto, foto del daño. +2. Contenido contra el envío: misma serie, mismas piezas; anota lo que falte o sobre. +3. Inspección sin energía, tapa abierta: sacude junto al oído (nada suelto); gabinete y prensaestopas sin golpes; empuja con el dedo el Blackpill, el simpleRTK2B (headers UNO) y el módem (zócalo XBee), que la vibración saca; meneo de conectores, Dupont y SMA; sin componentes desprendidos ni quemados; batería normal (hinchada, con fuga o caliente: se desconecta, no entra, acta de daño). Foto del interior. +4. Continuidad a GND sin energía: entrada 24 V > 10 kΩ · 5 V > 1 kΩ · 3.3 V > 1 kΩ · batería en vacío 3.0–4.2 V (compara con el envío). Lectura fija de 0–20 Ω = corto: no se energiza; acta de daño. +5. 24 V al GX16 (pines 1-2), antenas puestas: LED parpadea · entrada 23–26 V · 5 V en 4.9–5.4 V (bajo 4.8 V el módem se cae con cada ráfaga LTE) · 3.3 V en 3.20–3.40 V · corriente a 60 s 150–400 mA si la fuente la muestra. Fuente en límite o algo caliente: apaga; no entra. +6. Prueba de vida (5 min): `BOOT` con el mismo firmware del envío · módem registrado (LED lento o fijo a los 3 min) · mismo ICCID · satélites si hay cielo · alguien confirma que aparece en el monitor. Apaga, cierra la tapa, aprieta prensaestopas. +7. Veredicto: lista para entrar · entra con observaciones · se queda en el taller · rechazada. -La disposición es lo que marca: +Corto, no enciende, 5 V bajo o firmware distinto: no entra, y además se levanta un acta de daño para marcar la serie. Descubrirlo arriba de una máquina cuesta otra visita y otro permiso de ICAVE. + +## Daño o incidente + +Para cualquier cosa con número de serie: tarjeta, módulo, unidad, cable o antena. No asigna culpas; evita que el daño se pierda de vista. + +Registra: qué es y dónde ocurrió · tipo (corto, sobrevoltaje, quemado, golpe, agua, batería, error de ensamble, sin causa aparente) · si estaba energizada y con qué · resumen en una línea (lo que ven los demás formularios) · descripción · foto · componentes afectados · disposición. | Disposición | Efecto en la serie | |---|---| -| Marcada como dañada — en espera | ⚠ aviso amarillo en todos los formularios | -| Enviada a Querétaro para evaluación | ⚠ aviso amarillo | -| Canibalizada — sus módulos buenos pasan a otra unidad | ⚠ aviso amarillo; anotar qué módulos quedan libres | -| **Reparada** — vuelve a servicio | levanta la marca | -| **Baja** definitiva | ⛔ aviso rojo, permanente | +| Marcada como dañada — en espera | Aviso amarillo en todos los formularios | +| Enviada a Querétaro para evaluación | Aviso amarillo | +| Canibalizada — sus módulos buenos pasan a otra unidad | Aviso amarillo; anota qué módulos quedan libres | +| Reparada — vuelve a servicio | Levanta la marca | +| Baja definitiva | Aviso rojo permanente | -Y una casilla que conviene no saltarse: **la pieza quedó etiquetada físicamente** (cinta roja) y -separada de las buenas. El sitio marca la serie; la cinta marca la tarjeta que alguien tiene en la mano. +Etiqueta la pieza con cinta roja y sepárala de las buenas: el sitio marca la serie, la cinta marca la pieza. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-19 | Primera versión: mapa, reglas, envío, recepción y daño. | +| 1.1 | 2026-09-29 | Encabezado uniforme y enlaces cruzados. | +| 1.2 | 2026-09-29 | Edición breve; el momento 8 apunta al checklist de puesta en marcha. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/diagnostico-banco.md b/docs/procedimientos/diagnostico-banco.md index 6124900..3c6a08a 100644 --- a/docs/procedimientos/diagnostico-banco.md +++ b/docs/procedimientos/diagnostico-banco.md @@ -1,136 +1,100 @@ +--- +title: "Diagnóstico en banco — unidad HBOX sobre la mesa" +tags: [project-drogheda, hbox, procedimiento, diagnostico, banco, v3] +date: 2026-09-18 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 +--- + # Diagnóstico en banco — unidad HBOX sobre la mesa -**Para:** Alan y Daniel · **Versión:** 1.0 · 18-sep-2026 · **Responsable:** Leo Rodríguez +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco (Alan y Daniel). + - Cuándo: una unidad de campo desmontada llega a la mesa. Escrito para V3 (EinarBoard 1.0: RTK-003 en RTG `RT-ZPMC-20`, RTK-006 en tractoplana `HS-WES-62`); el orden vale para V4 y V5.5. Antes: [diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) (unidad aún montada). Después, si procede: [reflasheo](reflasheo-unidades.md). + - Tiempo: 60–90 min (tres capturas de 3 min y 10 min de estabilización). + - Necesitas: fuente de banco con límite de corriente, multímetro, laptop con cables USB, antena GNSS y 2 antenas LTE de prueba, cielo abierto o ventana (sin cielo no hay fix y parece falla), cámara para las fotos del acta y el [acta de diagnóstico en banco](../formularios/banco.html). -Acta que se llena mientras trabajas: -**[▶ Abrir el acta de diagnóstico en banco](../formularios/banco.html)** +## Reglas de banco -Aplica a las unidades que ya están desmontadas: **RTK-003** (RTG `RT-ZPMC-20`) y **RTK-006** -(tractoplana `HS-WES-62`). Para una unidad todavía montada en la máquina, el procedimiento es -otro: [Diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md). +1. No energices antes del paso 2 (continuidad). +2. Batería de litio hinchada, caliente, con fuga u olor: desconéctala primero y trabaja sin ella. No la perfores, no la cargues, no la guardes en un cajón. Foto y aviso. +3. Empieza con el límite de corriente en 500 mA. +4. Tarjetas con LTC4040 (V3, V4, V5): fuente de 5 V ≥ 5.2 V o paquete conectado. Sin batería y por debajo de 4.60 V (PFI del LTC4040) el módem se apaga solo. +5. Anota toda medición fuera de rango con su valor, no solo "FALLA". +6. El firmware se elige por la tarjeta, nunca por el número de versión ([Descargas](../descargas/index.md)). ---- +## Límites del banco -## 1. Qué podemos y qué ya no podemos saber +- Perdido al desmontar: temperatura máxima, cuenta de recuperaciones y causa del último arranque. El firmware v3 los guarda en RAM. En RTK-003 y RTK-006 la hipótesis térmica solo se prueba con lo que se vea físicamente. +- Se puede saber: cortos, consumo, arranque, rieles, satélites, registro en Telcel, estado de la batería y si la falla sigue después de reflashear. +- Por eso en RTK-014 (montacargas, todavía instalada) primero se captura por USB en sitio y después se desmonta. -Sé honesto con lo que el banco puede dar, para no perseguir fantasmas. +Las tres unidades desplegadas son EinarBoard 1.0 con firmware v2/v3 (`V4-PLAN.md` del repo de firmware): les toca el binario V3, nunca el bring-up V5, y el control de carga usa la polaridad de producción (`CHRG_EN` alto = carga apagada). Conectores y LEDs: [manual V3](../manuales/manual-tarjeta-V3.md). -**Ya se perdió** (y no se recupera): la temperatura máxima, la cuenta de recuperaciones y la causa -del último arranque. El firmware v3 guarda esos tres datos en memoria RAM, así que se borraron al -desconectar la unidad para desmontarla. Por eso en estas dos unidades **no vamos a poder probar la -hipótesis térmica con datos del propio equipo** — solo con lo que se vea físicamente. +## Paso 1 — Inspección sin energía -**Sí podemos saber:** si hay un corto, cuánta corriente consume, si arranca, si los rieles están -donde deben, si el GNSS ve satélites, si el módem registra en Telcel, en qué estado está la -batería, y si el problema sigue después de reflashear. +Unidad desconectada de todo, antes de mover nada: -> De ahí la regla que aplica a la unidad del montacargas (**RTK-014**, todavía instalada): -> primero la captura por USB en sitio, y hasta después se desmonta. +- [ ] Fotos del exterior, cuatro lados. +- [ ] Abre. Foto del interior completo antes de tocar cables. +- [ ] Olor a quemado; partes oscurecidas, derretidas o abombadas. +- [ ] Agua, marcas de agua, sarro blanco o corrosión verde en conectores. +- [ ] Batería hinchada, caliente, con manchas o fuga. Foto de los dos lados. +- [ ] Meneo suave de cada conector, Dupont y SMA: alguno flojo o fuera. +- [ ] Centro de los SMA doblado o faltante. -!!! info "Qué tarjeta traen estas unidades" - Las tres unidades desplegadas son **EinarBoard 1.0** corriendo firmware **v2/v3** (así lo - documenta `V4-PLAN.md` del repositorio de firmware). Eso importa para dos cosas: el binario que - les toca es el de generación **V3** —nunca el de bring-up del v5—, y el control de carga usa la - polaridad de producción (`CHRG_EN` en alto = carga **apagada**). +Todo hallazgo se fotografía y se anota aunque después la unidad encienda. -## 2. Equipo necesario +## Paso 2 — Continuidad a tierra -| Equipo | Para qué | -|---|---| -| **Fuente de banco con límite de corriente** | Energizar sin quemar nada y **leer el consumo** | -| Multímetro | Continuidad y rieles | -| Laptop + cables USB | Las tres capturas (Blackpill, 4G, ArduSimple) | -| Antena GNSS y 2 antenas LTE de prueba | Para que el receptor y el módem puedan funcionar | -| Cielo abierto o ventana | Sin vista al cielo el GNSS nunca dará fix y parecerá falla | -| Cámara | Fotos obligatorias del acta | +Multímetro en ohms, punta negra en el negativo/chasis. La lectura sube mientras cargan los capacitores; espera a que se estabilice. -## 3. Seguridad - -1. **Nunca energices antes del paso 5 (continuidad).** Si hay un corto, la fuente lo va a encontrar - quemando algo. -2. **Batería de litio:** si está hinchada, caliente, con fuga o huele, **desconéctala primero** y - trabaja sin ella. No la perfores, no la cargues, no la metas en un cajón. Foto y aviso. -3. Empieza siempre con el **límite de corriente bajo** (500 mA). Subirlo es fácil; deshacer un - componente quemado, no. - ---- - -## 4. Paso 1 — Inspección sin energía - -Con la unidad **desconectada de todo**, y antes de mover nada: - -- [ ] Foto del exterior de la caja, de los cuatro lados. -- [ ] Abrir. **Foto del interior completo antes de tocar cables.** -- [ ] ¿Huele a quemado? ¿Hay partes oscurecidas, derretidas o abombadas? -- [ ] ¿Hay agua, marcas de agua, sarro blanco o **corrosión verde** en conectores? -- [ ] Batería: ¿hinchada, caliente, con manchas o fuga? Foto de los dos lados. -- [ ] Prueba de meneo suave en cada conector, Dupont y SMA: ¿alguno se mueve o se sale? -- [ ] Conectores de antena: ¿el centro del SMA está doblado o falta? - -Cualquier hallazgo aquí ya es un resultado: fotografíalo y anótalo aunque después todo encienda. - -## 5. Paso 2 — Continuidad a tierra, **antes** de energizar - -Multímetro en ohms, **punta negra en el negativo/chasis**. La lectura sube lentamente (los -capacitores se están cargando con la pila del multímetro): eso es normal, espera a que se estabilice. - -| Punto | Esperado | Lectura mala | +| Punto | Esperado | Mala | |---|---|---| -| Entrada 24 V (pines 1-2 del GX16) | **> 10 kΩ** | Fija en 0–20 Ω = **corto: no energizar** | -| Riel de 5 V (salida de la Mean Well) | **> 1 kΩ** | Fija en 0–20 Ω = corto | -| Riel de 3.3 V | **> 1 kΩ** | Fija en 0–20 Ω = corto | -| Alimentación del simpleRTK2B (riel conmutado) | **> 1 kΩ** | Fija en 0–20 Ω = corto | -| Batería (bornes, con la batería **desconectada**) | — | Anota su voltaje en vacío | +| Entrada 24 V (GX16 pines 1-2) | > 10 kΩ | Fija en 0–20 Ω: corto, no energices | +| Riel 5 V (salida de la Mean Well) | > 1 kΩ | Fija en 0–20 Ω | +| Riel 3.3 V | > 1 kΩ | Fija en 0–20 Ω | +| Alimentación del simpleRTK2B (riel conmutado) | > 1 kΩ | Fija en 0–20 Ω | +| Batería desconectada | — | Anota su voltaje en vacío | -!!! danger "Si encuentras un corto" - **No energices.** Anótalo, fotografía la zona, marca la unidad como *corto a tierra* y déjala - aparte. Energizar un corto convierte una reparación de un componente en una tarjeta perdida. +Con corto: no energices. Foto de la zona, marca la unidad como "corto a tierra" y apártala. -## 6. Paso 3 — Energizado con rampa de corriente +## Paso 3 — Energizado con rampa de corriente -Este paso es el que más información da por minuto invertido. +1. Fuente a 24.0 V, límite 500 mA, salida apagada. +2. Conecta solo la entrada de 24 V, sin antenas. +3. Enciende y mira el amperímetro los primeros 3 s. -1. Fuente a **24.0 V**, límite de corriente en **500 mA**, salida **apagada**. -2. Conecta solo la entrada de 24 V (sin antenas todavía). -3. Enciende la salida y **mira el amperímetro en los primeros 3 segundos**. - -| Lo que hace la corriente | Qué significa | Qué haces | +| Corriente | Significa | Acción | |---|---|---| -| **0 mA**, la fuente no entrega nada | Circuito abierto: fusible, conector o etapa de entrada muerta | Revisa fusible y cableado de entrada | -| **Se pega al límite** (500 mA) y el voltaje se cae | **Corto** | **Apaga de inmediato.** Regresa al paso 2 | -| **50–150 mA** estables, sin LED | Vive el MCU pero la etapa RTK no enciende | Sigue al paso 4 y a la captura del Blackpill | -| **150–400 mA** y el LED parpadea | Arranca normal | Sigue al paso 4 | -| Sube despacio y **algo se calienta** | Componente en corto parcial | Apaga y busca con el dorso de la mano qué quema | +| 0 mA | Abierto: fusible, conector o entrada muerta | Revisa fusible y cableado | +| Pegada a 500 mA, el voltaje cae | Corto | Apaga ya; vuelve al paso 2 | +| 50–150 mA estable, sin LED | MCU vivo, etapa RTK apagada | Paso 4 y captura del Blackpill | +| 150–400 mA, LED parpadea | Arranque normal | Paso 4 | +| Sube despacio y algo se calienta | Corto parcial | Apaga y localiza con el dorso de la mano | -Anota **el pico de arranque** y **la corriente estable a los 60 segundos**. Son dos números -distintos y los dos importan. +Anota el pico de arranque y la corriente estable a los 60 s. -## 7. Paso 4 — Rieles - -Con la unidad energizada y estable: +## Paso 4 — Rieles | Punto | Esperado | |---|---| -| Entrada 24 V | 23 – 26 V | -| Riel 5 V (salida Mean Well) | 4.8 – 5.2 V | -| Riel 3.3 V | 3.20 – 3.40 V | -| Alimentación del simpleRTK2B **al arrancar** | **0 V** — el firmware enciende la etapa RTK solo cuando decide que es seguro | -| Batería de respaldo | 3.0 – 4.2 V | +| Entrada 24 V | 23–26 V | +| 5 V (salida Mean Well) | 4.8–5.2 V | +| 3.3 V | 3.20–3.40 V | +| simpleRTK2B al arrancar | 0 V (el firmware enciende la etapa cuando decide) | +| Batería de respaldo | 3.0–4.2 V | -!!! tip - 5 V en la etapa RTK **en el instante de arrancar** es un defecto, no una buena señal: el - invariante del producto dice *apagado es el estado seguro*. Si aparece energía ahí antes de que - el MCU la pida, anótalo. +5 V en la etapa RTK en el instante de arrancar es un defecto (apagado es el estado seguro): anótalo. -## 8. Paso 5 — Captura del Blackpill (la principal) +## Paso 5 — Captura del Blackpill -1. Conecta el **USB del Blackpill** a la laptop. -2. Abre el puerto serie nuevo a **115200 baudios** (PuTTY, TeraTerm o el monitor de Arduino). -3. Activa **guardar a archivo**. -4. Deja correr **3 minutos**. Luego presiona **RESET** y graba también el arranque. -5. Guarda el archivo como `RTK-0NN_blackpill_AAAA-MM-DD.log` y **súbelo en el acta**. +1. USB del Blackpill a la laptop; puerto serie a 115200 (PuTTY, TeraTerm o monitor de Arduino) grabando a archivo. +2. Graba 3 min; luego pulsa RESET y graba también el arranque. +3. Guarda `RTK-0NN_blackpill_AAAA-MM-DD.log` y súbelo al acta. -Qué vas a ver (firmware v3.0.x): +Firmware v3.0.x: ``` BOOT,1240,fw=3.0.3,reset=PIN @@ -138,91 +102,81 @@ COLS,ms,state,link,fix,sat,rx,rate,vbat,v5v,veh,ign,tc,tmax,der,rec,limp,… TLM,182000,RUN,DEGR,1,11,4210,1HZ,3.92,5.02,1,1,58,81,0,3,1,900,… ``` -| Campo | Léelo así | +| Campo | Lectura | |---|---| -| `state` | `RUN` trabajando · `BOOT` arrancando · `SLEEP` dormida · `PWRCYC` reiniciando la etapa RTK | +| `state` | `RUN` trabajando · `BOOT` arrancando · `SLEEP` dormida · `PWRCYC` reiniciando la etapa | | `link` | `OK` con correcciones · `DEGR` intermitentes · `LIMP` casi sin ellas · `SRCH` buscando | | `fix` | 4 o 5 = RTK · 1 = GPS solo · 0 = sin posición | -| `vbat` / `v5v` | Voltajes que mide el propio equipo — compáralos con tu multímetro | -| `veh` / `ign` | 1 = presente. En banco, `veh` debe ser 1 y `ign` 0 si no conectaste ignición | -| `tc` / `tmax` | Temperatura actual y máxima **desde este arranque** | -| `rec` / `limp` | Recuperaciones y si quedó enganchada en modo limitado | +| `vbat` / `v5v` | Voltajes medidos por el equipo; compáralos con el multímetro | +| `veh` / `ign` | 1 = presente. En banco `veh=1` e `ign=0` si no conectaste ignición | +| `tc` / `tmax` | Temperatura actual y máxima desde este arranque | +| `rec` / `limp` | Recuperaciones y si quedó en modo limitado | -Si en vez de estas líneas ves un tablero que se redibuja, la unidad trae otro firmware: **anótalo y -avísale a ingeniería antes de seguir**. +Si ves un tablero que se redibuja en lugar de estas líneas, es otro firmware: anótalo y avisa a ingeniería antes de seguir. -## 9. Paso 6 — Captura del módem 4G NTRIP Master +## Paso 6 — Captura del módem 4G -El módem se configura y se escucha por el **puerto USB "XBEE"** del simpleRTK2B Pro (el módulo 4G va -montado sobre el receptor y ese USB es su consola). +El módem va sobre el simpleRTK2B y su consola es el USB XBEE. -1. **Sin energía**, verifica que el módulo 4G esté bien asentado en el zócalo XBee y que las - **dos antenas LTE** estén conectadas. -2. Conecta el USB **POWER+GPS** (alimenta todo) **y** el USB **XBEE** (consola del módem). -3. Terminal serie en el puerto **XBEE** a **115200 baudios**, con **guardar a archivo**. -4. Deja grabar **3 minutos** desde el arranque, sin escribir nada. Anota qué hace el **LED de red** - del módulo: parpadeo rápido = buscando; lento o fijo = registrado. -5. Para leer su configuración: `$$$AS+I=1111` entra a modo configuración. Anota el **ID de estación** - (`AS+K`) y el mountpoint. -6. Guarda como `RTK-0NN_modem4g_AAAA-MM-DD.log` y súbelo al acta. +1. Sin energía: módem asentado en el zócalo XBee y las dos antenas LTE conectadas. +2. Conecta USB POWER+GPS (alimenta todo) y USB XBEE (consola). +3. Terminal en XBEE a 115200, grabando a archivo. +4. Graba 3 min desde el arranque sin escribir. LED de red: rápido = buscando; lento o fijo = registrado. +5. `$$$AS+I=1111` para leer la configuración; anota `AS+K` y el mountpoint. +6. Guarda `RTK-0NN_modem4g_AAAA-MM-DD.log` y súbelo al acta. -!!! warning "Esta consola miente por omisión" - Una unidad **sana** imprime en esta consola prácticamente lo mismo que una **averiada**: unas - pocas líneas de registro y nada más. Ya nos pasó — en junio dimos por muerto un módem sano - leyendo solo esta consola. **La consola del 4G no prueba que las correcciones estén llegando ni - que los datos se estén enviando.** Eso solo se confirma con el `link` del Blackpill, con un fix - ≥4 en el ArduSimple, o viendo el tráfico en el servidor. +!!! warning "Esta consola no prueba el enlace" + Un módem sano y uno averiado imprimen casi lo mismo. En junio se dio por muerto un módem sano leyendo solo esta consola. Las correcciones y el envío de datos se confirman con el `link` del Blackpill, un fix ≥ 4 en el ArduSimple o el tráfico en el servidor. Esta consola solo demuestra que el módem enciende, registra en Telcel y con qué configuración quedó. - Úsala para lo que sí demuestra: que el módem enciende, que registra en Telcel y con qué - configuración quedó. +## Paso 7 — Captura del simpleRTK2B -## 10. Paso 7 — Captura del simpleRTK2B Pro (ArduSimple) +1. Antena GNSS con cielo. +2. USB POWER+GPS a la laptop. +3. Rápido: terminal a 115200, graba 3 min de NMEA como `RTK-0NN_ardusimple_AAAA-MM-DD.nmea`. +4. Completo (u-center, Receiver → Connect): UBX-MON-VER (anota la versión), Fix Mode 3D en < 2 min a cielo abierto, satélites y señal; con correcciones sube a 3D/DGNSS/FIXED. -1. Antena GNSS conectada y **con vista al cielo** (ventana abierta o afuera; dentro del taller no - habrá fix y parecerá falla). -2. Conecta el USB **POWER+GPS** a la laptop. -3. **Opción rápida (terminal):** abre el puerto serie a **115200 baudios** y graba 3 minutos de - NMEA. Guarda como `RTK-0NN_ardusimple_AAAA-MM-DD.nmea`. -4. **Opción completa (u-center):** *Receiver → Connect*, y revisa: - - **UBX-MON-VER** → versión de firmware del ZED-F9P (anótala en el acta). - - **Fix Mode** → debe llegar a **3D** en menos de 2 minutos a cielo abierto. - - Número de satélites y su nivel de señal. - - Si hay correcciones llegando, el fix sube a **3D/DGNSS/FIXED**. - -Cómo leer el NMEA sin u-center: busca líneas `$GNGGA` y mira el **sexto campo** (calidad): +Sin u-center: en `$GNGGA`, sexto campo: | Calidad | Significa | |---|---| | `0` | Sin posición | -| `1` | GPS normal, **sin correcciones** | +| `1` | GPS sin correcciones | | `2` | Corregido básico | -| **`4`** | **RTK fijo** — es el objetivo | -| **`5`** | RTK flotante — casi | +| `4` | RTK fijo (objetivo) | +| `5` | RTK flotante | -Un receptor que da `1` con buenos satélites **no está roto**: está diciendo que las correcciones no -le llegan, y eso apunta al módem o al servidor, no al GNSS. +Calidad `1` con buenos satélites no es falla del GNSS: no llegan correcciones (módem o servidor). -## 11. Paso 8 — Batería +## Paso 8 — Batería -| Medida | Esperado | Lectura mala | +| Medida | Esperado | Mala | |---|---|---| -| Voltaje en vacío (desconectada) | 3.0 – 4.2 V | < 2.5 V = celda muy descargada o dañada | -| Voltaje con la unidad encendida | Sube lentamente si está cargando | Baja = no está cargando | -| Aspecto | Plana, sin marcas | Hinchada, con fuga o caliente = **fuera de servicio** | +| En vacío (desconectada) | 3.0–4.2 V | < 2.5 V: celda muy descargada o dañada | +| Con la unidad encendida | Sube lentamente si carga | Baja: no carga | +| Aspecto | Plana, sin marcas | Hinchada, con fuga o caliente: fuera de servicio | -Una batería hinchada **no se reinstala, no se carga y no viaja en avión**. Sepárala, foto, aviso. +Una batería hinchada no se reinstala, no se carga y no viaja en avión. Sepárala, foto, aviso. -## 12. Paso 9 — Veredicto +## Paso 9 — Veredicto | Hallazgo | Disposición | |---|---| -| Corto a tierra | No reparar en sitio → enviar a Querétaro | -| No enciende, sin corto | Enviar a Querétaro | -| Enciende y todo normal en banco | Reflashear ([procedimiento](reflasheo-unidades.md)) y volver a probar | -| Enciende pero el módem no registra | Probar la SIM en otro módulo antes de culpar al módem | -| GNSS con fix `1` y módem registrado | Revisar servidor/caster — no es hardware | -| Batería dañada | Retirar la batería, anotarlo, y decidir con ingeniería si se reinstala sin ella | -| Daño por calor visible | Enviar a Querétaro **con las fotos** — es evidencia del rediseño térmico | +| Corto a tierra | No se repara en sitio: a Querétaro | +| No enciende, sin corto | A Querétaro | +| Enciende y todo normal | [Reflasheo](reflasheo-unidades.md) y nueva prueba | +| El módem no registra | Prueba la SIM en otro módem antes de culpar al módem | +| GNSS con fix `1` y módem registrado | Servidor/caster; no es hardware | +| Batería dañada | Retírala, anótalo y decide con ingeniería si se reinstala sin ella | +| Daño por calor visible | A Querétaro con las fotos (evidencia para el rediseño térmico) | -Al terminar, **sube al acta los tres archivos de captura** (Blackpill, 4G y ArduSimple). Son el -insumo del análisis en Querétaro: sin ellos, el diagnóstico se queda en tu memoria. +Sube al acta las tres capturas (Blackpill, 4G, ArduSimple). Si la unidad se envía: [acta de envío](../formularios/envio.html) según el [ciclo de vida](ciclo-de-vida.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-18 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme; enlaces al manual V3, reflasheo y ciclo de vida. | +| 1.2 | 2026-09-29 | Edición breve; recibe las reglas de banco que antes estaban en la portada de Taller. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/einarboard-1.0-bringup.md b/docs/procedimientos/einarboard-1.0-bringup.md index c96d718..8586097 100644 --- a/docs/procedimientos/einarboard-1.0-bringup.md +++ b/docs/procedimientos/einarboard-1.0-bringup.md @@ -1,102 +1,80 @@ --- -title: EinarBoard 1.0 (rev 1.1) — Bring-Up Runbook & Anticipated-Trouble Register -tags: [project-drogheda, hardware, einarboard, bringup, testing, runbook] -project: Project Drogheda -author: Helgen CTO +title: "EinarBoard 1.0 — Runbook de bring-up" +tags: [project-drogheda, hardware, einarboard, v3, bringup, testing, runbook, historico] date: 2026-07-08 -status: ACTIVE — execute in order when boards arrive +project: Project Drogheda +author: Helgen Technologies +status: HISTÓRICO — se ejecutó en orden cuando llegaron las tarjetas (jul-2026) --- -# EinarBoard 1.0 — Bring-Up Runbook +# EinarBoard 1.0 — Runbook de bring-up -**Order (FINAL — replacement of 2026-07-08):** original PCBA SMT026070860564 cancelled (2 BOM -lines lost at matching); replacement placed 2026-07-08, **live-verified complete: 53 lines, -116/118 designators assembled** incl. D2/DBK2/DBK1 and all six LEDs. Rotations confirmed by Leo -in the placement viewer. Deltas vs the original parts map: LEDs = **C2295 KT-0805R (RED — all -indicators red by choice)** · RS1 = **C2988654** (HoLLR1206-1W-8mR-1%, spec-compliant alternate) · -100nF = C1591 · 22µF ×4 = C76637 · R51 = C22972 · 22k = C31850. **J1/J2 NOT assembled (the only -unselected parts)** → bench jig-solder; buy two 1×20 2.54 female sockets locally (the C50984 reel -is locked in JLC inventory for future PCBA). Setpoints re-derived from ordered values 2026-07-08: fan 4.99 V · modem 3.33 V · -I_chg 2.42 A · input limit 3.12 A · PFI 4.61 V · backup 4.79 V — all on target. +Tarjeta: V3 (EinarBoard 1.0, rev 1.1, Blackpill en zócalo). ---- +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: ingeniería (banco QRO) + - Cuándo: documento histórico — se aplicó a la primera tarjeta V3 al llegar de JLCPCB (jul-2026). Para las V3 que hoy están en campo, usa [diagnóstico en banco](diagnostico-banco.md) y [reflasheo](reflasheo-unidades.md) + - Tiempo: medio día para la tarjeta #1 (secciones C–D); 1 h por tarjeta en la réplica (F) + - Necesitas: fuente de banco con límite de corriente, multímetro, lupa, Blackpill, simpleRTK2B Pro, módem 4G, paquete 1S4P o celda de banco, resistencia de 10 kΩ (emulación de NTC) -## A. NOW — before production starts (the $479 gate) +Traducido del original en inglés (08-jul-2026). -- [ ] **DFM Analysis check (4–6 h after ordering, Order History → DFM Analysis).** Verify the - polarity dozen against the answer sheet: **U6 pin-1 TOP-LEFT · U2/U7 pin-1 BOTTOM-RIGHT · - Q7 pin-1 TOP-LEFT · bands: D2/Dbk2/D5/D10 LEFT, Dbk1 TOP, D6 RIGHT · electrolytics "+": - C3 BOTTOM, C10/C43 LEFT · LED cathodes LEFT (D1, D4G1, DB1–4)**. The preview already caught - U6 and U2 turned 180° once — assume nothing. -- [ ] **Confirm Production File is set to Yes with 48 h auto-confirm** — an unwatched weekend - approves itself. Approve only after the DFM check passes. -- [ ] Answer every JLC review email **same day** (schedule protection). +**Pedido (FINAL — reemplazo del 2026-07-08):** el PCBA original SMT026070860564 se canceló (2 líneas del BOM se perdieron en el emparejamiento); el reemplazo se colocó el 2026-07-08, **verificado completo en vivo: 53 líneas, 116/118 designadores ensamblados**, incluidos D2/DBK2/DBK1 y los seis LEDs. Rotaciones confirmadas por Leo en el visor de colocación. Diferencias contra el mapa de partes original: LEDs = **C2295 KT-0805R (ROJO — todos los indicadores rojos por decisión)** · RS1 = **C2988654** (HoLLR1206-1W-8mR-1%, alterno conforme a especificación) · 100 nF = C1591 · 22 µF ×4 = C76637 · R51 = C22972 · 22 k = C31850. **J1/J2 NO ensamblados (las únicas partes no seleccionadas)** → soldar en banco con escantillón; comprar localmente dos zócalos hembra 1×20 de 2.54 mm (el carrete C50984 quedó bloqueado en el inventario de JLC para PCBA futuros). Puntos de ajuste re-derivados de los valores pedidos el 2026-07-08: ventilador 4.99 V · módem 3.33 V · I_chg 2.42 A · límite de entrada 3.12 A · PFI 4.61 V · respaldo 4.79 V — todos en objetivo. -## B. Reception (day of delivery) +## A. Ahora — antes de que arranque la producción (la compuerta de US$479) -- [ ] Visual vs the ordered renders: DNPs bare (P3/P13/H3, MOD1 field), all sockets present, - P1 wire-entry toward the edge, J9 opening at the edge. -- [ ] Polarity dozen again, on physical boards, one board, 5 minutes with a loupe. -- [ ] Measure J1↔J2 socket spacing on one board (decision record says 15.00 mm) and test-insert - a Blackpill — expect light preload if the module measures wider; note insertion force. +- [ ] **Revisión del análisis DFM (4–6 h después de pedir, Order History → DFM Analysis).** Verificar la «docena de polaridad» contra la hoja de respuestas: **U6 pin 1 ARRIBA-IZQUIERDA · U2/U7 pin 1 ABAJO-DERECHA · Q7 pin 1 ARRIBA-IZQUIERDA · bandas: D2/Dbk2/D5/D10 IZQUIERDA, Dbk1 ARRIBA, D6 DERECHA · «+» de electrolíticos: C3 ABAJO, C10/C43 IZQUIERDA · cátodos de LED IZQUIERDA (D1, D4G1, DB1–4)**. La vista previa ya atrapó una vez U6 y U2 girados 180°: no dar nada por sentado. +- [ ] **Confirmar que Production File está en Yes con autoconfirmación a 48 h** — un fin de semana sin vigilancia se aprueba solo. Aprobar solo después de que pase la revisión DFM. +- [ ] Contestar cada correo de revisión de JLC el mismo día (protección del calendario). -## C. Board #1 electrical bring-up — NO modules socketed, current-limited bench supply +## B. Recepción (día de entrega) -1. **Resistance sanity (unpowered):** 24V_IN→GND, MAIN5V→GND, 3V3_MODEM→GND — no shorts (>1 kΩ). -2. **24 V path:** bench supply 24 V, limit 200 mA → P1 pins 1/2. Check: 24V rail after Q10 ≈ 24 V - (reverse-protection FET conducting), **5V_FAN = 5.0 V** (U2 running), fan header P6 pin 1. -3. **Vehicle 5 V path:** 5 V, limit 500 mA → P2. Check: **MAIN5V ≈ 5 V** (LTC4040 input FET - passing), SYS5V after P11 jumpered/switched ON, Blackpill socket pins J1-20/J2-18 = 5 V. -4. **Load switch default-OFF (invariant #1):** with no MCU, SW_5V must be **0 V**. Then short - J1-7 (PWR_CTRL) to 3V3 momentarily → SW_5V = 5 V, **3V3_MODEM = 3.33 V** (U7 up). -5. **Ignition sense:** 12 V and 24 V through P1-3 → IGN_SENSE (J1-11) clamps ≈ 3.5–3.6 V; 0 V → <0.3 V. -6. **⚠ CHARGER NTC TRAP (this WILL look like a dead charger):** with no battery-harness NTC on - P4-3, the LTC4040's NTC pin is pulled to VIN by R55 → reads "battery too cold" → **charging - silently paused**. For bench charge tests, connect **10 kΩ from P4-3 to P4-2 (GND)** to emulate - 25 °C. Do not debug the charger without it. -7. **Charger (with NTC emulation + real 1S4P pack or bench cell):** connect pack to P4 → - CHRG (J2-11) low while charging; charge current ramps ≤ 2.42 A; input current never exceeds - ~3.1 A (watch the bench meter — this validates RS1/CLPROG behavior). -8. **Backup event (THE LTC4040 validation — this block never saw a proto):** system running on - P2 5 V with pack connected → pull P2 → **VSYS holds ≈ 4.79 V** from boost, board keeps running. - Measure: no back-feed voltage appearing on the disconnected P2 pins (validates Q7 orientation - fix). Restore P2 → seamless return + recharge. **Do this before any fleet commitment.** -9. **K1 fail-safe:** unpowered board: continuity K1 pin 1 ↔ pins 5/6 (NC closed = corrections - path exists with dead MCU). Powered + PB5 high: path opens to NO (pin 10). +- [ ] Visual contra los renders pedidos: DNP vacíos (P3/P13/H3, campo de MOD1), todos los zócalos presentes, entrada de cable de P1 hacia el borde, apertura de J9 en el borde. +- [ ] La docena de polaridad otra vez, sobre tarjetas físicas, una tarjeta, 5 minutos con lupa. +- [ ] Medir la separación de zócalos J1↔J2 en una tarjeta (el registro de decisiones dice 15.00 mm) e insertar de prueba un Blackpill — esperar una precarga ligera si el módulo mide más ancho; anotar la fuerza de inserción. -## D. Module integration (board #1 only, then replicate) +## C. Bring-up eléctrico de la tarjeta #1 — sin módulos en zócalos, fuente de banco con límite de corriente -- [ ] **MOD1 socket strips: solder using the simpleRTK2B Pro as the jig** (strips on module → - insert → solder → remove). Same jig trick for any stiff J1/J2 fit. -- [ ] Blackpill in (USB end toward board-left / VB-B12 corner at pads-1 — sockets don't key!). - Flash bench firmware via module USB. -- [ ] **Firmware flag: PROD `CHRG_EN` (PA8) is HIGH = charge OFF** — the proto TP4056 logic was - INVERTED (`CHRG_RUN` HIGH = ON). Port the flag before flashing, or units will disable charging - when they mean to enable it. -- [ ] Pro into MOD1 (antenna top-left, USBs bottom, per the validated orientation). **Old-rev - Pros: XBee switch → UART1. All revs: Pro's own XBee socket stays EMPTY; never plug the Pro's - "USB XBee" port in service** (its FTDI sits on the RTCM3 downlink on new revs). -- [ ] **F9P config: write to FLASH, not RAM** (Jun-20 finding — RAM-only config dies at power - cycle). Verify with a power cycle before shipping any unit. -- [ ] 4G NTRIP Master into J7/J8 (VCC row = J7). Telcel micro-SIM installed first. Board USB-C - (J9) enables the modem's USB only when a host provides VBUS — bench console via J9 is safe; - it does not fight the uplink. -- [ ] End-to-end: open sky, corrections from caster → **GGA quality 4 (RTK fixed)** — the - fleet's first-ever verified fix ≥4 per the Jun-20 gap. +1. Verificación de resistencias (sin energía): 24V_IN→GND, MAIN5V→GND, 3V3_MODEM→GND — sin cortos (> 1 kΩ). +2. **Camino de 24 V:** fuente de banco a 24 V, límite 200 mA → P1 pines 1/2. Verificar: riel de 24 V después de Q10 ≈ 24 V (FET de protección inversa conduciendo), **5V_FAN = 5.0 V** (U2 funcionando), header del ventilador P6 pin 1. +3. **Camino de 5 V del vehículo:** 5 V, límite 500 mA → P2. Verificar: **MAIN5V ≈ 5 V** (FET de entrada del LTC4040 pasando), SYS5V después de P11 con puente o interruptor en ON, pines del zócalo del Blackpill J1-20/J2-18 = 5 V. +4. **Interruptor de carga apagado por omisión (invariante #1):** sin MCU, SW_5V debe ser **0 V**. Después, cortocircuitar momentáneamente J1-7 (PWR_CTRL) a 3V3 → SW_5V = 5 V, **3V3_MODEM = 3.33 V** (U7 arriba). +5. Sensado de ignición: 12 V y 24 V por P1-3 → IGN_SENSE (J1-11) recorta a ≈ 3.5–3.6 V; 0 V → < 0.3 V. +6. **⚠ Trampa de la NTC del cargador (esto VA a parecer un cargador muerto):** sin la NTC del arnés de batería en P4-3, el pin NTC del LTC4040 queda llevado a VIN por R55 → lee «batería demasiado fría» → carga pausada en silencio. Para pruebas de carga en banco, conectar **10 kΩ de P4-3 a P4-2 (GND)** para emular 25 °C. No depurar el cargador sin esto. +7. **Cargador (con emulación de NTC + paquete 1S4P real o celda de banco):** conectar el paquete a P4 → CHRG (J2-11) en bajo mientras carga; la corriente de carga sube hasta ≤ 2.42 A; la corriente de entrada nunca pasa de ~3.1 A (observar el amperímetro de la fuente — esto valida el comportamiento de RS1/CLPROG). +8. **Evento de respaldo (LA validación del LTC4040 — este bloque nunca pasó por un prototipo):** sistema corriendo con los 5 V de P2 y el paquete conectado → quitar P2 → **VSYS se sostiene en ≈ 4.79 V** desde el boost, la tarjeta sigue funcionando. Medir: no aparece voltaje de retorno en los pines desconectados de P2 (valida la corrección de orientación de Q7). Restaurar P2 → regreso sin interrupción + recarga. Hacer esto antes de cualquier compromiso de flota. +9. **Fail-safe de K1:** tarjeta sin energía: continuidad K1 pin 1 ↔ pines 5/6 (NC cerrado = el camino de correcciones existe con el MCU muerto). Energizada + PB5 en alto: el camino se abre hacia NO (pin 10). -## E. Known-accepted risks (decision register — watch, don't re-litigate) +## D. Integración de módulos (solo tarjeta #1, después replicar) -| Risk | Decision/owner | Watch for | +- [ ] **Tiras del zócalo MOD1: soldar usando el simpleRTK2B Pro como escantillón** (tiras en el módulo → insertar → soldar → retirar). Mismo truco para cualquier ajuste rígido de J1/J2. +- [ ] Blackpill puesto (extremo USB hacia la izquierda de la tarjeta / esquina VB-B12 en los pads 1 — ¡los zócalos no tienen guía!). Flashear el firmware de banco por el USB del módulo. +- [ ] **Bandera de firmware: en PROD `CHRG_EN` (PA8) en ALTO = carga APAGADA** — la lógica del TP4056 del prototipo estaba INVERTIDA (`CHRG_RUN` en ALTO = ENCENDIDA). Portar la bandera antes de flashear, o las unidades desactivarán la carga cuando quieran activarla. +- [ ] Pro en MOD1 (antena arriba a la izquierda, USB abajo, según la orientación validada). **Pros de revisión vieja: interruptor XBee → UART1. Todas las revisiones: el zócalo XBee propio del Pro se queda VACÍO; nunca conectar el puerto «USB XBee» del Pro en servicio** (su FTDI queda sobre el enlace de bajada RTCM3 en las revisiones nuevas). +- [ ] **Configuración del F9P: escribir en FLASH, no en RAM** (hallazgo del 20-jun — la configuración solo en RAM muere con el ciclo de energía). Verificar con un ciclo de energía antes de embarcar cualquier unidad. +- [ ] 4G NTRIP Master en J7/J8 (fila VCC = J7). Micro-SIM Telcel instalada primero. El USB-C de la tarjeta (J9) habilita el USB del módem solo cuando un host entrega VBUS — la consola de banco por J9 es segura; no pelea con el enlace de subida. +- [ ] Extremo a extremo: cielo abierto, correcciones desde el caster → **calidad GGA 4 (RTK fijo)** — el primer fix ≥ 4 verificado de la flota, según la brecha del 20-jun. + +## E. Riesgos conocidos y aceptados (registro de decisiones — vigilar, no reabrir) + +| Riesgo | Decisión / responsable | Qué vigilar | |---|---|---| -| J1/J2 rows at 15.00 mm vs 15.24 reading of module | Leo, vernier-verified, 2026-07-07 | Insertion force; pin preload; use jig-solder trick if stiff | -| LTC4040 block fab'd without proto validation | Gate waived consciously (boards cheap) | Step C.8 is the validation — run it FIRST | -| C22 = 35 V part on 24 V node (spec said 50 V) | Accepted at order | Nothing expected; note for rev 1.2 BOM | -| C778721/C90142 ceramic bias derating | Within design margins | — | -| D4G1 modem LED driven from 1.8 V pin | Known-dim (audit L4) | Don't debug as a fault | -| Backup boost budget 1.93 A of 2.5 A at modem TX burst | Margin accepted; 104 µF VSYS bank | Brownout during TX only if budget exceeded — scope VSYS during TX test | +| Filas J1/J2 a 15.00 mm vs lectura de 15.24 del módulo | Leo, verificado con vernier, 2026-07-07 | Fuerza de inserción; precarga de pines; usar el truco del escantillón si queda rígido | +| Bloque LTC4040 fabricado sin validación en prototipo | Compuerta omitida a conciencia (tarjetas baratas) | El paso C.8 es la validación — correrlo PRIMERO | +| C22 = parte de 35 V en el nodo de 24 V (la especificación decía 50 V) | Aceptado al pedir | No se espera nada; nota para el BOM de la rev 1.2 | +| Derating por polarización de cerámicos C778721/C90142 | Dentro de los márgenes de diseño | — | +| LED del módem D4G1 manejado desde un pin de 1.8 V | Se sabe que es tenue (auditoría L4) | No depurarlo como falla | +| Presupuesto del boost de respaldo 1.93 A de 2.5 A en ráfaga TX del módem | Margen aceptado; banco de 104 µF en VSYS | Brownout durante TX solo si se excede el presupuesto — osciloscopio en VSYS durante la prueba de TX | -## F. Fleet replication (after board #1 passes everything) +## F. Réplica en flota (después de que la tarjeta #1 pase todo) -Per-unit checklist: NTC harness populated (removes the C.6 emulation) · module orientations · -switch-to-UART1 on old Pros · F9P FLASH config verified by power cycle · jig-soldered strips · -GGA≥4 open-sky check · then HBOX integration per the enclosure docs (fit verified 2026-07-07). +Checklist por unidad: arnés con NTC poblado (elimina la emulación de C.6) · orientación de módulos · interruptor a UART1 en Pros viejos · configuración del F9P en FLASH verificada con ciclo de energía · tiras soldadas con escantillón · verificación de GGA ≥ 4 a cielo abierto · después integración en el HBOX según los documentos del gabinete (ajuste verificado el 2026-07-07). + +Ver también: [manual V3](../manuales/manual-tarjeta-V3.md) · [pinout V3](../montaje/pinout-arneses.md) · [BOM dividido V3](../montaje/bom-split.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-07-08 | Runbook original (inglés). | +| 1.1 | 2026-09-29 | Traducción al español, encabezado uniforme y enlaces. Sin cambios técnicos. | diff --git a/docs/procedimientos/fan-policy-bench-test.md b/docs/procedimientos/fan-policy-bench-test.md index b6afa9b..5165a37 100644 --- a/docs/procedimientos/fan-policy-bench-test.md +++ b/docs/procedimientos/fan-policy-bench-test.md @@ -1,33 +1,40 @@ --- -title: "Procedimiento de banco — Validación de la política de ventilador FW v3.0.3" -project: Project Drogheda +title: "Validación en banco — política de ventilador por potencia (FW v3.0.3)" +tags: [project-drogheda, testing, ventilador, firmware, banco, v3, v4, procedimiento] date: 2026-08-18 +project: Project Drogheda version: v1.0 audience: ingeniería (banco) target: EinarBoard 1.0 / 2.0 (V4) + firmware blackpillrtkcode_v3 v3.0.3 -tags: [project-drogheda, testing, ventilador, firmware, banco] --- # Validación en banco — política de ventilador por potencia (FW v3.0.3) +Tarjeta: V3 (EinarBoard 1.0) y V4 (EinarBoard 2.0) con firmware `blackpillrtkcode_v3` v3.0.3. + +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: ingeniería (banco) + - Cuándo: al validar un binario V3/V4 con la política de ventilador por potencia (v3.0.3 o posterior que la conserve) + - Tiempo: ~30 min por unidad (incluye 5 min al 100 % y el ciclo de calentamiento) + - Necesitas: fuente 24 V, fuente 5 V a 5.2 V, fuente de ignición 12–24 V, multímetro, laptop con terminal 115200, pistola de aire caliente y osciloscopio opcional + ## 0. Qué se está probando Desde v3.0.3 el ventilador **ya no se modula**: solo tiene dos estados. | Condición | Ventilador | |---|---| -| VEH5V presente **Y** ignición ON | **100 % fijo (DC), a cualquier temperatura** | -| Falta VEH5V **o** falta ignición ("modo batería") | Termostato: **enciende ≥ 48 °C, apaga < 45 °C** (temperatura de control = la más alta de aire SHT40 / batería TMP102 / MCU) | +| VEH5V presente Y ignición ON | **100 % fijo (DC), a cualquier temperatura** | +| Falta VEH5V o falta ignición ("modo batería") | Termostato: **enciende ≥ 48 °C, apaga < 45 °C** (temperatura de control = la más alta de aire SHT40 / batería TMP102 / MCU) | -La lógica reacciona en ≤ 2 s (cadencia térmica) más el debounce de entradas (~0.75 s). No hay sensado de 24 V: la **ignición es el testigo** de que el riel de 24 V existe. +La lógica reacciona en ≤ 2 s (cadencia térmica) más el debounce de entradas (~0.75 s). No hay sensado de 24 V: la ignición es el testigo de que el riel de 24 V existe. -> ⚠️ **PELIGRO:** hay 24 V en P1. Verifique polaridad antes de energizar. No conecte ni desconecte el ventilador (P6) con la tarjeta energizada. - -> 🛑 **ALTO:** en banco sin batería, el riel de 5 V debe estar en **≥ 5.2 V** o con el pack conectado (disparo PFI 4.60 V del LTC4040 bajo ráfaga LTE — nota 24-jul). Si la unidad se reinicia sola durante la prueba, revise esto primero. +!!! danger "24 V en P1 y riel de 5 V" + Verifica la polaridad antes de energizar. No conectes ni desconectes el ventilador (P6) con la tarjeta energizada. En banco sin batería, 5 V ≥ 5.2 V o paquete conectado ([reglas de banco](diagnostico-banco.md#reglas-de-banco)); si la unidad se reinicia sola, revisa esto primero. ## 1. Equipo -Fuente de 24 V (≥ 1 A), fuente de 5 V ajustada a 5.2 V (o el SD-15B de la unidad), fuente o puente de 12–24 V para ignición, multímetro, laptop con terminal serie (USB del Blackpill, **115200 8N1**), pistola de aire caliente (a baja, < 70 °C), osciloscopio (opcional, para confirmar DC). +Fuente de 24 V (≥ 1 A), fuente de 5 V ajustada a 5.2 V (o el SD-15B de la unidad), fuente o puente de 12–24 V para ignición, multímetro, laptop con terminal serie (USB del Blackpill, **115200 8N1**), pistola de aire caliente (a baja, < 70 °C), osciloscopio (opcional, para confirmar DC). ## 2. Puntos de medición @@ -35,18 +42,18 @@ Fuente de 24 V (≥ 1 A), fuente de 5 V ajustada a 5.2 V (o el SD-15B de la unid |---|---|---|---| | **P1** (GX16-5 / Phoenix) | 1 | `24V_IN` | Alimenta SOLO el buck del ventilador (U2 → `5V_FAN`) | | | 2 | `GND` | Retorno común | -| | 3 | `IGN_IN` | Ignición cruda 12–24 V (divisor Rig 22k / Rigb 10k → PA5) | -| **P2** | 1 | `VEH5V` | 5 V del SD-15B (= "vehículo presente" para el firmware, umbral ON > 4.2 V / OFF < 3.8 V) | -| **P6** (ventilador) | 1 | `5V_FAN` | +5 V del buck — debe medir ~5 V siempre que haya 24 V en P1.1 | -| | 2 | `FAN_RET` | Drenaje de Q2 (lado bajo). **Fan ON → ~0 V; fan OFF → ~5 V** | +| | 3 | `IGN_IN` | Ignición cruda 12–24 V (divisor Rig 22k / Rigb 10k → PA5) | +| **P2** | 1 | `VEH5V` | 5 V del SD-15B (= "vehículo presente" para el firmware, umbral ON > 4.2 V / OFF < 3.8 V) | +| **P6** (ventilador) | 1 | `5V_FAN` | +5 V del buck — debe medir ~5 V siempre que haya 24 V en P1.1 | +| | 2 | `FAN_RET` | Drenaje de Q2 (lado bajo). **Fan ON → ~0 V; fan OFF → ~5 V** | | | 4 | `FAN_TACH_RAW` | No usado (ventilador de 2 hilos) — debe quedar al aire | -| **PA6** (Blackpill / Rg) | — | `FAN_PWM` | Comando del MCU vía Rg (100 Ω) → gate de Q2. **ON → 3.3 V DC plano; OFF → 0 V** | +| **PA6** (Blackpill / Rg) | — | `FAN_PWM` | Comando del MCU vía Rg (100 Ω) → gate de Q2. **ON → 3.3 V DC plano; OFF → 0 V** | -La medición que decide es **P6.2 respecto a GND** (o la tensión P6.1↔P6.2 a través del ventilador: ~5 V girando, ~0 V parado). PA6 confirma qué está comandando el firmware; P6.2 confirma que Q2 y el ventilador obedecen. +La medición que decide es **P6.2 respecto a GND** (o la tensión P6.1↔P6.2 a través del ventilador: ~5 V girando, ~0 V parado). PA6 confirma qué está comandando el firmware; P6.2 confirma que Q2 y el ventilador obedecen. ## 3. Telemetría de referencia -Abra la terminal serie antes de empezar. Cada 2 s sale una línea `TLM`; las columnas relevantes (ver línea `COLS` al arranque): +Abra la terminal serie antes de empezar. Cada 2 s sale una línea `TLM`; las columnas relevantes (ver línea `COLS` al arranque): `...,veh,ign,...,tair,rh,tbat,fan_rpm,fan_pwm,fan_fault,...` @@ -56,30 +63,40 @@ Abra la terminal serie antes de empezar. Cada 2 s sale una línea `TLM`; las col ## 4. Procedimiento -Estado inicial: P1 con 24 V, P2 con 5.2 V, **ignición desconectada**, ventilador en P6, unidad a temperatura ambiente (< 40 °C). +Estado inicial: P1 con 24 V, P2 con 5.2 V, ignición desconectada, ventilador en P6, unidad a temperatura ambiente (< 40 °C). | # | Acción | Resultado esperado | Verificar | |---|---|---|---| -| 1 | Energizar la unidad (arranque en frío) | **Self-test**: los 4 LEDs de gauge encienden en secuencia y el ventilador da un soplo de ~0.8 s | Confirma que Q2 + ventilador funcionan, independiente de la lógica | -| 2 | Esperar 10 s, sin ignición | Ventilador **apagado** | P6.2 ≈ 5 V · PA6 = 0 V · TLM: `veh=1 ign=0 fan_pwm=0` | -| 3 | Aplicar 12–24 V a P1.3 (ignición) | En ≤ 3 s el ventilador arranca al **100 %**, aun frío | P6.2 ≈ 0 V · PA6 = 3.3 V **DC plano** (sin PWM en el osciloscopio) · TLM: `ign=1 fan_pwm=100` | -| 4 | Mantener 5 min | Sigue al 100 % sin interrupciones; `fan_fault=0` | Sin parpadeos en P6.2 | -| 5 | Quitar ignición (24 V y 5 V se quedan) | En ≤ 3 s el ventilador **se apaga** (modo batería, unidad fría) | P6.2 ≈ 5 V · `ign=0 fan_pwm=0` | -| 6 | Sin ignición: calentar el sensor SHT40 (sonda P5) con aire caliente, gradual | Al llegar `tair` a **48 °C** el ventilador arranca al 100 % | TLM: `tair≥48 → fan_pwm=100`. **No** debe arrancar a 45–47 °C (histéresis) | -| 7 | Retirar el calor y dejar enfriar | Sigue girando entre 45–47 °C; **se apaga solo por debajo de 45 °C** | `tair=46 → fan_pwm=100` · `tair=44 → fan_pwm=0` | -| 8 | Reconectar ignición con la unidad aún tibia | 100 % inmediato sin importar la temperatura | `fan_pwm=100` | -| 9 | (Opcional, con pack conectado) Quitar el 5 V de P2 dejando 24 V + ignición | El firmware pasa a modo batería (gate incompleto): manda termostato, no el 100 % fijo | `veh=0 → fan_pwm` según temperatura | +| 1 | Energizar la unidad (arranque en frío) | Self-test: los 4 LEDs de gauge encienden en secuencia y el ventilador da un soplo de ~0.8 s | Confirma que Q2 + ventilador funcionan, independiente de la lógica | +| 2 | Esperar 10 s, sin ignición | Ventilador apagado | P6.2 ≈ 5 V · PA6 = 0 V · TLM: `veh=1 ign=0 fan_pwm=0` | +| 3 | Aplicar 12–24 V a P1.3 (ignición) | En ≤ 3 s el ventilador arranca al **100 %**, aun frío | P6.2 ≈ 0 V · PA6 = 3.3 V DC plano (sin PWM en el osciloscopio) · TLM: `ign=1 fan_pwm=100` | +| 4 | Mantener 5 min | Sigue al 100 % sin interrupciones; `fan_fault=0` | Sin parpadeos en P6.2 | +| 5 | Quitar ignición (24 V y 5 V se quedan) | En ≤ 3 s el ventilador se apaga (modo batería, unidad fría) | P6.2 ≈ 5 V · `ign=0 fan_pwm=0` | +| 6 | Sin ignición: calentar el sensor SHT40 (sonda P5) con aire caliente, gradual | Al llegar `tair` a **48 °C** el ventilador arranca al 100 % | TLM: `tair≥48 → fan_pwm=100`. **No** debe arrancar a 45–47 °C (histéresis) | +| 7 | Retirar el calor y dejar enfriar | Sigue girando entre 45–47 °C; **se apaga solo por debajo de 45 °C** | `tair=46 → fan_pwm=100` · `tair=44 → fan_pwm=0` | +| 8 | Reconectar ignición con la unidad aún tibia | 100 % inmediato sin importar la temperatura | `fan_pwm=100` | +| 9 | (Opcional, con pack conectado) Quitar el 5 V de P2 dejando 24 V + ignición | El firmware pasa a modo batería (gate incompleto): manda termostato, no el 100 % fijo | `veh=0 → fan_pwm` según temperatura | -> ℹ️ **NOTA sobre el paso 6:** apunte el aire caliente a la **sonda SHT40 (P5)**, no a la tarjeta completa — así el resultado es reproducible. No exceda ~65 °C: arriba de 45 °C en la celda el firmware además corta la carga (`Cell hot -> charge OFF` en el log); es comportamiento esperado, no una falla. +!!! note "Sobre el paso 6" + Apunte el aire caliente a la **sonda SHT40 (P5)**, no a la tarjeta completa — así el resultado es reproducible. No exceda ~65 °C: arriba de 45 °C en la celda el firmware además corta la carga (`Cell hot -> charge OFF` en el log); es comportamiento esperado, no una falla. ## 5. Criterios de aceptación -La unidad PASA si: (1) `fw=3.0.3` en BOOT; (2) `fan_pwm` solo toma valores 0 y 100 durante toda la prueba; (3) con ignición + VEH5V el ventilador gira al 100 % en frío (paso 3 — este es el cambio de comportamiento clave vs. versiones anteriores); (4) la histéresis 48/45 °C del modo batería se cumple en ambos sentidos (pasos 6–7); (5) PA6 es DC plano en ON (sin portadora de 25 kHz); (6) `fan_fault=0` al final. +La unidad PASA si: (1) `fw=3.0.3` en BOOT; (2) `fan_pwm` solo toma valores 0 y 100 durante toda la prueba; (3) con ignición + VEH5V el ventilador gira al 100 % en frío (paso 3 — este es el cambio de comportamiento clave vs. versiones anteriores); (4) la histéresis 48/45 °C del modo batería se cumple en ambos sentidos (pasos 6–7); (5) PA6 es DC plano en ON (sin portadora de 25 kHz); (6) `fan_fault=0` al final. Cualquier desviación: capture el log serie completo (es append-only, basta guardar la sesión de terminal) y repórtelo con el número de paso. ## 6. Registro -| Unidad | Fecha | Ingeniero | P3 (100 % frío) | P6/P7 (histéresis) | fan_fault | PASA/FALLA | +| Unidad | Fecha | Ingeniero | P3 (100 % frío) | P6/P7 (histéresis) | fan_fault | PASA/FALLA | |---|---|---|---|---|---|---| | H____ | | | | | | | + +Detalle de la política en el firmware: [manual V3](../manuales/manual-tarjeta-V3.md) · [manual V4](../manuales/manual-tarjeta-V4.md). Binarios: [Descargas](../descargas/index.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-08-18 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme, avisos en formato del sitio y enlaces a manuales y descargas. | diff --git a/docs/procedimientos/historico-proto-bench-v3.md b/docs/procedimientos/historico-proto-bench-v3.md index 1599d9b..1ba9d8b 100644 --- a/docs/procedimientos/historico-proto-bench-v3.md +++ b/docs/procedimientos/historico-proto-bench-v3.md @@ -1,196 +1,136 @@ --- -title: Watchdog v3 — Proto Bench Bring-up & Build-Readiness (DEV board) -tags: [project-drogheda, hardware, watchdog, prototype, breadboard, bring-up, readiness] -project: Project Drogheda -author: Helgen CTO +title: "Watchdog v3 — Preparación y bring-up del prototipo en protoboard" +tags: [project-drogheda, hardware, watchdog, prototype, breadboard, bring-up, readiness, historico] date: 2026-06-24 -status: Active — tomorrow's bench guide (supersedes the procedure half of watchdog-protoboard-bringup.md for v3) +project: Project Drogheda +author: Helgen Technologies +status: HISTÓRICO — guía de banco del 25-jun-2026 (sustituyó la mitad de procedimiento de la lista de compras para v3) --- -# Watchdog v3 — Proto Build Readiness & Bench Bring-up +# Watchdog v3 — Preparación y bring-up del prototipo en protoboard -> **Scope:** breadboard the **DEV** watchdog on the existing Blackpill and prove the state -> machine + sensing + load switch + fan/temp loop. **PCB layout is explicitly out of scope -> for tomorrow** (do it after the proto works). Authority: [[watchdog-electrical-design-state]] -> (canonical) · firmware `04-Source-Code/firmware/blackpillrtkcode_v2/` (v2.3) · -> schematic `kicad/hbox-watchdog-v3.kicad_sch`. +Tarjeta: V3 en protoboard (prototipo DEV sobre Blackpill, antes de la EinarBoard 1.0). -> **⚠ UPDATE 2026-07-03 — sensor suite changed to parts in hand.** Proto sensors are now -> **AHT10** (0x38, I²C1 **alone**, 3V3) + **LM35 → PA7** + **NTC → PB1** (no SHT40/TMP102 on -> proto — PCB-only). The kit's TP4056 has **no TEMP pin** → charge cutoff is **PA8 `CHRG_RUN`** -> (IRF9540N on TP4056 IN+, **inverted vs PROD CHRG_EN**). Cutoff switch wired: nodo SYS → SPST -> → MAIN5V. **The fan in hand is 2-wire** → PB10 tach test drops. §1/§3 rows below are patched; -> the authoritative wiring = ledger xlsx + `Drogheda_Guia-Conexion-Protoboard_ES_v2.2.pdf`. -> **Firmware v2.3 still reads SHT40 (0x44)** — the AHT10 driver / LM35 channel / CHRG_RUN flag -> are a pending firmware pass; until then the I²C and charge-cut rows are wire-now/test-later. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: ingeniería (banco QRO) + - Cuándo: documento histórico — bring-up del prototipo en protoboard del watchdog v3 (jun-2026), antes de la primera PCB. El paso siguiente fue el [bring-up de la EinarBoard 1.0](einarboard-1.0-bringup.md) + - Tiempo: un día de banco + - Necesitas: la [lista de compras del protoboard](historico-protoboard.md), Blackpill, fuente de 5 V, multímetro, fuente de calor ---- +Traducido del original en inglés (24-jun-2026, actualizado 03-jul-2026). -## 0. Verdict — are you ready to build? **Yes, with three caveats** +Alcance: armar en protoboard el watchdog DEV sobre el Blackpill existente y probar la máquina de estados + sensado + interruptor de carga + lazo ventilador/temperatura. El layout de la PCB queda explícitamente fuera del alcance (se hace después de que el prototipo funcione). Autoridad: `watchdog-electrical-design-state` (canónico, repo) · firmware `04-Source-Code/firmware/blackpillrtkcode_v2/` (v2.3) · esquemático `kicad/hbox-watchdog-v3.kicad_sch`. -You can build and bring up the **core watchdog** tomorrow. Nothing about the schematic or its -ERC state blocks a breadboard build. The caveats are about *firmware coverage* and *scope -discipline*, not readiness: +!!! warning "Actualización 2026-07-03 — el conjunto de sensores cambió a las partes en mano" + Los sensores del prototipo ahora son **AHT10** (0x38, I²C1 solo, 3V3) + **LM35 → PA7** + **NTC → PB1** (sin SHT40/TMP102 en el prototipo — solo en PCB). El TP4056 del kit **no tiene pin TEMP** → el corte de carga es **PA8 `CHRG_RUN`** (IRF9540N en IN+ del TP4056, **invertido respecto a `CHRG_EN` de PROD**). Interruptor de corte cableado: nodo SYS → SPST → MAIN5V. **El ventilador en mano es de 2 hilos** → la prueba de tacómetro en PB10 se elimina. Las filas de §1/§3 están parchadas; el cableado autoritativo = libro de conexiones xlsx + `Drogheda_Guia-Conexion-Protoboard_ES_v2.2.pdf`. **El firmware v2.3 todavía lee el SHT40 (0x44)** — el driver del AHT10, el canal LM35 y la bandera CHRG_RUN quedaron pendientes de un pase de firmware; hasta entonces las filas de I²C y corte de carga son «cablear ahora / probar después». -1. **ERC "issues" are cosmetic — not a blocker.** File-based ERC on `hbox-watchdog-v3.kicad_sch` - = **0 errors, 1 warning** (a `Q_NPN_BCE` symbol-cache mismatch). The ground net is unified - (4 `GND` symbols, **0** placed `GNDREF` instances — the GNDREF you may see is just an orphaned - library-cache entry, not a real second ground). None of this affects a breadboard. *(Clean it - only before you go to PCB layout — see §2.)* -2. **Two v3 sub-circuits aren't in firmware yet.** The flashed v2.3 build does **not** drive the - 4-LED battery gauge (PB12–15) or `CHRG_EN` (PA8). You can wire them, but they'll sit dark/idle - until a firmware pass. Decide per §4 whether to build them now or defer. -3. **v2.3 has never been hardware-validated.** Repo invariant: *bench-test before flash.* - Tomorrow is its first real bench test — treat step 1 (flash + confirm telemetry) as the gate - before trusting any later step. +## 0. Veredicto: se puede construir, con tres salvedades -**The one thing I couldn't verify:** your exact purchased parts. The two proto BOM `.xlsx` -(`watchdog-protoboard-BOM-3boards.xlsx`, `watchdog-LISTA-DE-COMPRAS-ES.xlsx`) are locked open in -LibreOffice, so I rebuilt the checklist (§3) from the design docs. Close LibreOffice and I'll diff -your actual list against it. +Se puede construir y arrancar el núcleo del watchdog. Nada del esquemático ni de su estado de ERC bloquea un armado en protoboard. Las salvedades son de *cobertura de firmware* y *disciplina de alcance*, no de preparación: ---- +1. **Los «problemas» de ERC son cosméticos — no bloquean.** ERC sobre el archivo `hbox-watchdog-v3.kicad_sch` = **0 errores, 1 aviso** (un símbolo `Q_NPN_BCE` que no coincide con la caché). La red de tierra está unificada (4 símbolos `GND`, **0** instancias `GNDREF` colocadas — el GNDREF que se ve es solo una entrada huérfana de la caché de librería, no una segunda tierra real). Nada de esto afecta al protoboard. *(Limpiarlo solo antes de pasar al layout — ver §2.)* +2. **Dos subcircuitos de v3 todavía no están en firmware.** El build v2.3 flasheado **no** maneja el indicador de batería de 4 LEDs (PB12–15) ni `CHRG_EN` (PA8). Se pueden cablear, pero quedarán apagados hasta un pase de firmware. Decidir según §4 si se arman ahora o después. +3. **v2.3 nunca se ha validado en hardware.** Invariante del repositorio: *probar en banco antes de flashear.* Este es su primer banco real — tratar el paso 1 (flash + confirmar telemetría) como la compuerta antes de confiar en cualquier paso posterior. -## 1. What you can prove tomorrow (firmware v2.3 supports it) vs. not +**Lo que no se pudo verificar:** las partes compradas exactas. Los dos BOM del prototipo en `.xlsx` (`watchdog-protoboard-BOM-3boards.xlsx`, `watchdog-LISTA-DE-COMPRAS-ES.xlsx`) estaban abiertos en LibreOffice, así que el checklist (§3) se reconstruyó desde los documentos de diseño; se compara con la lista real al cerrarlos. -| Sub-circuit | Pins | v2.3 firmware | Testable tomorrow? | +## 1. Qué se puede probar (el firmware v2.3 lo soporta) y qué no + +| Subcircuito | Pines | Firmware v2.3 | ¿Se prueba? | |---|---|---|---| -| Boot + `$PHLG`/STREAM telemetry (USB) | USB-C | ✅ `ENABLE_PHLG=1` | **Yes** — this is the gate | -| Status LED (blink codes) | PB0 | ✅ | **Yes** | -| **RTK-stack load switch** (the recovery heart) | PA1 → 2N3904 → IRF9540 | ✅ OFF-at-reset, MCU-asserts-ON | **Yes** | -| Sense: battery / 5 V / ignition | PA0 / PA4 / PA5 | ✅ hysteresis + debounce | **Yes** | -| Smart fan (PWM) | PA6 · *(PB10 tach = DNP, fan in hand is 2-wire)* | ✅ 25 kHz PWM · RPM/stall **n/a** | **Yes** (PWM ramp; no tach) | -| I²C temp/RH — **AHT10 0x38, alone on the bus** [2026-07-03] | PB6/PB7 | ❌ v2.3 reads SHT40 0x44 → **AHT10 driver pending** (+ MCU-temp fallback works) | wire OK, **reads after firmware patch** | -| Analog temp ×2 — NTC→PB1 + **LM35→PA7** [2026-07-03] | PB1 / PA7 | ❌ channels not coded | wire OK, verify with multimeter meanwhile | -| 4-LED battery gauge | PB12–15 | ❌ not coded | wire OK, **stays dark** | -| Temp-qualified charge cut — **`CHRG_RUN`** [2026-07-03] | PA8 → 2N3904 → IRF9540N on TP4056 IN+ | ❌ not coded (**inverted vs PROD `CHRG_EN`** — needs flag) | wire OK; hand-test by jumpering PA8 high/low | -| Reset (hardware) | NRST | n/a (HW only) | **Yes** — button just works | +| Arranque + telemetría `$PHLG`/STREAM (USB) | USB-C | ✅ `ENABLE_PHLG=1` | Sí — es la compuerta | +| LED de estado (códigos de parpadeo) | PB0 | ✅ | Sí | +| Interruptor de carga de la etapa RTK (el corazón de la recuperación) | PA1 → 2N3904 → IRF9540 | ✅ OFF al reset, el MCU lo enciende | Sí | +| Sensado: batería / 5 V / ignición | PA0 / PA4 / PA5 | ✅ histéresis + debounce | Sí | +| Ventilador inteligente (PWM) | PA6 · *(PB10 tacómetro = DNP, el ventilador en mano es de 2 hilos)* | ✅ PWM 25 kHz · RPM/atasco n/a | Sí (rampa PWM; sin tacómetro) | +| Temperatura/HR por I²C — **AHT10 0x38, solo en el bus** [2026-07-03] | PB6/PB7 | ❌ v2.3 lee SHT40 0x44 → **driver AHT10 pendiente** (+ el respaldo de temperatura del MCU funciona) | cablear OK, lee después del parche de firmware | +| Temperatura analógica ×2 — NTC→PB1 + **LM35→PA7** [2026-07-03] | PB1 / PA7 | ❌ canales no codificados | cablear OK, verificar con multímetro mientras tanto | +| Indicador de batería de 4 LEDs | PB12–15 | ❌ no codificado | cablear OK, queda apagado | +| Corte de carga por temperatura — **`CHRG_RUN`** [2026-07-03] | PA8 → 2N3904 → IRF9540N en IN+ del TP4056 | ❌ no codificado (**invertido respecto a `CHRG_EN` de PROD** — necesita bandera) | cablear OK; probar a mano puenteando PA8 alto/bajo | +| Reset (hardware) | NRST | n/a (solo HW) | Sí — el botón simplemente funciona | -**Fan note [updated 2026-07-03]:** the fan in hand is **2-wire** → no tach; PB10 stays DNP and -v2.3's RPM/stall check reads nothing (harmless). Fan-fault will be inferred from temperature in -the firmware pass. PWM drive on PA6 through the IRLZ44N tests exactly the same. +**Nota del ventilador [actualizada 2026-07-03]:** el ventilador en mano es de **2 hilos** → sin tacómetro; PB10 queda DNP y la comprobación de RPM/atasco de v2.3 no lee nada (inofensivo). La falla de ventilador se inferirá por temperatura en el pase de firmware. El manejo PWM en PA6 a través del IRLZ44N se prueba exactamente igual. ---- +## 2. La situación del ERC -## 2. The ERC situation (so you can stop worrying about it tonight) +- Lo que ERC reporta en el archivo DEV: 0 errores, 1 aviso (`Q_NPN_BCE` no encontrado en la librería `Device`). Ese aviso significa que el símbolo del esquemático viene de la caché del proyecto y la librería `Device` instalada tiene un nombre/pines ligeramente distintos — puramente cosmético, de enlace de librería. +- El GNDREF: **no hay símbolos GNDREF colocados** — solo la *definición* sobrante en la caché embebida. La tierra es una sola red. +- **Por qué no bloquea el protoboard:** ERC valida una *netlist para fabricación*. En protoboard todas las tierras se unen físicamente; la colocación fuera de rejilla y un nombre de caché distinto son invisibles para el cobre que se cablea a mano. +- Antes del layout (después), limpiar en KiCad: Tools → *Update Symbols from Library* (quita el aviso de caché de `Q_NPN_BCE`), después *Annotate* y volver a correr ERC; mover cualquier parte fuera de rejilla a la rejilla de 1.27 mm. No editar el esquemático por script mientras KiCad lo tiene abierto (conflicto de bloqueo de archivo). -- **What ERC actually reports on the DEV file:** 0 errors, 1 warning (`Q_NPN_BCE` not found in - lib `Device`). That warning means the symbol in your schematic is from the project cache and the - installed `Device` lib has a slightly different name/pins — **purely a library-link cosmetic**. -- **The GNDREF you may have seen:** there are **no placed GNDREF symbols** — only the leftover - symbol *definition* in the embedded cache. Your ground is one net. -- **Why it doesn't block the breadboard:** ERC validates a *netlist for fabrication*. On a - breadboard you tie all grounds together physically; off-grid placement and a cache-name mismatch - are invisible to copper you wire by hand. -- **Before PCB layout (later), clean these in KiCAD:** Tools → *Update Symbols from Library* - (clears the `Q_NPN_BCE` cache warning), then *Annotate* and re-run ERC; nudge any off-grid parts - onto the 1.27 mm grid. **Don't let me edit the schematic while you have KiCAD open** (file-lock - conflict) — close it first and I'll do the cleanup pass. +## 3. Checklist de partes antes de armar (reconstruido — confirmar contra la caja) ---- +**Ya se tiene (no comprar):** Blackpill STM32F411, cable USB-C, 18650 + PowerBoost (o fuente de banco), Mean Well SD-15B-05 (o 5 V de banco), multímetro, una fuente de calor (secadora / taza de agua caliente) para la prueba del ventilador. *F9P + 4G master NO se necesitan para este bring-up.* -## 3. Pre-build parts checklist (reconstructed — confirm against your box) +Núcleo (los «cerebros» — indispensable): -**Already have (don't buy):** Blackpill STM32F411, USB-C cable, 18650 + PowerBoost (or bench PSU), -Mean Well SD-15B-05 (or bench 5 V), multimeter, a heat source (hair-dryer/cup of hot water) for the -fan test. *F9P + 4G master are NOT needed for this bring-up.* +- [ ] Protoboard ×2 (830 puntos) + kits de jumpers (M-M y M-F) +- [ ] Surtido de resistencias incl. **330 Ω, 1 k, 4.7 k, 10 k, 100 k, 220 Ω** +- [ ] **2N3904** ×3 (driver del interruptor de carga, TO-92) +- [ ] **IRF9540 / IRF9540N** ×2 (P-FET lado alto para 5 V, TO-220) +- [ ] LED ×5 (estado) · **100 nF** cerámico ×10 (filtros ADC/desacoplo) · 100 µF ≥ 16 V ×4 (bulk) +- [ ] **Potenciómetro de 10 kΩ** ×2 + botón táctil/interruptor deslizante ×2 (barrer VBAT / simular ignición) +- [ ] Tira de header macho 1×40 (para pinar cualquier módulo sin pines) -**Core (the "brains" — must-have):** +**Térmico (nuevo en v3):** -- [ ] Breadboard ×2 (830-pt) + jumper kits (M-M and M-F) -- [ ] Resistor assortment incl. **330 Ω, 1 k, 4.7 k, 10 k, 100 k, 220 Ω** -- [ ] **2N3904** ×3 (load-switch driver, TO-92) -- [ ] **IRF9540 / IRF9540N** ×2 (P-FET high-side 5 V switch, TO-220) -- [ ] LED ×5 (status) · **100 nF** ceramic ×10 (ADC filters/decoupling) · 100 µF ≥16 V ×4 (bulk) -- [ ] **10 kΩ trim pot** ×2 + tactile button/slide switch ×2 (sweep VBAT / simulate ignition) -- [ ] Male header strip 1×40 (to pin any bare module) +- [x] Ventilador 5 V, 40–60 mm — **2 hilos, en mano** [2026-07-03] (sin tacómetro; PB10 DNP) +- [ ] **IRLZ44N** ×2 (N-FET de nivel lógico, lado bajo del ventilador) — *un IRF540/IRFZ44 común no enciende con 3.3 V; si no hay IRLZ44N usar 2N2222A/TIP120 + 1 kΩ en base* +- [ ] **1N5819** ×3 (flyback del ventilador; 1N4007 aceptable) +- [x] Breakout I²C **AHT10** (0x38) — en mano [2026-07-03]; **solo en el bus**, 3V3 únicamente; parche de lectura de firmware pendiente (v2.3 habla SHT40) +- [x] **LM35** (TO-92) — en mano [2026-07-03]; temperatura analógica #2 en **PA7**, alimentado de 5 V -**Thermal (v3 new):** +**Adiciones de v3 (armar solo si se quieren cableadas ahora — ver §4):** -- [x] 5 V fan, 40–60 mm — **2-wire, in hand** [2026-07-03] (no tach; PB10 DNP) -- [ ] **IRLZ44N** ×2 (logic-level N-FET, fan low-side) — *plain IRF540/IRFZ44 won't turn on from - 3.3 V; if out of IRLZ44N use 2N2222A/TIP120 + 1 kΩ base* -- [ ] **1N5819** ×3 (fan flyback; 1N4007 acceptable) -- [x] I²C **AHT10** breakout (0x38) — **in hand** [2026-07-03]; **alone on the bus**, 3V3 only; - firmware read patch pending (v2.3 speaks SHT40) -- [x] **LM35** (TO-92) — **in hand** [2026-07-03]; analog temp #2 on **PA7**, powered from 5 V +- [ ] Reset: botón táctil → NRST↔GND (+ header de 2 pines opcional para reset externo) +- [ ] Indicador de batería: **4× LED + 4× 330 Ω** en PB12–15 *(quedan apagados hasta el firmware)* +- [ ] Sustituto del respaldo de batería: módulo **TP4056** + boost **MT3608** + **2× 1N5819** (OR-ing) *(reproduce carga / pérdida de energía→respaldo / BAT_SENSE)*. **[2026-07-03]** El TP4056 del kit **no tiene pin TEMP** → la NTC de 10 kΩ del cargador no se usa; el corte por temperatura ahora está en el prototipo en hardware: PA8 `CHRG_RUN` → 1 k → 2N3904 → IRF9540N (pull-up 10 k) en IN+ del TP4056 (ALTO = carga; sin MCU = sin carga — invertido respecto a PROD). Más el interruptor de corte: nodo SYS → SPST → MAIN5V (corta vehículo y batería) -**v3 additions (build only if you want them wired now — see §4):** +## 4. Decisión antes de sentarse: cuánto de v3 cablear -- [ ] Reset: tactile button → NRST↔GND (+ optional 2-pin header for external reset) -- [ ] Battery gauge: **4× LED + 4× 330 Ω** on PB12–15 *(will stay dark until firmware)* -- [ ] Battery-backup stand-in: **TP4056** module + **MT3608** boost + **2× 1N5819** (OR-ing) - *(reproduces charge / power-loss→backup / BAT_SENSE)*. **[2026-07-03]** The kit's TP4056 has - **no TEMP pin** → the 10 kΩ charger-NTC is unused; the temp-qualified cutoff **is now on the - proto in hardware**: PA8 `CHRG_RUN` → 1 k → 2N3904 → IRF9540N (10 k pull-up) on TP4056 IN+ - (HIGH = charge; MCU absent = no charge — inverted vs PROD). Plus the **cutoff switch**: - nodo SYS → SPST → MAIN5V (kills vehicle **and** battery) +- Recomendado — armar el núcleo probable + térmico (todo lo marcado *Sí* en §1). Prueba toda la lógica del watchdog y el nuevo lazo ventilador/temperatura, que es el objetivo del prototipo. Añadir el botón de reset (gratis — funciona sin firmware). +- **Indicador (PB12–15):** cablearlo si se quiere el layout/sensación, pero no encenderá hasta que exista el driver del indicador. *Más barato añadirlo después.* +- **Sustituto del respaldo de batería (TP4056+MT3608):** vale la pena si se quiere observar específicamente la transferencia pérdida de energía → respaldo y que `BAT_SENSE` siga a la celda. Omitir si el día es solo para la lógica del watchdog. ---- +## 5. Secuencia de bring-up (correr en orden — cada paso habilita el siguiente) -## 4. Decision before you sit down: how much of v3 to wire +1. **Solo USB — flashear y compuerta.** Compilar v2.3 (Arduino IDE / STM32duino, tarjeta = Blackpill F411CE), flashear por DFU (mantener BOOT0). Abrir serie a 115200. **Confirmar líneas `BOOT` / `COLS` / `TLM` y un `$PHLG,...*CS` cada 30 s.** Si falla, detenerse y corregir el firmware antes de cablear nada. +2. LED de estado — PB0 → 330 Ω → LED → GND. Observar que los códigos de parpadeo cambien con el estado. +3. Interruptor de carga (el corazón de la recuperación) — PA1 → 1 kΩ → base del 2N3904; colector → gate del IRF9540; 10 kΩ gate→5 V; drain → 5 V conmutado; poner un LED+330 Ω en la salida conmutada. **Confirmar: OFF al reset, ON cuando PA1 lo pide.** (Apagado es el estado seguro.) +4. Divisores de sensado — 10 k/10 k ÷2 hacia **PA0** (batería vía 18650/pot) y **PA4** (riel 5 V); pot de 10 kΩ hacia **PA5** (ignición). Barrer y observar que `veh`/`ign`/`vbat` cambien en TLM con histéresis (V5V_ON 4.20 / V5V_OFF 3.80; BAT_CRIT 3.40 / BAT_REC 3.70). +5. Ventilador + tacómetro — PA6 → 220 Ω → gate del IRLZ44N; ventilador(−) en el drain; 1N5819 ∥ ventilador; 100 kΩ gate→GND. Tacómetro de 3 hilos → pull-up 10 kΩ a 3V3 → PB10. Verlo girar/rampar; **desconectar el ventilador → `fan_fault`** en telemetría. +6. Temperatura I²C — SHT40/TMP102 en PB6/PB7 (+4.7 kΩ pull-up cada uno). Calentarlo → el ventilador rampa en la curva 45→70 °C. *¿Sin sensor? El respaldo de temperatura del MCU también rampa el ventilador — calentar toda la tarjeta.* +7. (Opcional) botón de reset — NRST↔GND momentáneo; presionar → reinicio limpio, línea de causa de reset en el log. +8. (Opcional) sustituto del respaldo de batería — 5 V del vehículo → IN del TP4056; celda en BAT del TP4056; TP4056/celda → MT3608 → 5 V vía OR-ing 1N5819 al riel; NTC junto a la celda. Quitar los 5 V del vehículo → observar que el respaldo sostenga el riel y `BAT_SENSE` siga. -- **Recommended for tomorrow — build the testable core + thermal** (everything in §1 marked - *Yes*). It proves the whole watchdog logic and the new fan/temp loop, which is the point of the - proto. Add the **reset button** (free — works with no firmware). -- **Gauge (PB12–15):** wire it if you want the layout/feel, but it won't light until I write the - gauge driver. *Cheaper to add later.* — **I can write that firmware pass tonight/tomorrow if you - want the LEDs live.** -- **Battery-backup stand-in (TP4056+MT3608):** worth wiring if you specifically want to watch - power-loss → backup hand-off and `BAT_SENSE` track the cell. Skip if tomorrow is about the - watchdog logic only. - ---- - -## 5. Bring-up sequence (run in order — each step gates the next) - -1. **USB only — flash & gate.** Compile v2.3 (Arduino IDE / STM32duino, board = Blackpill F411CE), - flash via DFU (hold BOOT0). Open serial @115200. **Confirm `BOOT` / `COLS` / `TLM` lines and a - `$PHLG,...*CS` every 30 s.** If this fails, stop and fix firmware before wiring anything. -2. **Status LED** — PB0 → 330 Ω → LED → GND. Watch blink codes change with state. -3. **Load switch (the recovery heart)** — PA1 → 1 kΩ → 2N3904 base; collector → IRF9540 gate; - 10 kΩ gate→5 V; drain → switched 5 V; put an LED+330 Ω on the switched output. - **Confirm: OFF at reset, ON when PA1 asserts.** (Power-off is the safe state.) -4. **Sense dividers** — 10 k/10 k ÷2 into **PA0** (battery via 18650/pot) and **PA4** (5 V rail); - 10 kΩ pot into **PA5** (ignition). Sweep and watch `veh`/`ign`/`vbat` flip in TLM with - hysteresis (V5V_ON 4.20 / V5V_OFF 3.80; BAT_CRIT 3.40 / BAT_REC 3.70). -5. **Fan + tach** — PA6 → 220 Ω → IRLZ44N gate; fan(−) at the drain; 1N5819 ∥ fan; 100 kΩ - gate→GND. 3-wire tach → 10 kΩ pull-up to 3V3 → PB10. Watch it spin/ramp; **unplug fan → - `fan_fault`** in telemetry. -6. **I²C temp** — SHT40/TMP102 on PB6/PB7 (+4.7 kΩ pull-ups each). Heat it → fan ramps on the - 45→70 °C curve. *No sensor? The MCU-temp fallback still ramps the fan — warm the whole board.* -7. **(Optional) reset button** — NRST↔GND momentary; press → clean reboot, reset-cause line in log. -8. **(Optional) battery-backup stand-in** — vehicle 5 V → TP4056 IN; cell on TP4056 BAT; TP4056/cell - → MT3608 → 5 V via 1N5819 OR-ing into the rail; NTC by the cell. Pull vehicle 5 V → watch backup - hold the rail and `BAT_SENSE` track. - ---- - -## 6. Wiring cheat-sheet (Blackpill side, v3) +## 6. Hoja de cableado (lado Blackpill, v3) ``` -PA0 ← BAT ÷2 (10k/10k) from 18650+ / pot PA6 → 220Ω → IRLZ44N gate; fan(−); 1N5819 ∥ fan -PA4 ← 5V ÷2 (10k/10k) from 5V rail PB10 ← fan tach, 10k pull-up → 3V3 -PA5 ← IGN ÷2 (10k/10k) from pot/switch PB6/PB7 → I²C SCL/SDA (+4.7k each → 3V3) -PA1 → 1k → 2N3904 base; collector → IRF9540 PB0 → 330Ω → LED → GND - gate; 10k gate→5V; drain → switched 5V NRST ← reset button → GND (optional) - → stack (LED+330Ω as a test load) PB12–15 → 330Ω → LED → GND (gauge; dark till FW) -GND / 5V / 3V3 rails common. Fan 5V from a SEPARATE 5V (2nd PSU / LM2596) — not the switched stack rail. +PA0 ← BAT ÷2 (10k/10k) desde 18650+ / pot PA6 → 220Ω → gate IRLZ44N; ventilador(−); 1N5819 ∥ ventilador +PA4 ← 5V ÷2 (10k/10k) desde riel 5V PB10 ← tacómetro, pull-up 10k → 3V3 +PA5 ← IGN ÷2 (10k/10k) desde pot/interruptor PB6/PB7 → I²C SCL/SDA (+4.7k cada uno → 3V3) +PA1 → 1k → base 2N3904; colector → gate IRF9540 PB0 → 330Ω → LED → GND + ; 10k gate→5V; drain → 5V conmutado NRST ← botón de reset → GND (opcional) + → etapa (LED+330Ω como carga de prueba) PB12–15 → 330Ω → LED → GND (indicador; apagado hasta FW) +Rieles GND / 5V / 3V3 comunes. 5 V del ventilador desde una fuente de 5 V SEPARADA (2ª fuente / LM2596) — no del riel conmutado de la etapa. ``` -> **Proto↔PCB part map (don't get confused):** the schematic uses SMD equivalents (Q1 **AO3401A** -> P-FET, Q5 **MMBT3904**, Q2 **AO3400A** fan FET). On the breadboard you use the through-hole -> stand-ins above (**IRF9540N / 2N3904 / IRLZ44N**) — same topology, same firmware. +!!! note "Mapa de partes prototipo↔PCB (para no confundirse)" + El esquemático usa equivalentes SMD (Q1 **AO3401A** P-FET, Q5 **MMBT3904**, Q2 **AO3400A** FET del ventilador). En el protoboard se usan los sustitutos through-hole de arriba (**IRF9540N / 2N3904 / IRLZ44N**) — misma topología, mismo firmware. ---- +## 7. Después de que el prototipo funcione — siguientes pasos -## 7. After the proto works — next steps (not tomorrow) +- Pase de firmware: driver del indicador de LEDs (PB12–15 desde `BAT_SENSE`) + lógica `CHRG_EN` de corte de carga en caliente. +- KiCad: limpieza cosmética de ERC → huellas → después layout de PCB (DEV primero, después PROD según `watchdog-production-schematic-delta`). +- Capacidad del paquete confirmada **~12 Ah** (2026-06-30; la etiqueta «40 Ah» estaba mal) — dimensiona la corriente de carga del LTC4040 (≈ C/5, ≤ 2.5 A). -- Firmware pass: gauge-LED driver (PB12–15 from `BAT_SENSE`) + `CHRG_EN` cut-charge-when-hot logic. -- KiCAD: cosmetic ERC cleanup → footprints → **then** PCB layout (DEV first, then build PROD per - [[watchdog-production-schematic-delta]]). -- Pack Ah confirmed **~12 Ah** (2026-06-30; "40 Ah" label was wrong) — sizes the LTC4040 charge current (≈C/5, ≤2.5 A). +## Relacionados -## Related -[[watchdog-electrical-design-state]] (CANONICAL) · [[watchdog-protoboard-bringup]] (Jun-22 shop -list) · [[watchdog-production-schematic-delta]] (PROD build spec) · `kicad/hbox-watchdog-v3.kicad_sch` +`watchdog-electrical-design-state` (canónico, repo) · [lista de compras del protoboard](historico-protoboard.md) (22-jun) · `watchdog-production-schematic-delta` (especificación del build PROD, repo) · `kicad/hbox-watchdog-v3.kicad_sch` · lo que siguió: [bring-up de la EinarBoard 1.0](einarboard-1.0-bringup.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-06-24 | Guía de banco original (inglés); actualización de sensores 03-jul. | +| 1.1 | 2026-09-29 | Traducción al español, encabezado uniforme y enlaces. Sin cambios técnicos. | diff --git a/docs/procedimientos/historico-protoboard.md b/docs/procedimientos/historico-protoboard.md index ebbfc09..f6d3e44 100644 --- a/docs/procedimientos/historico-protoboard.md +++ b/docs/procedimientos/historico-protoboard.md @@ -1,130 +1,114 @@ --- -tags: [project-drogheda, hardware, watchdog, prototype, breadboard, bom, bring-up] -project: Project Drogheda -author: Helgen CTO +title: "Watchdog — Lista de compras para el bring-up en protoboard" +tags: [project-drogheda, hardware, watchdog, prototype, breadboard, bom, bring-up, historico] date: 2026-06-22 -status: Active — shop list for the Blackpill bring-up +project: Project Drogheda +author: Helgen Technologies +status: HISTÓRICO — lista de compras del prototipo en Blackpill (jun-2026) --- -# Watchdog Bring‑up — Protoboard Shopping List (print me) +# Watchdog — Lista de compras para el bring-up en protoboard -> **⚠ SUPERSEDED for sensors (2026-07-03):** the proto suite is now **AHT10 (0x38, alone on -> I²C1, 3V3) + LM35→PA7 + NTC→PB1** — no SHT40/SHT31/BME280/TMP102 on the proto (PCB-only). -> Charge cutoff = **PA8 `CHRG_RUN`** on the TP4056 IN+ (the kit module has no TEMP pin). -> Current shop lists = `watchdog-protoboard-BOM-3boards.xlsx` / `watchdog-LISTA-DE-COMPRAS-ES.xlsx`; -> wiring = ledger xlsx + Guía v2.2. The sensor/substitute rows below are kept for history only. +Tarjeta: V3 en protoboard (prototipo sobre Blackpill, antes de la EinarBoard 1.0). -> Goal: breadboard the v2.2 watchdog on your **existing Blackpill**, prove the -> state machine + sensing + load switch + fans + temp loop, **before** any PCB. -> All parts are **through‑hole / breadboard‑friendly** and stocked at a normal MX -> electronics shop (Steren / AG Electrónica / local). Quantities include spares. -> Pin map: [[03-Architecture-Hardware/watchdog-pcb-v3-design#2|design §2]] · -> firmware: `blackpillrtkcode_v2.ino` (v2.2). +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: ingeniería (banco QRO) + - Cuándo: documento histórico — compras para el prototipo en protoboard del watchdog v2.2/v3 (jun-2026). El procedimiento de banco es [Bring-up del prototipo v3](historico-proto-bench-v3.md) + - Tiempo: una visita a la tienda de electrónica + - Necesitas: el Blackpill y lo listado en §0 -## 0. Already have — do NOT buy -STM32F411 Blackpill · USB‑C/micro cable · 18650 + PowerBoost · Mean Well SD‑15B‑05 -(or a bench PSU) · multimeter · the F9P + 4G master (only needed later, not for the -bring‑up). A **heat source** (hair dryer / lighter / hot water cup) to trigger the -thermal/fan test — household, no need to buy. +Traducido del original en inglés (22-jun-2026, sustituido en parte el 03-jul-2026). ---- +!!! warning "Sustituido para sensores (2026-07-03)" + El conjunto de sensores del prototipo pasó a ser **AHT10 (0x38, solo en I²C1, 3V3) + LM35→PA7 + NTC→PB1** — sin SHT40/SHT31/BME280/TMP102 en el prototipo (solo en PCB). Corte de carga = **PA8 `CHRG_RUN`** en IN+ del TP4056 (el módulo del kit no tiene pin TEMP). Listas de compras vigentes = `watchdog-protoboard-BOM-3boards.xlsx` / `watchdog-LISTA-DE-COMPRAS-ES.xlsx`; cableado = libro de conexiones xlsx + Guía v2.2. Las filas de sensores/sustitutos de abajo se conservan solo por historia. -## 1. Core — bring up the "brains" (buy this even if the shop is sparse) +Objetivo: armar en protoboard el watchdog v2.2 sobre el Blackpill existente y probar la máquina de estados + sensado + interruptor de carga + ventiladores + lazo de temperatura, antes de cualquier PCB. Todas las partes son through-hole / aptas para protoboard y se consiguen en una tienda de electrónica normal en México (Steren / AG Electrónica / local). Las cantidades incluyen repuestos. Mapa de pines: `watchdog-pcb-v3-design` §2 (repo) · firmware: `blackpillrtkcode_v2.ino` (v2.2). -| # | Item | Qty | Value / part | ~MXN | For | +## 0. Ya se tiene — no comprar + +STM32F411 Blackpill · cable USB-C/micro · 18650 + PowerBoost · Mean Well SD-15B-05 (o una fuente de banco) · multímetro · el F9P + 4G master (solo hacen falta después, no para el bring-up). Una fuente de calor (secadora / encendedor / taza de agua caliente) para disparar la prueba térmica/de ventilador — de casa, no hay que comprarla. + +## 1. Núcleo — arrancar los «cerebros» (comprar esto aunque la tienda esté escasa) + +| # | Ítem | Cant. | Valor / parte | ~MXN | Para | |---|---|---|---|---|---| -| 1 | Breadboard 830‑pt | 2 | half/full | 120 | build surface (2 = room for fans/sensors) | -| 2 | Jumper wires M‑M | 1 pk | 65 pcs | 60 | board wiring | -| 3 | Jumper wires M‑F | 1 pk | 40 pcs | 50 | to Blackpill / modules | -| 4 | Resistor assortment box | 1 | ¼ W (incl. 330Ω,1k,4.7k,10k,100k,220Ω) | 120 | dividers, gates, pull‑ups | -| 5 | LED (any) | 5 | 3/5 mm | 10 | status LED on PB0 | -| 6 | Ceramic cap 100 nF | 10 | 0.1 µF (104) | 20 | ADC filters + decoupling | -| 7 | Electrolytic 100 µF / ≥16 V | 4 | — | 20 | rail bulk / modem‑burst reservoir | -| 8 | **2N3904** (NPN, TO‑92) | 3 | load‑switch driver | 15 | PA1 → P‑FET gate | -| 9 | **IRF9540 / IRF9540N** (P‑MOSFET, TO‑220) | 2 | high‑side 5 V switch | 40 | switched 5 V to "stack" | -| 10 | **10 kΩ trim pot** | 2 | breadboard trimmer | 30 | sweep VBAT / ignition to test thresholds | -| 11 | Tactile button or slide switch | 2 | — | 20 | simulate ignition on/off | -| 12 | Male header strip | 1 | 1×40, 2.54 mm | 15 | solder onto any module that needs pins | +| 1 | Protoboard 830 puntos | 2 | media/completa | 120 | superficie de armado (2 = espacio para ventiladores/sensores) | +| 2 | Jumpers M-M | 1 pq | 65 pzas | 60 | cableado de la placa | +| 3 | Jumpers M-F | 1 pq | 40 pzas | 50 | hacia el Blackpill / módulos | +| 4 | Caja surtida de resistencias | 1 | ¼ W (incl. 330 Ω, 1 k, 4.7 k, 10 k, 100 k, 220 Ω) | 120 | divisores, gates, pull-ups | +| 5 | LED (cualquiera) | 5 | 3/5 mm | 10 | LED de estado en PB0 | +| 6 | Capacitor cerámico 100 nF | 10 | 0.1 µF (104) | 20 | filtros ADC + desacoplo | +| 7 | Electrolítico 100 µF / ≥ 16 V | 4 | — | 20 | bulk del riel / reserva para ráfagas del módem | +| 8 | **2N3904** (NPN, TO-92) | 3 | driver del interruptor de carga | 15 | PA1 → gate del P-FET | +| 9 | **IRF9540 / IRF9540N** (P-MOSFET, TO-220) | 2 | interruptor lado alto de 5 V | 40 | 5 V conmutado hacia la «etapa» | +| 10 | **Potenciómetro de 10 kΩ** | 2 | trimmer para protoboard | 30 | barrer VBAT / ignición para probar umbrales | +| 11 | Botón táctil o interruptor deslizante | 2 | — | 20 | simular ignición on/off | +| 12 | Tira de header macho | 1 | 1×40, 2.54 mm | 15 | soldar en cualquier módulo que necesite pines | -**Core subtotal ≈ 520 MXN.** With this you can flash v2.2, watch the `$PHLG`/TLM log, -and validate the **load switch + the three sense dividers + LED** — the whole watchdog -logic — without the thermal parts. +**Subtotal del núcleo ≈ 520 MXN.** Con esto se puede flashear v2.2, ver el log `$PHLG`/TLM y validar el interruptor de carga + los tres divisores de sensado + LED — toda la lógica del watchdog — sin las partes térmicas. ---- +## 2. Adiciones térmicas — ventiladores + temperatura (lo nuevo de v3) -## 2. Thermal add‑ons — fans + temperature (the v3 new stuff) - -| # | Item | Qty | Value / part | ~MXN | For / note | +| # | Ítem | Cant. | Valor / parte | ~MXN | Para / nota | |---|---|---|---|---|---| -| 13 | 5 V fan, 40–60 mm, **3‑wire** | 1 | 3‑wire = has tach | 60 | one extraction fan; 3‑wire so PB10 reads RPM. Grab a 2nd as a spare if cheap | -| 14 | **IRLZ44N** (logic‑level N‑MOSFET, TO‑220) | 2 | fan low‑side PWM | 30 | 1 + spare; **must be logic‑level**; see substitute below | -| 15 | Schottky **1N5819** | 3 | fan flyback | 10 | one across the fan (1N4007 ok if out) | -| 16 | I²C temp+RH breakout | 1 | **SHT31 / SHT40** ideal | 120 | matches firmware (0x44). RH catches condensation | -| 17 | Analog temp **LM35** (TO‑92) | 2 | sure‑thing fallback | 25 | every shop has it; heat it → watch fans ramp | -| 18 | **DS18B20** waterproof probe | 1 | 1‑wire | 45 | great as the battery/modem hot‑spot probe | -| 19 | LM2596 buck module (adj.) | 1 | 24/12 → 5 V | 35 | dedicated **fan 5 V** rail (caveat §0a) if no 2nd bench PSU | +| 13 | Ventilador 5 V, 40–60 mm, **3 hilos** | 1 | 3 hilos = tiene tacómetro | 60 | un ventilador de extracción; de 3 hilos para que PB10 lea RPM. Tomar un 2º como repuesto si es barato | +| 14 | **IRLZ44N** (N-MOSFET de nivel lógico, TO-220) | 2 | PWM lado bajo del ventilador | 30 | 1 + repuesto; debe ser de nivel lógico; ver sustituto abajo | +| 15 | Schottky **1N5819** | 3 | flyback del ventilador | 10 | uno en paralelo con el ventilador (1N4007 sirve si no hay) | +| 16 | Breakout I²C temp+HR | 1 | **SHT31 / SHT40** ideal | 120 | coincide con el firmware (0x44). La HR detecta condensación | +| 17 | Temperatura analógica **LM35** (TO-92) | 2 | respaldo seguro | 25 | lo tienen en todas las tiendas; calentarlo → ver rampar los ventiladores | +| 18 | Sonda **DS18B20** sumergible | 1 | 1-wire | 45 | excelente como sonda de punto caliente de batería/módem | +| 19 | Módulo buck LM2596 (ajustable) | 1 | 24/12 → 5 V | 35 | riel de **5 V del ventilador** dedicado (salvedad §0a) si no hay 2ª fuente de banco | -**Thermal subtotal ≈ 260 MXN** (one fan + driver + one temp option). Grab #13–15 for the fan, and **one** temperature option -(#16 ideal, else #17/#18). +**Subtotal térmico ≈ 260 MXN** (un ventilador + driver + una opción de temperatura). Tomar #13–15 para el ventilador y una opción de temperatura (#16 ideal; si no, #17/#18). ---- +## 3. Sustituciones (el inventario de la tienda varía — todas funcionan) -## 3. Substitutions (shop stock varies — these all work) - -| If they're out of… | Buy instead | Catch | +| Si no tienen… | Comprar en su lugar | Detalle | |---|---|---| -| IRLZ44N (logic‑level FET) | **2N2222A** (TO‑92) or **TIP120** (Darlington) | BJT: add 1 kΩ base resistor; fine for a <0.5 A fan. **Plain IRF540/IRFZ44 won't fully turn on from 3.3 V — avoid.** | -| SHT31/SHT40 I²C breakout | **BME280/BMP280** (I²C, common) | address 0x76/0x77 → small firmware change | -| Any I²C sensor | **LM35** (analog) or **DS18B20** (1‑wire) | not I²C → firmware reads ADC / 1‑wire instead (I'll patch it) | -| IRF9540 P‑MOSFET | keep your original, or **2N2222 high‑side** is awkward — ask for any P‑channel ≥30 V | gate fully pulled to GND by the 2N3904, so a standard P‑FET is OK here | -| 1N5819 Schottky | **1N4007** | slightly slower; fine at fan PWM | +| IRLZ44N (FET de nivel lógico) | **2N2222A** (TO-92) o **TIP120** (Darlington) | BJT: añadir resistencia de base de 1 kΩ; bien para un ventilador < 0.5 A. **Un IRF540/IRFZ44 común no enciende del todo con 3.3 V — evitar.** | +| Breakout I²C SHT31/SHT40 | **BME280/BMP280** (I²C, común) | dirección 0x76/0x77 → cambio pequeño de firmware | +| Cualquier sensor I²C | **LM35** (analógico) o **DS18B20** (1-wire) | no es I²C → el firmware lee ADC / 1-wire en su lugar (parche de firmware) | +| P-MOSFET IRF9540 | conservar el original; un **2N2222 en lado alto** es incómodo — pedir cualquier canal P ≥ 30 V | el gate lo lleva a GND por completo el 2N3904, así que un P-FET estándar sirve aquí | +| Schottky 1N5819 | **1N4007** | un poco más lento; bien a la PWM del ventilador | ---- +## 4. Orden de bring-up (para que la lista se corresponda con acciones) -## 4. Bring‑up order (so the list maps to actions) +1. **Solo USB** — flashear v2.2, abrir serie a 115200. Confirmar líneas `BOOT/COLS/TLM` **y un `$PHLG,...*CS` cada 30 s**. (Sin partes externas — esto prueba el firmware.) +2. **LED en PB0** vía 330 Ω → observar que los códigos de parpadeo cambien con el estado. +3. Interruptor de carga — 2N3904 + IRF9540 + 1 kΩ (base) + 10 kΩ (pull-up de gate) desde un riel de 5 V; poner un LED+330 Ω en la salida conmutada. Conmutar: confirmar OFF al reset, ON cuando PA1 lo maneja. (Este es el corazón de la recuperación.) +4. Divisores de sensado — dos de 10 kΩ cada uno (÷2) hacia **PA0** (batería vía 18650) y **PA4** (riel 5 V); un pot de 10 kΩ hacia **PA5** (ignición). Barrerlos y ver `veh`/`ign` cambiar en el TLM con histéresis/debounce. +5. Ventilador — PA6 → gate (220 Ω) del IRLZ44N → ventilador(−); diodo de flyback en paralelo con el ventilador; 100 kΩ gate→GND. Verlo girar/rampar; hilo de tacómetro → pull-up 10 kΩ a 3V3 → PB10 → RPM en el log; **desconectar el ventilador → `FAN_FAULT`**. +6. Temperatura — breakout I²C en PB6/PB7 (+4.7 kΩ pull-ups), o LM35 en un pin ADC. Calentarlo → los ventiladores rampan según la curva 45→70 °C; a 75 °C entra el derate térmico existente. -1. **Just USB** — flash v2.2, open serial @115200. Confirm `BOOT/COLS/TLM` lines **and a - `$PHLG,...*CS` every 30 s**. (No external parts — this proves the firmware.) -2. **LED on PB0** via 330 Ω → watch the blink codes change with state. -3. **Load switch** — 2N3904 + IRF9540 + 1 kΩ (base) + 10 kΩ (gate pull‑up) from a 5 V rail; - put an LED+330 Ω on the switched output. Toggle: confirm **OFF at reset**, ON when PA1 - drives. (This is the heart of recovery.) -4. **Sense dividers** — two 10 kΩ each (÷2) into **PA0** (battery via 18650) and **PA4** - (5 V rail); a 10 kΩ pot into **PA5** (ignition). Sweep them and watch `veh`/`ign` flip in - the TLM with hysteresis/debounce. -5. **Fan** — PA6 → gate (220 Ω) of IRLZ44N → fan(−); flyback diode across the fan; - 100 kΩ gate→GND. Watch it spin/ramp; tach wire → 10 kΩ pull‑up to 3V3 → PB10 → - RPM in the log; **unplug the fan → `FAN_FAULT`**. -6. **Temperature** — I²C breakout on PB6/PB7 (+4.7 kΩ pull‑ups), or LM35 on an ADC pin. - Heat it → fans ramp per the 45→70 °C curve; at 75 °C the existing thermal derate kicks in. - ---- - -## 5. Wiring cheat‑sheet (Blackpill side) +## 5. Hoja de cableado (lado Blackpill) ``` -PA0 ← BAT ÷2 (10k/10k) from 18650+ PA6 → 220Ω → IRLZ44N gate; fan(−); 1N5819 ∥ fan -PA4 ← 5V ÷2 (10k/10k) from 5V rail PB10 ← fan tach, 10k pull-up → 3V3 (1k series) -PA5 ← IGN ÷2 (10k/10k) from pot/switch PB6/PB7 → I²C SCL/SDA (+4.7k each → 3V3) -PA1 → 1k → 2N3904 base; collector → IRF9540 PB0 → 330Ω → LED → GND - gate; 10k gate→5V; drain → switched (PA7/PB12 left free — 2nd fan if ever needed) - 5V → stack (use an LED load to test) -GND/5V/3V3 rails common; fan 5V from a SEPARATE 5V (LM2596 or 2nd PSU) — not the stack rail. +PA0 ← BAT ÷2 (10k/10k) desde 18650+ PA6 → 220Ω → gate IRLZ44N; ventilador(−); 1N5819 ∥ ventilador +PA4 ← 5V ÷2 (10k/10k) desde riel 5V PB10 ← tacómetro, pull-up 10k → 3V3 (1k en serie) +PA5 ← IGN ÷2 (10k/10k) desde pot/interr. PB6/PB7 → I²C SCL/SDA (+4.7k cada uno → 3V3) +PA1 → 1k → base 2N3904; colector → gate PB0 → 330Ω → LED → GND + IRF9540; 10k gate→5V; drain → 5V (PA7/PB12 libres — 2º ventilador si algún día hace falta) + conmutado → etapa (LED como carga) +Rieles GND/5V/3V3 comunes; 5 V del ventilador desde una fuente de 5 V SEPARADA (LM2596 o 2ª fuente) — no del riel de la etapa. ``` ---- +## 6. Nota sobre el sensor de temperatura y el firmware -## 6. Note on the temp sensor + firmware -The v2.2 firmware reads **I²C SHT40 (0x44) + TMP102 (0x48)**. Whatever you bring back: -- **SHT31/SHT40** → works as‑is (SHT40) or a 1‑line address tweak (SHT31). -- **BME280** → change address + read call. -- **LM35 / DS18B20** → analog / 1‑wire; tell me which and I'll patch `buildPHLG()` + - the fan‑curve input to read it. For *tomorrow's* bring‑up the fan loop can also be - driven off the **MCU‑internal** temp (already in firmware) — heat the whole board and - the derate still triggers, so you can prove the fan path even before the sensor arrives. +El firmware v2.2 lee **I²C SHT40 (0x44) + TMP102 (0x48)**. Según lo que se consiga: -## Related -- **3-board PROTO BOM (use this for bring-up):** `watchdog-protoboard-BOM-3boards.xlsx` (engineering, ≈MXN 5,341) + `watchdog-LISTA-DE-COMPRAS-ES.xlsx` (plain-Spanish shop list). **v3 adds:** reset (on-board + external), 4-LED battery gauge, power-cutoff switch, and battery backup (proto: TP4056+MT3608+OR-diodes+NTC; PCB: **LTC4040**). Canonical electrical state: [[03-Architecture-Hardware/watchdog-electrical-design-state|watchdog-electrical-design-state.md]]. -- [[03-Architecture-Hardware/watchdog-pcb-v3-bom|v3 BOM (production + bench, xlsx)]] · - [[03-Architecture-Hardware/watchdog-pcb-v3-design|v3 design (pin map, sub‑circuits)]] · - `04-Source-Code/firmware/blackpillrtkcode_v2/blackpillrtkcode_v2.ino` +- **SHT31/SHT40** → funciona tal cual (SHT40) o con un ajuste de dirección de una línea (SHT31). +- **BME280** → cambiar dirección + llamada de lectura. +- **LM35 / DS18B20** → analógico / 1-wire; se parcha `buildPHLG()` + la entrada de la curva del ventilador para leerlo. Para el bring-up inmediato el lazo del ventilador también puede manejarse con la temperatura interna del MCU (ya está en el firmware) — calentar toda la tarjeta y el derate se dispara igual, así que se puede probar el camino del ventilador antes de que llegue el sensor. + +## Relacionados + +- **BOM PROTO de 3 tarjetas (usar para el bring-up):** `watchdog-protoboard-BOM-3boards.xlsx` (ingeniería, ≈ MXN 5,341) + `watchdog-LISTA-DE-COMPRAS-ES.xlsx` (lista de compras en español llano). **v3 añade:** reset (en tarjeta + externo), indicador de batería de 4 LEDs, interruptor de corte de energía y respaldo de batería (prototipo: TP4056+MT3608+diodos OR+NTC; PCB: **LTC4040**). Estado eléctrico canónico: `watchdog-electrical-design-state.md` (repo). +- `watchdog-pcb-v3-bom` (BOM v3 producción + banco, xlsx) · `watchdog-pcb-v3-design` (diseño v3: mapa de pines, subcircuitos) · `04-Source-Code/firmware/blackpillrtkcode_v2/blackpillrtkcode_v2.ino` — todos en el repo. +- Lo que siguió: [Bring-up del prototipo v3](historico-proto-bench-v3.md) → [Bring-up de la EinarBoard 1.0](einarboard-1.0-bringup.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-06-22 | Lista original (inglés); nota de sustitución 03-jul. | +| 1.1 | 2026-09-29 | Traducción al español, encabezado uniforme y enlaces. Sin cambios técnicos. | diff --git a/docs/procedimientos/prueba-bateria-modem.md b/docs/procedimientos/prueba-bateria-modem.md index 58095d4..01fdd3f 100644 --- a/docs/procedimientos/prueba-bateria-modem.md +++ b/docs/procedimientos/prueba-bateria-modem.md @@ -1,182 +1,124 @@ -# Prueba de banco — módem 4G en modo batería (fw 0.5.7 → 0.6.0) +--- +title: "Prueba de banco — módem 4G en modo batería" +tags: [project-drogheda, hbox, procedimiento, bateria, modem, ltc4040, v5, v4, firmware] +date: 2026-09-26 +project: Project Drogheda +author: Helgen Technologies +version: 1.3 +--- -!!! danger "Noche 26/27-sep con 0.5.8: módem oscuro al amanecer (vbat 3.50 V, F9P vivo, LEDs de carga apagados)" - Al volver los 24 V el módem siguió oscuro; solo un reset (SW1/P10) o `SW4G1` lo levantó. Causa más probable: el recovery de enlace - seguía armado en batería y, sin GGA durante el silencio del ahorro, «RTK perdido 15 min» disparó un ciclo de etapa **en batería** - (buscar `RECOVERY` / `rec=1` en la captura, o `$PHEV RECOVERY` en el servidor). 0.5.8 queda retirada; **0.5.9** no cicla nunca en - batería, resetea al volver el 5 V tras ≥ 10 s de respaldo, corre continuo (sin ahorro) y añade la vigilancia del módem. +# Prueba de banco — módem 4G en modo batería -!!! success "0.6.0 — prueba del cargador (antes de la corrida de batería, misma unidad, paquete bajo)" - 1. 24 V + etapa ON, consola abierta. En los primeros 120 s `STAT` dice `carga=HOLDOFF`; luego `carga=PROVING n/30s` y a los ~150 s - `EVT CARGA ON: riel 5.xx V estable 30 s`. En el siguiente `STAT`: `ltc=CARGANDO`; en el monitor la unidad muestra 🔌 CARGANDO. - 2. Multímetro en P2 (riel del vehículo) 10 min: anotar mínimo visto. Si el riel cae bajo 4.90 V durante una ráfaga LTE, la consola - dice `CARGA cortada … enfriamiento 60 s` y `carga=COOLDOWN faltan Ns`; luego reintenta. Anotar `cortes=` al cabo de 1 h y el `vbat` - inicial y final (debe subir). Enfriamientos que llegan a 30 min = la fuente no aguanta 2.4 A + etapa → V5.6 o fuente de 4 A. - 3. Quitar 24 V: `carga=BATT`, `CARGA OFF: BATT` (nunca carga en batería). Volver 24 V: reset (0.5.9), y a los ~150 s vuelve a cargar. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: laboratorio QRO. + - Cuándo: al validar un firmware nuevo en una unidad V5.5 completa, o cuando una unidad en batería deja de reportar. V4: usa el [procedimiento V4](v4-prueba-fw-0.5.6.md) y su [acta](../formularios/v4.html) (en la V4 el USB de la Blackpill alimenta el riel de 5 V y la prueba en batería no vale con un cable normal). + - Tiempo: ~45 min por unidad; la aceptación (§2) incluye una noche completa. + - Necesitas: unidad completa con batería, fuente de 24 V, laptop grabando la consola, dos multímetros, monitor abierto, [acta de esta prueba](../formularios/prueba-bateria.html). -!!! success "Prueba de aceptación y calibración de 0.5.9 (misma unidad, consola abierta) — vale igual para 0.6.0" - 1. 24 V + ignición, módem registrado, RTK fix. 5 min. Anotar de 3–4 `STAT`: `sag5=` (nivel «vivo en 24 V»), `rtcm_age=` (pocos s), `sta=`. - 2. Quitar 24 V. 20 min. Anotar de 3–4 `STAT`: `sagb=` (nivel «vivo en batería»); `modem=vivo`; el módem sigue con LEDs; **no debe - aparecer ninguna línea `RECOVERY`**; el monitor sigue viendo la unidad con `pwr=BATT`. - 3. Matar el módem a propósito (en batería): `P` (etapa OFF) y luego `P` + `Y` (etapa ON desde batería) → F9P vivo, módem oscuro. 3 min: - `rtcm=none`, `sagb` cae al piso, `flat` sube y a las 4 ventanas `EVT MODEM SOSPECHOSO` + `$PHEV MODEM_DARK`. Anotar `sagb` de esas ventanas. - 4. Volver los 24 V: `5 V de vuelta … reset del MCU`, reinicio, etapa ON a los ~3 s, módem enciende; tras 2 min `modem=vivo`. - 5. Noche completa en batería desde 24 V (sin tocar nada). En la mañana: módem vivo antes de volver los 24 V, y `STAT`/monitor con la hora - de corte 3.40 V si llegó (`SLEEP`) → autonomía real. +!!! danger "No se hace" + No cambies el firmware, no muevas JP2/JP3/JP4 ni el trimmer del SD-15B: la prueba vale porque la unidad está como en campo. Nunca conectes la fuente de banco a P4 con la batería puesta. - Con los `sag5`/`sagb` de 1–3 se fijan `MODEM_SAG5_V` / `MODEM_SAGB_V` para 0.5.10 (auto-reset en 24 V; reset condicional al volver el 5 V). +## 1. Cargador (0.6.0) -!!! success "Resultado 26-sep: hipótesis A confirmada — y cerrada (procedimiento de 0.5.8, retirado)" - Con 0.5.7 en batería **ningún** encendido de etapa arrancó el módem (`P`, despertar, reset por `R`/P10); con 24 V todos; - y `SW4G1` con la etapa ya encendida sí. Es el riel del boost (4.6 V en `SW_IN`) hundido por la ráfaga de arranque del módem: - el buck de `3V3_MODEM` (mínimo 4.5 V) cae y el PMIC del módem aborta sin reintentar. **No tiene arreglo por firmware en V5.5/V4.** - Por eso **0.5.8 CAMPO no apaga el módem en batería** (respaldo continuo con ahorro: ráfaga de posición cada 10 min, `$PHLG` - cada 3 min). **Prueba de aceptación de 0.5.8** (misma unidad, consola abierta, [acta](../formularios/prueba-bateria.html)): +Misma unidad, paquete bajo, antes de la corrida en batería. +1. 24 V + etapa ON, consola abierta. Los primeros 120 s `STAT` dice `carga=HOLDOFF`; luego `carga=PROVING n/30s` y a los ~150 s `EVT CARGA ON: riel 5.xx V estable 30 s`. Siguiente `STAT`: `ltc=CARGANDO`; el monitor muestra 🔌 CARGANDO. +2. Multímetro en P2 durante 10 min; anota el mínimo. Si el riel baja de 4.90 V en una ráfaga LTE: `CARGA cortada … enfriamiento 60 s`, `carga=COOLDOWN faltan Ns`, y reintenta. Anota `cortes=` a la hora y `vbat` inicial y final (debe subir). Enfriamientos que llegan a 30 min: la fuente no da 2.4 A + etapa; V5.6 o fuente de 4 A. +3. Quita 24 V: `carga=BATT`, `CARGA OFF: BATT` (nunca carga en batería). Al volver 24 V: reset y a los ~150 s carga otra vez. + +## 2. Aceptación (0.5.9 y 0.6.0) + +Misma unidad, consola abierta. + +1. 24 V + ignición, módem registrado, RTK fix, 5 min. De 3–4 `STAT` anota `sag5=` (nivel "vivo en 24 V"), `rtcm_age=` (pocos s) y `sta=`. +2. Quita 24 V, 20 min. Anota `sagb=` de 3–4 `STAT` ("vivo en batería"). Esperado: `modem=vivo`, LEDs del módem encendidos, ninguna línea `RECOVERY`, el monitor ve la unidad con `pwr=BATT`. +3. Mata el módem a propósito en batería: `P` (etapa OFF) y `P` + `Y` (ON desde batería) → F9P vivo, módem oscuro. En 3 min: `rtcm=none`, `sagb` al piso, `flat` sube y a las 4 ventanas `EVT MODEM SOSPECHOSO` + `$PHEV MODEM_DARK`. Anota `sagb` de esas ventanas. +4. Vuelve 24 V: `5 V de vuelta … reset del MCU`, etapa ON a los ~3 s, el módem enciende; a los 2 min `modem=vivo`. +5. Noche completa en batería desde 24 V, sin tocar. En la mañana: módem vivo antes de volver 24 V y hora del corte de 3.40 V (`SLEEP`) si llegó: autonomía real. + +Con `sag5`/`sagb` de 1–3 se fijan `MODEM_SAG5_V` / `MODEM_SAGB_V` para 0.5.10 (auto-reset en 24 V; reset condicional al volver el 5 V). + +## 3. Hallazgos 25–27 sep + +- 26-sep (0.5.7), hipótesis A confirmada: en batería ningún encendido de etapa arrancó el módem (`P`, despertar, reset por `R`/P10); con 24 V todos; `SW4G1` con la etapa encendida sí. El boost (4.6 V en `SW_IN`) se hunde con la ráfaga de arranque del módem, el buck de `3V3_MODEM` (mínimo 4.5 V) cae y el PMIC del módem aborta sin reintentar. No tiene arreglo por firmware en V5.5/V4; se corrige en V5.6. Por eso el firmware de campo no apaga el módem en batería. +- Noche 26/27-sep (0.5.8): al amanecer `vbat` 3.50 V, F9P vivo, módem oscuro, LEDs de carga apagados. Al volver 24 V el módem siguió oscuro; solo SW1/P10 o `SW4G1` lo levantaron. Causa probable: el recovery de enlace seguía armado en batería; sin GGA en el silencio del ahorro, "RTK perdido 15 min" disparó un ciclo de etapa en batería (buscar `RECOVERY` / `rec=1` en la captura o `$PHEV RECOVERY` en el servidor). 0.5.8 retirada; 0.5.9 no cicla en batería, resetea al volver el 5 V tras ≥ 10 s de respaldo, corre continuo y vigila el módem. + +??? note "Aceptación de 0.5.8 (retirada)" 1. 24 V + ignición: etapa ON a los ~3 s, módem registra, `MODOB ON` (clic de K1 ~13 s), el monitor ve la unidad con fix. - 2. Quitar 24 V (dejar la batería): `V5 PERDIDO` → `BACKUP inicio` → `AHORRO en bateria`. **El módem sigue con sus LEDs encendidos.** - A los ~8 s: `AHORRO: rafaga #1 enviada … silencio 592 s`. En el monitor: badge de batería «~10 min», sin alarma. - 3. Esperar 10 min: `AHORRO: rafaga #2` y la posición llega al monitor (el módem seguía registrado; no hubo encendido nuevo). - Entre ráfagas, a los 3 y 6 min, un `$PHLG` (el monitor sigue viendo salud). Anotar `vbat` de cada `STAT`. - 4. Volver los 24 V con el módem vivo: `V5 PRESENTE` → `BACKUP fin` → `AHORRO fin`. **Sin reset** (la etapa venía encendida desde 24 V). - 5. Caso reset: con 24 V quitados, pulsar P10 (o `R`): la etapa **no** se reenciende en batería (por diseño). Volver los 24 V: - reset del MCU (`5 V de vuelta con etapa apagada`) y a los ~4 s arranca todo, módem incluido. - 6. Soak opcional hasta el corte de 3.40 V (`SLEEP`): anotar la hora de inicio y de corte → autonomía real (estimada 30–35 h). + 2. Quitar 24 V con batería: `V5 PERDIDO` → `BACKUP inicio` → `AHORRO en bateria`; el módem sigue encendido. A los ~8 s `AHORRO: rafaga #1 enviada … silencio 592 s`; en el monitor, badge de batería "~10 min" sin alarma. + 3. A los 10 min `AHORRO: rafaga #2` y la posición llega al monitor. A los 3 y 6 min, un `$PHLG`. Anotar `vbat` de cada `STAT`. + 4. Volver 24 V con el módem vivo: `V5 PRESENTE` → `BACKUP fin` → `AHORRO fin`, sin reset. + 5. Sin 24 V, pulsar P10 (o `R`): la etapa no se reenciende en batería. Al volver 24 V: reset (`5 V de vuelta con etapa apagada`) y a los ~4 s arranca todo. + 6. Opcional hasta el corte de 3.40 V (`SLEEP`): autonomía real (estimada 30–35 h). - Lo que sigue abajo es el procedimiento original de 0.5.7 (diagnóstico); se conserva por trazabilidad. +## 4. Corridas de diagnóstico (0.5.3–0.5.7) -**Versión:** 1.0 · 26-sep-2026 · **Para:** laboratorio QRO · **Dura:** ~45 min por unidad · **Registro:** [**▶ acta de esta prueba**](../formularios/prueba-bateria.html) — trae las tres tablas para llenar en el teléfono o la laptop, y ahí se adjunta la captura de consola. +Con estas corridas se separaron las hipótesis A y B. Siguen siendo la forma de medir los rieles en batería en cualquier tarjeta. -!!! warning "¿Es una tarjeta V4? Usa su procedimiento y su acta" - En la V4 el USB de la Blackpill está unido al riel de 5 V de la tarjeta: con un cable normal la laptop alimenta la - tarjeta y la prueba en batería no vale. Para una V4 sigue [V4 — preparación y prueba con 0.5.6](v4-prueba-fw-0.5.6.md) - (puente, interruptores del simpleRTK2B, cable de consola sin 5 V) y regístrala en el [acta de prueba V4](../formularios/v4.html). +Síntoma original (0.5.3, ventana de 2 min cada 10 min): en batería la etapa enciende pero el módem nunca transmite; los LEDs UART del simpleRTK2B parpadean lento (~1/s, solo GGA saliendo) en lugar de rápido, justo después del clic de K1. -## Qué se está buscando - -Con 24 V la unidad funciona bien: módem registrado, LEDs UART del simpleRTK2B en **parpadeo rápido** -(correcciones RTCM entrando + NMEA saliendo), se oye el **clic de K1** a los ~13 s y el monitor la ve. - -En batería (0.5.3: ventana de 2 min cada 10 min) la unidad enciende la etapa, pero **el módem nunca llega a -transmitir**: los LEDs UART del simpleRTK2B parpadean **lento, ~1 por segundo** (solo la GGA saliendo, sin -correcciones) y el servidor no recibe nada. Se observó que el cambio ocurre **justo después del clic de K1**. - -Hay dos explicaciones posibles y esta prueba las separa: - -| Hipótesis | Qué la delataría | +| Hipótesis | La delata | |---|---| -| **A · El riel se hunde.** En batería el módem cuelga del boost del LTC4040 (~4.79 V en MAIN5V), no de los 5.2–5.4 V del SD-15B. La ráfaga de registro LTE (~2 A) hunde el riel, el módem se reinicia y nunca termina de registrarse. | MAIN5V o SW_5V caen por debajo de ~4.4 V mientras el módem intenta registrarse; sus LEDs se apagan y reencienden. Falla **igual** con Modo B bloqueado. | -| **B · El camino por K1.** Con K1 conmutado (Modo B) la GGA llega al módem a través del MCU; si en batería esa ruta no entrega bien, el módem no manda GGA al caster y no recibe correcciones. | Con Modo B **bloqueado** (tecla `B`) el módem sí registra y aparecen las correcciones (parpadeo rápido). Los rieles se mantienen. | +| A · Riel hundido. En batería el módem cuelga del boost del LTC4040 (~4.79 V en MAIN5V), no de los 5.2–5.4 V del SD-15B; la ráfaga LTE (~2 A) lo hunde y el módem se reinicia | MAIN5V o SW_5V bajo ~4.4 V mientras registra; LEDs del módem se apagan y vuelven. Falla igual con Modo B bloqueado | +| B · Camino por K1. Con Modo B la GGA pasa por el MCU; si en batería no llega, no hay correcciones | Con Modo B bloqueado (`B`) el módem registra y hay parpadeo rápido; los rieles aguantan | -!!! note "El firmware no ve el riel de la batería" - `v5`/`v5min` de la consola y del `$PHLG` miden el **5 V del vehículo** (P2), no el riel del boost. En batería - leen ~0 y no dicen nada. Por eso **hay que medir con el multímetro**: la prueba no vale sin las lecturas. +`v5`/`v5min` miden el 5 V del vehículo (P2), no el boost: en batería leen ~0. Sin lecturas de multímetro la prueba no vale. -## Material +Montaje: unidad completa con batería, antenas y cielo; 24 V al GX16 (o P2); consola en el USB del HBOX (115200, CR+LF) grabando toda la sesión; multímetros en MAIN5V (U6 pin 1 / C32 / P11 pin 1), SW_5V (MOD1 pin 5 / C3) y 3V3_MODEM (J7 pin 1 / J8 pin 7), negro a GND; osciloscopio en 3V3_MODEM a 5 s/div si hay; monitor abierto; cronómetro. Teclas: `s` STAT · `v` puntos de medición · `B` Modo B permitido/bloqueado · `l` leyenda. -- La unidad completa (tarjeta V5 o V4 con **0.5.3**, simpleRTK2B, módem 4G con SIM, **batería conectada**), - antenas GNSS y LTE conectadas, antena GNSS con cielo (aunque sea ventana). -- Fuente de 24 V al GX16 (o al P2 según cómo esté armada la unidad). Un interruptor o simplemente desconectar. -- Laptop con terminal serie en el **USB del HBOX** (115200, CR+LF) **grabando a archivo** toda la sesión. -- **Multímetros** (dos, o uno y paciencia) en tres puntos: **MAIN5V** (U6 pin 1 / C32 — o P11 pin 1, que es lo mismo), - **SW_5V** (MOD1 pin 5 / C3) y, el que más importa, **3V3_MODEM** (zócalo XBee pin 1 = J7 pin 1 / J8 pin 7): es el que - alimenta al módem. Negro a GND. Si hay osciloscopio, mejor en 3V3_MODEM con 5 s/div. -- El monitor abierto en otra pantalla con la unidad ubicada. -- Cronómetro (el del teléfono). +### Corrida 0 — referencia con 24 V (5 min) -Teclas de consola que se usan: `s` = STAT ahora · `v` = puntos de medición · `B` = Modo B permitido/bloqueado · `l` = leyenda. +1. 24 V, consola grabando. Espera `STACK ON` y `MODOB ON` (~13 s, clic). +2. Anota LEDs del módem (cuál, color, ritmo), LEDs UART del simpleRTK2B (rápido), MAIN5V ≈ 5.2–5.4 V, SW_5V ≈ 5.0 V, y la unidad en el monitor con Salud y ⚡. +3. `s` y copia la línea `STAT`. -## Corrida 0 — referencia con 24 V (5 min) +Si la corrida 0 no sale limpia, detente: el problema no es la batería. -1. 24 V puesto, consola grabando. Esperar a `EVT … STACK ON`, luego a `MODOB ON` (~13 s; se oye el clic). -2. Anotar en la tabla: patrón de LEDs del módem (describir: cuál LED, color, rápido/lento/fijo), LEDs UART del - simpleRTK2B (**rápido** esperado), MAIN5V y SW_5V (esperado ≈ 5.2–5.4 V y ≈ 5.0 V), y que el monitor muestre la - unidad con Salud (`$PHLG`) y ⚡. -3. Teclear `s` y copiar la línea `STAT`. +### Corrida 0-bis — reset por software -Si la corrida 0 no sale limpia, **detenerse**: el problema no es la batería. +Con el módem oscuro en 24 V, tecla `R`. Si enciende igual que con P10, sigue con 1 y 4: en cada ventana debe verse `reset=SOFT` y `BACKUP tras reset SOFT … ventana AHORA`, y el módem encender solo. Si `R` no lo enciende, pasa al puente (abajo). -## Corrida 1 — batería con Modo B (la falla) (25 min) +### Corrida 1 — batería con Modo B (25 min) -1. Con todo funcionando, **quitar los 24 V** y arrancar el cronómetro. Consola: `V5 PERDIDO` → `BACKUP inicio … modo - reporte cada 10 min`. La etapa **sigue encendida** (esta primera ventana arranca con el módem ya registrado, así - que todavía transmite — no es la que interesa). -2. A los ~2 min: `DUTY reposo … etapa OFF`. Verificar con el multímetro que **SW_5V = 0 V** y que el módem **se apagó** - (LEDs apagados). Si el módem sigue encendido con SW_5V = 0, anotar y **avisar**: algo lo alimenta por otro lado - (¿USB conectado al simpleRTK2B o al módem?). -3. Esperar el despertar: `DUTY despertar #1 … etapa ON` a los ~10 min del paso 1. **Aquí empieza lo importante.** - Desde ese instante, durante los 2 minutos, registrar cada 15 s en la tabla: - - MAIN5V y SW_5V (el valor **más bajo** que se vea; los multímetros baratos promedian — anotar el mínimo que alcancen a leer), - - LEDs del módem (¿se apagan y reencienden? ¿llegan a parpadeo lento/fijo de "registrado"?), - - LEDs UART del simpleRTK2B (lento 1/s = sin correcciones · rápido = con correcciones), - - momento del **clic de K1** (consola: `MODOB ON`), - - línea `STAT` (teclear `s` a los 30 s y a los 90 s; interesan `vbat` y `vbatmin`). -4. En el monitor: ¿la unidad recibió algo en esa ventana? (fila actualizada, `$PHLG` con 🔋, o nada). -5. Dejar que cierre la ventana (`DUTY reposo`) y **no tocar**: se necesita una segunda ventana para la corrida 2. +1. Quita 24 V y arranca el cronómetro: `V5 PERDIDO` → `BACKUP inicio … modo reporte cada 10 min`. Esta primera ventana arranca con el módem registrado; no es la que interesa. +2. A los ~2 min, `DUTY reposo … etapa OFF`: SW_5V = 0 V y módem apagado. Si el módem sigue encendido con SW_5V = 0, anota y avisa (¿USB conectado al simpleRTK2B o al módem?). +3. `DUTY despertar #1 … etapa ON` a los ~10 min. Durante los 2 min, cada 15 s: mínimo de MAIN5V y SW_5V, LEDs del módem, LEDs UART del simpleRTK2B, momento del clic de K1 (`MODOB ON`), y `s` a los 30 y 90 s (`vbat`, `vbatmin`). +4. En el monitor: ¿llegó algo en esa ventana? +5. Deja cerrar la ventana sin tocar. -## Corrida 2 — batería SIN Modo B (25 min) +### Corrida 2 — batería sin Modo B (25 min) -1. Mientras la unidad está en reposo (etapa OFF), teclear `B` en la consola → debe responder `MODO B BLOQUEADO por - operador`. Ahora al despertar K1 **no** conmuta: el F9P habla directo con el módem. -2. Esperar `DUTY despertar #2` y repetir **exactamente** el registro del paso 3 de la corrida 1. -3. Resultado: - - **Si ahora el módem registra y el simpleRTK2B parpadea rápido** → hipótesis **B** (camino por K1). Anotarlo y - dejar la unidad así; ingeniería revisa el firmware. - - **Si sigue igual que en la corrida 1** → hipótesis **A** (riel). Seguir a la corrida 3. -4. Teclear `B` otra vez para dejar Modo B permitido. +1. En reposo, `B` → `MODO B BLOQUEADO por operador` (K1 no conmuta). +2. En `DUTY despertar #2` repite el registro de la corrida 1. +3. Módem registra y parpadeo rápido: hipótesis B; deja la unidad así y avisa a ingeniería. Igual que la corrida 1: hipótesis A, sigue a la 3. +4. `B` otra vez para permitir Modo B. -## Corrida 3 — solo si la 2 dio "A": ¿es la batería o es el boost? (20 min) +### Corrida 3 — batería o boost (20 min, solo si dio A) -1. 24 V puesto, etapa apagada (`P` la apaga si está encendida, o simplemente esperar el reposo). **Desconectar la batería** de su - conector y conectar en su lugar una **fuente de banco a 3.9 V con límite de 3 A** (respetar polaridad; medir antes de - conectar). -2. Repetir la corrida 1 (quitar 24 V, esperar el despertar, registrar los 2 min). -3. Resultado: - - **Funciona con la fuente** → el problema es el **paquete** (resistencia interna alta: celda caliente, vieja o descargada). - Anotar el voltaje de la batería en vacío y la temperatura que reporte `STAT` (`tbat`). - - **Falla igual** → el problema es la **etapa de boost** (LTC4040 / capacitancia en MAIN5V). Es hardware; no cambiar nada, - reportar las lecturas. +1. Con 24 V y etapa apagada, desconecta la batería y pon en su lugar una fuente a 3.9 V, límite 3 A (mide polaridad antes). +2. Repite la corrida 1. +3. Funciona con la fuente: el paquete tiene resistencia interna alta (caliente, viejo o descargado); anota su voltaje en vacío y `tbat`. Falla igual: boost (LTC4040 / capacitancia en MAIN5V); reporta las lecturas sin cambiar nada. -## Corrida 4 — regreso de los 24 V sin reset (5 min) +### Corrida 4 — regreso de 24 V (5 min) -Observado el 25-sep: con la unidad en batería y el módem oscuro, al volver los 24 V el simpleRTK2B revive pero el -módem **sigue oscuro hasta un reset de la tarjeta**. Medir **3V3_MODEM** en ese estado: si marca ~3.3 V con el módem -apagado, el módem está en *latch* por subvoltaje (no rearranca hasta que se le quita la alimentación). La causa (26-sep): con la etapa OFF el MCU seguía -sosteniendo el riel del módem por el UART del GNSS (PA2 → simpleRTK2B → DIN_4G), así que el módem nunca veía un -power-on reset. **0.5.5** puso ese UART en alta impedancia y cicla la etapa 10 s al volver el 5 V — **no bastó**: en reposo -`3V3_MODEM` sigue en ~1 V (C43+, 26-sep), el módem no ve un apagado real y no rearranca. +25-sep: en batería con el módem oscuro, al volver 24 V el simpleRTK2B revive y el módem sigue oscuro hasta un reset. Mide 3V3_MODEM: ~3.3 V con el módem apagado = latch por subvoltaje. Causa (26-sep): con la etapa OFF el MCU sostenía el riel del módem por el UART del GNSS (PA2 → simpleRTK2B → DIN_4G). 0.5.5 dejó ese UART en alta impedancia y cicla la etapa 10 s al volver el 5 V; no bastó (3V3_MODEM en reposo ~1 V en C43+). Lo revive un pulso en `SW4G1` o un reset por P10 con 24 V; un ciclo de etapa (`P`/`P`+`Y`, 5–60 s) nunca. Por eso 0.5.7 resetea el MCU en cada despertar y al volver el 5 V. -**Lo que sí lo revive (confirmado 26-sep): un pulso en `SW4G1`** y también **un reset del MCU por P10 con 24 V** — -mientras que un ciclo de etapa desde el firmware (`P`/`P`+`Y`, 5–60 s) nunca lo enciende. Por eso **0.5.7** hace en cada -despertar de batería y en cada regreso del 5 V un reset del MCU (arranca en ~4 s, ventana de inmediato). - -**Corrida 0-bis (antes de la corrida 1):** con el módem oscuro en 24 V, tecla **`R`** (reset por software). Si el módem -enciende igual que con P10 → seguir con las corridas 1 y 4: en cada ventana debe verse el banner de arranque con -`reset=SOFT` y `BACKUP tras reset SOFT … ventana AHORA`, y el módem encender solo. Si `R` **no** lo enciende, el reset por -pin hace algo que el reset por software no hace: se pasa al puente. - -**Respaldo — el puente (0.5.6+, sigue en el firmware):** 3 s después de cada encendido de etapa el MCU pulsa el reset del -módem por el pin libre P7 de `U13` (PCF8574). Eso necesita un **puente en la tarjeta**: +Puente (0.5.6+, sigue en el firmware): 3 s después de cada encendido de etapa el MCU pulsa el reset del módem por U13 P7. ``` U13 pin 12 (P7) ──|<── SW4G1 pad 1 (MODEM_RST) diodo Schottky de señal BAT54 (o BAT85/BAT43/1N5711) — no 1N5819 cátodo ánodo ``` -1. Con la etapa ON, teclear **`M`**: el multímetro en `SW4G1` pad 1 debe caer a < 0.4 V durante 0.5 s y los LEDs del - módem apagar y volver. Si no, el puente no está. -2. Repetir la **corrida 1** (batería) y la **corrida 4** (regreso de 24 V sin reset): en cada ventana debe verse - `EVT … MODEM_RST stack_on` a los 3 s y el módem registrar solo. -3. En reposo, anotar además **`SW_5V` en C3(+)** (no en Q1) y si el LED POWER del simpleRTK2B está encendido; y confirmar - que **no hay cable en el USB-C J9** (es el USB del módem: su VBUS llega al módulo). Eso dice quién sostiene el ~1 V. +1. Etapa ON, tecla `M`: `SW4G1` pad 1 cae a < 0.4 V durante 0.5 s y los LEDs del módem se apagan y vuelven. Si no, falta el puente. +2. Repite las corridas 1 y 4: en cada ventana `EVT … MODEM_RST stack_on` a los 3 s y el módem registra solo. +3. En reposo anota SW_5V en C3(+) (no en Q1) y si el LED POWER del simpleRTK2B enciende. Confirma que no hay cable en J9 (USB del módem; su VBUS llega al módulo). -## Registro +### Registro -Todo se llena en el **[acta de la prueba](../formularios/prueba-bateria.html)**: configuración, corrida 0, la tabla de -2 minutos de cada despertar (una por corrida), el resultado A/B y el archivo completo de la consola. Queda en el -expediente de la unidad. Si no hay señal en el laboratorio, la misma tabla en papel y se captura después: +Todo va en el [acta de la prueba](../formularios/prueba-bateria.html): configuración, corrida 0, la tabla de 2 min de cada despertar, resultado A/B y log completo. Sin señal en el laboratorio, en papel: -| t | MAIN5V (mín) | SW_5V (mín) | 3V3_MODEM (mín) | LEDs módem | LEDs UART simpleRTK2B | K1 | `vbat` / `vbatmin` | ¿Servidor recibió? | +| t | MAIN5V (mín) | SW_5V (mín) | 3V3_MODEM (mín) | LEDs módem | LEDs UART simpleRTK2B | K1 | `vbat` / `vbatmin` | ¿Llegó al servidor? | |---|---|---|---|---|---|---|---|---| | 0:15 | | | | | | | | | | 0:30 | | | | | | | | | @@ -185,6 +127,12 @@ expediente de la unidad. Si no hay señal en el laboratorio, la misma tabla en p | 1:30 | | | | | | | | | | 2:00 | | | | | | | | | -!!! danger "Lo que NO se hace" - No cambiar el firmware, no mover puentes (JP2/JP3/JP4), no tocar el trimmer del SD-15B. La prueba sirve porque - la unidad está **como en campo**. Y nunca conectar la fuente de banco a la batería con la batería puesta. +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.1 | 2026-09-27 | Resultado 26-sep (hipótesis A), aceptación 0.5.8 → 0.5.9 y prueba del cargador 0.6.0. | +| 1.2 | 2026-09-29 | Reordenado: estado actual primero. | +| 1.3 | 2026-09-29 | Edición breve; los hallazgos 26/27-sep viven aquí (Descargas solo los resume). | + +Versiones anteriores en git. diff --git a/docs/procedimientos/reflasheo-unidades.md b/docs/procedimientos/reflasheo-unidades.md index 9cbe382..bb7b5ba 100644 --- a/docs/procedimientos/reflasheo-unidades.md +++ b/docs/procedimientos/reflasheo-unidades.md @@ -1,127 +1,80 @@ -# Reflasheo de unidades HBOX — solo en taller - -**Para:** Alan y Daniel (ejecución) · ingeniería (generación del binario) -**Versión:** 1.0 · 18-sep-2026 · **Responsable:** Leo Rodríguez - +--- +title: "Reflasheo de unidades HBOX — solo en taller" +tags: [project-drogheda, hbox, procedimiento, reflasheo, firmware, dfu, v3, v4, v5] +date: 2026-09-18 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 --- -## 1. Cuándo se reflashea y cuándo no +# Reflasheo de unidades HBOX — solo en taller -Reflashear es una **prueba diagnóstica**, no una reparación: sirve para contestar *«¿el problema -desaparece con firmware nuevo?»*. Si la unidad tiene un corto, un conector roto o una batería -hinchada, el firmware no va a arreglar nada. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de taller (Alan y Daniel); §5 es para ingeniería. + - Cuándo: unidad V3, V4 o V5.5 después del [diagnóstico en banco](diagnostico-banco.md), con las capturas ya subidas al acta. + - Tiempo: 20 min de flasheo + 10 min de verificación. + - Necesitas: laptop con STM32CubeProgrammer o `dfu-util`, cable USB con datos, el `.bin` de la tarjeta desde [Descargas](../descargas/index.md) con SHA-256 verificado, unidad en la mesa alimentada solo por USB, [acta de reflasheo](../formularios/reflasheo.html). -!!! danger "Dos reglas que no se rompen" - **1 · Solo en taller, nunca sobre la máquina.** Un flasheo interrumpido deja la unidad muerta. - Si eso pasa en la mesa, se vuelve a intentar; si pasa arriba de un RTG, hay que bajarla otra vez. +Reflashear es una prueba diagnóstica ("¿desaparece la falla con firmware nuevo?"), no una reparación. Un corto, un conector roto o una batería hinchada no se arreglan con firmware. - **2 · Primero la evidencia, después el flasheo.** El flasheo borra la memoria del equipo - (temperatura máxima, recuperaciones, causa del último arranque) y sustituye el firmware que - estaba fallando. **Haz y sube las capturas del diagnóstico antes de tocar el botón.** El acta de - banco bloquea este paso hasta que el archivo de captura esté subido. +!!! warning "Reglas" + 1. Solo en taller, nunca sobre la máquina. Un flasheo interrumpido deja la unidad muerta; en la mesa se reintenta, arriba de un RTG hay que bajarla otra vez. + 2. Primero la evidencia. El flasheo borra la memoria del equipo (temperatura máxima, recuperaciones, causa del último arranque). Sube las capturas del diagnóstico antes; el acta de banco bloquea este paso hasta que estén. + 3. Un binario por tarjeta ([tabla y reglas en Descargas](../descargas/index.md#firmware-del-hbox-que-binario-va-en-que-tarjeta)). Si no encuentras el `.bin` correcto, pregunta a ingeniería. -| Situación | ¿Reflashear? | +## 1. Cuándo sí y cuándo no + +| Situación | Reflashear | |---|---| -| Ya hiciste el diagnóstico y las capturas están subidas | **Sí** | -| La unidad tiene corto, humedad o daño visible | No — enviar a Querétaro | +| Diagnóstico hecho y capturas subidas | Sí | +| Corto, humedad o daño visible | No: a Querétaro | | No sabes qué firmware trae | Primero anótalo (línea `BOOT` de la captura) | -| La unidad está instalada en la máquina | **No.** Se desmonta primero | -| No encuentras el `.bin` correcto en Descargas | No inventes: pregunta a ingeniería | +| Unidad instalada en la máquina | No: se desmonta primero | +| El binario de esa tarjeta dice "pendiente" en Descargas | No: flasheo detenido hasta que ingeniería lo publique (§5) | -## 2. Qué binario le toca a cada unidad +## 2. Flasheo -Los binarios viven en **[Descargas](../descargas/index.md)**, con su versión y su SHA256. Cada -generación de tarjeta tiene el suyo y **no son intercambiables**: la polaridad del control de carga -está invertida entre generaciones, así que un binario equivocado puede dejar la batería cargando -cuando debería estar cortada. +1. Anota el firmware que traía (línea `BOOT,…,fw=3.0.3,…` de la captura) en el acta. Sin ese dato el reflasheo no sirve como prueba. +2. Verifica el SHA-256 del `.bin` ([cómo](../descargas/index.md#verifica-el-sha-256)). +3. USB del Blackpill (o J11 en V5) a la laptop. +4. Modo DFU: mantén BOOT0, pulsa y suelta RESET (NRST), suelta BOOT0. Debe aparecer `STM32 BOOTLOADER` (`0483:DF11`). Si no, repite; si sigue sin salir, cambia el cable (muchos son solo de carga) o el MCU no arranca. +5. Graba en `0x08000000`: STM32CubeProgrammer (USB/DFU → Open file → Download) o `dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV3_X.Y.Z.bin`. +6. Espera "Download complete" y "Verify successful". Si falla a la mitad, no desconectes: repite 4 y 5. +7. Pulsa RESET. -| Generación de tarjeta | Binario | Estado | -|---|---|---| -| **V3** — EinarBoard 1.0 (RTK-003, RTK-006, RTK-014), Blackpill | `hbox-tarjetaV3_4.0.0.bin` | ⚠ publicado, sin prueba de banco | -| **V4** — Blackpill + PCF8574/W5500/SC16IS752 | `hbox-tarjetaV4_0.6.0.bin` | ⚠ publicado, sin prueba de banco (mismo código que V5 + `board_v4.h`); 0.6.0 CAMPO = 0.5.9 + gobernador de carga; puente U13-P7 → SW4G1 opcional | -| **V5** — MCU soldado, lote de 15 | `hbox-v5-bringup_0.6.0.bin` | ⚠ vigente 27-sep (0.6.0 CAMPO: cargador con gobernador; el módem no se apaga en batería, sin ciclos de etapa en batería, reset al volver el 5 V; ver [Descargas](../descargas/index.md)) | +## 3. Verificación -Si el renglón dice *pendiente*, **no hay binario aprobado todavía**: el flasheo de esa generación -está detenido hasta que ingeniería lo publique (§6). +1. Puerto serie a 115200 grabando a archivo; pulsa RESET y captura el arranque. +2. Comprueba: + - [ ] Línea `BOOT` con la versión nueva en `fw=`. + - [ ] El LED parpadea (no apagado ni en parpadeo rápido permanente). + - [ ] Salen líneas `TLM,` cada pocos segundos. + - [ ] Ningún `EVT` de falla repitiéndose. +3. Deja correr 10 min con antenas: `state` llega a `RUN` y `link` sale de `SRCH`. +4. Sube esta captura al [acta de reflasheo](../formularios/reflasheo.html) junto con la de antes. -## 3. Qué necesitas - -- Laptop con **STM32CubeProgrammer** (o `dfu-util`). -- Cable **USB con datos** (muchos cables de carga no llevan datos — si la laptop no ve nada, prueba otro). -- El `.bin` descargado del sitio, con su SHA256 verificado. -- La unidad **en la mesa**, energizada solo por el USB. - -Verifica el archivo antes de flashear: - -```bash -# macOS / Linux -shasum -a 256 hbox-tarjetaV3_X.Y.Z.bin -# Windows (PowerShell) -Get-FileHash .\hbox-tarjetaV3_X.Y.Z.bin -Algorithm SHA256 -``` - -Debe coincidir **carácter por carácter** con el que publica `SHA256SUMS.txt`. Si no coincide, -descárgalo otra vez; si sigue sin coincidir, no lo uses y avisa. - -## 4. El flasheo, paso a paso - -1. **Anota el firmware que traía.** De la captura del diagnóstico, la línea `BOOT,…,fw=3.0.3,…`. - Va en el acta. Sin este dato el reflasheo no sirve como prueba. -2. Conecta el **USB del Blackpill** a la laptop. -3. **Entra a modo DFU:** - - Mantén presionado **BOOT0**. - - Presiona y suelta **RESET (NRST)**. - - Suelta **BOOT0**. - - En la laptop debe aparecer **«STM32 BOOTLOADER»** (identificador `0483:DF11`). - Si no aparece: repite la secuencia; si sigue sin salir, el cable no lleva datos o el MCU no arranca. -4. **Graba el binario** en la dirección **`0x08000000`**: - - *STM32CubeProgrammer* → conectar en **USB/DFU** → *Open file* → *Download*. - - o bien: `dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV3_X.Y.Z.bin` -5. Espera a **«Download complete»** y **«Verify successful»**. Si falla a la mitad, **no desconectes**: - repite el paso 3 y vuelve a grabar. -6. Presiona **RESET**. - -## 5. Verificación — el flasheo no termina hasta aquí - -1. Abre el puerto serie a **115200 baudios**, con **guardar a archivo**. -2. Presiona RESET otra vez y captura el arranque. -3. Comprueba: - -- [ ] Aparece la línea `BOOT` con la **versión nueva** en `fw=`. -- [ ] El LED vuelve a parpadear (no se queda apagado ni en parpadeo rápido permanente). -- [ ] Empiezan a salir líneas `TLM,` cada pocos segundos. -- [ ] Ningún `EVT` de falla repitiéndose sin parar. - -4. Deja correr **10 minutos** con antenas conectadas y vuelve a mirar: `state` debe llegar a `RUN`, - y `link` debe salir de `SRCH`. -5. **Sube esta captura al acta**, junto con la de antes del flasheo. Las dos juntas son la prueba de - si el firmware cambió algo. - -| Resultado | Qué sigue | +| Resultado | Siguiente | |---|---| -| Arranca y se estabiliza en `RUN` | Candidata a reinstalar — coordina con ICAVE | -| Arranca pero repite la misma falla | El firmware no era la causa → enviar a Querétaro | -| Ya no arranca después del flasheo | Repite DFU con otro cable; si sigue, enviar a Querétaro | +| Arranca y queda en `RUN` | Candidata a reinstalar; coordina con ICAVE | +| Repite la misma falla | El firmware no era la causa: a Querétaro | +| Ya no arranca | Repite DFU con otro cable; si sigue, a Querétaro | -## 6. Para ingeniería — cómo se genera el binario +## 4. V5 y V4 -*(Esta sección no es para el técnico: es para quien publica el `.bin`.)* +Mismo DFU. V5: por J11 ([flasheo V5 §5](v5-prueba-y-flasheo.md#5-flasheo-por-usb-dfu-j11-5-min)). V4: solo con USB, sin 24 V y sin batería ([procedimiento V4](v4-prueba-fw-0.5.6.md)). -Hoy el repositorio **no contiene binarios compilados de V3 ni de V4**. Los `.bin` están en -`.gitignore` a propósito. Y hay una diferencia importante entre las dos generaciones: +## 5. Para ingeniería — generar y publicar un binario -| Generación | Código fuente | Qué falta | +El repositorio no contiene binarios compilados de V3 ni V4 (`.bin` en `.gitignore`). + +| Tarjeta | Código fuente | Falta | |---|---|---| -| **V3** | ✅ `04-Source-Code/firmware/blackpillrtkcode_v4/` (4.0.0): la lógica de v3.0.3 + telemetría en banda | Probarlo en banco (RTK-003 / RTK-006) | -| **V4** | ✅ `hbox_v5_bringup/` (0.5.1) + `board_v4.h` — la V4 es la V5 en un Blackpill | Compilar para Blackpill y probarlo en banco | +| V3 | `04-Source-Code/firmware/blackpillrtkcode_v4/` (4.0.0): lógica de v3.0.3 + telemetría en banda | Prueba de banco (RTK-003 / RTK-006) | +| V4 | `hbox_v5_bringup/` + `board_v4.h` (la V4 es la V5 en un Blackpill) | Prueba de banco | -Un binario por tarjeta. `blackpillrtkcode_v3` (3.0.4) queda solo como referencia: es la lógica que corre hoy en campo pero sin telemetría en banda, así que el monitor no la ve. +`blackpillrtkcode_v3` (3.0.4) queda como referencia: es la lógica de campo sin telemetría en banda. V3 solo usa `` y ``: basta el core STM32. -El buen dato es que V3 no depende de ninguna librería externa — solo `` y `` — -así que basta el core de STM32. - -Compilación reproducible con `arduino-cli` (verifica el FQBN contra tu instalación del core -STM32duino antes de darlo por bueno): +Compilación con `arduino-cli` (verifica el FQBN contra tu core STM32duino): ```bash # 1. toolchain (una sola vez) @@ -155,23 +108,27 @@ mv release/hbox_v5_bringup.ino.bin release/hbox-tarjetaV4_0.6.0.bin shasum -a 256 release/hbox-tarjetaV4_0.6.0.bin | tee -a release/SHA256SUMS ``` -**El destino de tarjeta ya viene bien por omisión:** el propio `.ino` trae `TARGET_EINARBOARD 1` y -`TARGET_PROTO 0`, que es lo correcto para la flota desplegada — las unidades de campo son -**EinarBoard 1.0** corriendo v2/v3 (así lo dice el `V4-PLAN.md`). Solo habría que tocarlo si vas a -flashear una tarjeta de protoboard, y en ese caso se edita el `.ino`, no se pasa por la línea de -comandos. +El `.ino` trae por omisión `TARGET_EINARBOARD 1` y `TARGET_PROTO 0`, correcto para la flota (EinarBoard 1.0 con v2/v3, según `V4-PLAN.md`). Solo se cambia, editando el `.ino`, para una tarjeta de protoboard. -!!! warning "El flag de destino de tarjeta no es cosmético" - `TARGET_EINARBOARD` y `TARGET_PROTO` **invierten la polaridad del control de carga** (en - producción `CHRG_EN` en alto = carga **apagada**; en protoboard `CHRG_RUN` en alto = carga - **encendida**). Compilar con el destino equivocado puede dejar la batería cargando justo cuando - el firmware cree que la está protegiendo por temperatura — precisamente la falla #1 del RCA. +!!! warning "El destino de tarjeta invierte la polaridad del cargador" + Producción: `CHRG_EN` alto = carga apagada. Protoboard: `CHRG_RUN` alto = carga encendida. Con el destino equivocado la batería puede quedar cargando cuando el firmware cree protegerla por temperatura (falla #1 del RCA de junio). -Antes de publicar: +Antes de publicar en [Descargas](../descargas/index.md): -- [ ] Compilado con el `TARGET_` correcto para la generación de tarjeta. -- [ ] **Probado en banco en una unidad real**, no solo compilado. -- [ ] Verificada la polaridad del control de carga sobre hardware. -- [ ] Publicado en `docs/descargas/` con versión en el nombre y su línea en `SHA256SUMS.txt`. -- [ ] Anotado en el `CHANGELOG.md` del repositorio de firmware, con la fecha. -- [ ] Actualizada la tabla de §2 de este documento. +- [ ] Compilado con el `TARGET_` correcto para la tarjeta. +- [ ] Probado en banco en hardware real, no solo compilado. +- [ ] Polaridad del control de carga verificada sobre la tarjeta. +- [ ] Nombre con tarjeta y versión (`hbox-tarjetaV3_X.Y.Z.bin`); nunca se infiere una de la otra. +- [ ] Copiado a `docs/descargas/` de `hbox-docs` (los `.bin` de campo están en `.gitignore`); `SHA256SUMS.txt` lo regenera `sync-docs.sh`. +- [ ] Anotado en el `CHANGELOG.md` del firmware con fecha y quién lo probó. +- [ ] Tabla de Descargas actualizada; publicado con `./scripts/deploy.sh`. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-18 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme; enlaces a manuales y al acta. | +| 1.2 | 2026-09-29 | Edición breve. Tabla de binarios y verificación SHA-256 → Descargas; la lista "antes de publicar" vive solo aquí. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v4-prueba-fw-0.5.6.md b/docs/procedimientos/v4-prueba-fw-0.5.6.md index 60261d3..7709ec6 100644 --- a/docs/procedimientos/v4-prueba-fw-0.5.6.md +++ b/docs/procedimientos/v4-prueba-fw-0.5.6.md @@ -1,214 +1,134 @@ -# V4 — preparación y prueba con firmware 0.5.6 +--- +title: "V4 — preparación y prueba con firmware 0.6.0" +tags: [project-drogheda, hbox, procedimiento, v4, firmware, bateria, modem, dfu] +date: 2026-09-26 +project: Project Drogheda +author: Helgen Technologies +version: 1.3 +--- -**Versión:** 1.0 · 26-sep-2026 · **Para:** técnico de banco · **Dura:** ~1 h por tarjeta · **Registro:** [**▶ acta de prueba V4**](../formularios/v4.html) — una por tarjeta; ahí se suben la foto del puente y la consola completa. +# V4 — preparación y prueba con firmware 0.6.0 -Antes de probar una tarjeta V4 con el firmware 0.5.6 hay que hacerle cuatro preparativos: el puente de reset del -módem, dos interruptores del simpleRTK2B, un cable de consola sin 5 V y la batería cargada. Después se flashea y se -hacen tres pruebas: con 24 V, en batería y regreso de 24 V. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnico de banco. + - Cuándo: una vez por tarjeta V4 (EinarBoard 2.0, Blackpill en zócalo), antes de darla por buena con el firmware de campo. Sin serie: etiquétala V4-NN con el siguiente libre del [tablero](../tablero.html). + - Tiempo: ~1 h por tarjeta, más ~20 min en batería. + - Necesitas: tarjeta V4 completa (Blackpill, simpleRTK2B, módem con SIM, antena GNSS con cielo, antena LTE, batería); 24 V al GX16 que puedas desconectar; diodo Schottky BAT54 (como D5), BAT85, BAT43 o 1N5711, nunca 1N5819; alambre wire-wrap, cautín fino, flux, Kapton, termofil, lupa; multímetro con MIN/MAX; laptop con terminal serie y `dfu-util` o STM32CubeProgrammer; dos cables USB-A a USB-C (uno normal y uno sin 5 V, Preparación 2); cargador Li-ion de 1 celda o fuente de banco; monitor y [acta de prueba V4](../formularios/v4.html) abierta desde el inicio (se guarda sola en el navegador). -Abre el [acta](../formularios/v4.html) al empezar y llénala conforme avanzas: se guarda sola en el navegador. Si la -tarjeta no tiene número de serie, etiquétala **V4-NN** con el siguiente libre del [tablero](../tablero.html). +Orden: tres preparativos (puente de reset del módem; interruptores del simpleRTK2B, cable sin 5 V y batería), flasheo, y tres pruebas (24 V, batería, regreso de 24 V). Conectores y botones: [manual V4](../manuales/manual-tarjeta-V4.md). En V5.5 la prueba equivalente es [módem 4G en batería](prueba-bateria-modem.md). -!!! note "Actualización 27-sep (noche): el binario vigente es 0.6.0 CAMPO = 0.5.9 + gobernador de carga (la batería se recarga en la unidad)" - Donde abajo dice 0.5.9, léase 0.6.0 (`hbox-tarjetaV4_0.6.0.bin`, SHA-256 `1458470bbdd95b49…`; consola `hbox-v5-bringup 0.6.0`, `$PHLG,0.6.0,`). - Con 24 V y la etapa ON, a los ~2 min `STAT` muestra `carga=PROVING` y luego `ON` / `ltc=CARGANDO`; en el monitor 🔌 CARGANDO. +El procedimiento se escribió para 0.5.6. Puente, `M`, `R` y DFU solo con USB no cambian con 0.6.0. Historial de versiones: [Descargas](../descargas/index.md). -!!! note "Actualización 27-sep (tarde): 0.5.9 CAMPO (respaldo continuo; sin ciclos de etapa en batería; reset al volver el 5 V)" - Con 0.5.9 no hay ventanas de 10 min ni ahorro en batería: la etapa y el módem siguen encendidos y reportando; ningún ciclo de - etapa en batería; al volver el 5 V tras ≥ 10 s de respaldo la tarjeta se resetea sola (arranca en ~4 s con el módem). 0.5.8 se retiró - (su recovery en batería dejaba el módem oscuro). Lo demás (puente, `M`, `R`, DFU solo con USB) sigue igual. Donde abajo dice 0.5.7 u - 0.5.8, léase 0.5.9. - -!!! note "Actualización 26-sep (tarde): el binario vigente era 0.5.7" - 0.5.7 conserva todo lo de 0.5.6 (pulso `MODEM_RST` por el puente, tecla `M`) y añade el **despertar de batería por reset - del MCU** — lo único que en banco encendió el módem sin puente — más la tecla **`R`** (reset por software ahora), reset - en batería que abre ventana y `P` aceptado en batería. Este procedimiento sigue igual; donde dice 0.5.6, léase 0.5.7. - Antes de la Prueba B, con el módem oscuro en 24 V teclea `R`: si enciende, el puente pasa a ser respaldo. - -## Antes de empezar - -!!! danger "Reglas" - - Todo cambio de hardware (soldar, mover interruptores, poner o quitar módulos) se hace **sin energía**: sin 24 V, - batería desconectada y sin USB. - - Durante las pruebas **no conectes ningún USB al simpleRTK2B ni al USB-C del módem (J9)**: alimentan al módem - por otro lado y la prueba no vale. - - En la V4 la consola se usa **solo con el cable sin 5 V** (Preparación 2). El cable normal es únicamente para - flashear. - - Durante la prueba en batería **no presiones RESET**. Tras un reset sin 24 V la etapa no se enciende (es a - propósito) y la prueba se pierde. - - Graba la consola completa a archivo desde el primer minuto (115200, CR+LF). - -**Material** - -- Tarjeta V4 completa: Blackpill, simpleRTK2B, módem 4G con SIM, antena GNSS con vista al cielo, antena LTE y batería. -- Fuente de 24 V al GX16 que puedas desconectar. -- Diodo Schottky pequeño: **BAT54** (el mismo tipo que D5 en la tarjeta), BAT85, BAT43 o 1N5711. **No uses 1N5819.** -- Alambre delgado (wire-wrap), cautín de punta fina, flux, cinta Kapton, termofil y lupa. -- Multímetro (mejor si tiene MIN/MAX). -- Laptop con terminal serie y `dfu-util` o STM32CubeProgrammer. -- Dos cables USB-A a USB-C: uno normal para flashear y otro modificado sin 5 V (Preparación 2). -- Cargador de Li-ion de 1 celda o fuente de banco (Preparación 2). -- Acceso al monitor y al [acta de prueba V4](../formularios/v4.html). +!!! warning "Reglas" + - Todo cambio de hardware (soldar, mover interruptores, poner o quitar módulos) sin energía: sin 24 V, batería desconectada, sin USB. + - Durante las pruebas, ningún USB al simpleRTK2B ni a J9 (USB-C del módem): alimentan al módem por otro lado. + - La consola de la V4 se usa solo con el cable sin 5 V. El cable normal es solo para flashear. + - En batería no pulses RESET: tras un reset sin 24 V la etapa no enciende (a propósito) y la prueba se pierde. + - Graba la consola completa desde el primer minuto (115200, CR+LF). ## Preparación 1 — Puente de reset del módem -El firmware 0.5.6 reinicia el módem 3 s después de cada encendido de la etapa, igual que si alguien presionara el -botón **4G NTRIP RESET**. Para eso necesita un diodo entre U13 y ese botón. Se hace una sola vez por tarjeta y -**sin energía**. +3 s después de cada encendido de etapa el firmware reinicia el módem como si se pulsara 4G NTRIP RESET. Necesita un diodo entre U13 y ese botón. Una vez por tarjeta, sin energía. ``` U13 pata 12 (P7) ──|<── SW4G1, pad que va a RESET (J7) cátodo ánodo ``` -1. **Ubica U13** (PCF8574): el chip de 16 patas que está a la derecha de los puentes JP2/JP3 del cargador. -2. **Encuentra su pata 12.** Pon la marca de la pata 1 (punto o bisel) arriba a la izquierda: las patas 9 a 16 quedan - del lado derecho, con la 16 arriba. En ese lado hay **dos patas juntas sin pista: la 13 (arriba) y la 12 (abajo)**. - La 12 es la de abajo, pegada a la 11, que sí tiene pista. -3. **Ubica SW4G1**: el botón con la leyenda **4G NTRIP RESET**. Tiene dos pads. Con el multímetro en continuidad, el - pad correcto es el que tiene continuidad con el pin del zócalo J7 marcado **RESET**. El otro pad es tierra. -4. **Suelda el diodo** con alambre corto: - - **Banda del diodo (cátodo) → U13 pata 12.** - - **Lado sin banda (ánodo) → pad de SW4G1 que va a RESET.** - - Si es un BAT54 de 3 patas (SOT-23): pata 1 = ánodo, pata 3 = cátodo, la 2 no se usa. La prueba del paso 6 - confirma la orientación, sea cual sea el encapsulado. -5. Revisa con lupa que la pata 12 **no quede unida a la 11 ni a la 13**. Fija el alambre con Kapton y pásalo lejos - del módem 4G. -6. **Revisión sin energía**, multímetro en prueba de diodo: punta roja en el pad de SW4G1 y negra en U13 pata 12 → - **0.15–0.45 V**. Con las puntas invertidas → **OL** o un valor alto (más de 1 V). Si marca 0 V hay un corto; si - marca OL en los dos sentidos, falta soldadura. -7. Toma la **foto del puente** (U13 y SW4G1) y súbela al acta. +1. U13 (PCF8574) es el chip de 16 patas a la derecha de JP2/JP3. +2. Con la marca de pata 1 arriba a la izquierda, las patas 9–16 quedan a la derecha (16 arriba). Hay dos patas juntas sin pista: 13 (arriba) y 12 (abajo, pegada a la 11, que sí tiene pista). +3. SW4G1 es el botón 4G NTRIP RESET. De sus dos pads, el correcto tiene continuidad con el pin RESET del zócalo J7; el otro es tierra. +4. Suelda con alambre corto: banda del diodo (cátodo) → U13 pata 12; lado sin banda (ánodo) → pad de SW4G1 a RESET. BAT54 en SOT-23: pata 1 = ánodo, pata 3 = cátodo, la 2 no se usa. +5. Con lupa: la pata 12 no toca la 11 ni la 13. Fija el alambre con Kapton, lejos del módem. +6. Prueba de diodo sin energía: roja en SW4G1, negra en U13-12 → 0.15–0.45 V; invertidas → OL o > 1 V. 0 V = corto; OL en ambos sentidos = falta soldadura. +7. Foto del puente (U13 y SW4G1) al acta. -!!! warning "¿Por qué no 1N5819?" - Es un Schottky de potencia: en caliente deja pasar corriente al revés, y esa corriente alimentaría al módem durante - el reposo, justo lo que se está eliminando. Un 1N4148 solo sirve si en la Prueba A la lectura baja de 0.4 V. +No uses 1N5819: es Schottky de potencia y en caliente conduce al revés, lo que alimentaría el módem en reposo. Un 1N4148 solo sirve si en la Prueba A la lectura baja de 0.4 V. -## Preparación 2 — Interruptores del simpleRTK2B, cable de consola y batería +## Preparación 2 — Interruptores, cable de consola y batería -**Interruptores del simpleRTK2B** (sin energía) +Interruptores del simpleRTK2B (sin energía): el doble junto al LED POWER, rotulado IOREF=3.3V y 5V=OUTPUT, va con ambos en OFF. La tarjeta ya da IOREF con su 3.3 V permanente; con IOREF en ON el GPS queda encendido en reposo, alimenta de regreso al módem y gasta la batería. Sin esas leyendas: foto y pregunta antes de mover. Anota la posición. -- Junto al LED **POWER** del simpleRTK2B hay un interruptor doble con las leyendas **IOREF=3.3V** y **5V=OUTPUT**. - **Los dos van en OFF.** -- La tarjeta ya le da IOREF con su 3.3 V permanente. Con IOREF=3.3V en ON, ese 3.3 V mantiene encendido al GPS - durante el reposo, alimenta de regreso al módem y gasta la batería. -- Si los interruptores no tienen esas leyendas, toma una foto y pregunta antes de mover nada. Anota la posición en - el acta. +Cable de consola sin 5 V (una vez). En la V4 el 5 V del USB de la Blackpill está unido al riel de 5 V: con un cable normal la laptop alimenta la tarjeta (la prueba en batería no vale) y con 24 V la tarjeta le regresa corriente a la laptop. -**Cable de consola sin 5 V** (solo V4, se hace una vez) +1. Abre el forro de un cable USB-A a USB-C unos 5 cm a la mitad. +2. Corta solo el hilo rojo (+5 V) y aísla ambas puntas con termofil. Si no trae rojo, negro, verde y blanco, usa otro. +3. Etiqueta: SOLO CONSOLA V4 — SIN 5 V. +4. Prueba: tarjeta sin 24 V ni batería, cable entre laptop y Blackpill: la Blackpill queda apagada. Si enciende, el cable no sirve. +5. Al usarlo, energiza primero la tarjeta y luego conecta el cable. -En la V4 los 5 V del USB de la Blackpill están unidos al riel de 5 V de la tarjeta. Con un cable normal la laptop -alimenta la tarjeta: la prueba en batería no vale, y con 24 V la tarjeta le regresa corriente a la laptop. +Batería: mide en su conector; debe tener ≥ 3.80 V (3.14 V, como en el último reporte, es descargada). Cárgala por fuera con el cargador Li-ion de 1 celda, o fuente de banco a 4.00 V con límite 1 A directo al conector, polaridad verificada, sin dejarla sola, hasta que la corriente baje de 0.1 A. Si se calienta o se infla, detente y avisa. -1. Toma un cable USB-A a USB-C y abre el forro unos 5 cm a la mitad del cable. -2. **Corta solo el hilo rojo (+5 V)** y aísla las dos puntas con termofil. No cortes el negro, el verde ni el blanco. - Si el cable no trae esos cuatro colores, usa otro. -3. Etiquétalo: **SOLO CONSOLA V4 — SIN 5 V**. -4. Pruébalo: con la tarjeta sin 24 V y sin batería, conecta la laptop y la Blackpill con este cable. **La Blackpill - debe quedar apagada** (ningún LED). Si enciende, el cable no sirve. -5. Al usarlo, primero energiza la tarjeta (24 V o batería) y después conecta el cable. +## Flasheo de 0.6.0 -**Batería** +Archivo [`hbox-tarjetaV4_0.6.0.bin`](../descargas/hbox-tarjetaV4_0.6.0.bin), nunca el `hbox-v5-bringup_…`. SHA-256: `1458470bbdd95b490969976402bf2144a773a991b7650c55e3281687ba77b2e3` ([cómo verificar](../descargas/index.md#verifica-el-sha-256)). -- Mide la batería en su propio conector: debe tener **3.80 V o más**. Una batería con 3.14 V, como la del último - reporte, está descargada. -- **Cárgala por fuera de la tarjeta**: el firmware 0.5.6 no carga la batería. -- Usa el cargador de Li-ion de 1 celda del laboratorio. Si no hay, fuente de banco en **4.00 V con límite de 1 A**, - directo al conector de la batería y con la polaridad verificada. No la dejes sola; termina cuando la corriente - baje de 0.1 A. -- Si la batería se calienta o se ve inflada, detente y avisa. +1. Sin 24 V y con la batería desconectada, cable normal a la Blackpill. +2. DFU: mantén BOOT0, pulsa y suelta NRST, suelta BOOT0. Debe aparecer `STM32 BOOTLOADER` (0483:DF11). +3. `dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV4_0.6.0.bin` (o STM32CubeProgrammer → USB → Connect → Download en `0x08000000`). +4. Consola a 115200: `hbox-v5-bringup 0.6.0`, `board=EinarBoard v4 (HBOX v4)` y `>>> BOARD OK`. Si no viste el arranque: `t` (la línea empieza con `$PHLG,0.6.0,`) y `r` repite los tests. +5. Retira el cable normal. Desde aquí, solo el cable sin 5 V. -## Flasheo de 0.6.0 (sustituye a 0.5.9 / 0.5.8 / 0.5.7 / 0.5.6) - -- Archivo: [**`hbox-tarjetaV4_0.6.0.bin`**](../descargas/hbox-tarjetaV4_0.6.0.bin), de [Descargas](../descargas/index.md). - **No** uses el de V5 (`hbox-v5-bringup_…`). -- SHA-256, verifícalo antes: `1e604edd1fa20e72327574f91292fbab11e1ab2d12c990ad62330dbb0e4c52ab`. - En Mac o Linux: `shasum -a 256 hbox-tarjetaV4_0.6.0.bin` (esperado `1458470bbdd95b49…`). - -**Pasos** - -1. Tarjeta **sin 24 V y con la batería desconectada**. Conecta el **cable normal** a la Blackpill. -2. Modo DFU: mantén **BOOT0** de la Blackpill, presiona y suelta **NRST**, suelta BOOT0. La laptop debe mostrar - **STM32 BOOTLOADER** (0483:DF11). -3. Graba: `dfu-util -a 0 -s 0x08000000:leave -D hbox-tarjetaV4_0.6.0.bin` (o STM32CubeProgrammer → USB → Connect → - Download en `0x08000000`). -4. Abre la consola (115200). Tras reiniciar debe verse `hbox-v5-bringup 0.6.0`, luego - `board=EinarBoard v4 (HBOX v4)`, y los tests deben terminar en `>>> BOARD OK`. Si no alcanzas a ver el arranque, - teclea `t` (la línea debe empezar con `$PHLG,0.6.0,`) y `r` para repetir los tests. -5. Desconecta el cable normal. De aquí en adelante, solo el cable sin 5 V. - -!!! tip "Si no aparece STM32 BOOTLOADER" - En la V4 el USB también alimenta el riel de 5 V de la tarjeta, y con él al W5500, cuya salida de interrupción llega - al pin `BOOT1` de la Blackpill. Si tras dos intentos no aparece STM32 BOOTLOADER: sin energía, saca la Blackpill del - zócalo, flashéala suelta con el cable normal y vuelve a colocarla. **Al colocarla, su USB-C va del lado de la - etiqueta E-CSn de la tarjeta**: el pin B12 de la Blackpill cae en E-CSn y el pin R en NRST. Si no coincide, no la - energices. +Sin `STM32 BOOTLOADER` tras dos intentos: el USB también alimenta el W5500, cuya interrupción llega a `BOOT1`. Sin energía, saca la Blackpill, flashéala suelta y reinsértala con su USB-C del lado de la etiqueta E-CSn (B12 en E-CSn, pin R en NRST). Si no coincide, no la energices. ## Prueba A — Con 24 V -1. Conecta la batería y después los 24 V. Espera 30 s, conecta el **cable sin 5 V** y abre la consola grabando. -2. Mide **P2** (entrada de 5 V del SD-15B): **5.1–5.3 V**. Si marca 0 V, detente: el SD-15B o el arnés no están - entregando. -3. Teclea `s`. La línea `STAT` debe mostrar `v5=5.xx(ok)`, `stack=ON` y `mrst=1` (o más); al poco rato también - `modoB=ON` y `gga=` con satélites. -4. **Prueba del puente:** multímetro en el pad RESET de SW4G1 contra GND (con el módem encendido marca alto). Teclea - `M`: la lectura debe caer **por debajo de 0.4 V** durante medio segundo (usa MIN/MAX si lo tienes) y los LEDs del - módem se apagan y vuelven. La consola dice `MODEM_RST operador`. - - No baja: el diodo está al revés o sin soldar. - - Baja pero se queda entre 0.4 y 0.7 V: el diodo no es Schottky; cámbialo. -5. Espera a que el módem registre y a que los LEDs UART del simpleRTK2B parpadeen rápido (están llegando - correcciones). En el monitor, la unidad aparece con `0.6.0` y ⚡ VEHÍCULO. +1. Conecta la batería y luego 24 V. A los 30 s conecta el cable sin 5 V y abre la consola grabando. +2. P2 (salida del SD-15B): 5.1–5.3 V. Con 0 V detente: SD-15B o arnés. +3. `s`: `v5=5.xx(ok)`, `stack=ON`, `mrst=1` o más; al poco, `modoB=ON` y `gga=` con satélites. +4. Puente: multímetro en el pad RESET de SW4G1 contra GND (alto con el módem encendido). Teclea `M`: baja de 0.4 V medio segundo (usa MIN/MAX), los LEDs del módem se apagan y vuelven, y la consola dice `MODEM_RST operador`. No baja: diodo al revés o sin soldar. Se queda en 0.4–0.7 V: el diodo no es Schottky. +5. Espera registro del módem y LEDs UART del simpleRTK2B en parpadeo rápido (correcciones). En el monitor: `0.6.0` y ⚡ VEHÍCULO. +6. Opcional: con el módem oscuro en 24 V, `R` (reset por software) debe encenderlo. -Si algo de esta prueba falla, no pases a la prueba en batería: marca «me detengo» en el acta y ve al Cierre. +Si algo falla, no pases a batería: marca "me detengo" en el acta y ve al cierre. ## Prueba B — En batería -1. Con todo funcionando, **quita los 24 V** (la batería se queda conectada) y anota la hora. La consola muestra - `V5 PERDIDO` y `BACKUP inicio … modo reporte cada 10 min`. La etapa sigue encendida unos 2 minutos. -2. Llegan `DUTY reposo … etapa OFF` y `STACK OFF reason=duty_sleep`. Espera 30 s y mide en reposo: +!!! note "Pendiente de ingeniería" + Los pasos 2–5 describen el ciclo de 10 min de 0.5.6–0.5.7. Desde 0.5.9 la etapa y el módem siguen encendidos en batería, sin ventanas (ver [Descargas](../descargas/index.md)). Con 0.6.0 registra en el acta lo que ocurra y avisa a ingeniería. - | Punto | Dónde medir | Debe marcar | +1. Con todo funcionando, quita 24 V (la batería queda) y anota la hora: `V5 PERDIDO` y `BACKUP inicio … modo reporte cada 10 min`. La etapa sigue unos 2 min. +2. `DUTY reposo … etapa OFF` y `STACK OFF reason=duty_sleep`. A los 30 s mide: + + | Punto | Dónde | Debe marcar | |---|---|---| - | SW_5V | C3 (+) | menos de 0.3 V | - | 3V3_MODEM | C43 (+) o J7 pin 1 | menos de 0.3 V; anota el valor aunque sea mayor | - | LED POWER del simpleRTK2B | a la vista | apagado (el LED IOREF encendido es normal) | + | SW_5V | C3 (+) | < 0.3 V | + | 3V3_MODEM | C43 (+) o J7 pin 1 | < 0.3 V; anota el valor aunque sea mayor | + | LED POWER del simpleRTK2B | A la vista | Apagado (IOREF encendido es normal) | - - LED POWER encendido en reposo: el interruptor IOREF=3.3V quedó en ON o hay un USB conectado al simpleRTK2B. - - 3V3_MODEM arriba de 0.3 V: anótalo en el acta y sigue la prueba; ingeniería lo revisa. + LED POWER encendido: IOREF=3.3V en ON o un USB en el simpleRTK2B. 3V3_MODEM > 0.3 V: anótalo y sigue. -3. A los 10 min del paso 1 llega `DUTY despertar #1`. En la consola deben aparecer, en este orden: - `STACK ON reason=duty_wake` → `NMEA primera trama en PA3 ($GNTXT,…u-blox AG…)` → a los 3 s - `MODEM_RST stack_on` → a los ~10 s `MODOB ON`. - - Si la primera trama no es `$GNTXT … u-blox AG` sino `$GNGGA` u otra, el GPS nunca se apagó: revisa el - interruptor IOREF=3.3V. -4. Durante esa ventana (2 a 3 min) el módem debe encender sus LEDs y registrar solo, sin tocar nada. En el monitor - debe llegar la posición con 🔋. Anota lo que viste en la tabla de despertares del acta. -5. Deja pasar la segunda ventana (a los 20 min del paso 1) y confirma lo mismo. +3. A los 10 min, `DUTY despertar #1`, en orden: `STACK ON reason=duty_wake` → `NMEA primera trama en PA3 ($GNTXT,…u-blox AG…)` → a los 3 s `MODEM_RST stack_on` → a los ~10 s `MODOB ON`. Si la primera trama es `$GNGGA` u otra, el GPS nunca se apagó: revisa IOREF. +4. En la ventana (2–3 min) el módem registra solo y la posición llega al monitor con 🔋. Anota en la tabla de despertares. +5. Confirma lo mismo en la segunda ventana (min 20). -**Pasa** si en las dos ventanas el módem registra y el monitor recibe la unidad, sin presionar nada. Si no registra, -el acta abre una tabla para anotar los rieles y los LEDs durante la siguiente ventana. +Pasa si en las dos ventanas el módem registra y el monitor recibe la unidad sin tocar nada. Si no registra, el acta abre una tabla de rieles y LEDs para la siguiente ventana. -## Prueba C — Regreso de los 24 V sin reset +## Prueba C — Regreso de 24 V sin reset -1. **Durante el reposo** (etapa OFF), reconecta los 24 V sin presionar RESET. La consola muestra `V5 PRESENTE`, - `DUTY fin` y `BACKUP fin`; a los ~3 s `STACK ON reason=auto` y 3 s después `MODEM_RST stack_on`. -2. **Durante una ventana** (etapa ON): quita los 24 V como en el paso 1 de la Prueba B y reconéctalos antes de que - pasen 2 minutos. La consola muestra `5 V de vuelta tras bateria: ciclo de etapa…` → `STACK OFF reason=pwr_return` - → unos 10 s después `STACK ON reason=recovery` → `MODEM_RST stack_on`. +1. En reposo (etapa OFF), reconecta 24 V sin pulsar RESET: `V5 PRESENTE`, `DUTY fin`, `BACKUP fin`; a los ~3 s `STACK ON reason=auto` y 3 s después `MODEM_RST stack_on`. +2. En una ventana (etapa ON), quita 24 V y reconéctalos antes de 2 min: `5 V de vuelta tras bateria: ciclo de etapa…` → `STACK OFF reason=pwr_return` → ~10 s → `STACK ON reason=recovery` → `MODEM_RST stack_on`. -**Pasa** si en los dos casos el módem registra solo en menos de 2 minutos y el monitor vuelve a mostrar ⚡. +Pasa si en los dos casos el módem registra solo en < 2 min y el monitor vuelve a ⚡. -## Registro y cuándo parar +## Registro -Todo va en el **[acta de prueba V4](../formularios/v4.html)**: diodo usado y foto del puente, posición de los -interruptores, prueba del cable, voltaje de la batería, flasheo, lectura de P2 y la prueba con `M`, lecturas en -reposo, la tabla de despertares, la Prueba C y el **archivo completo de la consola**. Cada etapa termina con una -pregunta de paso: si la tarjeta no pasa, marca «me detengo», llena el Cierre y envía el acta con resultado **FALLA**. -Queda en el [expediente](../unidad.html) de la tarjeta y en el [tablero](../tablero.html). +Todo va en el [acta de prueba V4](../formularios/v4.html), con el log completo de consola. Cada etapa termina con una pregunta de paso; si la tarjeta no pasa, marca "me detengo", llena el cierre y envía con resultado FALLA. Queda en el [expediente](../unidad.html) y en el [tablero](../tablero.html). -!!! danger "Detente y avisa a ingeniería si pasa cualquiera de estas" - - P2 marca 0 V con los 24 V puestos. +!!! danger "Detente y avisa a ingeniería" + - P2 en 0 V con 24 V puestos. - La Blackpill enciende con el cable sin 5 V. - - Con `M`, el pad RESET de SW4G1 no baja de 0.4 V (después de revisar el diodo). - - Los tests terminan en `>>> BOARD CHECK FAILED`. - - El LED POWER del simpleRTK2B sigue encendido en reposo con IOREF=3.3V en OFF y sin USB. + - Con `M`, el pad RESET de SW4G1 no baja de 0.4 V (diodo ya revisado). + - Tests terminan en `>>> BOARD CHECK FAILED`. + - LED POWER del simpleRTK2B encendido en reposo con IOREF en OFF y sin USB. - Algo se calienta o huele, o la batería se infla. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.1 | 2026-09-27 | Notas de 0.5.7, 0.5.9 y 0.6.0. | +| 1.2 | 2026-09-29 | SHA-256 de 0.6.0 corregido; encabezado uniforme. | +| 1.3 | 2026-09-29 | Edición breve; tabla de versiones → Descargas; aviso de que la Prueba B describe el ciclo de 0.5.6–0.5.7. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-checklist-puesta-en-marcha.md b/docs/procedimientos/v5-checklist-puesta-en-marcha.md new file mode 100644 index 0000000..1f4d387 --- /dev/null +++ b/docs/procedimientos/v5-checklist-puesta-en-marcha.md @@ -0,0 +1,94 @@ +--- +title: "HBOX V5 — Checklist de puesta en marcha en el puerto" +tags: [project-drogheda, hbox, v5, v5.6, instalacion, puesta-en-marcha, campo, checklist] +date: 2026-09-29 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 +status: ACTIVO — imprimir; una hoja por unidad instalada +audience: técnico de campo +--- + +# HBOX V5 — Checklist de puesta en marcha en el puerto + +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - **Para quién:** técnico de campo; una hoja impresa por unidad V5.5/V5.6. Al terminar se sube al [expediente](../unidad.html). + - **Cuándo:** al instalar en la máquina, después de la [configuración](v5-configuracion-unidad.md) y la [recepción](ciclo-de-vida.md#7-recepcion-e-inspeccion). + - **Tiempo:** 45–60 min por unidad (incluye 5 min en batería). + - **Necesitas:** multímetro, herramienta de montaje, teléfono con datos para el monitor y el [manual del cliente](../manuales/manual-cliente.md) para entregar. + +**Unidad:** `HBOX5-E___-A____-R_____` · **Monitor:** `H00___` · **Máquina:** ____________ · **Terminal:** ________ +**Técnico:** ____________________ · **Fecha:** ____/____/2026 · **Inicio:** ______ · **Fin:** ______ + +!!! warning "Antes de subir a la máquina" + Acta de ensamble APROBADA y unidad configurada. Firmware de campo vigente; el `-eth` de banco no se instala en campo. Interruptor de corte en OFF hasta el paso 3. Máquina apagada y con permiso de acceso (número de máquina como lo nombra la terminal). + +## 1. Montaje (máquina apagada) + +- [ ] Gabinete fijo en el punto acordado, sin tapar la rejilla del ventilador ni el LED de panel. +- [ ] Antena GNSS en el punto más alto, con cielo, sobre base metálica si es magnética; cable sin dobleces ni empalmes. +- [ ] 2 antenas LTE a ≥ 1 m de la GNSS y ≥ 20 cm entre sí; SMA a mano + ¼ vuelta. +- [ ] Prensaestopas apretados; sin cables sobre bordes cortantes; bridas cada 30 cm. + +## 2. Arnés 24 V (máquina apagada, con multímetro) + +- [ ] GX16: pin 1 = +24 V permanente (batería de la máquina) · pin 2 = GND · pin 3 = ignición (+24 V solo con llave) · pin 4 = GND. +- [ ] En el conector, antes de enchufar: pin 1–2 = 24–28 V; pin 3–2 = 0 V con llave OFF y 24–28 V con llave ON. +- [ ] Sin continuidad entre pin 1 o 3 y el 5 V de la tarjeta (P2). 24 V en P2 destruye la unidad. +- [ ] Portafusible del kit en el +24 V, cerca de la toma, fusible 3 A lento. + +## 3. Encendido y LEDs + +- [ ] GX16 enchufado, interruptor de corte en ON, llave en ON. +- [ ] LED de panel parpadea a 1 Hz en < 5 s. +- [ ] Ventilador gira. +- [ ] RGB azul en < 15 s y verde (RTK FIX) en < 10 min con cielo. +- [ ] Módem registrado (LED de red lento o fijo) en < 2 min. + +| RGB | Estado | Acción | +|---|---|---| +| Verde | Etapa ON, RTK FIX | OK | +| Azul | Etapa ON, sin RTK | Espera 10 min con cielo; si sigue: SIM / correcciones | +| Magenta | Etapa ON, el F9P no habla | Avisa a ingeniería (simpleRTK2B) | +| Amarillo | En batería | Sin 5 V: arnés / SD-15B | +| Rojo | Etapa OFF | Sin 5 V, batería < 3.40 V o > 60 °C. No la dejes así | + +## 4. Monitor + +- [ ] En monitor.helgen.dev, `H00___` aparece con posición en la máquina en ≤ 2 min. +- [ ] Columna Salud presente (fw, `vbat`, temperaturas). Sin Salud: avisa (Modo B / módem). +- [ ] Con batería en carga, 🔌 CARGANDO a los ~3 min. + +## 5. Ethernet (solo si el panel lleva RJ45 y el cliente lo usa) + +- [ ] Cable en J10; LED de enlace encendido. Sin PoE: la unidad sigue con 24 V. +- [ ] IP asignada por la red del cliente: __________________ (hoy solo espejo de prueba; el monitor no lo usa). + +## 6. Prueba de batería (5 min) + +- [ ] Llave OFF y GX16 desconectado: RGB amarillo, ventilador parado, módem encendido. +- [ ] 5 min después el monitor sigue recibiendo posición con `pwr=BATT`. +- [ ] Al reconectar: la tarjeta se reinicia sola (0.5.9+), RGB azul → verde en < 10 min, monitor vuelve a `VEH`. +- [ ] Módem oscuro al volver el 24 V: pulsa SW4G1 una vez. ☐ Pasó. + +## 7. Cierre + +- [ ] Tapa con sello, tornillos en cruz, etiqueta exterior legible; foto de gabinete, antenas y GX16. +- [ ] Interruptor de corte en ON; llave como la encontraste. +- [ ] Reportado a ingeniería: `H00___` instalada en ____________ a las ______ · RTK FIX ☐ sí ☐ no · batería 5 min ☐ OK. + +**Resultado:** ☐ EN SERVICIO ☐ EN SERVICIO CON OBSERVACIONES ☐ NO INSTALADA (motivo: _____________________) + +**Firma técnico:** ______________________ **Firma cliente / supervisor:** ______________________ + +Falla en la instalación: [diagnóstico en campo](../diagnostico/procedimiento-diagnostico-campo.md) y su [acta](../formularios/diagnostico.html). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión (V5.5/V5.6, fw 0.6.0). | +| 1.1 | 2026-09-29 | Encabezado uniforme. | +| 1.2 | 2026-09-29 | Edición breve; firmware "vigente" en lugar de número fijo. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-configuracion-unidad.md b/docs/procedimientos/v5-configuracion-unidad.md new file mode 100644 index 0000000..74d48cc --- /dev/null +++ b/docs/procedimientos/v5-configuracion-unidad.md @@ -0,0 +1,120 @@ +--- +title: "HBOX V5 — Configuración de una unidad" +tags: [project-drogheda, hardware, hbox, v5, v5.6, configuracion, ntrip, ethernet, rs485, rs232, bateria, procedimiento] +project: Project Drogheda +author: Helgen Technologies +date: 2026-09-29 +version: 1.1 +status: ACTIVO — toda unidad V5.5 / V5.6 antes de embarcar o de reinstalar +audience: técnicos de banco +--- + +# HBOX V5 — Configuración de una unidad + +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: unidad V5.5/V5.6 que pasó la [prueba final](v5-prueba-final-unidad.md), antes de embarcar o de reinstalar. Paso 5 de producción, antes del [checklist de puesta en marcha](v5-checklist-puesta-en-marcha.md). + - Tiempo: 30–40 min por unidad, más la espera de RTK FIX. + - Necesitas: laptop con terminal serie a 115200 grabando, 2 cables USB-C con datos, 24 V o arnés GX16 real, [plantilla 4G](../descargas/4G_NTRIP_HelgenSRV-NMEA.example.txt) y el `.local.txt` de ingeniería, configuración F9P, antena GNSS con cielo, 2 antenas LTE, SIM Telcel; si aplica, cable Ethernet y adaptadores USB-RS485 / USB-RS232. Registro: [acta de ensamble](../formularios/ensamble.html) y, si aplica, [acta Ethernet y serie](../formularios/ethernet-serie.html). + +Una unidad está configurada cuando cumple las siete filas: + +| # | Elemento | Configurado cuando | § | +|---|---|---|---| +| 1 | Módem 4G | Parámetros cargados (APN, caster, mountpoint, ID de estación) y registrado en Telcel | 1 | +| 2 | simpleRTK2B (ZED-F9P) | Configuración Helgen en flash; RTK FIX (`fix=4`) con cielo | 2 | +| 3 | Identidad | Aparece en el monitor como `H00xx` con posición y Salud | 3 | +| 4 | Ethernet (si lo lleva) | Enlace y espejo TCP probados con `0.6.0-eth` | 4 | +| 5 | Puertos serie (si los lleva) | `[PASS] SC16IS752` y niveles correctos en P15/P16 | 4 | +| 6 | Paquete de batería | Química = JP2; `ltc=CARGANDO` | 5 | +| 7 | Firmware y consola | Versión vigente y `STAT` limpio | 6 | + +## 1. Módem 4G — parámetros + +Las claves `$$$AS+…` y la plantilla están en [Descargas](../descargas/index.md#parametros-del-modem-4g-ntrip-master). Los valores reales (caster y APN) los entrega ingeniería para esta unidad; no se guardan ni se reenvían. `AS+K` (ID de estación) es el `H00xx` de la unidad (§3). + +1. Módem suelto (antes del ensamble): se carga sobre el simpleRTK2B por el USB XBEE ([módulos §2b](v5-modulos-integracion.md#2b-montaje-y-configuracion)). +2. Unidad ensamblada (módem en J7/J8): terminal en J9 a 115200 (J9 va al USB del módem, `USB_DP/DM` → J7 pines 7/8 según netlist V5.6); mismo procedimiento. +3. Al terminar, `$$$AS+I=1111` y lee `AS+K`; anótalo en el acta. +4. Retira el cable de J9: con cable, la laptop alimenta el módem y las pruebas de batería y de reset del módem no valen. + +- [ ] Todas las líneas contestaron `OK`. +- [ ] Módem registrado en Telcel (LED lento o fijo) en < 2 min. +- [ ] `AS+K` anotado. + +## 2. simpleRTK2B — RTK FIX + +1. El módulo trae la configuración Helgen de su acta. Si llegó sin acta, cárgala ([módulos §1c](v5-modulos-integracion.md#1c-configuracion-helgen)). +2. Consola del HBOX (J11, 115200), etapa encendida (`stack=ON`): `n` muestra 20 s de `$GNGGA` con `fix=` y `sats=`. +3. Con cielo y módem registrado, espera `fix=4` (típico 1–5 min, máximo 10). `STAT`: `gga=RTK_FIX sats≥10 hdop<1.5`; LED RGB verde. + +| `fix=` | Significado | Se embarca | +|---|---|---| +| 0 | Sin fix | No | +| 1 | GPS autónomo (sin correcciones) | No | +| 5 | RTK FLOAT | No, salvo cielo malo documentado | +| 4 | RTK FIX | Sí | + +- [ ] `fix=4` estable 5 min; tiempo y satélites anotados. + +## 3. Identidad `H00xx` + +La identidad en el monitor (monitor.helgen.dev, htracker) sale del módem: el NTRIP Master envía `$GPTXT` con el ID de `AS+K` en el tercer campo y el servidor lo toma como `H00xx`. El `H00xx` cambia si se cambia el módem, no la tarjeta. El `$PHID` que manda el espejo Ethernet (UID, fw, tarjeta, MAC) todavía no lo usa el monitor. + +1. Con 24 V, etapa ON y módem registrado, en ≤ 2 min el monitor muestra `H00xx` con posición a 1 Hz y Salud (fw, `vbat`, temperaturas, `v5min`). +2. Consola: `modoB=ON relay=… phlg_aire=…` sube de 1 en 1 cada 30 s. + +- [ ] `H00xx` visible con Salud y anotado en el acta y en la etiqueta interior (`HBOX5-Exx-Axxx-Rxxxx · H00xx`). + +## 4. Ethernet y puertos serie (solo si el panel los lleva) + +Prueba, defaults de red, pines de P15/P16 y regla de JP5: [Prueba de Ethernet y puertos serie](v5-prueba-ethernet-serie.md). No hay build de campo con Ethernet: la IP y el servidor son banderas de compilación y el monitor no escucha el espejo. + +- [ ] Ethernet probado y registrado, o "no aplica: panel sin RJ45". +- [ ] `[PASS] SC16IS752` en el POST; JP5 abierto/cerrado según la instalación, anotado. + +## 5. Batería + +Química y JP2: [ensamble §2](v5-ensamble.md#2-tarjeta-sin-energia). + +Con 24 V, etapa ON y > 150 s tras el arranque: `STAT … carga=PROVING` → `carga=ON … ltc=CARGANDO`, y el monitor muestra 🔌 CARGANDO. `vbat` sube en la siguiente media hora. Detalle del gobernador: [Descargas](../descargas/index.md). + +- [ ] Química = JP2, ambas anotadas. +- [ ] `ltc=CARGANDO` visto. + +## 6. Consola final + +24 V + ignición, etapa ON ≥ 5 min, cielo, batería conectada. Teclea `s` y lee `STAT`: + +| Campo | Debe decir | Si no | +|---|---|---| +| Encabezado (tras reset) | `hbox-v5-bringup` con la versión vigente de [Descargas](../descargas/index.md) | Reflashea | +| `v5=` | `5.2x–5.3x(ok)`, nunca `BAJO` ni `no` | SD-15B a ~5.3 V; arnés | +| `v5min=` | ≥ 4.9 | El riel cae con la ráfaga LTE: fuente / SD-15B | +| `vbat=` | Li-ion 3.6–4.1 · LFP 3.2–3.5 | Paquete / P4 | +| `chrg=` · `ltc=` · `carga=` | `chg` · `CARGANDO` · `ON` (tras ~150 s) | §5 | +| `flt=` | `none` | `FAULT`: LTC4040 / NTC del paquete | +| `tair=` / `rh=` · `tbat=` · `tmcu=` | Plausibles (< 45 °C en banco), no `n/d` | I²C: U3 / U4 | +| `i2cerr=` | `0` | Soldadura U3 / U4 / U13 / U10 | +| `stack=` · `modo=` | `ON` · `AUTO` | `MAN`: teclea `A` | +| `gga=` · `sats=` | `RTK_FIX` · ≥ 10 | §2 | +| `modoB=` · `phlg_aire=` | `ON` · sube cada 30 s | K1 / módem | +| `rtcm_age=` | Pocos segundos (no `rtcm=none`) | No llegan correcciones: §1 | +| `modem=` | `vivo` (tras 2 min de gracia) | `SOSPECHOSO`: módem oscuro; SW4G1 y revisa | +| `rec=` | `0`, sin `LIMP` | NMEA intermitente: MOD1 / UART1 | +| `eth=` (solo `-eth`) | `CONECTADO ip=…` con cable; `off` sin 5 V | §4 | + +V5.6: su firmware (`MODEM_EN`, `tchg`, `tcell`, `tmodem`) aún no existe; hasta entonces se prueba con el binario V5 vigente y esos campos no aparecen. + +- [ ] `STAT` limpio y encabezado de versión pegados en el acta. +- [ ] Etiquetas exterior e interior con `HBOX5-Exx-Axxx-Rxxxx` y `H00xx`. +- [ ] P11 en OFF para almacenar o embarcar. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión: define "unidad configurada" para V5.5/V5.6. | +| 1.1 | 2026-09-29 | Edición breve. Parámetros del módem → Descargas; Ethernet/serie y JP5 → prueba de Ethernet y serie; química/JP2 → ensamble §2; tabla de firmware → Descargas. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-ensamble.md b/docs/procedimientos/v5-ensamble.md index e726da7..8e7c284 100644 --- a/docs/procedimientos/v5-ensamble.md +++ b/docs/procedimientos/v5-ensamble.md @@ -1,176 +1,169 @@ --- -title: HBOX v5 — Procedimiento de ensamble de la unidad y energizado final +title: "HBOX V5 — Ensamble de la unidad y energizado" tags: [project-drogheda, hardware, hbox, v5, ensamble, checklist, procedimiento] +date: 2026-09-17 project: Project Drogheda author: Helgen Technologies -date: 2026-09-17 -version: 1.0 -status: ACTIVO — una unidad a la vez; se registra en el acta "Ensamble" +version: 1.2 +status: ACTIVO — una unidad a la vez audience: técnicos de banco --- -# HBOX v5 — Ensamble de la unidad y energizado final +# HBOX V5 — Ensamble de la unidad y energizado -**Entrada:** tres módulos **ya aprobados** en sus actas — una EinarBoard **V5-NN** (acta de prueba y -flasheo), un simpleRTK2B Pro **ARD-NNN** y un módem 4G NTRIP Master **RTK-NNNN** que pasaron juntos la -**integración**. **Salida:** una unidad HBOX cerrada, etiquetada **HBOX5-Exx-Axxx-Rxxxx**, encendida y -reportando. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: con una EinarBoard V5-NN aprobada y una pareja ARD-NNN + RTK-NNNN aprobada e integrada. Paso 3 de producción, entre [Módulos RTK y 4G](v5-modulos-integracion.md) y la [prueba final](v5-prueba-final-unidad.md). Resultado: unidad cerrada, etiquetada `HBOX5-Exx-Axxx-Rxxxx`, encendida y reportando. + - Tiempo: 60–90 min por unidad. + - Necesitas: ver §1; [acta de ensamble](../formularios/ensamble.html). -**Duración estimada:** 60–90 min por unidad. +!!! warning "Reglas" + 1. Primero el acta: selecciona los tres módulos en el [acta de ensamble](../formularios/ensamble.html) y espera a verlos en verde (Aprobado) con la pareja en "integración OK". Un módulo en rojo o "sin acta" no se ensambla. + 2. La batería se conecta al final (§6), con la unidad energizada desde 24 V. + 3. Inserta los módulos sin energía y revisa la orientación dos veces. Un XBee al revés o un simpleRTK2B corrido un pin se destruye al encender. -> ⛔ **REGLA 1 — Primero el acta, luego el desarmador.** Abrir el acta de ensamble, seleccionar los -> tres módulos y esperar a que el sitio muestre los tres en **verde (Aprobado)** y la pareja ArduSimple+4G -> con **integración OK**. Si alguno sale en rojo o "sin acta", **no se ensambla** con ese módulo. -> -> ⛔ **REGLA 2 — Batería al final.** El pack 1S4P se conecta en P4 solo en la sección 6, con la unidad -> ya energizada desde 24 V y con el NTC del pack en P4-3. -> -> ⛔ **REGLA 3 — Todo módulo se inserta sin energía**, mirando la orientación dos veces. Un XBee al -> revés o un simpleRTK2B corrido un pin se destruye al encender. +## 0. Número de la unidad ---- - -## 0. El número de serie de la unidad - -El acta lo compone automáticamente al seleccionar los módulos: +El acta lo compone al seleccionar los módulos: ``` HBOX5 - E07 - A010 - R0006 - │ │ │ └── módem 4G NTRIP Master RTK-0006 + │ │ │ └── módem 4G NTRIP Master RTK-0006 │ │ └────────── simpleRTK2B Pro (ArduSimple) ARD-010 - │ └──────────────── EinarBoard V5-07 + │ └──────────────── EinarBoard V5-07 └──────────────────────── producto HBOX, tarjeta v5 ``` -Ese texto va en la **etiqueta exterior** del HBOX (panel, junto al GX16) y en la **etiqueta interior** -(cara interna de la tapa). Un módulo solo puede pertenecer a **una** unidad: el sitio rechaza el acta -si el módulo ya está asignado. +Va en la etiqueta exterior (panel, junto al GX16) y en la interior (cara interna de la tapa). Un módulo pertenece a una sola unidad: el sitio rechaza el acta si ya está asignado. ---- - -## 1. Material y herramientas +## 1. Material | Í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.5.1 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 | -| Ventilador 5 V 2 hilos (P6), LED de panel (P8), botón de reset (P10), interruptor de corte (P11), NTC de punto caliente (P12) | arnés interno | -| Pigtails de antena: GNSS SMA-hembra bulkhead → SMA del simpleRTK2B; 2 × LTE SMA bulkhead → u.FL del módulo 4G | | -| Separadores M2.5/M3, tornillería, bridas, fijador de rosca para SMA | | -| Fuente de banco 24 V / 1 A con límite de corriente, multímetro, laptop con terminal serie | | -| Etiquetas: exterior e interior con el número de unidad | impresas desde el acta | +| Gabinete HBOX con panel (GX16-5, 3 × SMA, RJ45, prensaestopas) | Diseño mecánico vigente | +| EinarBoard V5-NN aprobada, firmware 0.5.1 o superior | Acta de tarjeta | +| simpleRTK2B Pro ARD-NNN y módem RTK-NNNN aprobados e integrados | En sus bolsas | +| Mean Well SD-15B-05 (24 V → 5 V) | Va dentro del HBOX | +| Paquete de batería con NTC (3 hilos → P4), química según §2 | Se conecta al final | +| Ventilador 5 V (P6), LED de panel (P8), botón de reset (P10), interruptor de corte (P11), NTC de punto caliente (P12) | Arnés interno | +| Pigtails: GNSS SMA bulkhead → SMA del simpleRTK2B; 2 × LTE SMA bulkhead → u.FL del módem | | +| Separadores M2.5/M3, tornillería, bridas, fijador de rosca | | +| Fuente de banco 24 V / 1 A con límite, multímetro, laptop con terminal serie | | +| Etiquetas exterior e interior | Impresas desde el acta | ---- +## 2. Tarjeta (sin energía) -## 2. Preparación de la tarjeta (sin energía) +- [ ] La EinarBoard es la V5-NN seleccionada en el acta (etiqueta cerca de MH4). +- [ ] JP2 coincide con la química del paquete (tabla abajo). Léelo con lupa; serigrafía V5.6: `JP2 = F2 (Li-ion / LFP)`. +- [ ] JP3 (F1) = 0 · JP4 (F0) = 1. Anota JP2, JP3 y JP4 en el acta. +- [ ] JP1 (0R, alimentación del ventilador) presente. +- [ ] P11 abierto, sin jumper; ahí va el interruptor de panel (§4). +- [ ] Tarjeta fija con separadores en MH1–MH6 (MH7–MH12 según el diseño), sin flexionarla; apriete suave. -- [ ] EinarBoard **V5-NN** corresponde a la seleccionada en el acta (leer la etiqueta cerca de MH4). -- [ ] Jumpers del cargador en la posición del pack Li-ion 4.00 V: **JP2 (F2) = 1 · JP3 (F1) = 0 · JP4 (F0) = 1**. - Anotar en el acta la posición de cada uno. *(Si el pack cambia a LiFePO4, ingeniería indicará JP2 = 0.)* -- [ ] Jumper **JP1** (0R, alimentación del ventilador) presente. -- [ ] **P11** (corte) **abierto** — sin jumper; el interruptor de panel se conecta ahí en la sección 4. -- [ ] Tarjeta fijada en la platina/gabinete con separadores en **MH1–MH6** (y MH7–MH12 según el diseño) sin flexionar la tarjeta; tornillos con apriete suave. +| Tarjeta | Paquete | JP2 (3 pads) | RNTB (R55) / NTC del paquete | Flotación | En vacío | +|---|---|---|---|---|---| +| V5.5 | Li-ion 18650 1S4P | 1-2 (F2 alto, Li-ion) | 10 k / NTC 10 k | ≈ 4.0–4.1 V | 3.0–4.2 V | +| V5.6 | LiFePO4 alta temperatura 26650 | 2-3 (F2 bajo, LFP) | 5.6 k / NTC B3380 | 3.50 V | 2.8–3.6 V | -## 3. Módulos enchufables (sin energía) +!!! danger "Química y JP2 cruzados = FALLA" + - Li-ion con JP2 en 2-3: flota a 3.50 V, el paquete nunca se llena y la autonomía es de minutos. + - LFP con JP2 en 1-2: el cargador intenta 4.0 V sobre una celda de 3.6 V máx. Sobrecarga. No se embarca. -- [ ] **simpleRTK2B Pro ARD-NNN** en **MOD1**: alinear el pin **"5V"** del zócalo UNO con el pin 5V del - módulo; las cuatro tiras entran a fondo y parejas; **ninguna** clavija queda fuera del zócalo. -- [ ] **Módem 4G NTRIP Master RTK-NNNN** en **J7/J8** (zócalo XBee de 2 mm de la EinarBoard, **no** en el - simpleRTK2B): la silueta del módulo coincide con la serigrafía; pin 1 (VCC) del lado marcado. -- [ ] SIM presente en el módulo 4G (ya verificada en su acta). -- [ ] Nada toca la tapa ni los separadores; los módulos no rozan componentes altos (K1, C10, L6). + Si no coinciden, detén la unidad y avisa a ingeniería. JP2 no se cambia en banco. -## 4. Panel y arnés interno (sin energía) +## 3. Módulos (sin energía) -Conectar contra el pinout; cada JST hace **clic**. +- [ ] simpleRTK2B ARD-NNN en MOD1: pin "5V" del zócalo UNO alineado con el 5V del módulo; las cuatro tiras a fondo, ninguna clavija fuera. +- [ ] Módem RTK-NNNN en J7/J8 de la EinarBoard (no en el simpleRTK2B): silueta sobre la serigrafía, pin 1 (VCC) del lado marcado. +- [ ] SIM puesta. +- [ ] Nada toca la tapa ni los separadores; los módulos no rozan K1, C10 ni L6. -| Conector | Qué se conecta | Verificar | +## 4. Panel y arnés (sin energía) + +Cada JST hace clic. + +| Conector | Qué va | Verifica | |---|---|---| -| **P1** (GX16-5 del panel) | pin 1 = +24 V · pin 2 = GND · pin 3 = ignición · pin 4 = GND | polaridad con multímetro **antes** de conectar al panel | -| **SD-15B-05** | entrada: +24 V/GND del GX16 (empalme en Y) · salida +5 V/GND → **P2** (pin 1 = +5 V) | ajustar salida a **5.0 V** en banco antes de montar | -| **P6** | ventilador (pin 1 = +5V_FAN, pin 2 = retorno) | dirección de flujo: aire **hacia afuera** por la rejilla | -| **P8** | LED de panel (pin 1 = ánodo, pin 2 = cátodo) | LED asoma por el panel | -| **P10** | botón de reset externo | normalmente abierto | -| **P11** | interruptor de corte del panel (2 hilos) | en posición **ON** cierra pin 1–2 | -| **P12** | NTC de punto caliente pegado al módulo 4G o al disipador | con cinta térmica | -| **P4** | **NO conectar todavía** (batería, sección 6) | — | -| Antena **GNSS** | bulkhead SMA del panel → SMA del simpleRTK2B | fijador de rosca, apriete a mano + ¼ vuelta | -| Antenas **LTE (2)** | bulkheads SMA del panel → u.FL del módulo 4G | los u.FL hacen clic; ruta del cable sin dobleces < 10 mm | -| **J10** RJ45 / **P15** RS-485 / **P16** RS-232 | solo si el panel de esta unidad los lleva | tapas ciegas en los que no | +| P1 (GX16-5) | 1 = +24 V · 2 = GND · 3 = ignición · 4 = GND | Polaridad con multímetro antes de conectar | +| SD-15B-05 | Entrada +24 V/GND del GX16 (empalme en Y); salida +5 V/GND → P2 (pin 1 = +5 V) | Salida a 5.0 V en banco antes de montar | +| P6 | Ventilador (1 = +5V_FAN, 2 = retorno) | Aire hacia afuera por la rejilla | +| P8 | LED de panel (1 = ánodo, 2 = cátodo) | Asoma por el panel | +| P10 | Botón de reset | Normalmente abierto | +| P11 | Interruptor de corte (2 hilos) | ON cierra 1–2 | +| P12 | NTC de punto caliente en el módem o el disipador | Cinta térmica | +| P4 | Nada todavía | §6 | +| GNSS | Bulkhead SMA → SMA del simpleRTK2B | Fijador de rosca, a mano + ¼ vuelta | +| LTE (2) | Bulkheads SMA → u.FL del módem | Clic en los u.FL; sin dobleces < 10 mm | +| J10 / P15 / P16 | Solo si el panel los lleva ([conexión](v5-prueba-ethernet-serie.md#conexion-en-la-instalacion)) | Tapas ciegas en los que no | -- [ ] Ningún cable pasa sobre el módulo 4G ni sobre la antena; cables sujetos con bridas al chasis. +- [ ] Ningún cable pasa sobre el módem ni la antena; cables con bridas al chasis. - [ ] Sin conductores expuestos cerca de 24 V (P1, SD-15B). -## 5. Energizado desde 24 V (unidad abierta, sin batería) +## 5. Energizado desde 24 V (abierta, sin batería) -1. Fuente de banco **24.0 V, límite 1.0 A**, salida apagada, conectada al **GX16** del panel (pin 1 = +, pin 2 = −). - Interruptor de corte (P11) en **ON**. USB-C en **J11** conectado a la laptop, terminal serie a 115200. -2. Encender la salida. En los primeros 10 s: +1. Fuente a 24.0 V, límite 1.0 A, salida apagada, al GX16 (pin 1 = +, pin 2 = −). P11 en ON. USB-C de J11 a la laptop, terminal a 115200. +2. Enciende. En los primeros 10 s: -| Punto | Esperado | -|---|---| -| Corriente de la fuente | **< 150 mA** (etapa RTK aún apagada) | -| **D18** verde | Encendido | -| **D17** azul + LED de panel | Parpadean (firmware de bring-up corriendo) | -| Consola | Encabezado `hbox-v5-bringup`, reporte con **12 PASS**, luego `STAT … v5=4.9–5.1` | -| Ventilador | **Gira** (con 24 V presente el buck U2 se enciende solo) | + | Punto | Esperado | + |---|---| + | Corriente | < 150 mA (etapa RTK apagada) | + | D18 | Encendido | + | D17 y LED de panel | Parpadean | + | Consola | Encabezado `hbox-v5-bringup`, 12 PASS, luego `STAT … v5=4.9–5.1` | + | Ventilador | Gira (U2 se enciende solo con 24 V) | -3. Anotar en el acta: `v5` (debe ser 4.8–5.1 V), `tmp102`, `sht40`. -4. **Encender la etapa RTK desde la consola:** teclear **`P`** y confirmar con **`Y`**. El firmware sube - `PWR_CTRL` y reporta `STACK ON`. En los siguientes 60 s: +3. Anota `v5` (4.8–5.1 V), `tmp102` y `sht40`. +4. Enciende la etapa: `P` y confirma con `Y` (`STACK ON`). En 60 s: -| Punto | Esperado | -|---|---| -| Corriente de la fuente | sube a **250–600 mA** (pico corto al registrar el 4G) | -| simpleRTK2B: LED POWER | Encendido | -| 4G: LED de red | Buscando → registrado (< 2 min) | -| Consola, comando **`n`** | Muestra las tramas `$GNGGA` de PA3: **`fix=1`** (GPS) al minuto, **`fix=4`** (RTK FIX) en < 10 min con antena al cielo; `sats ≥ 10` | + | Punto | Esperado | + |---|---| + | Corriente | 250–600 mA (pico corto al registrar el 4G) | + | simpleRTK2B, LED POWER | Encendido | + | Módem, LED de red | Registrado en < 2 min | + | Consola, tecla `n` | Tramas `$GNGGA` de PA3: `fix=1` al minuto, `fix=4` (RTK FIX) en < 10 min con cielo; `sats ≥ 10` | -5. Anotar en el acta el **tiempo hasta `fix=4`** y el número de satélites. -6. Teclear **`P`** de nuevo para **apagar** la etapa RTK. La corriente debe volver a < 150 mA. +5. Anota el tiempo hasta `fix=4` y los satélites. +6. `P` otra vez apaga la etapa; la corriente vuelve a < 150 mA. -> Si `n` no muestra tramas: el simpleRTK2B no está a 115200 en UART1 (volver al acta del módulo RTK: -> configuración Helgen) o MOD1 está corrido un pin. **Apagar antes de tocar nada.** +`n` sin tramas: el simpleRTK2B no está a 115200 en UART1 (configuración Helgen) o MOD1 está corrido un pin. Apaga antes de tocar. ## 6. Batería y respaldo -1. Con la unidad encendida desde 24 V y la etapa RTK **apagada**: conectar el pack en **P4** - (pin 1 = BAT+, pin 2 = GND, pin 3 = NTC). Medir antes con multímetro: **3.0–4.2 V** entre BAT+ y GND. -2. En la consola, `STAT` debe mostrar **`vbat`** con el voltaje del pack y **`chrg`**: `0` = cargando - (el firmware de bring-up mantiene la carga **deshabilitada**, así que `chrg=1` es lo esperado aquí). -3. **Prueba de respaldo:** apagar la salida de la fuente de 24 V. +1. Con 24 V y la etapa apagada, mide el paquete en vacío (rango en §2) y conéctalo en P4 (1 = BAT+, 2 = GND, 3 = NTC). +2. `STAT` muestra `vbat` y `chrg` (`0` = cargando). Con la etapa apagada el firmware no carga: `chrg=1` es lo esperado. +3. Apaga la fuente de 24 V: -| Punto | Esperado | -|---|---| -| D18, D17 y consola | **Siguen vivos** (el LTC4040 conmuta a batería sin reinicio: el encabezado **no** se vuelve a imprimir) | -| `STAT` | `v5=0.0`, `vbat` con el voltaje del pack | -| Ventilador | Se detiene (no hay 24 V) — correcto | + | Punto | Esperado | + |---|---| + | D18, D17 y consola | Siguen vivos; el encabezado no se reimprime (sin reinicio) | + | `STAT` | `v5=0.0`, `vbat` del paquete | + | Ventilador | Se detiene | -4. Volver a encender 24 V: `STAT` vuelve a `v5≈5.0`. Sin reinicio. -5. Anotar: voltaje del pack, "respaldo OK sin reinicio". +4. Enciende 24 V: `v5≈5.0`, sin reinicio. +5. Anota el voltaje del paquete y "respaldo OK sin reinicio". -## 7. Cierre, etiquetado y registro +## 7. Cierre -- [ ] Etiqueta **exterior** `HBOX5-Exx-Axxx-Rxxxx` en el panel, junto al GX16. Etiqueta **interior** en la tapa. -- [ ] Interruptor de corte en **OFF** para almacenar (evita descargar la batería). Anotarlo en la etiqueta interior. -- [ ] Tapa cerrada con su sello; tornillos en cruz; prensaestopas apretados. -- [ ] Acta de ensamble enviada con resultado **APROBADA**. +- [ ] Etiqueta exterior `HBOX5-Exx-Axxx-Rxxxx` junto al GX16; etiqueta interior en la tapa. +- [ ] P11 en OFF para almacenar (no descarga la batería); anótalo en la etiqueta interior. +- [ ] Tapa con su sello, tornillos en cruz, prensaestopas apretados. +- [ ] Acta de ensamble enviada como APROBADA. ---- +Siguiente: [prueba final](v5-prueba-final-unidad.md) y [configuración](v5-configuracion-unidad.md). -## Anexo A — Notas de ingeniería +## Anexo — notas de ingeniería -- **Firmware:** el bring-up **0.2.0** añade el modo de banco (`P` = stack ON/OFF con confirmación, - `n` = monitor NMEA de PA3, 20 s). Mantiene la carga deshabilitada (`CHRG_EN` alto) y K1 liberado. - La unidad ensamblada queda con este firmware hasta que exista el firmware de producción v5 - (rediseño de gestión de batería); se re-flashea por J11 sin abrir el HBOX si J11 queda accesible — - **decidir si J11 asoma por el panel o se deja interno.** -- **Corriente en 24 V:** valores orientativos; los reales se fijan con las primeras tres unidades y - se actualizan aquí (bring-up 0.2.0 imprime `v5` pero no mide corriente). -- **Respaldo sin reinicio** es la prueba del LTC4040 + L6/SW_BAT en la tarjeta real (el EMC audit - marcó `/SW_BAT` 0.3 mm como crítico): si alguna unidad reinicia al cortar 24 V, anotar `vbat` y - temperatura — es evidencia para el respin. -- **Modo B / relevador K1:** no se prueba aquí; K1 queda liberado (camino directo F9P ↔ módem). +- El bring-up 0.2.0 añadió el modo de banco (`P` = etapa ON/OFF con confirmación, `n` = monitor NMEA de PA3 por 20 s) con la carga deshabilitada (`CHRG_EN` alto) y K1 liberado. Desde 0.6.0 el gobernador carga solo con etapa ON en 24 V. Se reflashea por J11 sin abrir el HBOX si J11 queda accesible; pendiente decidir si J11 asoma por el panel. +- Las corrientes en 24 V son orientativas; se fijan con las primeras tres unidades (el firmware imprime `v5` pero no mide corriente). +- El respaldo sin reinicio prueba el LTC4040 + L6/`SW_BAT` (0.3 mm, crítico en la auditoría EMC). Si una unidad reinicia al cortar 24 V, anota `vbat` y temperatura para el respin. +- Modo B / K1 no se prueba aquí; K1 queda liberado (F9P ↔ módem directo). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-17 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme y enlaces al flujo de producción. | +| 1.2 | 2026-09-29 | Edición breve. La regla de química del paquete y JP2 (V5.5 y V5.6) vive aquí, en §2. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-modulos-integracion.md b/docs/procedimientos/v5-modulos-integracion.md index 10c97f9..36cca99 100644 --- a/docs/procedimientos/v5-modulos-integracion.md +++ b/docs/procedimientos/v5-modulos-integracion.md @@ -1,211 +1,155 @@ --- -title: HBOX v5 — Prueba de módulos (simpleRTK2B Pro y 4G NTRIP Master) e integración RTK antes del ensamble +title: "HBOX V5 — Prueba de módulos e integración RTK" tags: [project-drogheda, hardware, hbox, v5, ardusimple, 4g, ntrip, testing, procedimiento] +date: 2026-09-17 project: Project Drogheda author: Helgen Technologies -date: 2026-09-17 -version: 1.0 -status: ACTIVO — se aplica a cada módulo antes de asignarlo a una unidad +version: 1.2 +status: ACTIVO audience: técnicos de banco --- -# HBOX v5 — Prueba de módulos e integración RTK (antes del ensamble) +# HBOX V5 — Prueba de módulos e integración RTK -**Objetivo:** que ningún módulo llegue al ensamble sin haber demostrado que funciona **solo** y **en -pareja**: cada simpleRTK2B Pro obtiene fix GNSS, cada 4G NTRIP Master se registra en la red, y la -pareja RTK + 4G alcanza **RTK FIX** con correcciones NTRIP. Todo queda registrado en las actas -del sitio (`https://drogheda.helgen.online` → Actas). +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: cada simpleRTK2B Pro y cada 4G NTRIP Master antes de asignarlo a una unidad, sin EinarBoard. Paso 2 de producción, entre la [prueba de tarjeta](v5-prueba-y-flasheo.md) y el [ensamble](v5-ensamble.md). + - Tiempo: módulo RTK 10 min · módulo 4G 10 min · integración 15–30 min (depende del cielo). + - Necesitas: laptop con u-center o u-center 2; dos cables USB-C con datos (el simpleRTK2B tiene dos puertos: POWER+GPS y XBEE); antena GNSS multibanda SMA con vista al cielo; dos antenas LTE (u.FL → SMA); una nano-SIM Telcel activa por módem; de ingeniería, la configuración F9P (`.txt` de u-center) y `4G_NTRIP_HelgenSRV-NMEA.local.txt` con credenciales (no se copia a otras máquinas); etiquetas ARD-NNN y RTK-NNNN, bolsas antiestáticas; actas [ArduSimple](../formularios/ardusimple.html), [módem 4G](../formularios/modem4g.html) e [integración](../formularios/integracion.html). -**Duración estimada:** módulo RTK 10 min · módulo 4G 10 min · integración 15–30 min (depende del cielo). +!!! warning "Reglas" + 1. Un acta por módulo, con su serie (ARD-010, RTK-0006…), nunca por lote. + 2. Sin EinarBoard: el simpleRTK2B se alimenta por su USB y el módem va en el zócalo XBee del simpleRTK2B. + 3. Conecta las antenas antes de energizar. Un transmisor LTE sin antena se puede dañar. -> ⛔ **REGLA 1 — Un acta por módulo, con su número de serie.** No se prueba "un lote"; se prueba -> RTK-010, 4G-006, uno por uno. -> -> ⛔ **REGLA 2 — Sin EinarBoard en estas pruebas.** El simpleRTK2B se alimenta por su propio USB y el -> módulo 4G va en el zócalo XBee del simpleRTK2B. La tarjeta EinarBoard entra hasta el ensamble. -> -> ⛔ **REGLA 3 — Antenas siempre conectadas antes de energizar** el módulo 4G y el receptor GNSS. -> Un transmisor LTE sin antena se puede dañar. +## 0. Números de serie ---- +| Pieza | Etiqueta | Dónde va | +|---|---|---| +| EinarBoard V5 | V5-01 … V5-15 (30 seleccionables) | Cerca de MH4 (puesta en la prueba de tarjeta) | +| simpleRTK2B Pro (ArduSimple) | ARD-001 … ARD-030 | Blindaje del ZED-F9P, sin tapar SMA ni zócalo XBee | +| 4G NTRIP Master (módem) | RTK-0001 … RTK-0030 (serie hasta RTK-1000) | Blindaje del módem, sin tapar los u.FL | +| Unidad HBOX | HBOX5-E07-A010-R0006 (la calcula el acta de ensamble) | Panel exterior | -## 0. Identidad de cada pieza (números de serie) +El número de unidad sale de sus tres módulos: `E07` = V5-07, `A010` = ARD-010, `R0006` = RTK-0006. "RTK-" es el módem 4G, no el receptor GNSS. Los números no tienen que coincidir: en el acta de ensamble eliges qué módulo aprobado va en cada unidad. -| Pieza | Etiqueta | Rango | Dónde va la etiqueta | -|---|---|---|---| -| EinarBoard v5 | **V5-01 … V5-15** (30 seleccionables) | lote JLC 22-Ago | esquina cerca de MH4 (ya puesta en la prueba de tarjeta) | -| simpleRTK2B Pro (ArduSimple) | **ARD-001 … ARD-030** | consecutivo de 3 dígitos | sobre el blindaje del ZED-F9P, sin tapar el conector SMA ni el zócalo XBee | -| 4G NTRIP Master (módem) | **RTK-0001 … RTK-0030** | consecutivo de 4 dígitos (serie hasta RTK-1000) | sobre el blindaje del módem, sin tapar los conectores u.FL de antena | -| Unidad HBOX (ensamblada) | **HBOX5-E07-A010-R0006** | se calcula sola en el acta de ensamble | panel exterior del HBOX | +En cada acta anota también la etiqueta de fábrica de ArduSimple y, en el módem, IMEI e ICCID de la SIM. -El número de la unidad **se arma con los tres módulos que lleva dentro**: `E07` = EinarBoard V5-07, -`A010` = ArduSimple ARD-010, `R0006` = módem 4G RTK-0006. **Ojo:** la etiqueta "RTK-" es la del **módem 4G**, no la del receptor GNSS. No hace falta que los números coincidan entre sí: el técnico -**selecciona** en el acta de ensamble qué módulo (ya aprobado) va en qué unidad, y el sitio compone el -número. Así, con solo leer la etiqueta del HBOX se sabe qué hay dentro. +## 1. simpleRTK2B Pro — acta ArduSimple -Anota también en cada acta la **etiqueta de fábrica** del módulo (el código que trae impreso -ArduSimple) y, en el 4G, el **IMEI** y el **ICCID de la SIM**. Es lo que después permite rastrear un -módulo en la plataforma. +### 1a. Inspección (sin energía) ---- +- [ ] Etiqueta ARD-NNN puesta; etiqueta de fábrica anotada. +- [ ] Pines del zócalo XBee (2 × 10) rectos; SMA firme; sin componentes golpeados. +- [ ] Tira tipo Arduino (entra en MOD1) recta y completa. -## 1. Material +### 1b. Fix GNSS -| Cant. | Ítem | -|---|---| -| 1 | Laptop con **u-center** (u-blox, Windows) o **u-center 2** | -| 2 | Cables USB-C **con datos** (el simpleRTK2B Pro tiene dos puertos USB: **POWER+GPS** y **XBEE**) | -| 1 | Antena GNSS multibanda (SMA) con vista al cielo (ventana con cielo abierto o exterior) | -| 2 | Antenas LTE (u.FL → SMA pigtail según el módulo) | -| 1 | SIM Telcel activa (nano-SIM) por módulo 4G | -| 1 | Archivo de configuración del **ZED-F9P** de Helgen (u-center `.txt`) — lo entrega ingeniería | -| 1 | Archivo de configuración del **4G NTRIP Master** con credenciales reales (`4G_NTRIP_HelgenSRV-NMEA.local.txt`) — lo entrega ingeniería, **no** se copia a otras máquinas | -| — | Etiquetas ARD-NNN (ArduSimple) y RTK-NNNN (módem 4G), marcador, bolsas antiestáticas | +1. Antena GNSS al SMA, con vista al cielo. +2. USB-C POWER+GPS a la laptop. +3. Verifica: ---- + | Punto | Esperado | + |---|---| + | LED POWER | Encendido | + | Laptop | Puerto serie u-blox GNSS receiver | + | u-center → Receiver → Connect | Fix Mode de *No Fix* a 3D en < 2 min a cielo abierto | + | Satélites en uso | ≥ 10 | + | LED GPS FIX | Parpadea con fix | -## 2. Módulo simpleRTK2B Pro (ArduSimple) — acta **"Módulo ArduSimple"** +4. Anota en el acta: firmware del ZED-F9P (View → Messages → UBX-MON-VER), satélites y tiempo al primer fix. -### 2a. Inspección visual (sin energía) +Sin fix en 5 min a cielo abierto: prueba otra antena antes de marcar FALLA. -- [ ] Etiqueta **ARD-NNN** puesta y legible; anotar también la etiqueta de fábrica. -- [ ] Pines del zócalo **XBee** (2 hileras de 10) rectos; conector **SMA** firme; sin componentes golpeados. -- [ ] Pines de la tira tipo Arduino (los que entran en MOD1 de la EinarBoard) rectos y completos. +### 1c. Configuración Helgen -### 2b. Energizado y fix GNSS +1. Tools → Receiver Configuration → Load configuration → archivo F9P de Helgen → Transfer file → GNSS. +2. UBX-CFG-CFG → Save current configuration (todas las memorias) → Send. +3. Desconecta y reconecta el USB. Conecta u-center a 115200: debe seguir con fix y `$GNGGA`. -1. Conectar la **antena GNSS** al SMA. Colocarla con vista al cielo. -2. Conectar el USB-C **POWER+GPS** a la laptop. -3. Verificar: +- [ ] Configuración guardada; sobrevive al reinicio. + +## 2. Módem 4G NTRIP Master — acta módem 4G + +### 2a. Inspección (sin energía) + +- [ ] Etiqueta RTK-NNNN puesta; IMEI (etiqueta del módem) e ICCID (SIM) anotados. +- [ ] SIM insertada en la dirección correcta, con clic. +- [ ] Pines XBee (2 × 10, paso 2 mm) rectos; u.FL sin daño. + +### 2b. Montaje y configuración + +1. Sin energía, inserta el módem en el zócalo XBee del simpleRTK2B. La silueta indica la orientación; no fuerces. +2. Dos antenas LTE a los u.FL; antena GNSS al SMA. +3. Conecta USB POWER+GPS (alimenta todo) y USB XBEE (configuración del módem). +4. Terminal serie en el puerto XBEE a 115200 baud. Envía línea por línea las líneas `$$$AS+…` de `4G_NTRIP_HelgenSRV-NMEA.local.txt`. Cada una contesta `OK` o el eco de ArduSimple. +5. `$$$AS+I=1111` para entrar a configuración; `$$$AS+K=…` con el ID de estación que indique ingeniería. + +- [ ] Configuración completa, sin `ERROR`. +- [ ] ID de estación (`AS+K`) anotado. + +### 2c. Registro en la red (hasta 2 min) | Punto | Esperado | |---|---| -| LED **POWER** | Encendido | -| Laptop | Aparece un puerto serie (u-blox GNSS receiver) | -| u-center → Receiver → Connect | Conecta; **Fix Mode** pasa de *No Fix* a **3D** en < 2 min a cielo abierto | -| Satélites en uso | **≥ 10** (cielo abierto) | -| LED **GPS FIX** | Parpadea cuando hay fix | +| LED de red 4G | De parpadeo rápido (buscando) a lento o fijo (registrado) | +| Comando de estado de ArduSimple por XBEE | Operador Telcel y RSSI | -4. Anotar en el acta: **versión de firmware** del ZED-F9P (u-center → View → Messages → UBX-MON-VER), - satélites en uso, y el tiempo hasta el primer fix. +- [ ] Registrado en Telcel; RSSI anotado si lo reporta. -### 2c. Cargar la configuración de Helgen +Sin registro en 3 min: prueba la SIM en otro módem aprobado. Si la SIM funciona allí y este no registra: FALLA (4G). -1. u-center → **Tools → Receiver Configuration** → *Load configuration* → archivo F9P de Helgen → - **Transfer file → GNSS**. -2. Guardar en el receptor: **UBX-CFG-CFG → Save current configuration** (todas las memorias) → Send. -3. Desconectar y reconectar el USB. Volver a conectar en u-center a la **velocidad configurada por Helgen - (115200)**. Debe seguir mostrando fix y mensajes `$GNGGA`. +## 3. Integración ArduSimple + 4G — acta de integración -- [ ] Configuración cargada y guardada; sobrevive al reinicio. +Se prueba la pareja que irá junta (ARD-NNN + RTK-NNNN); el mismo par se elige en el ensamble. Montaje igual que 2b; el USB XBEE puede quedar conectado para ver mensajes. -> Si el módulo no da fix en 5 min a cielo abierto, probar con otra antena antes de marcarlo FALLA. - ---- - -## 3. Módem 4G NTRIP Master — acta **"Módem 4G"** - -### 3a. Inspección visual (sin energía) - -- [ ] Etiqueta **RTK-NNNN** puesta; anotar **IMEI** (etiqueta del módem) e **ICCID** (tarjeta SIM). -- [ ] **SIM insertada** en la dirección correcta, con clic. -- [ ] Pines XBee (2 × 10, paso 2 mm) rectos; conectores **u.FL** de antena sin daño. - -### 3b. Montaje sobre el simpleRTK2B y configuración - -1. **Sin energía**, insertar el módulo 4G en el zócalo **XBee del simpleRTK2B Pro** (el módulo queda - sobre el receptor; el corte de la silueta indica la orientación — nunca forzar). -2. Conectar las **2 antenas LTE** a los u.FL del módulo. -3. Conectar la antena GNSS. Conectar el USB **POWER+GPS** (alimenta todo) **y** el USB **XBEE** (puerto de - configuración del módem). -4. En la laptop abrir un terminal serie en el puerto **XBEE** a **115200 baud** y enviar, línea por línea, - el archivo `4G_NTRIP_HelgenSRV-NMEA.local.txt` (solo las líneas `$$$AS+…`). Cada línea debe contestar - `OK` (o el eco de ArduSimple). -5. Al terminar: `$$$AS+I=1111` para entrar a config y **`$$$AS+K=…`** debe llevar el **ID de estación** - que indique ingeniería para este módulo (se anota en el acta). - -- [ ] Configuración enviada completa, sin líneas con `ERROR`. -- [ ] ID de estación (`AS+K`) anotado en el acta. - -### 3c. Registro en la red - -Esperar hasta 2 min con las antenas LTE conectadas: - -| Punto | Esperado | -|---|---| -| LED de **red / 4G** del módulo | Pasa de parpadeo rápido (buscando) a **parpadeo lento o fijo** (registrado) | -| Consulta de estado por el puerto XBEE (comando de estado de ArduSimple) | Reporta operador **Telcel** y señal (RSSI) | - -- [ ] Registrado en la red Telcel. Anotar RSSI si el módulo lo reporta. - -> Sin registro en 3 min: revisar que la SIM esté activa (probar la SIM en otro módulo aprobado). Si -> la SIM funciona en otro módulo y este no registra → **FALLA (4G)**. - ---- - -## 4. Integración ArduSimple + 4G — acta **"Integración"** - -Se hace con la **pareja** que después irá junta en una unidad (ARD-NNN + RTK-NNNN). El acta registra -los dos números; el mismo par se seleccionará en el ensamble. - -Montaje: el mismo del punto 3b (4G sobre el simpleRTK2B, dos antenas LTE, antena GNSS al cielo, USB -POWER+GPS conectado; el USB XBEE puede quedar conectado para ver mensajes). - -1. u-center conectado al puerto **POWER+GPS** (115200). Esperar fix **3D**. -2. Observar el LED **NO RTK** del simpleRTK2B: encendido = sin correcciones; **parpadeando = RTK FLOAT**; - **apagado = RTK FIX**. -3. En u-center: **Fix Mode** debe llegar a **3D/DGNSS/FIXED** (RTK fixed). Tiempo típico a cielo abierto: - 1–5 min tras el registro 4G. +1. u-center en POWER+GPS (115200). Espera fix 3D. +2. LED NO RTK del simpleRTK2B: encendido = sin correcciones; parpadea = RTK FLOAT; apagado = RTK FIX. +3. Fix Mode debe llegar a 3D/DGNSS/FIXED, típicamente 1–5 min después del registro 4G. | Punto | Esperado | Anotar | |---|---|---| -| Tiempo desde encendido hasta **RTK FIX** | < 10 min | minutos | -| Fix Mode en u-center | 3D/DGNSS/**FIXED** | — | +| Encendido → RTK FIX | < 10 min | minutos | +| Fix Mode | 3D/DGNSS/FIXED | — | | Satélites en uso | ≥ 10 | número | -| Precisión estimada (u-center, hAcc) | < 0.05 m en FIX | metros | -| Estabilidad | Se mantiene FIXED **5 min** sin caer a FLOAT (con la antena quieta) | sí/no | -| Plataforma Helgen | Ingeniería confirma que la estación (ID `AS+K`) aparece reportando en el servidor | sí/no | +| hAcc | < 0.05 m en FIX | metros | +| Estabilidad | FIXED 5 min sin caer a FLOAT, antena quieta | sí/no | +| Plataforma | Ingeniería ve la estación (`AS+K`) reportando | sí/no | -- [ ] RTK FIX alcanzado y estable 5 min. -- [ ] Confirmado en plataforma (o anotado "pendiente de confirmar" con hora). +- [ ] RTK FIX estable 5 min. +- [ ] Confirmado en plataforma, o "pendiente" con hora. -> **Si llega a FLOAT pero nunca a FIX:** cielo insuficiente (probar exterior) o punto de montaje -> incorrecto; no es falla del módulo si el módulo 4G ya registró y hay correcciones (LED NO RTK -> parpadea). Si **nunca sale de "encendido"** (sin correcciones): revisar credenciales NTRIP con -> ingeniería antes de marcar FALLA. +FLOAT sin llegar a FIX con el LED NO RTK parpadeando: falta cielo (prueba en exterior) o el mountpoint está mal; no es falla del módulo. LED NO RTK siempre encendido (sin correcciones): revisa credenciales NTRIP con ingeniería antes de marcar FALLA. -### 4b. Cierre +### Cierre -- [ ] Apagar (desconectar USB). Separar el módulo 4G del simpleRTK2B **con cuidado, sin doblar pines**. -- [ ] Guardar cada módulo en su bolsa con su etiqueta. Anotar en la bolsa del ArduSimple: "pareja: RTK-NNNN". -- [ ] Enviar el acta de integración con los dos números. +- [ ] Desconecta el USB. Separa el módem del simpleRTK2B sin doblar pines. +- [ ] Cada módulo en su bolsa con su etiqueta; en la del ArduSimple anota "pareja: RTK-NNNN". +- [ ] Envía el acta de integración. ---- +## 4. Criterio de aprobado -## 5. Hoja rápida de estados (para el técnico) - -| Módulo | Aprobado cuando… | +| Módulo | Aprobado cuando | |---|---| -| ARD-NNN | fix 3D, ≥10 sat, configuración Helgen cargada y guardada | -| RTK-NNNN (módem) | SIM registrada en Telcel, configuración enviada sin errores, `AS+K` anotado | -| Pareja ArduSimple + 4G | RTK FIX estable 5 min con correcciones por 4G | +| ARD-NNN | Fix 3D, ≥ 10 satélites, configuración Helgen guardada | +| RTK-NNNN | Registrado en Telcel, configuración sin errores, `AS+K` anotado | +| Pareja | RTK FIX estable 5 min con correcciones por 4G | -Un módulo con **FALLA** no se asigna a ninguna unidad: el acta de ensamble no lo dejará seleccionar. +El acta de ensamble no deja seleccionar un módulo con FALLA. Parámetros del módem y configuración F9P: [Descargas](../descargas/index.md). Configuración final de la unidad: [Configuración de la unidad](v5-configuracion-unidad.md). ---- +## Anexo — notas de ingeniería -## Anexo A — Notas de ingeniería +- En la unidad V5 el módem va en J7/J8 de la EinarBoard (mismo footprint XBee), no sobre el simpleRTK2B. El enlace F9P ↔ módem pasa por K1; con K1 liberado (`BYP_CTRL` bajo, estado por defecto) el camino es directo. Por eso la integración se prueba sobre el simpleRTK2B: misma electrónica, sin depender del firmware de la EinarBoard. +- F9P: UART1 a 115200 (lo lee la EinarBoard en PA3/PA2) y UART2 a la velocidad del módem (`AS+B=115200`). El `.txt` del F9P no está en el repo; falta añadirlo a `04-Source-Code/rtk-config/` (sin secretos). +- `AS+K` es la identidad en el servidor secundario (`AS+r/AS+h`). Pendiente decidir si es el número del módem (R0006) o el de la unidad; mientras, el acta lo guarda como texto libre. +- Credenciales (APN, NTRIP) solo en `…local.txt` en la laptop de banco; nunca en git ni en el sitio. -- En la **unidad v5** el módulo 4G **no** va sobre el simpleRTK2B: va en el zócalo **J7/J8** de la - EinarBoard (mismo footprint XBee). El enlace F9P ↔ módem pasa por el relevador **K1**; con K1 - liberado (estado por defecto del firmware, `BYP_CTRL` bajo) el camino es directo. Por eso la - prueba de integración se hace con el módulo montado en el simpleRTK2B (misma electrónica, sin - depender del firmware de la EinarBoard). -- Configuración F9P: UART1 a **115200** (es lo que lee la EinarBoard en PA3/PA2) y UART2 a la - velocidad del módem (`AS+B=115200`). El archivo `.txt` del F9P **no está en el repo** — hay que - añadirlo a `04-Source-Code/rtk-config/` (sin secretos) para que este procedimiento sea reproducible. -- El ID de estación `AS+K` es la identidad de la unidad en el servidor secundario (`AS+r/AS+h`). - Decisión pendiente: `AS+K` = número del módem 4G (R0006) o número de unidad. Mientras se decide, - el acta lo registra como texto libre. -- Las credenciales (APN, NTRIP) viven solo en `…local.txt` en la laptop de banco. Nunca en git ni en - el sitio. +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-17 | Primera versión. | +| 1.1 | 2026-09-29 | Encabezado uniforme, enlaces a actas, descargas y configuración. | +| 1.2 | 2026-09-29 | Edición breve: material dentro del encabezado; secciones renumeradas. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-prueba-ethernet-serie.md b/docs/procedimientos/v5-prueba-ethernet-serie.md new file mode 100644 index 0000000..1dfc06a --- /dev/null +++ b/docs/procedimientos/v5-prueba-ethernet-serie.md @@ -0,0 +1,195 @@ +--- +title: "HBOX V5 — Prueba de banco: Ethernet y puertos serie" +tags: [project-drogheda, hardware, hbox, v5, v5.6, ethernet, w5500, rs485, rs232, sc16is752, testing, procedimiento] +project: Project Drogheda +author: Helgen Technologies +date: 2026-09-29 +version: 1.1 +status: ACTIVO — obligatoria en al menos una V5.5 antes de pedir la V5.6; después, en toda unidad con RJ45 o clemas serie +audience: técnicos de banco +--- + +# HBOX V5 — Prueba de banco: Ethernet y puertos serie + +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: al menos una V5.5 antes de pedir la V5.6 (Ethernet nunca se había probado en tarjeta real y la V5.6 copia el bloque); después, toda unidad V5.5/V5.6 con RJ45 o clemas serie en el panel, dentro de la [configuración de la unidad](v5-configuracion-unidad.md). + - Tiempo: Ethernet 15 min · serie 15 min. + - Necesitas: unidad V5 ensamblada (o tarjeta + simpleRTK2B para ver NMEA); 24 V al GX16 (o 5.3 V / 3 A en P2); laptop con terminal serie a 115200 grabando y `nc` (macOS/Linux) o `ncat` (Windows); binario de banco `hbox-v5-bringup_0.6.0-eth.bin` (lo compila ingeniería con `-DENABLE_ETH=1` y entrega su SHA-256) ; cable Ethernet directo cat 5e de 1–3 m (el W5500 hace Auto-MDIX); adaptadores USB-RS485 y USB-RS232 (DB9 macho) con 3 cables con puntera; multímetro; desarmador plano 2.5 mm; [acta Ethernet y puertos serie](../formularios/ethernet-serie.html). + +!!! warning "Reglas" + 1. Nunca pruebes Ethernet solo en batería ni solo por USB: el W5500 cuelga de `3V3_ETH`, que sale del 5 V del sistema. Sin 5 V el firmware lo deja en reset. + 2. 5 V del sistema ≥ 5.2 V (SD-15B o fuente a ~5.3 V). Con menos, la ráfaga LTE lleva el riel al PFI 4.60 V del LTC4040 y la tarjeta se reinicia. + 3. Con fuente de banco en P2 y sin 24 V, sin paquete de batería. Lo normal: 24 V al GX16 y el SD-15B interno. + +## A. Ethernet (build `0.6.0-eth`) + +### A1. Laptop (una vez) + +1. Adaptador Ethernet en IP manual 192.168.7.1, máscara 255.255.255.0, sin gateway. Con un switch con DHCP la unidad toma IP del DHCP pero sigue buscando el servidor en 192.168.7.1; usa cable directo. +2. Firewall: permite entradas a 5010/TCP o desactívalo durante la prueba. +3. Deja escuchando: + + ```bash + nc -lk 5010 # macOS / Linux + ncat -lk 5010 # Windows (Nmap) + ``` + +### A2. Flasheo del build de banco + +1. DFU por J11, solo USB, sin 24 V ([flasheo §5](v5-prueba-y-flasheo.md#5-flasheo-por-usb-dfu-j11-5-min)). +2. `dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.6.0-eth.bin` o STM32CubeProgrammer. +3. Terminal en J11: primera línea `hbox-v5-bringup 0.6.0-eth`; la ayuda (`h`) lista `E=Ethernet on/off`. + +El build `-eth` es solo de banco: al terminar reflashea `hbox-v5-bringup_0.6.0.bin` (ver C). + +### A3. Secuencia + +1. Cable entre J10 y la laptop. Sin 24 V los LEDs de J10 quedan apagados (correcto: el USB no alimenta el W5500). +2. Energiza 24 V + ignición (P11 en ON). En los primeros ~15 s: + + | Paso | Consola | Significa | + |---|---|---| + | a | `>>> BOARD OK` · `EVT … STACK ON reason=auto` | Tarjeta y etapa bien | + | b | `EVT ETH W5500 OK en SPI2 (W5500) mac=02:48:42:xx:xx:xx ip_estatica=192.168.7.2 — esperando cable` | El chip responde (`$PHEV … ETH_HW,ok`) | + | c | LED de enlace de J10 encendido, actividad parpadea | PHY con enlace | + | d | `EVT ETH sin DHCP en 4 s -> IP estatica` (directo) o `ETH enlace ARRIBA ip= (DHCP)` (switch) | Dirección obtenida | + | e | `EVT ETH enlace ARRIBA ip=192.168.7.2 (estatica) gw=… -> servidor 192.168.7.1:5010` | Listo para conectar | + | f | `EVT ETH conectado a 192.168.7.1:5010 (n=1): NMEA + $PHLG + $PHEV en espejo` | Socket abierto | + +3. En `nc` llega primero la identidad y luego el flujo. `$PHID` se repite cada 5 min; con la etapa apagada o sin simpleRTK2B solo llegan `$PHLG`/`$PHEV`. + + ``` + $PHID,,0.6.0-eth,EinarBoard v5 (HBOX v5),02:48:42:xx:xx:xx,*CS + $PHLG,0.6.0-eth,RUN,… + $GNGGA,… + $GNRMC,… + ``` + +4. `s`: `STAT … eth=CONECTADO ip=192.168.7.2 lineas=N bytes=… drop=0 conn=1`. `lineas` sube; `drop` queda en 0. +5. Cable: desconecta el RJ45 10 s → `EVT ETH cable desconectado — esperando enlace`; al reconectar, `enlace ARRIBA` y `conectado (n=2)` en < 10 s. +6. Servidor: cierra `nc` (Ctrl-C) → `EVT ETH servidor desconectado … reintento en 5 s`; relanza `nc -lk 5010` y reconecta solo. +7. Tecla `E` → `ETH OFF (operador)`, LEDs de J10 apagados; `E` otra vez repite b–f. +8. Sin 5 V: quita los 24 V con batería puesta → `EVT ETH OFF (sin_5V): W5500 en reset` y `eth=off`. Al volver los 24 V, reset del MCU (0.5.9+) y la secuencia completa. +9. Guarda el log de consola y la captura de `nc` (`nc -lk 5010 | tee H00xx_eth.txt`) para el acta. + +### A4. Aceptación + +| Criterio | Pasa si | +|---|---| +| Hardware | `ETH W5500 OK en SPI2` en cada arranque con 5 V, nunca `NO responde` | +| Enlace | LED de enlace ON con cable; `enlace ARRIBA` < 10 s tras conectar | +| Dirección | Toma DHCP si hay servidor; si no, 192.168.7.2 en ≤ 5 s | +| Espejo | `$PHID` primero; NMEA + `$PHLG` continuos ≥ 5 min; `drop=0` | +| Recuperación | Cable y servidor se recuperan solos en < 10 s | +| No interferencia | Con Ethernet conectado: `modoB=ON`, `phlg_aire` sube, el monitor ve la unidad por 4G, `v5min ≥ 4.9` | + +### A5. Fallas + +| Síntoma | Revisa | +|---|---| +| `EVT ETH W5500 NO responde en SPI2 … — 3V3_ETH? U11? reintento en 10 s` (`$PHEV … ETH_HW,fail`) | `3V3_ETH` (salida de U12 / J10 pin 4 TCT) = 3.3 V. Con 0 V: U12 o su enable, `SYS5V` (¿P11 cerrado?). Con 3.3 V: SPI2 (PB12 CS, PB13 SCK, PB14 MISO, PB15 MOSI) y RST en PA15 (en V5.5 flota sin pull-down; V5.6 lleva R112 4.7 k), cristal Y1 25 MHz, soldadura de U11 (QFN 48) | +| `W5500 OK` pero nunca `enlace ARRIBA` | Otro cable; adaptador de la laptop activo; J10 (pines doblados; el HR911105A trae los magnéticos dentro y un golpe los rompe); pares J10 1-2 / 3-6 | +| `enlace ARRIBA` sin `conectado` (`eth=buscando_srv`) | IP de la laptop ≠ 192.168.7.1/24, `nc` sin escuchar, firewall, dos adaptadores en la misma subred | +| `conectado` sin datos en `nc` o `drop` sube | `nc` sin `-k` se cerró tras el primer cliente; terminal congelada | +| Reinicio al conectar Ethernet | `v5min` < 4.6: SD-15B o fuente (regla 2) | +| Bien con cable directo, mal con switch | DHCP en otra subred y servidor fijo en 192.168.7.1: usa cable directo o pide build con `-DETH_SERVER_IP=` | + +## B. Puertos serie (P15 RS-485, P16 RS-232) + +### B0. Qué prueba cada firmware + +| Firmware | Prueba | Secciones | +|---|---|---| +| 0.6.0 / 0.6.0-eth | Presencia del SC16IS752 y niveles estáticos | B1, B2 | +| 0.6.1 (planeado) | Lazo interno y eco externo a 9600 8N1 | B3, B4 | + +### B1. Presencia (0.6.x) + +Tarjeta energizada (USB basta). Teclea `r` y busca: + +``` +[PASS] I2C SC16IS752 U10 @0x4D ACK +[PASS] SC16IS752 0x4D ACK, SPR rd=0xA5 (exp A5), LSR=0x60 +``` + +`[FAIL] … no ACK at 0x4D`: U10 sin alimentación, soldadura o dirección (A0, A1 a GND). `SPR rd=` ≠ `A5`: U10 dañado o Y2 no oscila (marcado `3.6864`). + +### B2. Niveles estáticos (0.6.x, sin nada en las clemas) + +| Punto (negro a P15.3 / P16.3) | Esperado | Si no | +|---|---|---| +| P16.1 (TX RS-232) | −5 a −6.5 V (reposo del MAX3232) | ≈ 0 V: U15 sin 3V3 o bomba de carga muerta; ≈ +5 V: T1IN bajo = U10 en reset | +| P16.2 (RX RS-232) | ≈ 0 V (pull-down interno de R1IN) | — | +| P15.1 (A) y P15.2 (B) a GND | Ambas 1–3 V | Ambas 0 V con 3V3 presente: U14 sin VCC | +| P15.1 – P15.2 con JP5 cerrado | 0 V ± 0.2 (driver desactivado, línea terminada) | ≈ 0 con JP5 abierto también es normal | +| Ohms P15.1–P15.2, tarjeta apagada | JP5 abierto > 10 kΩ · cerrado ≈ 120 Ω (R82) | — | + +### B3. Lazo interno (0.6.1) + +No cablees P15 con P16: son eléctricamente distintos. El lazo de 0.6.1 une TX→RX de cada canal dentro del SC16IS752 (MCR bit 4), sin cable: tecla de consola de 0.6.1 → `[PASS] SER_LOOP_A` / `[PASS] SER_LOOP_B`. Prueba U10 y el cristal, no los transceptores ni las clemas. + +### B4. Eco externo con adaptadores (0.6.1, 9600 8N1) + +En modo eco, lo que entra por un puerto sale por el mismo. + +RS-485 (P15): + +1. JP5 según la [regla de terminación](#conexion-en-la-instalacion). En banco, bus de dos nodos: ciérralo solo si el adaptador también termina. Anota la posición. +2. A → P15.1, B → P15.2, GND → P15.3. Par trenzado, ≤ 3 m. +3. Terminal en el adaptador a 9600 8N1, sin eco local. Envía `HELGEN-485 0123456789\r\n` diez veces (o 1 kB). +4. Pasa con 10/10 líneas idénticas. +5. Sin respuesta: intercambia A y B (muchos adaptadores rotulan D+/D− al revés); si sigue, vuelve a B2. + +RS-232 (P16): + +1. Cable de 3 hilos: P16.1 TX → DB9 pin 2 (RXD) · P16.2 RX → DB9 pin 3 (TXD) · P16.3 GND → DB9 pin 5. Sin control de flujo. +2. Terminal a 9600 8N1. Envía `HELGEN-232 0123456789\r\n` diez veces. +3. Pasa con 10/10 idénticas. Basura o nada: invierte pines 2↔3 y revisa B2. + +### B5. Aceptación + +| Prueba | Pasa si | Firmware | +|---|---|---| +| Presencia U10 | `[PASS] SC16IS752 … SPR rd=0xA5` | 0.6.0+ | +| Niveles RS-232 | P16.1 en −5…−6.5 V en reposo | 0.6.0+ | +| Niveles RS-485 | A y B con nivel (no 0/0); 120 Ω A-B solo con JP5 cerrado | 0.6.0+ | +| Lazo interno | `SER_LOOP_A` y `SER_LOOP_B` en PASS | 0.6.1 | +| Eco RS-485 / RS-232 | 10/10 idénticas a 9600 8N1 | 0.6.1 | + +Sin 0.6.1 el resultado se registra como "presencia + niveles OK". Basta para ordenar la V5.6 (el bloque serie no cambia). El eco se agrega al mismo acta cuando salga 0.6.1. + +## Conexión en la instalación + +| Conector | Pin 1 | Pin 2 | Pin 3 | Notas | +|---|---|---|---|---| +| P15 RS-485 | A | B | GND | Semidúplex, 2 hilos. JP5 = terminación 120 Ω (R82) entre A y B | +| P16 RS-232 | TX (sale) | RX (entra) | GND | ±5 V (MAX3232). El HBOX es DTE | + +- JP5 (puente de soldadura, abierto de fábrica): un bus RS-485 se termina solo en sus dos extremos. Ciérralo solo si el HBOX es un extremo; en un bus de dos nodos se cierran los dos; nunca en un nodo intermedio. +- RS-232 contra otro DTE (laptop, PLC con DB9 macho): cruzado como en B4. Contra un DCE (módem, DB9 hembra): directo. +- Clemas Phoenix MC 1,5 de 3 vías (paso 3.5 mm): alambre 0.2–1.5 mm² (AWG 24–16), pelado 7 mm, sin estañar (o con puntera). RS-485 en par trenzado con GND en el mismo cable. +- No hay PoE (J10 pines 7/8 sin conectar): la unidad sigue necesitando 24 V. + +## C. Cierre + +- [ ] Si la unidad se embarca, reflashea `hbox-v5-bringup_0.6.0.bin` y anótalo en el [acta de reflasheo](../formularios/reflasheo.html). +- [ ] Retira cable y adaptadores; tapas ciegas en J10/P15/P16 que el panel no use. +- [ ] Envía el [acta Ethernet y puertos serie](../formularios/ethernet-serie.html) con los dos logs. + +## Anexo — notas de ingeniería + +- `ethService()`: `RST` alto → 150 ms → `Ethernet.begin` estático (prueba el chip y lee el PHY) → con cable, DHCP con 4 s (K1 liberado mientras, `relayDisengage("eth_dhcp")`) o estática → `connect()` con timeout 300 ms, reintento 5 s. Escrituras no bloqueantes (`availableForWrite`); descartes en `drop=`. MAC `02:48:42:` + hash del UID. Eventos en banda: `ETH_HW`, `ETH_UP`, `ETH_LINK`, `ETH_CONN`, `ETH_DISC`, `ETH_OFF`. +- Defaults del build: DHCP, y si no hay respuesta en 4 s estática 192.168.7.2/24 (`-DETH_DHCP=0`, `-DETH_IP=192,168,1,50`); servidor 192.168.7.1:5010, reintento 5 s (`-DETH_SERVER_IP=`, `-DETH_SERVER_PORT=`); activo solo con 5 V, nunca en batería ni por USB. IP y servidor son banderas de compilación: otro valor = otro `.bin` de ingeniería. No hay build de campo con Ethernet y el servidor htracker no escucha el espejo; la unidad reporta por 4G. +- V5.6 añade R112 4.7 k pull-down en `ETH_RST` (PA15) y C90 4.7 µF / C91 10 nF. `W5500 NO responde` intermitente en V5.5: sospecha PA15 flotando antes de que el firmware tome el pin. +- SC16IS752: 0x4D (A1 = A0 = GND, I²C), IRQ en PB8 (R81 10 k), Y2 3.6864 MHz (`XTAL_FREQ 3686400` → 9600 = divisor 24). Canal A → U14 SP3485 (DE y ~RE unidos en `SER_DEA`); canal B → U15 MAX3232 (canal 2 sin usar: T2IN y R2IN a GND). En 0.6.0 no hay tráfico de aplicación y el protocolo con el equipo del cliente está por definir. +- Netlist V5.6 (`p5ntc-after.xml`): P15.1 `RS485_A`, P15.2 `RS485_B`, P15.3 GND; JP5.1 `RS485_T` (R82 120 Ω → A), JP5.2 `RS485_B`; P16.1 `RS232_TX` (T1OUT), P16.2 `RS232_RX` (R1IN), P16.3 GND; J10 1/2 TX±, 3/6 RX±, 4 TCT (3V3_ETH), 5 RCT, 7/8 NC, 9–12 LEDs. + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-29 | Primera versión: Ethernet con `0.6.0-eth` y puertos serie (presencia, niveles, lazo y eco para 0.6.1). | +| 1.1 | 2026-09-29 | Edición breve; recibe de la configuración de la unidad la tabla de conexión, la regla de JP5 y los defaults de Ethernet. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-prueba-final-unidad.md b/docs/procedimientos/v5-prueba-final-unidad.md index 7dd6989..1521ec2 100644 --- a/docs/procedimientos/v5-prueba-final-unidad.md +++ b/docs/procedimientos/v5-prueba-final-unidad.md @@ -1,82 +1,97 @@ -# HBOX v5 — Prueba final de unidad ensamblada con firmware 0.5.1 (field-minimum + telemetría y eventos) +--- +title: "HBOX V5 — Prueba final de unidad ensamblada" +tags: [project-drogheda, hardware, hbox, v5, testing, prueba-final, procedimiento] +date: 2026-09-18 +project: Project Drogheda +author: Helgen Technologies +version: 1.2 +audience: técnicos de banco +--- -**Alcance:** unidad completa (EinarBoard V5 + ArduSimple + módem 4G + batería + antenas) dentro del HBOX, antes de embarcar. -**Firmware:** `hbox-v5-bringup_0.5.1.bin` (SHA-256 `e1f35108…`) — descarga en . -**Duración:** ~45 min por unidad (P1–P6). Registrar todo en el acta de ensamble (`HBOX5-Exx-Axxx-Rxxxx`). +# HBOX V5 — Prueba final de unidad ensamblada -!!! warning "Lo que 0.5.1 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.5.1-fm, cargador OFF»*. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: unidad V5.5/V5.6 recién ensamblada, antes de embarcar. Paso 4 de producción, entre el [ensamble](v5-ensamble.md) y la [configuración](v5-configuracion-unidad.md). + - Tiempo: ~45 min por unidad (P1–P6). + - Necesitas: arnés GX16 real con fuente de 24 V, cable USB-C en J11, laptop con terminal a 115200 grabando, antenas con cielo, monitor abierto. Se registra en el [acta de ensamble](../formularios/ensamble.html). + +Firmware: el binario V5 vigente de [Descargas](../descargas/index.md). Abajo `X.Y.Z` es la versión que flasheaste. Hasta 0.5.9 el cargador está apagado (paquete de un solo uso hasta 3.40 V); desde 0.6.0 carga con 24 V y etapa ON (`carga=`, `ltc=CARGANDO`). ## 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. -- **Antes de energizar — verificación del arnés GX16 con la fuente APAGADA (obligatoria; la EinarBoard 006 murió por un cruce aquí):** - continuidad GX16 pin 1 → P1.1 (24V_IN) · pin 2 → GND · pin 3 → P1.3 (IGN_IN); **ninguna continuidad entre pin 1 / pin 3 y P2.1 (5 V)**. - El 5 V de P2 solo puede venir de la salida del SD-15B. Con 24 V en P2 el LTC4040 (máx 5.5 V) y el MCU se pierden. -- NTC de punto caliente: conector **P12** (2 pines, NTC 10 k B3950). Es la única NTC que ve el MCU (`tntc`); la NTC del paquete en **P4 pin 3** - va solo al LTC4040 y **no aparece en telemetría** por diseño. Sin NTC en P12 el monitor muestra «n/d». -- 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**. +1. Con la fuente apagada, verifica el arnés GX16 (obligatorio; la EinarBoard 006 murió por un cruce aquí): pin 1 → P1.1 (24V_IN), pin 2 → GND, pin 3 → P1.3 (IGN_IN), y ninguna continuidad de pin 1 o pin 3 a P2.1 (5 V). El 5 V de P2 solo sale del SD-15B; 24 V en P2 destruye el LTC4040 (máx 5.5 V) y el MCU. +2. Consola: USB-C en J11, PuTTY o CoolTerm a 115200. Cada línea es `STAT`, `EVT` o `$PHLG`; `l` muestra la leyenda. +3. 24 V en P1 (entrada + ignición) por el arnés GX16; el SD-15B da el 5 V. Batería en P4. Antenas GNSS y LTE, SIM y módem puestos. +4. NTC de punto caliente en P12 (10 k B3950) si la unidad la lleva. Es la única que ve el MCU (`tntc`); la NTC del paquete (P4 pin 3) va solo al LTC4040 y no sale en telemetría. Sin NTC en P12 el monitor muestra "n/d". +5. Graba el log completo como `HBOX5-Exx-Axxx-Rxxxx_prueba-final.txt` para el acta. + +## P1. Arranque autónomo (2 min) + +Energiza 24 V con ignición. No toques la consola. | Esperado | Si falla | |---|---| -| Banner `hbox-v5-bringup 0.5.1` · `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 | +| Banner `hbox-v5-bringup X.Y.Z` · `modo=AUTO` · `inputs at boot: v5=5.2–5.4V(ok) ign=ON` | Otra versión: reflashea. `ign=OFF`: arnés pin 3 / divisor 22k-10k | +| `---- RESULT: 12 PASS / 0 FAIL ----` · `>>> BOARD OK` | Cualquier `[FAIL]`: tarjeta a revisión, no se embarca | +| `EVT … STACK ON reason=auto` sin teclear, ≈10 s tras el banner | `STAT` con `v5=` < 4.5 o `modo=MAN` (teclea `A`) | +| `EVT … NMEA primera trama` < 3 s después · `EVT FAN ON (vehiculo: 5V+ign)` | Sin NMEA: mide SW_5V (MOD1 pin 5) ≈ 5 V | +| LED RGB azul (sin RTK) o verde (RTK); DB1–DB4 según `vbat` | RGB rojo con `stack=ON`: PCF8574 / cableado de 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). +## P2. Riel y módem (10 min) + +Deja la unidad 10 min encendida mientras el módem se registra. | Esperado | Si falla | |---|---| -| `STAT … v5=5.2x–5.3x(ok)` **todo el tiempo**; nunca `(BAJO)` ni `EVT V5 BAJO`; **`v5min` ≥ 4.9 V** en todas las STAT | `BAJO` o `v5min` < 4.6 → 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.5.1-fm,RUN,…` cada 10 s, `rec=0`, sin `LIMP` | `rec` > 0 sin causa → NMEA intermitente: revisar MOD1 / UART1 F9P | -| **Modo B:** ≈10 s tras la primera NMEA, `EVT MODOB ON`; luego `STAT … modoB=ON relay=` (sube cientos/s) `phlg_aire=` (+1 cada 30 s) | `modoB=off` permanente → sin NMEA en PA3 o `B` bloqueado; `relay=0` con `modoB=ON` → K1 / PA10 | -| **Servidor:** en ≤ 2 min la unidad `H00xx` muestra la columna **Salud** (fw `0.5.1-fm`, vbat, temperaturas, `v5min`) y en el log del servidor los `$PHEV` (BOOT, STACK_ON, MODOB_ON) y sigue reportando posición 1 Hz | posición sí pero sin Salud → el módem no reenvía la `$PHLG`: revisar `$$$AS+` (modo transparente) | +| `v5=5.2x–5.3x(ok)` siempre; nunca `(BAJO)` ni `EVT V5 BAJO`; `v5min` ≥ 4.9 V en cada `STAT` | `BAJO` o `v5min` < 4.6: el riel cae con la ráfaga LTE; ajusta el SD-15B a ~5.3 V (PFI del LTC4040) | +| `tbat`/`tair`/`tmcu` estables (< 45 °C) · `i2cerr=0` | `i2cerr` sube: I²C / soldadura U3, U4, U13 | +| `$PHLG,X.Y.Z,RUN,…` cada 10 s, `rec=0`, sin `LIMP` | `rec` > 0: NMEA intermitente, revisa MOD1 / UART1 del F9P | +| Modo B: ≈10 s tras la primera NMEA, `EVT MODOB ON`; `modoB=ON`, `relay=` sube cientos/s, `phlg_aire=` +1 cada 30 s | `modoB=off` fijo: sin NMEA en PA3 o `B` bloqueado. `relay=0` con `modoB=ON`: K1 / PA10 | +| Servidor: en ≤ 2 min `H00xx` muestra Salud (fw, vbat, temperaturas, `v5min`), llegan `$PHEV` (BOOT, STACK_ON, MODOB_ON) y posición a 1 Hz | Posición sin Salud: el módem no reenvía `$PHLG`; revisa `$$$AS+` (modo transparente) | -## 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. +## P3. Respaldo de batería (6 min) + +Con la etapa ON, desconecta los 24 V. Espera 5 min y reconecta. | 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` | — | +| `EVT V5 PERDIDO` → `EVT BACKUP inicio vbat=4.0x`, etapa sigue ON, RGB amarillo | La etapa se apaga o la tarjeta reinicia (`reset=POR`): mide MAIN5V (C32) durante el corte, esperado 4.79 V | +| `stack=ON backup=Ns nmea=` sigue contando 5 min; ventilador según termostato (normalmente OFF) | `nmea` se detiene: SW_BAT/L6 (pista 0.3 mm) 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): +## P4. Primer RTK a cielo abierto (10 min) + +Antena 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 | +| `EVT GGA fix … -> RTK FLOAT(5)` y luego `-> RTK FIX(4)`; `gga=RTK_FIX sats≥10 hdop<1.5`; RGB verde | Se queda en `GPS(1)`: no llegan correcciones; revisa módem/NTRIP (`$$$AS+`), no el F9P | +| `$PHLG … RUN,OK,4,…` | `link=DEGR` fijo: 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. +## P5. Recuperación de enlace (4 min, una unidad por lote) + +Con la etapa ON más de 90 s, retira el ArduSimple del zócalo (o su UART1) y cronometra. | 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` | — | +| `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 | +| Al reinsertar: `NMEA primera trama`; `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.5.1-fm`), `uid=` del banner, resultado P1–P5, `vbat` final, y la nota *cargador OFF*. +## P6. Apagado y acta (2 min) -## 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) | +1. Quita la ignición: `EVT IGN OFF`, `EVT FAN OFF (bateria: termostato)`. La etapa sigue ON mientras haya 24 V. +2. Quita 24 V: con batería entra `BACKUP`. No esperes a `SLEEP`: reconecta y apaga con `P`. +3. En el acta: versión, `uid=` del banner, resultado P1–P5, `vbat` final y, con 0.5.x, "cargador OFF". + +Colores del LED RGB: [manual V5](../manuales/manual-tarjeta-V5.md). + +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-18 | Primera versión (0.5.1-fm). | +| 1.1 | 2026-09-29 | Título sin versión de firmware; nota de cargador 0.6.0; enlaces al flujo. | +| 1.2 | 2026-09-29 | Edición breve: versión genérica `X.Y.Z`; tabla de colores RGB remitida al manual V5. | + +Versiones anteriores en git. diff --git a/docs/procedimientos/v5-prueba-y-flasheo.md b/docs/procedimientos/v5-prueba-y-flasheo.md index a88e890..8022372 100644 --- a/docs/procedimientos/v5-prueba-y-flasheo.md +++ b/docs/procedimientos/v5-prueba-y-flasheo.md @@ -1,256 +1,197 @@ --- -title: EinarBoard v5 (HBOX v5) — Procedimiento de prueba y flasheo por tarjeta -tags: [project-drogheda, hardware, einarboard, v5, bringup, testing, flasheo, procedimiento] +title: "EinarBoard V5 — Prueba y flasheo por tarjeta" +tags: [project-drogheda, hardware, einarboard, v5, v5.5, v5.6, bringup, testing, flasheo, procedimiento] +date: 2026-09-15 project: Project Drogheda author: Helgen Technologies -date: 2026-09-15 -version: 1.0 -status: ACTIVO — aplicar a cada una de las 15 tarjetas del lote JLC 22-Ago-2026 +version: 1.2 +status: ACTIVO audience: técnicos de banco --- -# EinarBoard v5 — Procedimiento de prueba y flasheo +# EinarBoard V5 — Prueba y flasheo por tarjeta -**Lote:** 15 tarjetas `hbox-watchdog-v5` (JLCPCB, pedido 22-Ago-2026). -**Objetivo:** verificar que cada tarjeta enciende sin cortos, que sus rieles están en valor, -y dejarla flasheada con el firmware de arranque entregado por ingeniería. -**Duración estimada:** 15–20 min por tarjeta. +!!! abstract "Para quién · Cuándo · Tiempo · Necesitas" + - Para quién: técnicos de banco. + - Cuándo: al recibir cada tarjeta V5.5 o V5.6 desnuda, antes de montar módulos. Siguiente paso: [Módulos RTK y 4G](v5-modulos-integracion.md). + - Tiempo: 15–20 min por tarjeta. + - Necesitas: multímetro, fuente de banco 0–30 V con límite de corriente, cable USB-C con datos, laptop con STM32CubeProgrammer o `dfu-util`, jumper 2.54 mm para P11, lupa, el binario V5 vigente de [Descargas](../descargas/index.md) y el [acta de tarjeta V5](../formularios/v5.html). -> ⛔ **REGLA 1 — NO flashear `blackpillrtkcode_v3` (v3.0.3) en esta tarjeta.** -> Ese firmware es para la EinarBoard 1.0 (Blackpill). En la v5 usa los pines PB12–PB15 como -> LEDs de batería, pero en esta tarjeta esos pines son el bus SPI del chip Ethernet (W5500). -> Solo se flashea el archivo `.bin` que entregue ingeniería para v5. -> -> ⛔ **REGLA 2 — Sin batería y sin módulos en estas pruebas.** No conectar nada en P4 -> (batería), ni insertar el simpleRTK2B en MOD1, ni el módem 4G en J7/J8. -> -> ⛔ **REGLA 3 — Fuente de banco siempre con límite de corriente.** Si la corriente llega al -> límite o un componente se calienta: apagar, marcar la tarjeta como FALLA y pasar a la siguiente. +!!! warning "Reglas" + 1. Flashea solo el binario V5 de [Descargas](../descargas/index.md). `blackpillrtkcode_v3` (v3.0.3) maneja PB12–PB15 como LEDs de batería; en la V5 esos pines son el SPI del W5500. + 2. Sin batería en P4, sin simpleRTK2B en MOD1 y sin módem en J7/J8. + 3. Fuente siempre con límite de corriente. Si llega al límite o algo se calienta: apaga, marca FALLA y pasa a la siguiente tarjeta. ---- +## Referencias en la tarjeta -## 0. Material - -| Cant. | Ítem | -|---|---| -| 1 | Multímetro (continuidad / V DC) | -| 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.5.1.bin`** — descarga: **https://drogheda.helgen.online/descargas/** (repo: `04-Source-Code/firmware/hbox_v5_bringup/release/`, SHA-256 inicia `e1f35108`) | -| 1 | Jumper 2.54 mm para P11 (interruptor de corte) | -| 1 | Lupa o lámpara con aumento | -| — | Hoja de registro (sección 7) | - -**Identificación en la tarjeta** (serigrafía): - -| Ref. | Qué es | Dónde se usa | +| Ref. | Qué es | Uso | |---|---|---| -| **J11** | USB-C **DFU** (junto a SW1/SW2 y J10 Ethernet) | Alimentar solo el MCU y flashear | -| **J9** | USB-C del **módem** | NO se usa en este procedimiento | -| **SW1** | Botón **RESET** | Reiniciar el MCU | -| **SW2** | Botón **BOOT0** | Entrar en modo DFU | -| **TP7 / TP6** | Puntos de prueba **3V3 / GND** | Medir el riel de 3.3 V | -| **TP3 / TP4 / TP5** | SWDIO / SWCLK / NRST | Solo si ingeniería pide programar por ST-Link | -| **P2** | Entrada **5 V** (donde va la Mean Well SD-15B) | Prueba del riel de 5 V | -| **P1** | Entrada **24 V** (GX16) — pin 1 = +24 V, pin 2 = GND | Prueba del buck del ventilador | -| **P11** | Header **CUTOFF-SW** (2 pines) | Puentear para que pase MAIN5V → SYS5V | -| **P6** | Header del ventilador (2 pines) — pin 1 = +5V_FAN, pin 2 = retorno conmutado | Medir salida del buck (pin 1 contra GND) | -| **MOD1** | Zócalo UNO del simpleRTK2B — pin **"5V"** | Verificar que la etapa RTK arranca **apagada** | -| **D18** | LED verde **PWR** | Enciende cuando hay 3.3 V | -| **D17** | LED azul **C13** | Lo controla el firmware (apagado en chip virgen) | -| **U17** | Regulador AMS1117 3.3 V | Tocar para verificar temperatura | -| **Y2** | Cristal **3.6864 MHz** (HC-49, marcado `3.6864` / `36.864`) | Verificación visual | +| J11 | USB-C DFU (junto a SW1/SW2 y J10) | Alimentar el MCU y flashear | +| J9 | USB-C del módem | No se usa aquí | +| SW1 / SW2 | RESET / BOOT0 | Reinicio y modo DFU | +| TP7 / TP6 | 3V3 / GND | Riel de 3.3 V | +| TP3 / TP4 / TP5 | SWDIO / SWCLK / NRST | Solo si ingeniería pide ST-Link | +| P2 | Entrada 5 V (SD-15B) | Riel de 5 V | +| P1 | Entrada 24 V (GX16): pin 1 = +24 V, pin 2 = GND | Buck del ventilador | +| P11 | CUTOFF-SW (2 pines) | Puentear para pasar MAIN5V → SYS5V | +| P6 | Ventilador: pin 1 = +5V_FAN, pin 2 = retorno conmutado | Salida del buck (pin 1 contra GND) | +| MOD1 | Zócalo UNO del simpleRTK2B, pin "5V" | La etapa RTK debe arrancar apagada | +| D18 / D17 | LED verde PWR / LED azul C13 | 3.3 V presente / controlado por firmware | +| U17 | AMS1117 3.3 V | Temperatura al tacto | +| Y2 | Cristal 3.6864 MHz (marcado `3.6864` o `36.864`) | Visual | ---- +## 1. Inspección visual (sin energía, 3 min) -## 1. Inspección visual (sin energía) — 3 min +- [ ] Sin puentes de soldadura en U16 (MCU), U11 (W5500), U10 (SC16IS752) y U6 (LTC4040). +- [ ] Y2 marcado `3.6864` o `36.864`; Y1 y Y3 `25.000`; Y4 el pequeño de 32.768 kHz. Y2 marcado `1.8432`: anota y avisa a ingeniería. +- [ ] SW1 y SW2 presentes y con clic. +- [ ] J11, J9 y J10 (RJ45) asentados, sin pines doblados. +- [ ] JP2, JP3 y JP4 presentes; no cambies su posición. +- [ ] Sin componentes faltantes ni marcas de quemado. -Con lupa, en cada tarjeta: +## 2. Cortos a tierra (sin energía, 2 min) -- [ ] No hay puentes de soldadura visibles entre pines de **U16** (MCU, 64 pines), **U11** - (W5500), **U10** (SC16IS752), **U6** (LTC4040). -- [ ] **Y2** dice `3.6864` (o `36.864`). Los otros tres cristales: **Y1** y **Y3** = `25.000`, - **Y4** = pequeño de 32.768 kHz. Si Y2 dice `1.8432` → marcar y avisar a ingeniería. -- [ ] Botones **SW1** y **SW2** presentes y con "clic". -- [ ] Conectores **J11**, **J9**, **J10 (RJ45)** bien asentados, sin pines doblados. -- [ ] Jumpers de configuración del cargador presentes: **JP2, JP3, JP4** (no tocar su posición). -- [ ] Sin componentes faltantes evidentes ni marcas de quemado. +Multímetro en ohms, no en modo continuidad. Punta negra en TP6. Unos cientos de ohms que suben es normal (capacitores cargando); una lectura fija de 0–20 Ω es corto. ---- - -## 2. Continuidad — cortos a tierra (sin energía) — 2 min - -Multímetro en **ohms** (no en modo continuidad/beep, porque los capacitores dan lecturas -transitorias). Punta negra en **TP6 (GND)**. Esperar a que la lectura se estabilice. - -| Medir en | Riel | Esperado | Si es < 100 Ω | +| Punto | Riel | Esperado | < 100 Ω | |---|---|---|---| -| **TP7** | 3V3 | > 1 kΩ (la lectura sube lentamente) | FALLA — corto en 3.3 V | -| **P2 pin 1** | VEH5V (entrada 5 V) | > 1 kΩ | FALLA — corto en entrada 5 V | -| **P11 pin 1** | MAIN5V | > 1 kΩ | FALLA — corto en 5 V del sistema | -| **P1 pin 1** | 24V_IN | > 10 kΩ | FALLA — corto en 24 V | -| **MOD1 pin "5V"** | SW_5V (etapa RTK) | > 1 kΩ | FALLA | +| TP7 | 3V3 | > 1 kΩ | FALLA: corto en 3.3 V | +| P2 pin 1 | VEH5V | > 1 kΩ | FALLA: corto en entrada 5 V | +| P11 pin 1 | MAIN5V | > 1 kΩ | FALLA: corto en 5 V del sistema | +| P1 pin 1 | 24V_IN | > 10 kΩ | FALLA: corto en 24 V | +| MOD1 pin "5V" | SW_5V | > 1 kΩ | FALLA | -> Nota: es normal ver lecturas de unos cientos de ohms **que van subiendo** — son los -> capacitores cargándose con el multímetro. Lo que NO es normal es una lectura fija de 0–20 Ω. +## 3. Riel de 3.3 V por USB (J11, 3 min) ---- +El USB en J11 energiza solo el MCU y la lógica de 3.3 V; el 5 V del sistema queda apagado. -## 3. Prueba del riel de 3.3 V por USB (J11) — 3 min +1. Conecta USB-C en J11 a la laptop o a un cargador. +2. Mide: -Con USB solo se energiza el MCU y la lógica de 3.3 V; el riel de 5 V del sistema queda apagado. -Es la forma más segura de encender la tarjeta por primera vez. + | Punto | Esperado | + |---|---| + | D18 | Encendido | + | TP7 contra TP6 | 3.20–3.40 V | + | U17 al tacto tras 1 min | Tibio. Si quema: FALLA | + | D17 | Apagado o fijo (chip virgen) | -1. Conectar el cable USB-C en **J11** (el que está junto a los botones), otro extremo a la laptop - o a un cargador USB. -2. Verificar: +3. D18 apagado o TP7 < 3.0 V: desconecta y marca FALLA (3V3). +4. Deja el USB conectado. -| Punto | Esperado | -|---|---| -| **D18** (LED verde PWR) | **Encendido** | -| **TP7** respecto a TP6 | **3.20 – 3.40 V** | -| **U17** (AMS1117) al tacto tras 1 min | Tibio, se puede tocar. **Si quema → FALLA** | -| **D17** (LED azul) | Apagado o fijo (chip virgen — normal) | +## 4. Rieles de 5 V y 24 V con fuente (5 min) -3. Si D18 no enciende o TP7 < 3.0 V → desconectar, marcar **FALLA (3V3)**. -4. **Dejar el USB conectado** para la sección siguiente. +Con el MCU virgen sus pines quedan en alta impedancia y la etapa RTK debe quedar apagada; eso es lo que se verifica. ---- +### 4a. 5 V (P2) -## 4. Prueba de rieles de 5 V y 24 V con fuente de banco — 5 min +1. Fuente a 5.0 V, límite 500 mA, salida apagada. +2. Jumper en P11. +3. Fuente a P2 (pin 1 = +5 V, pin 2 = GND). El USB puede quedarse en J11. +4. Enciende y mide: -Se hace **con el MCU virgen (sin firmware)**: así todos sus pines quedan en alta impedancia y la -etapa RTK permanece apagada por diseño. Esto es lo que se está verificando. + | Punto | Esperado | + |---|---| + | Corriente | < 300 mA (típico 100–250 mA) | + | P11 pin 1 (MAIN5V) | 4.8–5.1 V | + | P11 pin 2 (SYS5V) | 4.8–5.1 V | + | TP7 | 3.20–3.40 V | + | MOD1 pin "5V" (SW_5V) | 0 V. Con 5 V: FALLA (la etapa RTK no arranca apagada) | + | U6 y U12 al tacto | Tibios | -### 4a. Riel de 5 V (entrada P2) +5. Apaga la fuente y desconecta P2. -1. Fuente de banco: **5.0 V, límite 500 mA**, salida apagada. -2. Colocar el **jumper en P11** (CUTOFF-SW). -3. Conectar fuente a **P2**: pin 1 = +5 V, pin 2 = GND. (Puede quedarse el USB en J11.) -4. Encender la salida y medir: +### 4b. 24 V → buck del ventilador (P1) -| Punto | Esperado | -|---|---| -| Corriente de la fuente | **< 300 mA** (típico 100–250 mA) | -| **P11 pin 1** (MAIN5V) | 4.8 – 5.1 V | -| **P11 pin 2** (SYS5V, con jumper) | 4.8 – 5.1 V | -| **TP7** (3V3) | 3.20 – 3.40 V | -| **MOD1 pin "5V"** (SW_5V, etapa RTK) | **0 V** ← obligatorio. Si hay 5 V aquí → FALLA (etapa RTK no arranca apagada) | -| **U6** (LTC4040), **U12** (buck Ethernet) al tacto | Tibios, no queman | +1. Fuente a 24.0 V, límite 200 mA, salida apagada. +2. Fuente a P1 (pin 1 = +24 V, pin 2 = GND). Pin 3 (ignición) sin conectar. +3. Enciende y mide: -5. Apagar la salida de la fuente. Desconectar de P2. + | Punto | Esperado | + |---|---| + | Corriente | < 50 mA (sin ventilador) | + | P6 pin 1 contra TP6 | 4.9–5.1 V (no midas contra P6 pin 2: es el lado conmutado) | + | U2 al tacto | Frío o tibio | -### 4b. Riel de 24 V → buck del ventilador (entrada P1) +4. Apaga y desconecta P1. El jumper de P11 puede quedarse. -1. Fuente de banco: **24.0 V, límite 200 mA**, salida apagada. -2. Conectar a **P1**: pin 1 = +24 V, pin 2 = GND. **Pin 3 (ignición) sin conectar.** -3. Encender la salida y medir: +Valor fuera de rango: marca FALLA con la sección (4a o 4b) y el valor medido. -| Punto | Esperado | -|---|---| -| Corriente de la fuente | **< 50 mA** (sin ventilador) | -| **P6 pin 1** (5V_FAN) respecto a **TP6 (GND)** | **4.9 – 5.1 V** (no medir contra P6 pin 2: es el lado conmutado del ventilador) | -| **U2** (buck) al tacto | Frío o tibio | +## 5. Flasheo por USB DFU (J11, 5 min) -4. Apagar salida. Desconectar de P1. Quitar el jumper de P11 (opcional; puede dejarse). +Solo tarjetas que pasaron 1–4. El firmware de campo se flashea igual. Verifica el SHA-256 del binario antes ([Descargas](../descargas/index.md)). -> Si algún valor está fuera de rango: marcar FALLA con la sección (4a o 4b) y el valor medido. -> **No flashear una tarjeta con FALLA.** +### 5a. Modo DFU ---- +1. Solo el USB en J11 (nada en P1/P2). +2. Mantén SW2 (BOOT0). +3. Pulsa y suelta SW1 (RESET). +4. Suelta SW2. +5. La laptop detecta `STM32 BOOTLOADER` (ID `0483:DF11`). -## 5. Flasheo por USB DFU (J11) — 5 min +Si no aparece: cambia el cable (muchos son solo de carga) y repite con SW2 presionado al soltar SW1. El chip virgen solo entra al bootloader con esta secuencia. -Solo para tarjetas que pasaron las secciones 1 a 4. +### 5b. STM32CubeProgrammer -### 5a. Entrar en modo DFU +1. Selector de conexión: USB. Refresca hasta ver `USB1` y pulsa Connect. +2. Pestaña Erasing & Programming. +3. File path: el `.bin` descargado. Start address: `0x08000000`. +4. Marca Verify programming y Run after programming. +5. Start Programming. Espera "File download complete" y "Verify… successful". +6. Disconnect. -1. Solo el **USB en J11** conectado a la laptop (nada en P1/P2). -2. **Mantener presionado SW2 (BOOT0).** -3. Sin soltar SW2, **presionar y soltar SW1 (RESET)**. -4. **Soltar SW2.** -5. La laptop debe detectar un dispositivo **"STM32 BOOTLOADER"** (ID `0483:DF11`). - -> El chip viene **vacío de fábrica**: no hace nada hasta que se flashea, y **solo** entra al -> programador con esta secuencia de botones. Si no aparece el dispositivo: cambiar el cable -> USB (muchos son solo de carga), repetir la secuencia con calma (SW2 debe estar presionado -> cuando se suelta SW1). - -### 5b. Flashear con STM32CubeProgrammer (recomendado) - -1. Abrir **STM32CubeProgrammer**. -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.5.1.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**. - -### 5c. Alternativa por terminal (`dfu-util`, macOS/Linux) +### 5c. `dfu-util` (macOS/Linux) ```bash -dfu-util -l # debe listar [0483:df11] -dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.5.1.bin +dfu-util -l # debe listar [0483:df11] +dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_X.Y.Z.bin ``` -### 5d. Verificación después del flasheo +### 5d. Verificación -1. Abrir un terminal serie en la laptop (CoolTerm, Serial, `screen`, o el monitor de Arduino) - y dejarlo listo. Pulsar **SW1** (RESET) una vez. -2. Esperado en los primeros 5 segundos: +1. Abre un terminal serie a 115200 baud (CoolTerm, `screen` o el monitor de Arduino) y pulsa SW1. +2. En los primeros 5 s: -| Punto | Esperado | -|---|---| -| **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.5.1` (cualquier otra version: re-flashear), luego líneas `[PASS]` / `[FAIL]`, y al final **`>>> BOARD OK`** | + | Punto | Esperado | + |---|---| + | D17 y LED de panel en P8 | Parpadean a 1 Hz | + | DB1 → DB4 | Encienden en secuencia una vez y se apagan; luego R, G, B en P14 si hay LED RGB | + | Laptop | Puerto serie nuevo (`STMicroelectronics Virtual COM Port` / `usbmodem…`) | + | Terminal | Encabezado `hbox-v5-bringup X.Y.Z` con la versión flasheada (otra versión: reflashea), líneas `[PASS]` 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). -4. Reporte esperado (todas `[PASS]`): +3. Si abriste el terminal tarde, teclea `r`: repite las pruebas y la secuencia de LEDs. +4. Reporte esperado: -``` -[PASS] CLOCK_HSE SYSCLK=96000000 Hz HSE_RDY=1 PLL_SRC=HSE ← cristal Y3 y USB OK -[PASS] LSE_Y4 Y4 32.768k LSERDY=1 ← cristal Y4 OK -[PASS] I2C PCF8574 U13 @0x20 ACK -[PASS] I2C SHT40 U3 @0x44 ACK -[PASS] I2C TMP102 U4 @0x48 ACK -[PASS] I2C SC16IS752 U10 @0x4D ACK -[PASS] TMP102 TMP102 27.50 C -[PASS] SHT40 SHT40 27.8 C 45.0 %RH -[PASS] SC16IS752 0x4D ACK, SPR rd=0xA5 (exp A5), LSR=0x60 -[PASS] GAUGE_WALK visual — technician confirms ← el técnico confirma que vio DB1→DB4 -[PASS] ADC vbat=0.00 v5=0.00 ntc=..C mcu=..C ← vbat y v5 en 0 es NORMAL con solo USB -[PASS] DIN ign=0 chrg=.. fault=.. ser_irq=1 eth_int=.. ----- RESULT: 12 PASS / 0 FAIL ---- ->>> BOARD OK -``` + ``` + [PASS] CLOCK_HSE SYSCLK=96000000 Hz HSE_RDY=1 PLL_SRC=HSE ← cristal Y3 y USB + [PASS] LSE_Y4 Y4 32.768k LSERDY=1 ← cristal Y4 + [PASS] I2C PCF8574 U13 @0x20 ACK + [PASS] I2C SHT40 U3 @0x44 ACK + [PASS] I2C TMP102 U4 @0x48 ACK + [PASS] I2C SC16IS752 U10 @0x4D ACK + [PASS] TMP102 TMP102 27.50 C + [PASS] SHT40 SHT40 27.8 C 45.0 %RH + [PASS] SC16IS752 0x4D ACK, SPR rd=0xA5 (exp A5), LSR=0x60 + [PASS] GAUGE_WALK visual — technician confirms ← confirmas que viste DB1→DB4 + [PASS] ADC vbat=0.00 v5=0.00 ntc=..C mcu=..C ← vbat y v5 en 0 con solo USB + [PASS] DIN ign=0 chrg=.. fault=.. ser_irq=1 eth_int=.. + ---- RESULT: 12 PASS / 0 FAIL ---- + >>> BOARD OK + ``` - Después imprime una línea `STAT …` cada 2 s con temperaturas y voltajes — es normal. + Después sale una línea `STAT …` cada 2 s. Sin módulos ni batería, la etapa RTK y el cargador no encienden. -5. Cualquier `[FAIL]` → anotar la línea completa en la hoja de registro y marcar **FALLA (POST)**. - El LED azul que no parpadea → repetir 5a–5b una vez; si vuelve a fallar → **FALLA (FLASH)**. +5. Cualquier `[FAIL]`: anota la línea completa y marca FALLA (POST). LED azul sin parpadear: repite 5a–5b una vez; si vuelve a fallar, FALLA (FLASH). -> Este firmware **no enciende la etapa RTK ni el cargador**: solo prueba la tarjeta. El firmware -> de producción v5 se flashea después, por el mismo procedimiento DFU. +## 6. Cierre ---- +- [ ] Desconecta el USB. +- [ ] Etiqueta la tarjeta con su serie (V5-01 … V5-15) y la fecha, cerca de MH4, sin tapar serigrafía. +- [ ] Llena el [acta de tarjeta V5](../formularios/v5.html). +- [ ] Guarda en bolsa antiestática. Las FALLA van en bolsa aparte con nota del punto que falló. -## 6. Cierre de la tarjeta +## 7. Hoja de respaldo en papel -- [ ] Desconectar USB. -- [ ] Etiquetar la tarjeta con su número de serie (**V5-01 … V5-15**) y fecha, en la esquina - cerca de MH4 (sin tapar serigrafía ni componentes). -- [ ] Llenar la hoja de registro. -- [ ] Guardar en bolsa antiestática. Las tarjetas con FALLA van en bolsa aparte con la nota - del punto que falló. - ---- - -## 7. Hoja de registro del lote +El registro oficial es el acta. Anota el valor medido cuando esté fuera de rango (ej. "TP7 = 2.9 V"). | Tarjeta | Visual (1) | Cortos (2) | 3V3 USB (3) | 5 V (4a) | 24 V (4b) | DFU (5a) | Flash (5b) | Post-flash (5d) | OK / FALLA | Técnico | Fecha | |---|---|---|---|---|---|---|---|---|---|---|---| @@ -270,42 +211,28 @@ dfu-util -a 0 -s 0x08000000:leave -D hbox-v5-bringup_0.5.1.bin | V5-14 | | | | | | | | | | | | | V5-15 | | | | | | | | | | | | -Anotar el valor medido cuando esté fuera de rango (ej. "TP7 = 2.9 V"). +Conectores y LEDs: [manual V5](../manuales/manual-tarjeta-V5.md) · valores: [hoja de datos V5.6](../hardware/v56-datasheet.md) · [pinout V5.6](../hardware/v56-pinout.md). ---- +## Anexo — notas de ingeniería -## Anexo A — Notas de ingeniería (no requeridas para el técnico) +Verificado contra `hbox-watchdog-v5.kicad_pcb` / `.kicad_sch` (netlist, 15-sep-2026): -Verificado contra `hbox-watchdog-v5.kicad_pcb` / `.kicad_sch` (netlist, 15-Sep-2026): +- Alimentación por J11: VBUS → D13 (SS34) → `/LDO_IN` → U17 AMS1117 → `/3V3`. `/SYS5V` apagado, así que U12 y `/3V3_ETH` (W5500) también. R100/R101 (5.1 k en CC) presentes: un cable C-a-C entrega VBUS. +- DFU: BOOT0 = pin 60 de U16, pull-down R98 10 k, SW2 a 3V3. `/BOOT1_STRAP` (PB2, pin 28) a GND por R99 10 k. HSE = Y3 25 MHz en PH0/PH1 (el bootloader ROM lo requiere, AN2606). USB en PA11/PA12 (pines 44/45) con ESD D14/D15. +- SWD: TP3 SWDIO (PA13), TP4 SWCLK (PA14), TP5 NRST, TP6 GND, TP7 3V3. +- Única colisión v3.0.3 ↔ v5: `PIN_BATLED1..4` = PB12–PB15 (pines 33–36) = `/ETH_CS`, `/ETH_SCK`, `/ETH_MISO`, `/ETH_MOSI` (SPI2 del W5500); PB14 es salida del W5500. En v5 el indicador de batería está en U13 PCF8574 (A0–A2 a GND → 0x20, P0–P3 → RB1–RB4 120 R → LEDs). El resto del mapa v3 coincide: PA0 BAT_SENSE, PA1 PWR_CTRL, PA2/PA3 GNSS, PA4 5V_SENSE, PA5 IGN_SENSE, PA6 FAN_PWM, PA8 CHRG_EN, PA9/PA10 USART1, PB0 EXT_LED, PB1 NTC, PB3 CHRG_STAT, PB4 CHRG_FAULT, PB5 BYP_CTRL, PB6/PB7 I²C1, PC13 LED (activo bajo, R102 1 k a 3V3), PB10 tach = NC. +- Pines v5 que v3 no conoce: PC0 `/ETH_INT`, PA15 `/ETH_RST` (sin pull-up: flota si el MCU no lo maneja), PB8 `/SER_IRQ`, PC14/PC15 LSE (Y4). `/SER_RSTn` tiene pull-up R80 10 k. +- Cristales (BOM = maestro): Y2 = C2238 X49SM36864MSD2SC-1 = 3.6864 MHz para el SC16IS752 (`XTAL_FREQ 3686400`); "1.8432MHz" en esquemático/BOM es error de etiqueta. Y1 (W5500) y Y3 (HSE) = C14872 X49SM25MSD2SC = 25 MHz, confirmados contra el BOM de JLCPCB. Y4 = 32.768 kHz. +- KiCad vs tarjetas fabricadas: el `.kicad_pcb` vivo tiene 35 huellas movidas después del pedido (commits 24-ago y 07-sep: zona Ethernet/DFU J10/U11/U12/Y1/C90–C103/J11, D14–D16, R20, C101); la netlist no cambió. Referencia física del lote: `production/HBOX_v5_PROD.zip` (22-ago). En las tarjetas recibidas D14–D16 están junto al MCU, no junto a J11. +- U2 se habilita solo: `/EN_FAN` = divisor Ren1 100 k / Ren2 20 k desde `/24V` (≈4 V con 24 V), sin MCU; por eso 4b vale con chip virgen. `/FAN_RET` es el lado bajo conmutado por Q2 (gate en PA6): abierto con MCU virgen. +- Compilación v5: `STMicroelectronics:stm32:GenF4:pnum=GENERIC_F411RETX` (no `BLACKPILL_F411CE`), `HSE_VALUE=25000000` con `SystemClock_Config` explícito en HSE para que el USB CDC tenga reloj exacto. -- **Alimentación por J11:** VBUS → D13 (SS34) → `/LDO_IN` → U17 AMS1117 → `/3V3`. `/SYS5V` - queda apagado, por lo tanto U12 y `/3V3_ETH` (W5500) quedan apagados. R100/R101 (5.1 k en CC) - presentes: un cable C-a-C entrega VBUS. -- **DFU:** BOOT0 = pin 60 de U16, pull-down R98 10 k, SW2 lo lleva a 3V3. `/BOOT1_STRAP` - (PB2, pin 28) fijo a GND por R99 10 k. HSE = Y3 25 MHz en PH0/PH1 (el bootloader ROM lo - requiere, AN2606). USB en PA11/PA12 (pines 44/45) con ESD D14/D15. -- **SWD:** TP3 SWDIO (PA13), TP4 SWCLK (PA14), TP5 NRST, TP6 GND, TP7 3V3. -- **Colisión firmware v3.0.3 ↔ v5 (única encontrada):** `PIN_BATLED1..4` = PB12–PB15 (pines - 33–36) = `/ETH_CS`, `/ETH_SCK`, `/ETH_MISO`, `/ETH_MOSI` (SPI2 del W5500). PB14 es salida del - W5500. El indicador de batería en v5 está en U13 PCF8574 (A0–A2 a GND → dirección I²C - 0x20, salidas P0–P3 → RB1–RB4 120 R → LEDs). Todo el resto del mapa de pines de v3 coincide - con v5: PA0 BAT_SENSE, PA1 PWR_CTRL, PA2/PA3 GNSS, PA4 5V_SENSE, PA5 IGN_SENSE, PA6 FAN_PWM, - PA8 CHRG_EN, PA9/PA10 USART1, PB0 EXT_LED, PB1 NTC, PB3 CHRG_STAT, PB4 CHRG_FAULT, - PB5 BYP_CTRL, PB6/PB7 I²C1, PC13 LED (activo bajo, R102 1 k a 3V3), PB10 tach = NC. -- **Pines de v5 que v3 no conoce (firmware v5 debe manejarlos):** PC0 `/ETH_INT`, - PA15 `/ETH_RST` (sin pull-up: flota si el MCU no lo maneja), PB8 `/SER_IRQ` (SC16IS752), - PC14/PC15 LSE 32.768 kHz (Y4). `/SER_RSTn` sí tiene pull-up R80 10 k. -- **Cristales (BOM = maestro):** Y2 = C2238 X49SM36864MSD2SC-1 = **3.6864 MHz** para el - SC16IS752 (`XTAL_FREQ 3686400`); el campo "1.8432MHz" del esquemático/BOM es un error de - etiqueta. Y1 (W5500) y Y3 (HSE del MCU) = C14872 X49SM25MSD2SC = **25 MHz**, confirmados contra el BOM de ensamble en JLCPCB. Y4 = 32.768 kHz LSE. -- **Estado del archivo KiCad vs tarjetas fabricadas:** el `.kicad_pcb` vivo tiene 35 huellas - movidas después del pedido (commits 24-Ago y 07-Sep: reubicación de la zona Ethernet/DFU - J10/U11/U12/Y1/C90–C103/J11, D14–D16, R20, C101). La netlist no cambió. La referencia - física de este lote es `production/HBOX_v5_PROD.zip` (22-Ago). En las tarjetas recibidas - D14–D16 están junto al MCU, no junto a J11. -- **Buck del ventilador U2 se habilita solo:** `/EN_FAN` = divisor Ren1 100 k / Ren2 20 k desde - `/24V` (≈4 V con 24 V de entrada), no depende del MCU → la prueba 4b es válida con chip virgen. - `/FAN_RET` es el lado bajo conmutado por Q2 (gate desde PA6): con MCU virgen queda abierto. -- **Objetivo de compilación del firmware v5:** `STMicroelectronics:stm32:GenF4:pnum=GENERIC_F411RETX` - (no `BLACKPILL_F411CE`), `HSE_VALUE=25000000` con `SystemClock_Config` explícito en HSE para - que el USB CDC tenga reloj exacto. +## Historial de revisiones + +| Versión | Fecha | Cambios | +|---|---|---| +| 1.0 | 2026-09-15 | Primera versión (lote de 15, firmware 0.5.1). | +| 1.1 | 2026-09-29 | Encabezado uniforme, nota de binario vigente, enlaces a acta y manuales. | +| 1.2 | 2026-09-29 | Edición breve: sin tabla de material duplicada; binario genérico `X.Y.Z` en lugar de 0.5.1. | + +Versiones anteriores en git. diff --git a/docs/produccion/index.md b/docs/produccion/index.md new file mode 100644 index 0000000..700ccf9 --- /dev/null +++ b/docs/produccion/index.md @@ -0,0 +1,19 @@ +--- +title: "Producción — lote V5.6" +--- + +# Producción — lote V5.6 + +| Paso | Procedimiento | Acta | +|---|---|---| +| 1 | [Prueba y flasheo de tarjetas](../procedimientos/v5-prueba-y-flasheo.md) | [Tarjeta V5](../formularios/v5.html) | +| 2 | [Módulos RTK y 4G e integración](../procedimientos/v5-modulos-integracion.md) | [ArduSimple](../formularios/ardusimple.html) · [Módem 4G](../formularios/modem4g.html) · [Integración](../formularios/integracion.html) | +| 3 | [Ensamble de la unidad](../procedimientos/v5-ensamble.md) | [Ensamble](../formularios/ensamble.html) | +| 4 | [Prueba final antes de embarcar](../procedimientos/v5-prueba-final-unidad.md) | En el acta de ensamble | +| 5 | [Configuración de la unidad](../procedimientos/v5-configuracion-unidad.md) | [Ensamble](../formularios/ensamble.html) · [Ethernet y serie](../formularios/ethernet-serie.html) si aplica | +| 6 | [Checklist de puesta en marcha en el puerto](../procedimientos/v5-checklist-puesta-en-marcha.md) | Impreso, al expediente | + +- [Tablero de producción](../tablero.html): qué tarjeta, módulo y unidad pasó cada paso. +- [Expediente de una unidad](../unidad.html) +- [Índice de actas](../actas/index.md) +- [Descargas](../descargas/index.md): firmware vigente y SHA-256. diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..dcb8d79 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,163 @@ +/* ========================================================================== + HBOX — Documentación técnica · hoja de estilo Helgen + Colores tomados de _brand/estilo-helgen.tex (\definecolor): + HelgenIndigo #2C3C5B · HelgenCyan #51F3DA · HelgenTeal #17A08C + HelgenMist #EFF1F5 · HelgenLightCyan #E7FCF8 · HelgenLightIndigo #EDEFF4 + ========================================================================== */ + +:root { + --helgen-indigo: #2C3C5B; + --helgen-indigo-dark: #1F2A44; + --helgen-indigo-light: #3D5078; + --helgen-cyan: #51F3DA; + --helgen-teal: #17A08C; + --helgen-mist: #EFF1F5; + --helgen-light-cyan: #E7FCF8; + --helgen-light-indigo: #EDEFF4; +} + +/* ---- Paleta "custom" de Material ---------------------------------------- */ +[data-md-color-primary="custom"] { + --md-primary-fg-color: var(--helgen-indigo); + --md-primary-fg-color--light: var(--helgen-indigo-light); + --md-primary-fg-color--dark: var(--helgen-indigo-dark); + --md-primary-bg-color: #ffffff; + --md-primary-bg-color--light: rgba(255, 255, 255, 0.7); +} +[data-md-color-accent="custom"] { + --md-accent-fg-color: var(--helgen-teal); + --md-accent-fg-color--transparent: rgba(23, 160, 140, 0.1); + --md-accent-bg-color: #ffffff; + --md-accent-bg-color--light: rgba(255, 255, 255, 0.7); +} +[data-md-color-scheme="default"] { + --md-typeset-a-color: #14685c; +} +[data-md-color-scheme="slate"][data-md-color-accent="custom"] { + --md-accent-fg-color: var(--helgen-cyan); + --md-accent-fg-color--transparent: rgba(81, 243, 218, 0.12); + --md-accent-bg-color: var(--helgen-indigo-dark); +} +[data-md-color-scheme="slate"] { + --md-typeset-a-color: var(--helgen-cyan); + --md-default-bg-color: #161d2b; + --md-code-bg-color: #1c2536; +} + +/* Fuentes del sistema (sitio utilizable sin Internet) */ +:root { + --md-text-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + --md-code-font: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; +} + +/* ---- Tamaño: pensado para tableta en el taller -------------------------- */ +.md-grid { max-width: 1400px; } +.md-typeset { font-size: 0.85rem; line-height: 1.6; } +@media screen and (min-width: 76.25em) { + .md-typeset { font-size: 0.9rem; } +} +.md-typeset h1 { color: var(--helgen-indigo); font-weight: 700; } +[data-md-color-scheme="slate"] .md-typeset h1 { color: var(--helgen-cyan); } +.md-typeset h2 { font-weight: 600; border-bottom: 2px solid var(--helgen-light-indigo); padding-bottom: 0.2em; } +[data-md-color-scheme="slate"] .md-typeset h2 { border-bottom-color: var(--helgen-indigo-light); } + +/* Cabecera y pestañas */ +.md-header__button.md-logo img { height: 1.6rem; width: auto; } +.md-tabs__link { font-size: 0.75rem; font-weight: 600; } +.md-tabs__link--active { border-bottom: 3px solid var(--helgen-cyan); } + +/* ---- Tarjetas (grid cards) ---------------------------------------------- */ +.md-typeset .grid.cards > ul > li, +.md-typeset .grid > .card { + border-radius: 0.5rem; + border: 1px solid var(--helgen-light-indigo); + transition: box-shadow 0.15s ease, transform 0.15s ease, border-color 0.15s ease; +} +[data-md-color-scheme="slate"] .md-typeset .grid.cards > ul > li { border-color: #2a3650; } +.md-typeset .grid.cards > ul > li:hover, +.md-typeset .grid > .card:hover { + border-color: var(--helgen-teal); + box-shadow: 0 6px 20px rgba(44, 60, 91, 0.18); + transform: translateY(-2px); +} +.md-typeset .grid.cards > ul > li > hr { margin: 0.6em 0; } +.md-typeset .grid.cards > ul > li h3 { margin-top: 0; } +.md-typeset .grid.cards > ul > li .md-button { margin: 0.2em 0.4em 0.2em 0; font-size: 0.78em; padding: 0.45em 1em; } + +/* Botones */ +.md-typeset .md-button--primary { + background-color: var(--helgen-indigo); + border-color: var(--helgen-indigo); + color: #fff; +} +.md-typeset .md-button--primary:hover { + background-color: var(--helgen-teal); + border-color: var(--helgen-teal); +} + +/* ---- Pastillas de estado de tarjeta ------------------------------------- */ +.badge-v3, .badge-v4, .badge-v55, .badge-v56, .badge-v6, .badge-fw { + display: inline-block; + padding: 0.1em 0.65em; + border-radius: 999px; + font-size: 0.72em; + font-weight: 700; + letter-spacing: 0.02em; + line-height: 1.6; + vertical-align: middle; + white-space: nowrap; +} +.badge-v56 { background: var(--helgen-indigo); color: #fff; } +.badge-v55 { background: var(--helgen-teal); color: #fff; } +.badge-v6 { background: #fff3cd; color: #7a5200; border: 1px solid #f0c36d; } +.badge-v4 { background: var(--helgen-light-indigo); color: var(--helgen-indigo); border: 1px solid #c9d0e0; } +.badge-v3 { background: #e9e9e9; color: #555; border: 1px solid #ccc; } +.badge-fw { background: var(--helgen-light-cyan); color: #0f5f52; border: 1px solid #9fe6d8; } +[data-md-color-scheme="slate"] .badge-v4 { background: #2a3650; color: #dfe6f5; border-color: #3d5078; } +[data-md-color-scheme="slate"] .badge-v3 { background: #333; color: #ccc; border-color: #555; } +[data-md-color-scheme="slate"] .badge-v6 { background: #4a3a10; color: #ffd97a; border-color: #7a5200; } +[data-md-color-scheme="slate"] .badge-fw { background: #123a34; color: var(--helgen-cyan); border-color: #17A08C; } + +/* Aviso de búsqueda en la portada */ +.buscar-aviso { + background: var(--helgen-light-cyan); + border-left: 4px solid var(--helgen-teal); + padding: 0.6em 1em; + border-radius: 0.3rem; + margin: 1em 0 1.5em; +} +[data-md-color-scheme="slate"] .buscar-aviso { background: #123a34; } + +/* Tablas: más compactas y con cabecera Helgen */ +.md-typeset table:not([class]) th { + background: var(--helgen-light-indigo); + color: var(--helgen-indigo); +} +[data-md-color-scheme="slate"] .md-typeset table:not([class]) th { + background: #2a3650; + color: #fff; +} +.md-typeset table:not([class]) td, .md-typeset table:not([class]) th { padding: 0.5em 0.8em; } + +/* Listas de pasos numeradas (índices de sección) */ +.md-typeset ol.pasos > li { margin-bottom: 0.6em; } +.md-typeset ol.pasos > li::marker { font-weight: 700; color: var(--helgen-teal); } + +/* ---- Impresión (checklists y procedimientos) ---------------------------- */ +@media print { + .md-header, .md-tabs, .md-sidebar, .md-footer, .md-top, .md-search, + .md-content__button, .md-source-file, .md-typeset .headerlink { display: none !important; } + .md-main__inner { margin: 0; } + .md-content { max-width: 100%; margin: 0; } + .md-typeset { font-size: 10.5pt; line-height: 1.35; color: #000; } + .md-typeset h1 { font-size: 16pt; color: #000; page-break-after: avoid; } + .md-typeset h2 { font-size: 13pt; page-break-after: avoid; border-bottom: 1px solid #000; } + .md-typeset h3 { font-size: 11.5pt; page-break-after: avoid; } + .md-typeset table { page-break-inside: avoid; font-size: 9.5pt; } + .md-typeset .admonition, .md-typeset details { page-break-inside: avoid; border: 1px solid #000; box-shadow: none; } + .md-typeset .task-list-control .task-list-indicator { border: 1px solid #000; background: #fff; } + .md-typeset a { color: #000; text-decoration: none; } + .md-typeset a[href^="http"]::after { content: none; } + .badge-v3, .badge-v4, .badge-v55, .badge-v56, .badge-v6, .badge-fw { border: 1px solid #000; background: none; color: #000; } + @page { margin: 12mm 14mm; } +} diff --git a/docs/tablero.html b/docs/tablero.html index 82b44f8..a0f8d73 100644 --- a/docs/tablero.html +++ b/docs/tablero.html @@ -71,7 +71,7 @@ const STREAMS = [ { tipo:'prueba-v5', prefijo:'V5', desde:1, n:30, pad:2, titulo:'Tarjetas EinarBoard — V5', form:'formularios/v5.html' }, { tipo:'modulo-ard', prefijo:'ARD', desde:1, n:30, pad:3, titulo:'Módulos simpleRTK2B Pro — ARD', form:'formularios/ardusimple.html', usoClave:'ard' }, { tipo:'modulo-4g', prefijo:'RTK', desde:1, n:30, pad:4, titulo:'Módems 4G NTRIP Master — RTK', form:'formularios/modem4g.html', usoClave:'modem' }, - { tipo:'prueba-v4', prefijo:'V4', desde:1, n:15, pad:2, titulo:'Tarjetas EinarBoard — V4 (fw 0.5.6)', form:'formularios/v4.html' }, + { tipo:'prueba-v4', prefijo:'V4', desde:1, n:15, pad:2, titulo:'Tarjetas EinarBoard — V4 (fw 0.6.0)', form:'formularios/v4.html' }, ]; const TABLAS = [ { tipo:'integracion', titulo:'Integración ArduSimple + 4G (parejas)', form:'formularios/integracion.html', cols:[['ard','ArduSimple'],['modem','4G (RTK-)']] }, diff --git a/docs/taller/index.md b/docs/taller/index.md new file mode 100644 index 0000000..22c663b --- /dev/null +++ b/docs/taller/index.md @@ -0,0 +1,18 @@ +--- +title: "Taller" +--- + +# Taller + +Unidad o tarjeta en la mesa. Antes de tocarla, abre su [expediente](../unidad.html). Reglas de banco: [diagnóstico en banco](../procedimientos/diagnostico-banco.md#reglas-de-banco). + +| Trabajo | Cuándo | Procedimiento | Acta | +|---|---|---|---| +| Diagnóstico en banco | Llegó del campo o falló en producción | [Diagnóstico en banco](../procedimientos/diagnostico-banco.md) | [Banco](../formularios/banco.html) | +| Reflasheo | Después de subir la captura del diagnóstico | [Reflasheo de unidades](../procedimientos/reflasheo-unidades.md) | [Reflasheo y configuración](../formularios/reflasheo.html) | +| Módem 4G en batería | Validar firmware o unidad que no reporta en batería | [Módem 4G en batería](../procedimientos/prueba-bateria-modem.md) | [Módem en batería](../formularios/prueba-bateria.html) | +| Ethernet y puertos serie | El cliente usa Ethernet, RS-485 o RS-232 | [Ethernet y puertos serie](../procedimientos/v5-prueba-ethernet-serie.md) | [Ethernet y serie](../formularios/ethernet-serie.html) | +| Tarjeta V4 | Preparación y prueba con 0.6.0 | [Preparación y prueba V4](../procedimientos/v4-prueba-fw-0.5.6.md) | [Prueba V4](../formularios/v4.html) | + +- [Manual V5](../manuales/manual-tarjeta-V5.md) · [Manual V4](../manuales/manual-tarjeta-V4.md) · [Pinout V5.6](../hardware/v56-pinout.md) +- [Tablero de producción](../tablero.html) diff --git a/mkdocs.yml b/mkdocs.yml index 291ceed..15639ad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,31 +1,47 @@ -site_name: HBOX — Documentación Técnica -site_description: Procedimientos de banco, montaje y diagnóstico del HBOX (EinarBoard) — Helgen Technologies -site_url: https://docs.helgen.online/hbox/ +site_name: HBOX — Documentación técnica (Helgen) +site_description: Procedimientos de producción, taller, campo y hardware del HBOX (EinarBoard) — Helgen Technologies +site_url: https://drogheda.helgen.online/ copyright: "© Helgen Technologies — uso interno" theme: name: material language: es + logo: img/helgen-logo-white.png + favicon: img/favicon.png + font: false palette: - scheme: default - primary: deep orange - accent: deep orange + primary: custom + accent: custom toggle: icon: material/weather-night name: Modo oscuro - scheme: slate - primary: deep orange - accent: deep orange + primary: custom + accent: custom toggle: icon: material/weather-sunny name: Modo claro features: - - navigation.tracking + - navigation.tabs + - navigation.tabs.sticky + - navigation.sections - navigation.indexes - navigation.top + - navigation.footer + - navigation.tracking + - search.suggest - search.highlight - content.code.copy - - toc.integrate + - toc.follow + +extra_css: + - stylesheets/extra.css + +plugins: + - search: + lang: [es, en] + separator: '[\s\-\.,:/]+' markdown_extensions: - admonition @@ -41,70 +57,107 @@ markdown_extensions: nav: - "🏠 Inicio": index.md + - "🧭 Guía del ingeniero": guia-ingeniero.md - - "🚜 Campo — la unidad está en la máquina": - - "Cómo se diagnostica en campo": diagnostico/procedimiento-diagnostico-campo.md - - "▶ Acta de diagnóstico en campo": formularios/diagnostico.html - - "Tablero de campo (qué se ha revisado)": diagnostico/tablero-campo.html - - - "🔬 Taller — la unidad está en la mesa": - - "Cómo se diagnostica en banco": procedimientos/diagnostico-banco.md - - "▶ Acta de diagnóstico en banco": formularios/banco.html - - "⚡ Reflasheo de unidades": procedimientos/reflasheo-unidades.md - - "🔋 Prueba: módem 4G en batería (0.6.0)": procedimientos/prueba-bateria-modem.md - - "▶ Acta: prueba de módem en batería": formularios/prueba-bateria.html - - "🧪 V4 — preparación y prueba con 0.5.6": procedimientos/v4-prueba-fw-0.5.6.md - - "▶ Acta de prueba V4 (0.5.6)": formularios/v4.html - - "▶ Acta de reflasheo y configuración": formularios/reflasheo.html - - - "🏭 Producción — lote v5": - - "1 · Prueba y flasheo de tarjetas": procedimientos/v5-prueba-y-flasheo.md - - "▶ Acta de tarjeta V5": formularios/v5.html - - "2 · Módulos RTK y 4G": procedimientos/v5-modulos-integracion.md - - "▶ Acta ArduSimple": formularios/ardusimple.html - - "▶ Acta módem 4G": formularios/modem4g.html - - "▶ Acta de integración": formularios/integracion.html - - "3 · Ensamble de la unidad": procedimientos/v5-ensamble.md - - "▶ Acta de ensamble": formularios/ensamble.html + - "🏭 Producción — lote V5.6": + - produccion/index.md + - "1 · Prueba y flasheo de tarjetas": + - procedimientos/v5-prueba-y-flasheo.md + - "Acta de tarjeta V5": formularios/v5.html + - "2 · Módulos RTK y 4G": + - procedimientos/v5-modulos-integracion.md + - "Acta ArduSimple": formularios/ardusimple.html + - "Acta módem 4G": formularios/modem4g.html + - "Acta de integración": formularios/integracion.html + - "3 · Ensamble de la unidad": + - procedimientos/v5-ensamble.md + - "Acta de ensamble": formularios/ensamble.html - "4 · Prueba final antes de embarcar": procedimientos/v5-prueba-final-unidad.md + - "5 · Configuración de la unidad": procedimientos/v5-configuracion-unidad.md + - "6 · Checklist de puesta en marcha": procedimientos/v5-checklist-puesta-en-marcha.md - "Tablero de producción": tablero.html - - "🛠 Hardware v6 — fabricación": - - "Auditoría pre-fabricación (español)": hardware/v6-auditoria-prefab.md - - "Pre-fabrication audit (English)": hardware/v6-prefab-audit.md - - "Plan de cobre y colocación EMC (ES)": hardware/EinarBoard-v6_Plan-de-Cobre_ES.html - - "Copper plan & EMC placement (EN)": hardware/EinarBoard-v6_Copper-Plan_EN.html + - "🔬 Taller": + - taller/index.md + - "Diagnóstico en banco": + - procedimientos/diagnostico-banco.md + - "Acta de diagnóstico en banco": formularios/banco.html + - "Reflasheo de unidades": + - procedimientos/reflasheo-unidades.md + - "Acta de reflasheo y configuración": formularios/reflasheo.html + - "Prueba: módem 4G en batería": + - procedimientos/prueba-bateria-modem.md + - "Acta: módem en batería": formularios/prueba-bateria.html + - "Prueba: Ethernet y puertos serie": + - procedimientos/v5-prueba-ethernet-serie.md + - "Acta: Ethernet y puertos serie": formularios/ethernet-serie.html + - "V4 — preparación y prueba con 0.6.0": + - procedimientos/v4-prueba-fw-0.5.6.md + - "Acta de prueba V4": formularios/v4.html - - "🔩 Montaje y arneses": - - "Pinout de arneses y conectores": montaje/pinout-arneses.md - - "BOM dividido para ensamble": montaje/bom-split.md - - "Guía de ensamble y control de calidad": montaje/guia-ensamble-qc.md - - "Guía de ensamble (PDF)": montaje/assembly-guide.md + - "🚜 Campo": + - campo/index.md + - "Diagnóstico en campo": + - diagnostico/procedimiento-diagnostico-campo.md + - "Acta de diagnóstico en campo": formularios/diagnostico.html + - "Tablero de campo": diagnostico/tablero-campo.html + - "Puesta en marcha en el puerto": procedimientos/v5-checklist-puesta-en-marcha.md + - "Envío, recepción y daños": + - procedimientos/ciclo-de-vida.md + - "Acta de envío": formularios/envio.html + - "Acta de recepción e inspección": formularios/recepcion.html + - "Acta de daño o incidente": formularios/dano.html + - "Expediente de una unidad": unidad.html + - "Actas — índice y cómo se usan": actas/index.md - - "📥 Descargas": - - "Firmware, parámetros 4G y ZED-F9P": descargas/index.md - - "README firmware bring-up v5": descargas/hbox-v5-bringup-README.md + - "🔩 Tarjetas y hardware": + - hardware/index.md + - "Manuales por tarjeta": manuales/index.md + - "V5.6 — lote en pedido": + - "Manual de la tarjeta V5 (V5.5 y V5.6)": manuales/manual-tarjeta-V5.md + - "Hoja de datos V5.6": hardware/v56-datasheet.md + - "Pinout de conectores V5.6": hardware/v56-pinout.md + - "Instrucciones de layout (esquemático → PCB)": hardware/v56-layout-instrucciones.md + - "ECO V5.6": hardware/v56-eco.md + - "Cambios al esquemático V5.5 → V5.6": hardware/v56-cambios-esquematico.md + - "V4": + - "Manual de la tarjeta V4": manuales/manual-tarjeta-V4.md + - "V3 — producción antigua": + - "Manual de la tarjeta V3": manuales/manual-tarjeta-V3.md + - "Pinout V3 (arneses y conectores)": montaje/pinout-arneses.md + - "BOM V3 (dividido para ensamble)": montaje/bom-split.md + - "Guía de ensamble y control de calidad": montaje/guia-ensamble-qc.md + - "Guía de ensamble (PDF)": montaje/assembly-guide.md + - "v6 — en diseño, no pedir": + - "Manual de la tarjeta v6": manuales/manual-tarjeta-v6.md + - "Auditoría completa v6": hardware/v6-auditoria-completa.md + - "Cambios al esquemático v6": hardware/v6-cambios-esquematico.md + - "Revisión v6 contra lecciones V5.5": hardware/v6-revision-lecciones-v55.md + - "Mapa de pines MCU v6": hardware/v6-pinmap.md + - "Auditoría pre-fabricación v6": hardware/v6-auditoria-prefab.md + - "Auditoría pre-fabricación v6 (inglés)": hardware/v6-prefab-audit.md + - "Plan de cobre y colocación EMC v6": hardware/EinarBoard-v6_Plan-de-Cobre_ES.html + - "Plan de cobre y colocación EMC v6 (inglés)": hardware/EinarBoard-v6_Copper-Plan_EN.html - - "📦 Ciclo de vida — envío, recepción, daños": - - "El ciclo de vida de una unidad (mapa)": procedimientos/ciclo-de-vida.md - - "▶ Acta de envío": formularios/envio.html - - "▶ Acta de recepción e inspección (cada caja, antes del puerto)": formularios/recepcion.html - - "▶ Acta de daño o incidente": formularios/dano.html - - - "🗂 Expediente de una unidad": unidad.html - - "📋 Actas — índice y cómo se usan": actas/index.md - - - "🌿 Git y archivos de diseño": - - "Guía Git (español)": git/guia-git-es.md - - "Git guide (English)": git/git-guide-en.md + - "📕 Manuales y descargas": + - "Manual del cliente (instalación y operación)": manuales/manual-cliente.md + - "Manual de instalación y operación (PDF)": manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf + - "Ficha técnica HBOX (PDF)": manuales/Drogheda-HBOX-Datasheet_v2.0.pdf + - "Descargas": + - descargas/index.md + - "README firmware bring-up v5": descargas/hbox-v5-bringup-README.md + - "Git y archivos de diseño": + - "Guía Git": git/guia-git-es.md + - "Guía Git (inglés)": git/git-guide-en.md - "📚 Referencia e histórico": - - "Protocolo de diagnóstico remoto (2026-06)": diagnostico/protocolo-diagnostico-remoto.md - - "EinarBoard 1.0 — Bring-up runbook": procedimientos/einarboard-1.0-bringup.md - - "FW v3.0.3 — Prueba de banco (ventilador)": procedimientos/fan-policy-bench-test.md - - "Histórico — Proto bench v3": procedimientos/historico-proto-bench-v3.md - - "Histórico — Protoboard": procedimientos/historico-protoboard.md + - "Protocolo de diagnóstico remoto": diagnostico/protocolo-diagnostico-remoto.md + - "EinarBoard 1.0 — puesta en marcha (histórico)": procedimientos/einarboard-1.0-bringup.md + - "FW v3.0.3 — prueba de banco del ventilador": procedimientos/fan-policy-bench-test.md + - "Histórico — prototipo v3 en protoboard": procedimientos/historico-proto-bench-v3.md + - "Histórico — lista de compras del protoboard": procedimientos/historico-protoboard.md - - "👤 Mi cuenta (cambiar contraseña)": cuenta.html - - "⚙ Administración (Leo)": admin.html - - "🚪 Salir": salir.html + - "⚙ Cuenta": + - "Mi cuenta (cambiar contraseña)": cuenta.html + - "Administración (Leo)": admin.html + - "Salir": salir.html diff --git a/scripts/sync-docs.sh b/scripts/sync-docs.sh old mode 100644 new mode 100755 index cf7a14d..7cd3167 --- a/scripts/sync-docs.sh +++ b/scripts/sync-docs.sh @@ -6,6 +6,9 @@ set -euo pipefail cd "$(dirname "$0")/.." SRC="${DROGHEDA_ROOT:-..}" # hbox-docs vive como submódulo directo de Drogheda +# NOTA (2026-09-29): las portadas de sección docs/index.md, docs/produccion/index.md, docs/taller/index.md, +# docs/campo/index.md y docs/hardware/index.md, junto con docs/stylesheets/extra.css y docs/img/, viven SOLO en +# hbox-docs (no vienen del repo Drogheda) y no están en este MAP a propósito: el script no las toca ni las borra. 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" @@ -38,6 +41,28 @@ declare -a MAP=( "04-Source-Code/firmware/release/hbox-tarjetaV4_0.6.0.bin|docs/descargas/hbox-tarjetaV4_0.6.0.bin" "04-Source-Code/firmware/release/hbox-tarjetaV4_0.5.9.bin|docs/descargas/superseded/hbox-tarjetaV4_0.5.9.bin" "04-Source-Code/firmware/release/hbox-tarjetaV4_0.5.8.bin|docs/descargas/superseded/hbox-tarjetaV4_0.5.8.bin" + # Documentación 2026-09-29: datasheet, pinout V5.6, manuales por tarjeta, procedimientos de configuración/Ethernet/serie, manual de cliente + "03-Architecture-Hardware/2026-09-29_Drogheda_EinarBoard-V5.6_Datasheet_ES_v1.0.md|docs/hardware/v56-datasheet.md" + "03-Architecture-Hardware/2026-09-29_Drogheda_HBOX-V5_Harness-Connector-Pinout_v1.0.md|docs/hardware/v56-pinout.md" + "03-Architecture-Hardware/manuales/index.md|docs/manuales/index.md" + "03-Architecture-Hardware/manuales/manual-tarjeta-V5.md|docs/manuales/manual-tarjeta-V5.md" + "03-Architecture-Hardware/manuales/manual-tarjeta-V4.md|docs/manuales/manual-tarjeta-V4.md" + "03-Architecture-Hardware/manuales/manual-tarjeta-V3.md|docs/manuales/manual-tarjeta-V3.md" + "03-Architecture-Hardware/manuales/manual-tarjeta-v6.md|docs/manuales/manual-tarjeta-v6.md" + "06-Testing-Validation/2026-09-29_Drogheda_HBOX-V5_Configuracion-de-Unidad_ES_v1.0.md|docs/procedimientos/v5-configuracion-unidad.md" + "06-Testing-Validation/2026-09-29_Drogheda_HBOX-V5_Prueba-Ethernet-y-Puertos-Serie_ES_v1.0.md|docs/procedimientos/v5-prueba-ethernet-serie.md" + "06-Testing-Validation/2026-09-29_Drogheda_HBOX-V5_Checklist-Puesta-en-Marcha_ES_v1.0.md|docs/procedimientos/v5-checklist-puesta-en-marcha.md" + "03-Architecture-Hardware/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf|docs/manuales/Drogheda-Manual-Instalacion-Operacion_v2.0.pdf" + "Marketing/HBOX-Datasheet/Drogheda-HBOX-Datasheet_v2.0.pdf|docs/manuales/Drogheda-HBOX-Datasheet_v2.0.pdf" + "00-Project-Management/2026-09-29_Drogheda_Guia-Ingeniero-Sitio_ES_v1.0.md|docs/guia-ingeniero.md" + "03-Architecture-Hardware/2026-09-29_Drogheda_EinarBoard-V5.6_Instrucciones-Layout_ES_v1.0.md|docs/hardware/v56-layout-instrucciones.md" + "03-Architecture-Hardware/2026-09-28_Drogheda_EinarBoard-V5.6_Schematic-Change-Report_v1.0.md|docs/hardware/v56-cambios-esquematico.md" + "03-Architecture-Hardware/2026-09-27_Drogheda_EinarBoard-V5.6_ECO_ES_v1.0.md|docs/hardware/v56-eco.md" + # v6 (en diseño) + "03-Architecture-Hardware/2026-09-28_Drogheda_EinarBoard-v6_Full-Audit_v1.0.md|docs/hardware/v6-auditoria-completa.md" + "03-Architecture-Hardware/2026-09-28_Drogheda_EinarBoard-v6_Schematic-Change-Report_v1.0.md|docs/hardware/v6-cambios-esquematico.md" + "03-Architecture-Hardware/2026-09-28_Drogheda_EinarBoard-v6_Review-vs-V5.5-Lessons_v1.0.md|docs/hardware/v6-revision-lecciones-v55.md" + "03-Architecture-Hardware/pinmap-v6.md|docs/hardware/v6-pinmap.md" "04-Source-Code/firmware/release/hbox-tarjetaV4_0.5.7.bin|docs/descargas/superseded/hbox-tarjetaV4_0.5.7.bin" "04-Source-Code/firmware/release/hbox-tarjetaV4_0.5.6.bin|docs/descargas/superseded/hbox-tarjetaV4_0.5.6.bin" "04-Source-Code/firmware/release/hbox-tarjetaV4_0.5.5.bin|docs/descargas/superseded/hbox-tarjetaV4_0.5.5.bin"