% 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 .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}