Drogheda/06-Testing-Validation/RCA-Presentacion-2026-06-22/2026-06-22_Drogheda_RCA-Presentacion_v1.0.tex

487 lines
26 KiB
TeX
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

% Helgen Technologies — HBOX RTK · RCA + Plan de Robustez (Project Drogheda)
% Audiencia: ICAVE (cliente, supervisor tecnico). Tono: responsable, tecnico, honesto.
% Compilar con XeLaTeX: latexmk -xelatex -interaction=nonstopmode <file>.tex
\documentclass[10pt,aspectratio=169]{beamer}
\usetheme[progressbar=frametitle, numbering=fraction, block=fill]{metropolis}
% ---------- Paleta oficial Helgen (Guia de Identidad v1.5, 2026) ----------
\definecolor{HelgenIndigo}{HTML}{2C3C5B} % Indigo — color primario
\definecolor{HelgenCyan}{HTML}{51F3DA} % Verde cian — acento
\definecolor{HelgenTeal}{HTML}{17A08C} % derivado: cian oscurecido para TEXTO sobre blanco
\definecolor{HelgenMist}{HTML}{EFF1F5} % derivado: tinte indigo 8% para rellenos
\definecolor{HelgenAmber}{HTML}{C0392B} % rojo de alerta (umbrales/peligro)
\setbeamercolor{normal text}{fg=HelgenIndigo, bg=white}
\setbeamercolor{alerted text}{fg=HelgenTeal}
\setbeamercolor{frametitle}{bg=HelgenIndigo, fg=white}
\setbeamercolor{progress bar}{fg=HelgenCyan, bg=HelgenMist}
\setbeamercolor{title separator}{fg=HelgenCyan}
\setbeamercolor{block title}{bg=HelgenMist, fg=HelgenIndigo}
\setbeamercolor{block title alerted}{bg=HelgenIndigo, fg=white}
% ---------- Fuentes de marca + idioma ----------
\usepackage{iftex}
\ifXeTeX
\usepackage{fontspec}
\IfFontExistsTF{League Spartan}{%
\newfontfamily\helgentitle{League Spartan}[BoldFont={* Bold}]
\setbeamerfont{title}{family=\helgentitle, series=\bfseries}
\setbeamerfont{frametitle}{family=\helgentitle, series=\bfseries}
\setbeamerfont{section title}{family=\helgentitle, series=\bfseries}
\setbeamerfont{standout}{family=\helgentitle, series=\bfseries}
}{}
\IfFontExistsTF{MADE Evolve Sans}{\setsansfont{MADE Evolve Sans}}{}
\else
\usepackage[T1]{fontenc}
\fi
% babel-spanish no esta en este TeX Live; XeLaTeX maneja acentos UTF-8 nativamente.
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, shapes.misc, fit, backgrounds}
\usepackage{listings}
\lstset{
basicstyle=\ttfamily\scriptsize,
keywordstyle=\color{HelgenIndigo}\bfseries,
commentstyle=\color{gray},
stringstyle=\color{HelgenTeal},
showstringspaces=false, breaklines=true, frame=single,
framerule=0.2pt, rulecolor=\color{HelgenMist}
}
% ---------- Estilos TikZ ----------
\tikzset{
box/.style={rounded rectangle, draw=HelgenIndigo, fill=HelgenMist,
font=\scriptsize, minimum height=7mm, inner xsep=2mm, align=center},
st/.style={rounded rectangle, draw=HelgenIndigo, fill=HelgenMist,
font=\scriptsize, minimum height=7mm, inner xsep=2mm, align=center},
hot/.style={rounded rectangle, draw=HelgenAmber, fill=HelgenMist, very thick,
font=\scriptsize, minimum height=7mm, inner xsep=2mm, align=center},
arr/.style={-{Stealth}, thick, HelgenTeal},
arrb/.style={-{Stealth}, thick, HelgenIndigo}
}
% ---------- Vinetas + separador (la fuente de marca no trae bullet ni middot) ----------
\setbeamertemplate{itemize item}{\textcolor{HelgenTeal}{\rule[0.25ex]{0.85ex}{0.85ex}}}
\setbeamertemplate{itemize subitem}{\textcolor{HelgenTeal}{\rule[0.25ex]{0.6ex}{0.6ex}}}
\setbeamertemplate{itemize subsubitem}{\textcolor{HelgenTeal}{\rule[0.25ex]{0.5ex}{0.5ex}}}
\newcommand{\sep}{\raisebox{0.35ex}{\rule{0.45ex}{0.45ex}}}
% Pie de figura con ancho acotado (evita desbordes al centrar texto largo)
\newcommand{\figcap}[1]{\par\vspace{1.2mm}\centerline{\begin{minipage}{0.92\textwidth}\footnotesize\centering #1\end{minipage}}}
% ---------- Pie de pagina ----------
\setbeamertemplate{frame footer}{%
\scriptsize\color{gray}\insertshortauthor\ \sep\ \insertshorttitle\ \sep\ Confidencial — Helgen Servicios Especializados}
% ---------- Metadatos ----------
\title[RCA HBOX RTK \sep\ ICAVE]{HBOX RTK — Análisis de Causa Raíz y Plan de Robustez}
\subtitle{Fallas de campo en ICAVE (Veracruz) \sep\ Camino a HBOX v3.0}
\author[Helgen Technologies]{Helgen Technologies — Ingeniería de Producto}
\date{22 de junio de 2026}
\begin{document}
\maketitle
\begin{frame}{Agenda}
\setbeamertemplate{section in toc}[sections numbered]
\tableofcontents[hideallsubsections]
\end{frame}
% =====================================================================
\section{Contexto y hallazgo principal}
\begin{frame}{¿Qué pasó?}
\begin{itemize}
\item 5 HBOX RTK instalados en equipo pesado de ICAVE (RTG, reach stackers, montacargas, tractoplana).
\item Operación intermitente desde el arranque y, después, una \alert{falla casi simultánea} en toda la flota.
\item En paralelo, durante semanas: \alert{desconexiones recurrentes} en Wialon.
\item Escalamiento del cliente (17 jun). Unidades retiradas: 4 en mano (3 fuera de servicio, 1 funcional) en Veracruz; equipo en Querétaro.
\end{itemize}
\vfill
\begin{alertblock}{Lo primero: transparencia}
Nuestra primera hipótesis fue el calor. El análisis con datos revela un cuadro más complejo, y este informe \textbf{corrige el diagnóstico con evidencia}.
\end{alertblock}
\end{frame}
\begin{frame}{Hallazgo principal}
\begin{itemize}
\item \textbf{No hay una causa única.} La evidencia apunta a \alert{al menos dos causas independientes}, amplificadas por una tercera.
\item \textbf{(1) Backend} — \alert{confirmado en el código}: puede retirar de Wialon a unidades que en realidad están \emph{sanas}.
\item \textbf{(2) Hardware / térmico} — causa física probable de las unidades genuinamente dañadas (a confirmar con desmontaje + termopar).
\item \textbf{(3) Firmware} — convierte interrupciones breves en cortes prolongados (ya corregido en v2).
\end{itemize}
\vfill
\begin{block}{Una consecuencia favorable}
Varias unidades reportadas como «caídas» pueden tener el \textbf{radio sano} y ser \textbf{víctimas del servidor}: esa parte es de corrección inmediata y de bajo costo.
\end{block}
\end{frame}
\begin{frame}{En una línea}
\begin{block}{Síntesis}
\large Los radios \textbf{funcionan}: entregamos posición GPS estándar (SPS) de forma confiable, \alert{todavía no RTK}. Los frentes por cerrar son la \textbf{fuente de correcciones}, la \textbf{observabilidad}, el \textbf{térmico} y la \textbf{vibración} — los cuatro, en corrección.
\end{block}
\end{frame}
% =====================================================================
\section{Metodología de diagnóstico}
\begin{frame}{Cómo diagnosticamos}
\begin{itemize}
\item \textbf{Principio:} validar primero las causas \alert{más probables y de comprobación inmediata} —sin desmontar unidades— antes que las hipótesis exóticas.
\item \textbf{3 vistas de log independientes por unidad:} receptor u-blox (\texttt{.ubx}), consola del 4G-NTRIP-Master (\texttt{.log}) y captura del retranslator en el servidor (\texttt{tcpdump}).
\item \textbf{+} archivos de configuración (caster NTRIP y ZED-F9P) \textbf{+} un \alert{baseline sano} de referencia (\texttt{RTK14\_440}).
\item \textbf{Herramientas propias} (\texttt{hbox-log-tools}): Log Explorer en navegador, analizador por lotes y dashboard.
\end{itemize}
\end{frame}
\begin{frame}{Diagnóstico diferencial (H1–H8)}
\centering\scriptsize
\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.15}
\begin{tabular}{@{}c L{0.42\textwidth} c c L{0.18\textwidth}@{}}
\toprule
\# & Hipótesis & A: simult. & B: descon. & Estado / Prior \\
\midrule
H1 & Térmico (batería / booster / módem en gabinete sellado + Mean Well) & Sí & Sí & Alto \\
H2 & Backend HOL (retranslator bloqueante) & Sí & Sí & \textbf{Confirmado (código)} \\
H2b & Filtro anti-salto (bloqueo permanente) & No & Sí & \textbf{Confirmado (código)} \\
H3 & Vibración (Dupont / SMA / soldadura) & No & Sí & Alto \\
H4 & Módulo 4G NTRIP (cuelgue / falla) & Parc. & Sí & Alto \\
H5 & Fusible sub-dimensionado & Sí* & Parc. & Medio \\
H6 & Lógica de watchdog (reset / loop) & No & Sí & Alto (para B) \\
H7 & Brownout de batería (caída de tensión por calor) & Sí & Sí & Medio-alto \\
H8 & Riel de potencia / EMI de la máquina & Parc. & Sí & Medio \\
\bottomrule
\end{tabular}
\vfill
\footnotesize Las dos comprobaciones \alert{más rápidas} (backend H2, fusible H5) se confirman en una hora, \textbf{sin desmontar una sola unidad}.
\end{frame}
% =====================================================================
\section{Evidencia: los datos}
\begin{frame}{Dos fallas, probablemente \emph{dos} causas}
\begin{columns}[T]
\column{0.5\textwidth}
\textbf{(A) Falla casi simultánea}
\begin{itemize}\small
\item Apunta a un estresor de \alert{modo común}.
\item Candidatos: calor, backend / caster / SIM, servidor.
\end{itemize}
\column{0.5\textwidth}
\textbf{(B) Desconexión crónica}
\begin{itemize}\small
\item Apunta a \alert{intermitencias}.
\item Candidatos: vibración, cuelgue del 4G, watchdog lento.
\end{itemize}
\end{columns}
\vfill
\begin{alertblock}{Por qué no reducirlo todo a «calor»}
Atribuir todo al calor pierde una corrección barata de \textbf{backend}, y un rediseño térmico \textbf{no} detendría las intermitencias por \textbf{vibración}. Se atienden ambas.
\end{alertblock}
\end{frame}
\begin{frame}{Ninguna unidad alcanzó RTK}
\centering
\includegraphics[width=\linewidth,height=0.76\textheight,keepaspectratio]{figs/fig_fix_compare.pdf}
\vfill
\figcap{Todas las capturas en \textbf{SPS (calidad 1)}; \alert{cero en RTK (4/5)}. El posicionamiento centimétrico nunca se entregó.}
\end{frame}
\begin{frame}{El receptor está sano — el problema no es el ZED-F9P}
\centering
\includegraphics[width=\linewidth,height=0.76\textheight,keepaspectratio]{figs/fig_baseline_gnss.pdf}
\vfill
\figcap{Baseline \texttt{RTK14\_440}: \textbf{12 satélites, HDOP 0.75}, C/N0 sano — pero atrapado en SPS. El receptor funciona.}
\end{frame}
\begin{frame}{La entrega extremo-a-extremo es sana}
\centering
\includegraphics[width=\linewidth,height=0.74\textheight,keepaspectratio]{figs/fig_delivery.pdf}
\vfill
\figcap{\texttt{RTK14\_440}: \textbf{984 paquetes, 1 Hz estable, cero caídas} al servidor. Lección clave: \alert{«entrega sana» $\neq$ «RTK»}.}
\end{frame}
\begin{frame}{Las correcciones son marginales}
\centering
\includegraphics[width=\linewidth,height=0.70\textheight,keepaspectratio]{figs/fig_ntrip_delay.pdf}
\vfill
\figcap{\textbf{Causa:} caster público gratuito \texttt{rtk2go} (sin SLA) + configuración del F9P \alert{solo en RAM} + cielo interior (banco). El cliente NTRIP rara vez alcanza el estado «conectado».}
\end{frame}
\begin{frame}{La trampa diagnóstica (y una rectificación)}
\begin{itemize}
\item La \textbf{consola del 4G-NTRIP-Master no es un indicador de salud confiable}: el baseline \emph{sano} registra la misma consola escasa que las unidades que «parecían» falladas.
\item \alert{Rectificación:} la supuesta «falla de ingest en master-14» queda \textbf{retirada} — master-14 \emph{es} el baseline y demuestra reenvío.
\item \textbf{Solo master-21} es una falla confirmada (el módem nunca registra: \texttt{0xFFFFF} + 511 errores del parser AT).
\end{itemize}
\vfill
\begin{block}{Lección}
La salud por unidad debe provenir de un componente que \textbf{interpreta el fix} —el Blackpill— registrado en un formato confiable.
\end{block}
\end{frame}
% =====================================================================
\section{Causas raíz}
\begin{frame}{Térmico (H1 / H7) — qué es real y qué falta probar}
\begin{itemize}
\item \textbf{Trampa térmica anidada:} el HBOX va sellado dentro de un gabinete ABS IP67 que \emph{además} aloja la fuente Mean Well, a pleno sol en Veracruz (interior estimado 60–80\,°C).
\item \textbf{La carcasa ASA fue una elección correcta:} UV-estable y reblandece a $\sim$95–100\,°C, con margen frente a esa temperatura. \alert{El gabinete no es el eslabón débil.}
\item \textbf{El eslabón débil son los componentes de potencia de grado prototipo} en ese espacio caliente: batería 18650 (carga $\leq$45\,°C $\rightarrow$ caída de tensión / hinchamiento), PowerBoost 1000C (booster \emph{hobby}) y el módem 4G (throttling térmico).
\item El \textbf{ZED-F9P} ($-40\ldots+85$\,°C) \alert{no} es la víctima.
\end{itemize}
\vfill
\begin{alertblock}{Honesto}
En banco las fallas se reproducen \textbf{en frío} $\rightarrow$ el calor \emph{no} explica lo observado en estos logs. La hipótesis térmica de \textbf{campo} sigue \alert{abierta} (falta soak con termopar).
\end{alertblock}
\end{frame}
\begin{frame}[fragile]{Backend (H2 / H2b) — confirmado en el código}
\begin{itemize}\small
\item \textbf{H2:} el envío a Wialon (con \texttt{connect} de 20\,s y espera de ACK) ocurre \alert{dentro} del único bucle UDP $\rightarrow$ un upstream lento detiene el bucle y \textbf{toda la flota cae a la vez}.
\item \textbf{H2b:} el filtro anti-salto no actualiza su referencia tras un «salto» rechazado $\rightarrow$ una unidad sana queda \alert{fuera de Wialon de forma permanente}.
\end{itemize}
\begin{lstlisting}
# retranslator.py (defecto): envio sincrono en el bucle de recepcion
for pkt in udp_recv_loop(): # un solo hilo, toda la flota
wialon.connect(timeout=20) # bloquea a TODOS si el upstream tarda
wialon.send(pkt); wialon.wait_ack() # head-of-line stall
\end{lstlisting}
\footnotesize Triage \alert{sin costo}: ONLINE en htracker pero OFFLINE en Wialon $\Rightarrow$ víctima del backend, no hardware dañado.
\end{frame}
\begin{frame}{Firmware (H6) — convierte una interrupción breve en un corte largo}
\begin{itemize}
\item v1 reacciona a la pérdida de correcciones con un \texttt{hot-reset} del \textbf{GNSS} (\texttt{UBX-CFG-RST}) $\rightarrow$ reinicia el ZED-F9P, \alert{no} el módem 4G colgado (la falla \#1 reportada). 5 min en una acción sin efecto.
\item v1: reset duro cada $\sim$10 min \alert{sin backoff} $\rightarrow$ \textbf{ciclo de reinicios}; cada ciclo equivale a varios minutos de desconexión. Una flota así produce «desconexiones recurrentes».
\end{itemize}
\vfill
\begin{block}{v2 (ya disponible)}
Recupera \textbf{ciclando el stack 4G}, detecta silencio de NMEA en $\sim$60\,s, aplica \textbf{backoff exponencial} y cae a \textbf{modo LIMP} (sigue reportando GPS estándar) en lugar de desaparecer.
\end{block}
\end{frame}
\begin{frame}{La revisión de ICAVE es correcta (H3 / H4)}
\centering\scriptsize
\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.18}
\begin{tabular}{@{}L{0.27\textwidth}L{0.33\textwidth}L{0.32\textwidth}@{}}
\toprule
Punto del cliente & Mecanismo & Corrección permanente \\
\midrule
Conectores Dupont & la vibración los afloja $\rightarrow$ apertura intermitente & conectores con seguro (JST / Molex) \\
Esfuerzo en soldaduras & flexión + ciclos térmicos los agrietan & PCB con alivio de esfuerzos \\
Sin diseño anti-vibración & la resonancia afloja todo & PCB + standoffs + grommets + coat \\
SMA / terminales flojos & se aflojan con la vibración & SMA con torque, conectores retenidos \\
Fallas de la tarjeta 4G & térmico + mecánico + sin recuperación & fix térmico + v2 + módem calificado \\
Cambio de SIM difícil & SIM enterrada en el stack & SIM en panel frontal / eSIM \\
«No apto para producción» & cableado a mano, piezas únicas & PCB diseñada, documentada, repetible \\
\bottomrule
\end{tabular}
\vfill
\footnotesize Nada de esto se resuelve con firmware: es el núcleo del trabajo de \textbf{PCB + ruggedización}.
\end{frame}
% =====================================================================
\section{Acciones ya tomadas}
\begin{frame}{Backend — reescrito}
\begin{itemize}
\item Retranslator + monitor: \alert{envío asíncrono}, sin bloqueo de cabeza de línea (HOL).
\item \textbf{Identidad por \texttt{cell\_id}} (no por orden de llegada) $\rightarrow$ la trazabilidad por unidad deja de depender del orden de los paquetes.
\item Filtro anti-salto \textbf{corregido}: ya no deja fuera de forma permanente a una unidad sana.
\end{itemize}
\vfill
\begin{block}{Resultado esperado}
Una unidad sana \textbf{ya no puede quedar fuera por el servidor}. Esto descarta una de las dos causas de modo común antes de la próxima prueba de campo.
\end{block}
\end{frame}
\begin{frame}{Observabilidad — Blackpill v2.1 + herramientas}
\begin{itemize}
\item \textbf{Spec de logging v2.1:} reemplaza el dashboard ANSI auto-sobrescrito por un flujo \alert{estructurado, con marca de tiempo y parseable}: estado, fix, paquetes, batería, \textbf{temperatura del MCU}, recuperación y \textbf{causa del reset}.
\item \textbf{\texttt{hbox-log-tools}:} Log Explorer (parseo + graficado automático + comparación contra baseline + export PNG/SVG), analizador por lotes y dashboard.
\end{itemize}
\vfill
\begin{block}{Efecto}
La salud por unidad deja de ser ambigua: proviene de la \textbf{propia unidad}, no de una consola que no es confiable.
\end{block}
\end{frame}
\begin{frame}[fragile]{GNSS / correcciones — persistencia y caster}
\begin{itemize}\small
\item Persistir la configuración del F9P en \alert{FLASH} (hoy es \textbf{solo RAM} $\rightarrow$ se pierde en un ciclo de energía y rompe el feed de forma silenciosa).
\item Migrar las correcciones de \texttt{rtk2go} (gratuito, sin SLA) a un \textbf{caster dedicado (HelgenSRV)} con disponibilidad garantizada.
\item Reverificar el switch \texttt{XBEE$\leftrightarrow$UART2} del simpleRTK2B Pro.
\end{itemize}
\begin{lstlisting}
; Persistir configuracion en BBR + FLASH (no solo RAM) -- ilustrativo
UBX-CFG-CFG saveMask = ioPort | msgConf | navConf
devices = devBBR | devFlash
; GGA en UART2 @1 Hz -> verificado correcto
\end{lstlisting}
\end{frame}
% =====================================================================
\section{Camino a HBOX v3.0}
\begin{frame}{Estrategia fásica}
\begin{columns}[T]
\column{0.5\textwidth}
\begin{block}{Fase 1 — Ruggedizar ahora}
\small Sobre los módulos actuales, sin esperar la PCB: eliminar Dupont, buck industrial 24$\rightarrow$5\,V $\geq$3\,A (retira el PowerBoost), fijación mecánica + conformal coat, SIM frontal, conducción térmica al plato + parasol, flashear v2.
\end{block}
\column{0.5\textwidth}
\begin{block}{Fase 2 — PCB de producción}
\small Una placa \emph{carrier} industrial que reemplaza todo el cableado a mano y las placas \emph{hobby}. La corrección \textbf{de fondo}, en paralelo.
\end{block}
\end{columns}
\vfill
\footnotesize Estabilización «permanente-suficiente» de la flota \textbf{ahora}; la PCB se fabrica en paralelo.
\end{frame}
\begin{frame}{Térmico v3.0 — gestión activa con ducto impermeable}
\begin{itemize}
\item \textbf{Hecho de ingeniería:} un ventilador dentro de una caja \emph{sellada} no enfría — solo agita el aire atrapado.
\item \textbf{v3.0:} un \alert{ducto impermeable} (membrana hidrófoba tipo Gore / laberinto sellado) crea una trayectoria de aire controlada que \emph{sí} extrae calor \textbf{sin comprometer el ingreso} (agua / polvo / salitre).
\item \textbf{Control inteligente del ventilador} gobernado por el Blackpill: sensa la temperatura interior $\rightarrow$ modula el flujo.
\item \textbf{La carcasa ASA se mantiene} (es adecuada); el foco es \textbf{conducir el calor} al plato metálico, reducir la ganancia solar (parasol) y bajar el calor interno (buck eficiente, retirar / reubicar la batería).
\end{itemize}
\vfill
\footnotesize \alert{Abierto:} definir la membrana / ducto y validar con soak de termopar. Opcional: gabinete metálico como disipador.
\end{frame}
\begin{frame}{PCB de producción (Fase 2) — diagrama de bloques}
\centering
\begin{tikzpicture}[node distance=4.5mm and 6mm]
\node[box] (vin) {24\,V gabinete\\(ya protegido)};
\node[box, right=of vin] (prot) {TVS +\\FET anti-inv.};
\node[box, right=of prot] (buck) {Buck 24$\rightarrow$5\,V\\$\geq$3\,A};
\node[box, right=of buck] (rail) {Riel 5\,V};
\node[box, above=of rail] (mcu) {STM32\\watchdog};
\node[box, right=of rail] (sw) {Load switch\\/ eFuse};
\node[box, right=of sw] (stack){Stack RTK\\+ 4G};
\node[box, below=of buck] (sense){Sense: Vin / 5\,V / batt / \alert{temp}};
\draw[arrb] (vin)--(prot); \draw[arrb] (prot)--(buck); \draw[arrb] (buck)--(rail);
\draw[arrb] (rail)--(sw); \draw[arrb] (sw)--(stack);
\draw[arr] (rail)--(mcu); \draw[arr] (mcu) -| (sw) node[midway,above,font=\tiny,text=HelgenIndigo]{enable};
\draw[arr] (sense)-- (mcu.south west);
\draw[arr] (mcu.east) -- ++(0.6,0) |- (stack.north) node[near start,above,font=\tiny,text=HelgenIndigo]{UART/UBX};
\end{tikzpicture}
\vfill
\footnotesize Conectores con seguro \sep\ SMA bulkhead con torque \sep\ SIM en panel frontal / MFF2 \sep\ test points en cada riel.
\end{frame}
\begin{frame}{Vibración — mitigación del módulo 4G NTRIP}
\begin{itemize}
\item Standoffs con \textbf{aisladores / grommets}; retención del módulo XBee 4G en su socket con bracket o clip.
\item Conformal coat del cableado discreto; conectores con seguro; SMA con thread-lock + torque.
\end{itemize}
\vfill
\begin{alertblock}{Abierto — en definición}
Definir el \textbf{esquema de amortiguación específico del módulo 4G} (montaje aislado vs. retención rígida), a confirmar con una \textbf{prueba de vibración} controlada. Este es el punto que todavía estamos cerrando.
\end{alertblock}
\end{frame}
\begin{frame}{Watchdog — FSM de recuperación (v2 $\rightarrow$ v3)}
\centering
\begin{tikzpicture}[node distance=8mm and 14mm]
\node[st] (normal) {NORMAL\\(reporta RTK/SPS)};
\node[hot, right=of normal] (cycle) {CICLAR STACK 4G\\(backoff exp.)};
\node[st, right=of cycle] (limp) {LIMP\\(GPS estándar,\\sigue reportando)};
\node[st, below=of cycle] (temp) {SENSAR TEMP\\$\rightarrow$ CTRL VENTILADOR};
\draw[arr] (normal) -- node[above,font=\tiny,text=HelgenIndigo]{silencio NMEA 60\,s} (cycle);
\draw[arr] (cycle) -- node[above,font=\tiny,text=HelgenIndigo]{persiste} (limp);
\draw[arr] (limp.north) to[bend right=35] node[above,font=\tiny,text=HelgenIndigo]{enlace OK} (normal.north);
\draw[arr] (cycle.south west) to[bend right=20] node[left,font=\tiny,text=HelgenIndigo]{recupera} (normal.south);
\draw[arrb, dashed] (normal) -- (temp);
\draw[arrb, dashed] (temp) -- (limp);
\end{tikzpicture}
\vfill
\footnotesize Invariantes: \textbf{nunca desaparecer, nunca ciclo infinito}; el estado seguro por defecto es \alert{OFF}. v3 añade el lazo térmico (líneas punteadas).
\end{frame}
% =====================================================================
\section{Estado honesto y plan a una semana}
\begin{frame}{Dónde estamos — sin adornos}
\begin{columns}[T]
\column{0.34\textwidth}
\begin{block}{Confirmado}
\scriptsize
\begin{itemize}
\item Backend HOL + anti-salto (en código)
\item Receptores GNSS sanos; SPS, no RTK
\item Consola 4G no es indicador de salud
\item master-21: módem caído
\end{itemize}
\end{block}
\column{0.32\textwidth}
\begin{block}{Hipótesis}
\scriptsize
\begin{itemize}
\item Térmico de \textbf{campo} (falta termopar / soak)
\item Fusible sub-dimensionado
\item Brownout de batería
\end{itemize}
\end{block}
\column{0.34\textwidth}
\begin{alertblock}{Abierto}
\scriptsize
\begin{itemize}
\item ¿Resuelto? — pendiente reflash v2 + análisis en entorno controlado (QRO)
\item Anti-vibración del 4G
\item Fix RTK $\geq$4 con caster dedicado en cielo abierto
\end{itemize}
\end{alertblock}
\end{columns}
\end{frame}
\begin{frame}{Plan a una semana $\rightarrow$ viernes 26 de junio}
\centering\footnotesize
\setlength{\tabcolsep}{6pt}\renewcommand{\arraystretch}{1.25}
\begin{tabular}{@{}l L{0.78\textwidth}@{}}
\toprule
Ventana & Actividad \\
\midrule
Lun–Mar & Desplegar \textbf{watchdog v2} y analizar en \textbf{entorno controlado (QRO)}; persistir F9P en FLASH + caster dedicado \\
Mar–Mié & \textbf{Retest RTK en cielo abierto} (confirmar fix $\geq$4/5); kit de ruggedización Fase 1 sobre 1 unidad de referencia \\
Mié–Jue & Definir \textbf{ducto + ventilador inteligente} + esquema anti-vibración del 4G; soak térmico con termopar \\
\textbf{Vie 26} & \alert{Enviar la versión más robusta del HBOX a Veracruz} para continuar las pruebas \\
\bottomrule
\end{tabular}
\vfill
\footnotesize El objetivo de esta semana no es «cerrado»: es un \textbf{HBOX medible y más robusto} de vuelta en el campo.
\end{frame}
\begin{frame}{Compromisos — responsable y fecha}
\centering\footnotesize
\setlength{\tabcolsep}{6pt}\renewcommand{\arraystretch}{1.25}
\begin{tabular}{@{}lll@{}}
\toprule
Acción & Responsable & Fecha \\
\midrule
Watchdog v2 + análisis controlado (QRO) & Leo / Daniel & 23–24 jun \\
Persistir F9P en FLASH + caster dedicado & Gibran & 24 jun \\
Retest RTK en cielo abierto & Gibran & 25 jun \\
Kit de ruggedización Fase 1 (unidad ref.) & Adriana & 25 jun \\
Diseño ducto + fan + anti-vibración 4G & Leo & 25–26 jun \\
Envío del HBOX robusto a Veracruz & Adriana & 26 jun \\
\bottomrule
\end{tabular}
\end{frame}
% =====================================================================
\begin{frame}[standout]
Diagnóstico con datos.\\
Corrección en ejecución.\\[2mm]
{\normalsize HBOX v3.0 — más robusto — a prueba el \textbf{26 de junio}.}
\vfill
{\footnotesize Gracias \sep\ Preguntas}
\end{frame}
\end{document}