2026-07-02: PROD schematic complete (ERC 0) + carrier-board PCB + doc sweep to the Jul-2 ledger

Electrical/PCB:
- LTC4040 Block B sized to the 12 Ah 1S4P pack (RPROG 825R -> 2.42 A ~ C/5,
  RS 8 mR -> 3.1 A input limit, PFI 4.60 V, backup 4.79 V, charge 4.00 V Li-ion
  via VSYS-referenced straps) + Block E cutoff (P11) + Block F PA4->VEH5V re-tap
  + Block H fail-safe Modo-B bypass (K1 normally-closed relay) + Block I NTC->PB1.
- CARRIER-BOARD conversion: simpleRTK2B Pro on UNO-pattern female headers (MOD1;
  D0/D1=UART1, D2=RX2, D8=TX2, IOREF=3V3, 5V=SW_5V) + 4G NTRIP Master on on-board
  XBee socket (J7/J8; VCC=3V3_MODEM via new Block K MP1584 buck off SW_5V - the
  HP XBee socket is 3.3 V not 5 V). Board 120x100, placement + GND pour + DRC
  baselines. Custom symbols: LTC4040EUFD, AO4406A, SimpleRTK2B_Pro_Socket.
- Fixed duplicated U2, stale no-connects, A4->A3 sheet; ERC 0 errors.

Docs:
- Canonical electrical-design-state + production delta (Block B values table,
  5b/5c/5d/5e) + design/rationale/connections/BOM swept to the Jul-2 assumptions
  ledger (Conexiones-por-Bloque xlsx).
- Guia de Conexion Protoboard: LaTeX source now maintained in-repo -> v2.1 PDF.
- CircuiTikZ sheet + wiring Beamer: block 11 (NTC->PB1) + guinda ignition legend.
- Client decks: Avance v1.1 (overclaims fixed) + RCA v1.1 (2-jul addendum).

Repo hygiene:
- .gitignore: live rtk-config (SIM/APN/NTRIP creds) now ignored and REMOVED from
  tracking (NOTE: rotate those credentials - they exist in prior commits);
  KiCad .bak/snapshots/.history, LaTeX intermediates, Office locks ignored+purged.
- Removed rogue .history gitlinks that broke git status.
This commit is contained in:
Leopoldo Rodríguez 2026-07-02 22:17:51 -06:00
parent effe473d2b
commit 2c3dffa232
74 changed files with 38365 additions and 38446 deletions

34
.gitignore vendored
View File

@ -23,3 +23,37 @@ venv/
*.log
# Claude local settings
**/.claude/settings.local.json
# --- Added 2026-07-02 (repo publish hygiene) ---
# Live device configs with credentials (SIM PIN / APN / NTRIP / server) — redacted template lives in the firmware repo
04-Source-Code/rtk-config/
# Editor local-history junk (nested .git inside breaks status)
**/.history/
# KiCad working artifacts
*.kicad_sch.bak*
*.kicad_pcb.bak*
*.kicad_prl
fp-info-cache
_autosave-*
*-backups/
03-Architecture-Hardware/kicad/snapshots/
*_2d_view.svg
*_drc_violations.json
# LaTeX build intermediates (PDF deliverables ARE committed)
*.aux
*.toc
*.nav
*.snm
*.out
*.synctex.gz
*.fls
*.fdb_latexmk
*.bbl
*.blg
# Office lock files
~$*
.~lock.*#

View File

@ -0,0 +1,387 @@
% Helgen Technologies — HBOX RTK · Avance de Desarrollo y Plan de Despliegue (Project Drogheda)
% Audiencia: Hutchison Ports (ICAVE / TIMSA / EIT / LCT). Seguimiento del RCA del 22-jun.
% 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
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, shapes.misc, fit, backgrounds}
\usepackage{pgfgantt}
% ---------- Estilos TikZ ----------
\tikzset{
box/.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},
heat/.style={-{Stealth}, very thick, HelgenAmber}
}
% ---------- Vinetas + separador ----------
\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}}}
\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[Avance HBOX RTK \sep\ Hutchison Ports]{HBOX RTK — Avance de Desarrollo y Plan de Despliegue}
\subtitle{Validación térmica \sep\ Watchdog v3 \sep\ Despliegue en las 4 BUs \sep\ Seguimiento del RCA (22 jun)}
\author[Helgen Technologies]{Helgen Technologies — Ingeniería de Producto}
\date{2 de julio de 2026}
\titlegraphic{\hfill\includegraphics[height=1.05cm]{figs/logo-helgen.png}}
\begin{document}
\maketitle
\begin{frame}{Agenda}
\setbeamertemplate{section in toc}[sections numbered]
\tableofcontents[hideallsubsections]
\end{frame}
% =====================================================================
\section{Estado general: los tres frentes del RCA}
\begin{frame}{Los tres frentes del RCA — dónde está cada uno hoy}
\centering\small
\setlength{\tabcolsep}{5pt}\renewcommand{\arraystretch}{1.35}
\begin{tabular}{@{}L{0.16\textwidth} L{0.33\textwidth} L{0.42\textwidth}@{}}
\toprule
Frente & Estado al 22 jun & \textbf{Hoy (2 jul)} \\
\midrule
Backend & Reescrito (envío asíncrono, filtro anti-salto corregido) & \alert{Desplegado en producción} y estable \\
Térmico & Hipótesis de campo abierta (faltaba soak) & \alert{Validado en cámara a 50\,°C}: el RTK opera normal; el foco es la \textbf{energía}. Solución en prueba (2 alternativas) \\
Hardware & Plan de PCB v3 & Watchdog v3 \alert{validado en protoboard}; \textbf{congelamiento del diseño de PCB hoy} \\
\bottomrule
\end{tabular}
\vfill
\begin{block}{En una línea}
Las tres causas del RCA tienen corrección \textbf{verificada o en prueba final}, y el despliegue hacia las 4 BUs \alert{inicia la próxima semana}.
\end{block}
\end{frame}
% =====================================================================
\section{Validación térmica en cámara (50\,°C)}
\begin{frame}{Prueba en cámara de calor — protocolo y resultado}
\begin{itemize}
\item \textbf{Unidad bajo prueba:} HBOX en configuración actual — \emph{tal como se embarcó a ICAVE}, sin modificaciones.
\item \textbf{Condición:} 50\,°C de temperatura ambiente sostenida en cámara.
\end{itemize}
\vfill
\centering\small
\setlength{\tabcolsep}{6pt}\renewcommand{\arraystretch}{1.3}
\begin{tabular}{@{}L{0.3\textwidth} L{0.3\textwidth} L{0.3\textwidth}@{}}
\toprule
Subsistema & Resultado a 50\,°C & Lectura \\
\midrule
RTK (F9P + 4G + correcciones) & \textbf{Operación normal}, sin degradación & Consistente con el rating del ZED-F9P ($-40\ldots+85$\,°C) \\
Batería de respaldo & Autonomía ${\sim}30\,\%$ de la nominal & \alert{La víctima térmica es la energía} \\
\bottomrule
\end{tabular}
\vfill
\begin{alertblock}{Confirma el RCA}
El calor \textbf{no} tumba el posicionamiento: degrada la \textbf{cadena de energía}. Exactamente lo que el RCA señaló como eslabón débil.
\end{alertblock}
\end{frame}
\begin{frame}{Lectura de ingeniería del resultado}
\begin{itemize}
\item \textbf{Posicionamiento robusto al calor:} con la máquina encendida, el RTK entrega igual a 50\,°C que en frío.
\item \textbf{El riesgo térmico es de disponibilidad}, no de precisión: con celda caliente, el respaldo en máquina apagada se reduce a ${\sim}30\,\%$.
\item \textbf{Mitigación doble:} bajar la temperatura interior (solución térmica, siguiente sección) y \textbf{proteger la celda} — el watchdog v3 corta la carga cuando el sensor reporta celda caliente (carga calificada por temperatura).
\item \textbf{Honesto:} el interior del gabinete en campo puede exceder 50\,°C en picos; por eso el v3 integra \alert{sensores de temperatura} — mediremos el valor real en campo, ya no estimaremos.
\end{itemize}
\end{frame}
% =====================================================================
\section{Solución térmica — dos alternativas en prueba}
\begin{frame}{Dos alternativas en evaluación}
\begin{columns}[T]
\column{0.56\textwidth}
\begin{block}{A — Ducto impermeable + ventilador}
\small Trayectoria de aire controlada que extrae el calor \textbf{sin comprometer el ingreso de agua} (diseño anti-ingreso validándose). Probada: funcional.
\end{block}
\begin{block}{B — Disipador de aluminio + ventilador interno}
\small Pared disipadora de aluminio con aletas al exterior; el ventilador interno fuerza la convección hacia ella y el calor \textbf{sale por conducción}, con la caja sellada. \alert{En prueba ahora.}
\end{block}
\begin{alertblock}{Descartada: placa fría a platina}
\small El gabinete instalado \textbf{no tiene platina} — no existe superficie de montaje para conducción directa.
\end{alertblock}
\column{0.4\textwidth}
\centering
\includegraphics[width=\linewidth]{figs/hbox-heatsink.jpeg}
\figcap{Alternativa B: disipador de aluminio integrado al HBOX.}
\end{columns}
\end{frame}
\begin{frame}{Rutas de extracción de calor — comparación}
\centering
\begin{columns}[T]
\column{0.5\textwidth}\centering
\textbf{\small A — Ducto impermeable}\\[2mm]
\begin{tikzpicture}[scale=0.9]
% caja
\draw[HelgenIndigo, thick, fill=HelgenMist, rounded corners=1pt] (0,0) rectangle (4.4,2.2);
% ducto superior
\draw[HelgenIndigo, thick] (-0.5,1.55) -- (0,1.55);
\draw[HelgenIndigo, thick] (-0.5,1.95) -- (0,1.95);
\draw[HelgenIndigo, thick] (4.4,1.55) -- (4.9,1.55);
\draw[HelgenIndigo, thick] (4.4,1.95) -- (4.9,1.95);
% membrana
\foreach \y in {1.58,1.66,...,1.94} \draw[HelgenTeal, thick] (0.05,\y) -- (0.3,\y);
\node[font=\tiny, text=HelgenIndigo, anchor=south] at (0.6,2.25) {membrana / laberinto};
% flujo de aire
\draw[arr] (-0.45,1.75) -- (0.7,1.75);
\draw[arr] (0.8,1.75) .. controls (2.2,1.3) .. (3.6,1.75);
\draw[arr] (3.7,1.75) -- (4.85,1.75);
\node[font=\tiny, text=HelgenTeal] at (2.2,0.95) {aire forzado (ventilador)};
% electronica
\node[box, font=\tiny] at (2.2,0.45) {electrónica HBOX};
% gotas bloqueadas
\node[font=\tiny, text=HelgenAmber] at (-0.55,2.45) {agua};
\draw[HelgenAmber, thick] (-0.75,2.2) -- (-0.35,2.3);
\draw[HelgenAmber, thick] (-0.75,2.3) -- (-0.35,2.2);
\end{tikzpicture}
\par\vspace{1mm}
{\scriptsize Extrae aire caliente por trayectoria sellada;\\el diseño impide el paso de agua al interior.}
\column{0.5\textwidth}\centering
\textbf{\small B — Disipador + ventilador interno}\\[2mm]
\begin{tikzpicture}[scale=0.9]
% caja sellada
\draw[HelgenIndigo, thick, fill=HelgenMist, rounded corners=1pt] (0.4,0) rectangle (4.8,2.2);
% pared de aluminio
\fill[HelgenIndigo!25] (0.4,0.1) rectangle (0.75,2.1);
\draw[HelgenIndigo, thick] (0.4,0.1) rectangle (0.75,2.1);
% aletas exteriores
\foreach \y in {0.2,0.42,...,2.05} \draw[HelgenIndigo, line width=1.4pt] (0.4,\y) -- (-0.05,\y);
\node[font=\tiny, text=HelgenIndigo, anchor=south, align=center] at (0.3,2.25) {aletas al\\exterior};
% ventilador interno
\node[circle, draw=HelgenIndigo, thick, minimum size=6mm, font=\tiny] (fan) at (3.4,1.5) {fan};
\draw[arr] (fan.west) -- (1.1,1.5);
\draw[arr] (3.4,0.9) .. controls (2.2,0.6) .. (1.2,0.9);
% conduccion
\draw[heat] (0.35,1.5) -- (-0.45,1.5);
\draw[heat] (0.35,0.6) -- (-0.45,0.6);
\node[font=\tiny, text=HelgenAmber, anchor=west] at (-0.55,0.28) {calor};
% electronica
\node[box, font=\tiny] at (3.4,0.45) {electrónica};
\node[font=\tiny, text=HelgenIndigo] at (2.2,1.9) {IP67 se mantiene};
\end{tikzpicture}
\par\vspace{1mm}
{\scriptsize Convección interna forzada hacia la pared de aluminio;\\conducción al exterior con la caja \textbf{sellada}.}
\end{columns}
\vfill
\figcap{Las \textbf{pruebas de calor concluyen hoy}; el resultado define la variante que se integra al diseño final. Ambas respetan el invariante: \alert{IP67 sin comprometer}.}
\end{frame}
% =====================================================================
\section{Watchdog v3 — protoboard validado, PCB en cierre}
\begin{frame}{Circuito v3 validado en protoboard profesional}
\begin{itemize}
\item Armado en \textbf{protoboard profesional} con los componentes reales del diseño: \alert{funciona perfectamente}.
\item Qué valida: conmutación del stack RTK (apagado = estado seguro), sensado de ignición a bordo (12--24\,V), respaldo por batería, medidor de carga, reset y \textbf{control de ventilador por temperatura}.
\item \textbf{Sensor de temperatura integrado} al watchdog: gobierna el ventilador, \textbf{corta la carga con celda caliente} y alimenta la telemetría.
\item Los invariantes del RCA se mantienen: \emph{nunca desaparecer, nunca ciclo infinito}; recuperación ciclando el \textbf{stack 4G}, no el GNSS.
\end{itemize}
\vfill
\begin{block}{Significado}
La electrónica que va a la PCB ya no es una apuesta: \textbf{es un circuito medido y funcionando} — la PCB es su traducción a manufactura.
\end{block}
\end{frame}
\begin{frame}{Watchdog v3 — diagrama de bloques}
\centering
\begin{tikzpicture}[node distance=4mm and 5mm]
\node[box] (vin) {24\,V gabinete\\(GX16)};
\node[box, right=of vin] (prot) {Protección\\inv. pol. + TVS};
\node[box, right=of prot] (psu) {Fuente\\24$\rightarrow$5\,V};
\node[box, right=of psu] (rail) {Riel 5\,V\\respaldado};
\node[box, right=of rail] (sw) {Load switch\\(OFF = seguro)};
\node[box, right=of sw] (stack){Stack RTK\\F9P + 4G};
\node[box, below=7mm of psu] (bat) {LTC4040 + batería\\carga calif.\ por T$^\circ$};
\node[box, below=7mm of sw] (mcu) {STM32\\watchdog};
\node[box, below=7mm of stack](temp){Sensores\\T$^\circ$ / HR};
\node[box, left=of bat] (ign) {Ignición 12--24\,V\\(acond.\ a bordo)};
\node[box, below=6mm of bat] (fan) {Ventilador\\PWM};
\draw[arrb] (vin)--(prot); \draw[arrb] (prot)--(psu); \draw[arrb] (psu)--(rail);
\draw[arrb] (rail)--(sw); \draw[arrb] (sw)--(stack);
\draw[arrb, {Stealth}-{Stealth}] (bat) -- (rail) node[midway, right, font=\tiny, text=HelgenIndigo]{respaldo};
\draw[arr] (mcu) -- (sw) node[midway, right, font=\tiny, text=HelgenIndigo]{enable};
\draw[arr] (temp) -- (mcu) node[midway, above, font=\tiny, text=HelgenIndigo]{I$^2$C};
\draw[arr] (ign.south east) to[bend right=14] node[pos=0.25, below, font=\tiny, text=HelgenIndigo]{sensado} (mcu.south west);
\draw[arr] (bat) -- (mcu) node[midway, above, font=\tiny, text=HelgenIndigo]{sensado};
\draw[arr] (mcu) |- (fan) node[near end, above, font=\tiny, text=HelgenIndigo]{ctrl};
\draw[arr] (mcu.north east) to[bend right=12] node[right=1mm, font=\tiny, text=HelgenIndigo]{UART \sep\ diagnóstico} (stack.south west);
\end{tikzpicture}
\vfill
\figcap{Todo lo que era módulos y cableado a mano queda \textbf{a bordo de la PCB}: protección, ignición, respaldo, sensado y control térmico.}
\end{frame}
\begin{frame}{Diagnóstico completo por unidad — en el mismo flujo GPS}
\begin{itemize}
\item El watchdog \textbf{inserta un mensaje de diagnóstico en el flujo de datos GPS}: temperatura, batería, tensiones, ignición y causa de recuperación viajan con la posición.
\item Requirió \alert{re-arquitectura del flujo de datos} del watchdog — \textbf{en prueba en este momento}.
\item Cierra la lección del RCA: la salud de la unidad deja de inferirse de consolas no confiables — \textbf{la reporta la propia unidad}.
\end{itemize}
\vfill
\centering
\begin{tikzpicture}[node distance=4mm and 6mm]
\node[box] (sens) {Sensores\\T$^\circ$ \sep\ V\textsubscript{bat} \sep\ ign.};
\node[box, right=of sens] (mcu) {Watchdog\\STM32};
\node[box, right=of mcu] (gps) {Flujo GPS/NMEA\\+ mensaje de diagnóstico};
\node[box, right=of gps] (fourg) {Módem\\4G};
\node[box, below=6mm of fourg] (srv) {Servidor\\Helgen};
\node[box, left=of srv] (plat) {Plataforma: diagnóstico\\completo por unidad};
\draw[arrb] (sens)--(mcu);
\draw[arr] (mcu)--(gps) node[midway, above, font=\tiny, text=HelgenIndigo]{inserta};
\draw[arrb] (gps)--(fourg);
\draw[arrb] (fourg)--(srv);
\draw[arrb] (srv)--(plat);
\end{tikzpicture}
\vfill
\figcap{Misma trayectoria que la posición: \alert{si llega la posición, llega el diagnóstico} — sin canales paralelos que mantener.}
\end{frame}
\begin{frame}{PCB de producción — estado y cierre}
\begin{itemize}
\item Integrar el diagnóstico y el sensado térmico exigió un \textbf{re-acomodo completo de los circuitos} en la placa.
\item En curso sobre el diseño: \textbf{verificación EMC} y \textbf{validación CAD/CAE} del nuevo acomodo.
\item Pruebas de calor del watchdog (con su sensor de temperatura) \textbf{concluyen hoy}.
\end{itemize}
\vfill
\begin{alertblock}{Hito de hoy}
\textbf{Congelamiento del diseño de PCB} esperado al cierre del día, tras concluir las pruebas de calor. Las unidades del martes viajan con esta PCB impresa (diseño final).
\end{alertblock}
\end{frame}
% =====================================================================
\section{Plan de despliegue — julio}
\begin{frame}{Cronograma — de la PCB congelada a las 4 BUs}
\centering
\resizebox{\textwidth}{!}{%
\begin{ganttchart}[
time slot format=isodate,
x unit=.5cm, y unit title=.6cm, y unit chart=.56cm,
canvas/.append style={draw=HelgenMist},
title/.append style={fill=HelgenIndigo, draw=HelgenIndigo},
title label font=\scriptsize\color{white},
vgrid={{draw=HelgenMist, line width=.3pt}},
bar/.append style={fill=HelgenIndigo, draw=none},
bar height=.55,
bar label font=\scriptsize\color{HelgenIndigo},
milestone/.append style={fill=HelgenCyan, draw=HelgenIndigo, thick},
milestone label font=\scriptsize\bfseries\color{HelgenIndigo},
link/.style={-{Stealth}, HelgenTeal, thick}
]{2026-07-02}{2026-07-24}
\gantttitle{Julio 2026}{23} \\
\gantttitlelist{2,...,24}{1} \\
\ganttmilestone[name=frz]{Congelamiento diseño PCB}{2026-07-02} \\
\ganttbar{Pruebas de laboratorio (térmico \sep\ EMC \sep\ diagnóstico)}{2026-07-02}{2026-07-10} \\
\ganttbar{Instalación de gabinetes — LCT \sep\ TIMSA \sep\ EIT}{2026-07-06}{2026-07-10} \\
\ganttmilestone{Envío de unidades a ICAVE (PCB impresa)}{2026-07-07} \\
\ganttmilestone[name=inst]{Instalación completa}{2026-07-10} \\
\ganttbar[name=comp]{Comparativa de disponibilidad (1 semana)}{2026-07-10}{2026-07-17} \\
\ganttmilestone[name=prod]{Liberación de PCB a producción}{2026-07-10} \\
\ganttbar[name=fab]{Fabricación de PCBs (5 días)}{2026-07-13}{2026-07-17} \\
\ganttbar[name=bus]{Envío de unidades a todas las BUs}{2026-07-20}{2026-07-24}
\ganttlink{prod}{fab}
\ganttlink{fab}{bus}
\ganttlink{comp}{bus}
\end{ganttchart}}
\vfill
\figcap{Dos rutas en paralelo: \textbf{campo} (instalación + comparativa) y \textbf{fábrica} (producción de PCBs). Convergen en el despliegue a todas las BUs desde \alert{mediados de julio}.}
\end{frame}
\begin{frame}{Hitos y criterios de éxito}
\begin{columns}[T]
\column{0.46\textwidth}
\begin{block}{Hitos comprometidos}
\small
\begin{itemize}
\item \textbf{Hoy 2 jul} — freeze del diseño de PCB
\item \textbf{Mar 7 jul} — unidades nuevas a ICAVE
\item \textbf{Vie 10 jul} — instalación completa; PCB a producción
\item \textbf{Vie 17 jul} — fin de comparativa; PCBs en sitio
\item \textbf{Med.\ jul} — envío a todas las BUs
\end{itemize}
\end{block}
\column{0.5\textwidth}
\begin{block}{Cómo mediremos la comparativa (1 semana)}
\small
\begin{itemize}
\item \textbf{Disponibilidad} de unidades nuevas vs.\ anteriores en plataforma
\item \textbf{Calidad de fix RTK} sostenida en operación
\item \textbf{Telemetría térmica} continua (primer dato real de campo)
\item \textbf{Cero} bloqueos permanentes por servidor
\end{itemize}
\end{block}
\end{columns}
\vfill
\footnotesize La comparativa entrega \alert{evidencia medible} — no una apreciación — antes del despliegue masivo.
\end{frame}
\begin{frame}{Supuestos y riesgos — sin adornos}
\begin{itemize}
\item \textbf{Freeze de hoy} condicionado al cierre de las pruebas de calor: si se desplaza, hay colchón hasta el envío del martes.
\item \textbf{Accesos a LCT / TIMSA / EIT} la próxima semana: en coordinación con cada BU; es la dependencia externa principal.
\item \textbf{Fabricación de PCBs (5 días)} es la ruta crítica del despliegue de mediados de julio; seguimiento diario.
\item El resultado de la \textbf{comparativa de disponibilidad} decide ajustes finales \emph{antes} de escalar a las 4 BUs — escalamos con evidencia, no con calendario.
\end{itemize}
\end{frame}
% =====================================================================
\begin{frame}[standout]
Validado en cámara.\\
Watchdog v3 funcionando.\\[2mm]
{\normalsize Instalación: \textbf{10 jul} \sep\ Comparativa: \textbf{17 jul} \sep\ Todas las BUs: \textbf{med.\ julio}}
\vfill
{\footnotesize Gracias \sep\ Preguntas}
\end{frame}
\end{document}

View File

@ -0,0 +1,396 @@
% Helgen Technologies — HBOX RTK · Avance de Desarrollo y Plan de Despliegue (Project Drogheda)
% Audiencia: Hutchison Ports (ICAVE / TIMSA / EIT / LCT). Seguimiento del RCA del 22-jun.
% Compilar: pdflatex -interaction=nonstopmode (2 pasadas); fuentes de marca solo con XeLaTeX.
% v1.1 (2026-07-02): estado real de PCB (cierre de esquemático de producción + arranque de layout HOY;
% campaña de protoboard de 3 tarjetas EN CURSO — no "validación cerrada" ni "freeze de PCB");
% unidades del martes viajan con el circuito v3 en protoboard (la v1.0 decía "PCB impresa", lo que
% contradecía su propio Gantt); + sensado NTC de punto caliente, sentencia \$PHLG y puente
% normalmente cerrado de correcciones (fail-safe). v1.0 se conserva intacta.
\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
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, shapes.misc, fit, backgrounds}
\usepackage{pgfgantt}
% ---------- Estilos TikZ ----------
\tikzset{
box/.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},
heat/.style={-{Stealth}, very thick, HelgenAmber}
}
% ---------- Vinetas + separador ----------
\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}}}
\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[Avance HBOX RTK \sep\ Hutchison Ports]{HBOX RTK — Avance de Desarrollo y Plan de Despliegue}
\subtitle{Validación térmica \sep\ Watchdog v3 \sep\ Despliegue en las 4 BUs \sep\ Seguimiento del RCA (22 jun)}
\author[Helgen Technologies]{Helgen Technologies — Ingeniería de Producto}
\date{2 de julio de 2026}
\titlegraphic{\hfill\includegraphics[height=1.05cm]{figs/logo-helgen.png}}
\begin{document}
\maketitle
\begin{frame}{Agenda}
\setbeamertemplate{section in toc}[sections numbered]
\tableofcontents[hideallsubsections]
\end{frame}
% =====================================================================
\section{Estado general: los tres frentes del RCA}
\begin{frame}{Los tres frentes del RCA — dónde está cada uno hoy}
\centering\small
\setlength{\tabcolsep}{5pt}\renewcommand{\arraystretch}{1.35}
\begin{tabular}{@{}L{0.16\textwidth} L{0.33\textwidth} L{0.42\textwidth}@{}}
\toprule
Frente & Estado al 22 jun & \textbf{Hoy (2 jul)} \\
\midrule
Backend & Reescrito (envío asíncrono, filtro anti-salto corregido) & \alert{Desplegado en producción} y estable \\
Térmico & Hipótesis de campo abierta (faltaba soak) & \alert{Validado en cámara a 50\,°C}: el RTK opera normal; el foco es la \textbf{energía}. Solución en prueba (2 alternativas) \\
Hardware & Plan de PCB v3 & Watchdog v3 \alert{operando en protoboard} (banco en curso); \textbf{hoy: cierre de esquemático e inicio de layout de PCB} \\
\bottomrule
\end{tabular}
\vfill
\begin{block}{En una línea}
Las tres causas del RCA tienen corrección \textbf{verificada o en prueba}, y el despliegue hacia las 4 BUs \alert{inicia la próxima semana}.
\end{block}
\end{frame}
% =====================================================================
\section{Validación térmica en cámara (50\,°C)}
\begin{frame}{Prueba en cámara de calor — protocolo y resultado}
\begin{itemize}
\item \textbf{Unidad bajo prueba:} HBOX en configuración actual — \emph{tal como se embarcó a ICAVE}, sin modificaciones.
\item \textbf{Condición:} 50\,°C de temperatura ambiente sostenida en cámara.
\end{itemize}
\vfill
\centering\small
\setlength{\tabcolsep}{6pt}\renewcommand{\arraystretch}{1.3}
\begin{tabular}{@{}L{0.3\textwidth} L{0.3\textwidth} L{0.3\textwidth}@{}}
\toprule
Subsistema & Resultado a 50\,°C & Lectura \\
\midrule
RTK (F9P + 4G + correcciones) & \textbf{Operación normal}, sin degradación & Consistente con el rating del ZED-F9P ($-40\ldots+85$\,°C) \\
Batería de respaldo & Autonomía ${\sim}30\,\%$ de la nominal & \alert{La víctima térmica es la energía} \\
\bottomrule
\end{tabular}
\vfill
\begin{alertblock}{Confirma el RCA}
El calor \textbf{no} tumba el posicionamiento: degrada la \textbf{cadena de energía}. Exactamente lo que el RCA señaló como eslabón débil.
\end{alertblock}
\end{frame}
\begin{frame}{Lectura de ingeniería del resultado}
\begin{itemize}
\item \textbf{Posicionamiento robusto al calor:} con la máquina encendida, el RTK entrega igual a 50\,°C que en frío.
\item \textbf{El riesgo térmico es de disponibilidad}, no de precisión: con celda caliente, el respaldo en máquina apagada se reduce a ${\sim}30\,\%$.
\item \textbf{Mitigación doble:} bajar la temperatura interior (solución térmica, siguiente sección) y \textbf{proteger la celda} — el watchdog v3 corta la carga cuando el sensor reporta celda caliente (carga calificada por temperatura).
\item \textbf{Honesto:} el interior del gabinete en campo puede exceder 50\,°C en picos; por eso el v3 integra \alert{sensores de temperatura} — mediremos el valor real en campo, ya no estimaremos.
\end{itemize}
\end{frame}
% =====================================================================
\section{Solución térmica — dos alternativas en prueba}
\begin{frame}{Dos alternativas en evaluación}
\begin{columns}[T]
\column{0.56\textwidth}
\begin{block}{A — Ducto impermeable + ventilador}
\small Trayectoria de aire controlada que extrae el calor \textbf{sin comprometer el ingreso de agua} (diseño anti-ingreso validándose). Probada: funcional.
\end{block}
\begin{block}{B — Disipador de aluminio + ventilador interno}
\small Pared disipadora de aluminio con aletas al exterior; el ventilador interno fuerza la convección hacia ella y el calor \textbf{sale por conducción}, con la caja sellada. \alert{En prueba ahora.}
\end{block}
\begin{alertblock}{Descartada: placa fría a platina}
\small El gabinete instalado \textbf{no tiene platina} — no existe superficie de montaje para conducción directa.
\end{alertblock}
\column{0.4\textwidth}
\centering
\includegraphics[width=\linewidth]{figs/hbox-heatsink.jpeg}
\figcap{Alternativa B: disipador de aluminio integrado al HBOX.}
\end{columns}
\end{frame}
\begin{frame}{Rutas de extracción de calor — comparación}
\centering
\begin{columns}[T]
\column{0.5\textwidth}\centering
\textbf{\small A — Ducto impermeable}\\[2mm]
\begin{tikzpicture}[scale=0.9]
% caja
\draw[HelgenIndigo, thick, fill=HelgenMist, rounded corners=1pt] (0,0) rectangle (4.4,2.2);
% ducto superior
\draw[HelgenIndigo, thick] (-0.5,1.55) -- (0,1.55);
\draw[HelgenIndigo, thick] (-0.5,1.95) -- (0,1.95);
\draw[HelgenIndigo, thick] (4.4,1.55) -- (4.9,1.55);
\draw[HelgenIndigo, thick] (4.4,1.95) -- (4.9,1.95);
% membrana
\foreach \y in {1.58,1.66,...,1.94} \draw[HelgenTeal, thick] (0.05,\y) -- (0.3,\y);
\node[font=\tiny, text=HelgenIndigo, anchor=south] at (0.6,2.25) {membrana / laberinto};
% flujo de aire
\draw[arr] (-0.45,1.75) -- (0.7,1.75);
\draw[arr] (0.8,1.75) .. controls (2.2,1.3) .. (3.6,1.75);
\draw[arr] (3.7,1.75) -- (4.85,1.75);
\node[font=\tiny, text=HelgenTeal] at (2.2,0.95) {aire forzado (ventilador)};
% electronica
\node[box, font=\tiny] at (2.2,0.45) {electrónica HBOX};
% gotas bloqueadas
\node[font=\tiny, text=HelgenAmber] at (-0.55,2.45) {agua};
\draw[HelgenAmber, thick] (-0.75,2.2) -- (-0.35,2.3);
\draw[HelgenAmber, thick] (-0.75,2.3) -- (-0.35,2.2);
\end{tikzpicture}
\par\vspace{1mm}
{\scriptsize Extrae aire caliente por trayectoria sellada;\\el diseño impide el paso de agua al interior.}
\column{0.5\textwidth}\centering
\textbf{\small B — Disipador + ventilador interno}\\[2mm]
\begin{tikzpicture}[scale=0.9]
% caja sellada
\draw[HelgenIndigo, thick, fill=HelgenMist, rounded corners=1pt] (0.4,0) rectangle (4.8,2.2);
% pared de aluminio
\fill[HelgenIndigo!25] (0.4,0.1) rectangle (0.75,2.1);
\draw[HelgenIndigo, thick] (0.4,0.1) rectangle (0.75,2.1);
% aletas exteriores
\foreach \y in {0.2,0.42,...,2.05} \draw[HelgenIndigo, line width=1.4pt] (0.4,\y) -- (-0.05,\y);
\node[font=\tiny, text=HelgenIndigo, anchor=south, align=center] at (0.3,2.25) {aletas al\\exterior};
% ventilador interno
\node[circle, draw=HelgenIndigo, thick, minimum size=6mm, font=\tiny] (fan) at (3.4,1.5) {fan};
\draw[arr] (fan.west) -- (1.1,1.5);
\draw[arr] (3.4,0.9) .. controls (2.2,0.6) .. (1.2,0.9);
% conduccion
\draw[heat] (0.35,1.5) -- (-0.45,1.5);
\draw[heat] (0.35,0.6) -- (-0.45,0.6);
\node[font=\tiny, text=HelgenAmber, anchor=west] at (-0.55,0.28) {calor};
% electronica
\node[box, font=\tiny] at (3.4,0.45) {electrónica};
\node[font=\tiny, text=HelgenIndigo] at (2.2,1.9) {IP67 se mantiene};
\end{tikzpicture}
\par\vspace{1mm}
{\scriptsize Convección interna forzada hacia la pared de aluminio;\\conducción al exterior con la caja \textbf{sellada}.}
\end{columns}
\vfill
\figcap{Las \textbf{pruebas de calor concluyen hoy}; el resultado define la variante que se integra al diseño final. Ambas respetan el invariante: \alert{IP67 sin comprometer}.}
\end{frame}
% =====================================================================
\section{Watchdog v3 — protoboard operando, PCB en arranque}
\begin{frame}{Circuito v3 operando en protoboard profesional}
\begin{itemize}
\item Armado en \textbf{protoboard profesional} (3 tarjetas) con los componentes del diseño —equivalentes de banco en los bloques de carga—: \alert{opera correctamente}; la campaña de banco \textbf{sigue en curso}.
\item Qué se valida: conmutación del stack RTK (apagado = estado seguro), sensado de ignición a bordo (12--24\,V), respaldo por batería, medidor de carga, reset y \textbf{control de ventilador por temperatura}.
\item \textbf{Sensado de temperatura integrado} (sensores digitales + NTC de punto caliente): gobierna el ventilador, \textbf{corta la carga con celda caliente} y alimenta la telemetría; una falla de ventilador \alert{se detecta por temperatura}.
\item Los invariantes del RCA se mantienen: \emph{nunca desaparecer, nunca ciclo infinito}; recuperación ciclando el \textbf{stack 4G}, no el GNSS.
\end{itemize}
\vfill
\begin{block}{Significado}
La electrónica que va a la PCB ya no es una apuesta: \textbf{es un circuito medido y funcionando en banco} — la PCB es su traducción a manufactura.
\end{block}
\end{frame}
\begin{frame}{Watchdog v3 — diagrama de bloques}
\centering
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}[node distance=4mm and 5mm]
\node[box] (vin) {24\,V gabinete\\(GX16)};
\node[box, right=of vin] (prot) {Protección\\inv. pol. + TVS};
\node[box, right=of prot] (psu) {Fuente\\24$\rightarrow$5\,V};
\node[box, right=of psu] (rail) {Riel 5\,V\\respaldado};
\node[box, right=of rail] (sw) {Load switch\\(OFF = seguro)};
\node[box, right=of sw] (stack){Stack RTK\\F9P + 4G};
\node[box, below=7mm of psu] (bat) {LTC4040 + batería\\carga calif.\ por T$^\circ$};
\node[box, below=7mm of sw] (mcu) {STM32\\watchdog};
\node[box, below=7mm of stack](temp){Sensores\\T$^\circ$/HR + NTC};
\node[box, left=of bat] (ign) {Ignición 12--24\,V\\(acond.\ a bordo)};
\node[box, below=6mm of bat] (fan) {Ventilador\\PWM};
\draw[arrb] (vin)--(prot); \draw[arrb] (prot)--(psu); \draw[arrb] (psu)--(rail);
\draw[arrb] (rail)--(sw); \draw[arrb] (sw)--(stack);
\draw[arrb, {Stealth}-{Stealth}] (bat) -- (rail) node[midway, right, font=\tiny, text=HelgenIndigo]{respaldo};
\draw[arr] (mcu) -- (sw) node[midway, right, font=\tiny, text=HelgenIndigo]{enable};
\draw[arr] (temp) -- (mcu) node[midway, above, font=\tiny, text=HelgenIndigo]{I$^2$C + ADC};
\draw[arr] (ign.south east) to[bend right=14] node[pos=0.25, below, font=\tiny, text=HelgenIndigo]{sensado} (mcu.south west);
\draw[arr] (bat) -- (mcu) node[midway, above, font=\tiny, text=HelgenIndigo]{sensado};
\draw[arr] (mcu) |- (fan) node[near end, above, font=\tiny, text=HelgenIndigo]{ctrl};
\draw[arr] (mcu.north east) to[bend right=12] node[right=1mm, font=\tiny, text=HelgenIndigo]{UART \sep\ diagnóstico} (stack.south west);
\end{tikzpicture}}
\vfill
\figcap{Todo lo que era módulos y cableado a mano queda \textbf{a bordo de la PCB}: protección, ignición, respaldo, sensado y control térmico.}
\end{frame}
\begin{frame}{Diagnóstico completo por unidad — en el mismo flujo GPS}
\begin{itemize}\small
\item El watchdog \textbf{inserta un mensaje de diagnóstico en el flujo de datos GPS} (sentencia propia \texttt{\$PHLG}): temperatura, batería, tensiones, ignición y causa de recuperación viajan con la posición.
\item Requirió \alert{re-arquitectura del flujo de datos} del watchdog — \textbf{en prueba en este momento}.
\item \textbf{A prueba de fallas:} en la PCB, el paso de correcciones al receptor queda en un \alert{puente normalmente cerrado} — aun con el watchdog fuera de servicio, \textbf{las correcciones no se interrumpen}.
\item Cierra la lección del RCA: la salud de la unidad deja de inferirse de consolas no confiables — \textbf{la reporta la propia unidad}.
\end{itemize}
\vfill
\centering
\begin{tikzpicture}[node distance=4mm and 6mm]
\node[box] (sens) {Sensores\\T$^\circ$ \sep\ V\textsubscript{bat} \sep\ ign.};
\node[box, right=of sens] (mcu) {Watchdog\\STM32};
\node[box, right=of mcu] (gps) {Flujo GPS/NMEA\\+ mensaje de diagnóstico};
\node[box, right=of gps] (fourg) {Módem\\4G};
\node[box, below=6mm of fourg] (srv) {Servidor\\Helgen};
\node[box, left=of srv] (plat) {Plataforma: diagnóstico\\completo por unidad};
\draw[arrb] (sens)--(mcu);
\draw[arr] (mcu)--(gps) node[midway, above, font=\tiny, text=HelgenIndigo]{inserta};
\draw[arrb] (gps)--(fourg);
\draw[arrb] (fourg)--(srv);
\draw[arrb] (srv)--(plat);
\end{tikzpicture}
\vfill
\figcap{Misma trayectoria que la posición: \alert{si llega la posición, llega el diagnóstico} — sin canales paralelos que mantener.}
\end{frame}
\begin{frame}{PCB de producción — estado y próximos pasos}
\begin{itemize}
\item Integrar el diagnóstico y el sensado térmico exigió un \textbf{re-acomodo completo de los circuitos} en la placa.
\item En curso sobre el diseño: \textbf{verificación EMC} y \textbf{validación CAD/CAE} del nuevo acomodo; los esquemáticos ya pasan la verificación eléctrica con \alert{cero errores}.
\item Pruebas de calor del watchdog (con su sensor de temperatura) \textbf{concluyen hoy}.
\end{itemize}
\vfill
\begin{alertblock}{Próximos pasos — arrancan hoy}
\textbf{Cierre del esquemático de producción} (bloque de batería con carga calificada por temperatura) e \textbf{inicio del trazado (\emph{layout}) de la PCB}; en paralelo continúa la \textbf{campaña de banco} sobre las 3 tarjetas protoboard. Las unidades del martes viajan con el \textbf{circuito v3 en protoboard}; la PCB sigue la ruta de fabricación del cronograma.
\end{alertblock}
\end{frame}
% =====================================================================
\section{Plan de despliegue — julio}
\begin{frame}{Cronograma — del arranque del layout a las 4 BUs}
\centering
\resizebox{\textwidth}{!}{%
\begin{ganttchart}[
time slot format=isodate,
x unit=.5cm, y unit title=.6cm, y unit chart=.56cm,
canvas/.append style={draw=HelgenMist},
title/.append style={fill=HelgenIndigo, draw=HelgenIndigo},
title label font=\scriptsize\color{white},
vgrid={{draw=HelgenMist, line width=.3pt}},
bar/.append style={fill=HelgenIndigo, draw=none},
bar height=.55,
bar label font=\scriptsize\color{HelgenIndigo},
milestone/.append style={fill=HelgenCyan, draw=HelgenIndigo, thick},
milestone label font=\scriptsize\bfseries\color{HelgenIndigo},
link/.style={-{Stealth}, HelgenTeal, thick}
]{2026-07-02}{2026-07-24}
\gantttitle{Julio 2026}{23} \\
\gantttitlelist{2,...,24}{1} \\
\ganttmilestone[name=frz]{Cierre esquemático \sep\ inicio layout PCB}{2026-07-02} \\
\ganttbar[name=lay]{Trazado (layout) de la PCB}{2026-07-02}{2026-07-09} \\
\ganttbar{Pruebas de laboratorio (térmico \sep\ EMC \sep\ diagnóstico)}{2026-07-02}{2026-07-10} \\
\ganttbar{Instalación de gabinetes — LCT \sep\ TIMSA \sep\ EIT}{2026-07-06}{2026-07-10} \\
\ganttmilestone{Envío de unidades a ICAVE (circuito v3)}{2026-07-07} \\
\ganttmilestone[name=inst]{Instalación completa}{2026-07-10} \\
\ganttbar[name=comp]{Comparativa de disponibilidad (1 semana)}{2026-07-10}{2026-07-17} \\
\ganttmilestone[name=prod]{Liberación de PCB a producción}{2026-07-10} \\
\ganttbar[name=fab]{Fabricación de PCBs (5 días)}{2026-07-13}{2026-07-17} \\
\ganttbar[name=bus]{Envío de unidades a todas las BUs}{2026-07-20}{2026-07-24}
\ganttlink{lay}{prod}
\ganttlink{prod}{fab}
\ganttlink{fab}{bus}
\ganttlink{comp}{bus}
\end{ganttchart}}
\vfill
\figcap{Dos rutas en paralelo: \textbf{campo} (instalación + comparativa) y \textbf{fábrica} (layout + producción de PCBs). Convergen en el despliegue a todas las BUs desde \alert{mediados de julio}.}
\end{frame}
\begin{frame}{Hitos y criterios de éxito}
\begin{columns}[T]
\column{0.46\textwidth}
\begin{block}{Hitos comprometidos}
\small
\begin{itemize}
\item \textbf{Hoy 2 jul} — cierre de esquemático; inicia el layout de PCB
\item \textbf{Mar 7 jul} — unidades nuevas a ICAVE
\item \textbf{Vie 10 jul} — instalación completa; PCB a producción
\item \textbf{Vie 17 jul} — fin de comparativa; PCBs en sitio
\item \textbf{Med.\ jul} — envío a todas las BUs
\end{itemize}
\end{block}
\column{0.5\textwidth}
\begin{block}{Cómo mediremos la comparativa (1 semana)}
\small
\begin{itemize}
\item \textbf{Disponibilidad} de unidades nuevas vs.\ anteriores en plataforma
\item \textbf{Calidad de fix RTK} sostenida en operación
\item \textbf{Telemetría térmica} continua (primer dato real de campo)
\item \textbf{Cero} bloqueos permanentes por servidor
\end{itemize}
\end{block}
\end{columns}
\vfill
\footnotesize La comparativa entrega \alert{evidencia medible} — no una apreciación — antes del despliegue masivo.
\end{frame}
\begin{frame}{Supuestos y riesgos — sin adornos}
\begin{itemize}
\item \textbf{Cierre de esquemático y arranque de layout (hoy)} condicionados al cierre de las pruebas de calor: si se desplazan, hay colchón hasta la liberación de la PCB a producción (10 jul); el envío del martes (circuito v3 en protoboard) \textbf{no depende de la PCB}.
\item \textbf{Accesos a LCT / TIMSA / EIT} la próxima semana: en coordinación con cada BU; es la dependencia externa principal.
\item \textbf{Fabricación de PCBs (5 días)} es la ruta crítica del despliegue de mediados de julio; seguimiento diario.
\item El resultado de la \textbf{comparativa de disponibilidad} decide ajustes finales \emph{antes} de escalar a las 4 BUs — escalamos con evidencia, no con calendario.
\end{itemize}
\end{frame}
% =====================================================================
\begin{frame}[standout]
Térmica validada en cámara.\\
Watchdog v3 operando — PCB en trazado.\\[2mm]
{\normalsize Instalación: \textbf{10 jul} \sep\ Comparativa: \textbf{17 jul} \sep\ Todas las BUs: \textbf{med.\ julio}}
\vfill
{\footnotesize Gracias \sep\ Preguntas}
\end{frame}
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -1 +0,0 @@
,focused-serene-brahmagupta,claude,24.06.2026 21:09,file:///sessions/focused-serene-brahmagupta/.config/libreoffice/4;

View File

@ -1 +0,0 @@
,focused-serene-brahmagupta,claude,24.06.2026 21:03,file:///sessions/focused-serene-brahmagupta/.config/libreoffice/4;

View File

@ -86,10 +86,62 @@ savings at 24 V — sourcing decision lives here in `09_`.
| SIM | micro-SIM buried → **front-panel SIM or MFF2 eSIM** | maintainability | hardware-brief §6.2 |
| Thermal | **v3.0: waterproof duct + Blackpill smart fan** (active managed) + conduct to plate / sunshade | a *ducted* fan removes heat without breaking IP67 | hardware-brief §2b, RCA |
## 5. Watchdog PCB v3 — Block B/E/H/I additions (2026-07-02)
> Production parts added by the 2026-07-02 capture session — **LTC4040 sized to the ~12 Ah
> 1S4P pack**; Blocks per [[03-Architecture-Hardware/watchdog-production-schematic-delta|watchdog-production-schematic-delta.md]]
> §4 (B) / §5 (E) / §5b (H) / §5c (I). Values are the sized set (RPROG → 2.42 A ≈ C/5;
> PFI trip 4.60 V; backup 4.79 V; charge = 4.00 V Li-ion via straps).
> **Fab gate: bench-validate the LTC4040 backup transition + temp-qualified charge cutoff
> before ordering boards.**
| Block | Ref | Item | Value / Package | Qty | LCSC |
|---|---|---|---|---:|---|
| B | U6 | Battery-backup manager (charger + power-path + 2.5 A boost) | **LTC4040EUFD** — QFN-24 4×5 mm, EP=GND | 1 | verify |
| B | Q7 | VIN→VSYS disconnect NFET (gate = IGATE) | AO4406A-class, 30 V ≥10 A ≤15 mΩ — SOIC-8 | 1 | verify |
| B | RS | Input current-limit sense (3.1 A) | **8 mΩ 1 %** — 1206 sense | 1 | verify |
| B | RPROG | Charge program (2.42 A ≈ C/5) | **825 Ω 1 %** — 0603 | 1 | verify |
| B | RPF1 / RPF2 | PFI divider (trip 4.60 V falling) | 287 k / 100 k, 1 % — 0603 | 1+1 | verify |
| B | RFB1 / RFB2 | Backup FB divider (4.79 V; RST −7.5 %) | 499 k / 100 k, 1 % — 0603 | 1+1 | verify |
| B | L6 | Charger/boost inductor (SW↔BAT) | **2.2 µH, Isat ≥8 A, DCR <20 mΩ** — 8040 | 1 | verify |
| B | CVIN | U6 VIN input caps | 10 µF X5R + 2.2 µF — 0805/0603 | 1+1 | verify |
| B | CVSYS | VSYS backup-transition hold-up (≥100 µF low-ESR) | 2×47 µF 1210 + 10 µF | 3 | verify |
| B | CBAT | U6 BAT cap | 22 µF X5R — 0805/1206 | 1 | verify |
| B | RNTB | Cell-NTC bias | 10 k 1 % low-drift — 0603 | 1 | verify |
| B | P4 | Battery connector (BAT+ / BAT− / NTC) | **JST-XH 3-pos** (was 2-pos) | 1 | verify |
| B | JP2 / JP3 / JP4 | Chemistry straps F2=1 / F1=0 / F0=1 → **4.00 V Li-ion** (to VSYS/GND, not 3V3) | solder jumper | 3 | — |
| E | P11 | Power-cutoff loop (MAIN5V → SYS5V; **ship with jumper plug**) | JST-XH 2-pos | 1 | verify |
| H | K1 | Modo-B fail-safe bypass relay (NC = direct uplink) | **HFD23/005-class** SPDT signal relay, 5 V coil | 1 | verify |
| H | Q6 | K1 coil low-side driver | MMBT3904 — SOT-23 | 1 | verify |
| H | R40 / R41 | Base series / base pull-down (default OFF) | 1 k / 10 k — 0603 | 1+1 | verify |
| H | D6 | Coil flyback | 1N4148 — SOD-123 | 1 | verify |
| H | P13 | Modo-B uplink (F9P_TX2 / 4G_DIN / GND) | JST-XH 3-pos | 1 | verify |
| I | R42 | NTC divider top | 10 k **1 %** — 0603 | 1 | verify |
| I | C24 | PB1 ADC settling | 100 nF — 0603 | 1 | verify |
| I | P12 | Hot-spot NTC (10 k, B≈3950 — at battery/modem) | JST-XH 2-pos | 1 | verify |
| H | K1 note | Capture uses the **Omron G6E-134P-ST-US 5 V** land pattern (`Relay_SPDT_Omron_G6E`); HFD23 alt = footprint swap | — | — | verify |
### 5b. Carrier-board additions — Block J sockets + Block K modem buck (2026-07-02 PM)
> The PROD board is now the **HBOX carrier**: all three modules on female headers (delta doc
> §5d/§5e). Board **120×100 mm**. XBee VCC = **3.3 V** (the Pro-class HP-socket spec — not 5 V),
> made by a dedicated buck on **SW_5V** so the watchdog's stack power-cycle also reboots the modem.
| Block | Ref | Item | Value / Package | Qty | LCSC |
|---|---|---|---|---:|---|
| J | MOD1 | UNO-pattern female headers for the simpleRTK2B Pro | 2.54 mm PinSocket **1×10 + 1×8 + 1×8 + 1×6** (8.5 mm stack height) | 1 set | verify |
| J | J7 / J8 | XBee socket for the 4G NTRIP Master | PinSocket **1×10, 2.00 mm**, rows 22.35 mm | 2 | verify |
| K | U7 | 3V3_MODEM buck (SW_5V → 3.33 V, ≥1.5 A pk) | **MP1584EN** — SOIC-8-EP | 1 | C107226 |
| K | L7 | Buck inductor | 10 µH ≥2 A — 8028 | 1 | verify |
| K | R60 / R61 | FB divider → 3.33 V | 100 k / **31.6 k**, 1 % — 0603 | 1+1 | verify |
| K | Dbk2 | Freewheel | SS34 — DO-214AC | 1 | C8678 |
| K | Cbst2 / Rfreq2 / Rcomp2 / Ccomp2 | BST / fsw / comp (same as Block A; ⚠ bench-tune) | 10 nF / 100 k / 40.2 k / 2.2 nF — 0603 | 4 | verify |
| K | C40 / C41 / C43 | In / out / LTE-burst bulk | 22 µF + 22 µF + **100 µF/6.3 V elco** | 3 | verify |
## Open Questions
- [ ] Confirm the **installed blade-fuse value** (2 A may be under-rated for LTE inrush).
- [x] ~~Battery decision (drop vs LiFePO4 vs supercap)~~ → **RESOLVED 2026-06-24: 1S4P + LTC4040** (NTC temp-qualified charging). Now: **confirm the pack Ah** (label says 40 Ah — suspect; 4× 18650 ≈ 10–14 Ah) → it sizes the charge current + the LTC4040 safety timer.
- [x] ~~Battery decision~~ → **1S4P + LTC4040** (NTC temp-qualified charging). **Pack = ~12 Ah** (1S4P, ~3 Ah/cell; the "40 Ah" label was a mistake — corrected 2026-06-30). Sizes the LTC4040 charge current (2.5 A max ≈ C/5, gentle) + safety timer.
- [ ] Lock supplier per line (Helgen vs alternate quote) for the August batch.
## Related

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 322 KiB

View File

@ -0,0 +1,450 @@
% cuerpo.tex — Guía de Conexión en Protoboard v2.1 (bloques 1–11)
% Fuente de datos autoritativa: ../Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx
% (hojas: Conexiones · Mapa de pines · Fuentes y convertidores · Estado y cambios)
\section{Cómo usar esta guía}
Esta guía lleva al técnico de armado por el cableado completo del prototipo del
\textbf{watchdog HBOX v3} sobre tarjeta DEV / protoboard (MCU STM32F411 «Blackpill»,
firmware v2.3), organizado en \textbf{11 bloques} que se arman y prueban uno por uno.
No armes los bloques en el orden en que aparecen: sigue el \textbf{orden de armado} de la
sección~\ref{sec:orden}, que va de lo más simple (solo USB) a lo más delicado (stack RTK).
\begin{helgennotice}[Documentos compañeros — dónde está cada cosa]
\begin{itemize}
\item \textbf{Lista de conexiones autoritativa:}
\texttt{Drogheda\_Conexiones-por-Bloque\_Proto\_v1.xlsx} (hojas \textit{Conexiones},
\textit{Mapa de pines}, \textit{Fuentes y convertidores}, \textit{Estado y cambios}).
Si esta guía y el XLSX difieren, \textbf{manda el XLSX}.
\item \textbf{Diagramas por bloque (CircuiTikZ):} carpeta \texttt{circuitikz-wiring/} —
\texttt{Drogheda\_Diagrama\_CircuiTikZ.pdf} (lámina completa) y
\texttt{Drogheda\_Diagrama\_Beamer.pdf} (una diapositiva por bloque).
\item \textbf{Estado eléctrico canónico del diseño:}
\texttt{watchdog-electrical-design-state.md} (léelo antes de cambiar cualquier cosa).
\item \textbf{Listas de compra:} \texttt{watchdog-LISTA-DE-COMPRAS-ES.xlsx} y
\texttt{watchdog-protoboard-BOM-3boards.xlsx}.
\end{itemize}
\end{helgennotice}
\section{Estado y cambios recientes}
\label{sec:estado}
Resumen de las decisiones y correcciones vigentes (hoja \textit{Estado y cambios} del XLSX).
Léelo antes de armar: aquí está lo que cambió respecto a versiones anteriores de la guía.
\hwtab{%
\begin{tabularx}{\textwidth}{@{}L{2.0cm} L{4.6cm} X@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Área}} & \textcolor{white}{\textbf{Cambio / estado}} & \textcolor{white}{\textbf{Detalle}}\\
\midrule
Batería & \textbf{Pack = $\sim$12\,Ah} (2026-06-30) & «40\,Ah» era un error; dimensiona R\textsubscript{PROG} + timer del LTC4040 (2.5\,A máx $\approx$ C/5).\\
Ventilador & 2 hilos (sin tacómetro) & PB10 DNP; el fallo del ventilador se infiere por temperatura (firmware pendiente).\\
Ventilador & 5\,V del ventilador = LM2596 & 24$\rightarrow$5\,V \textbf{separado} (ajustar a 5.0\,V) para no hundir el 5\,V principal (inrush).\\
Ignición & DFR1015 de 4 terminales & IN+/IN$-$/OUT+/OUT$-$; ambos GND al GND del sistema.\\
Ignición & Clamp BAT54 en PA5 & Ánodo = PA5, cátodo = 3V3 $\rightarrow$ PA5 $\le$ 3.3\,V; digital, \textbf{sin divisor} (Finding~2).\\
Batería & \textbf{NTC $\rightarrow$ pin TEMP del cargador} & TP4056 (proto) / LTC4040 (PCB); \textbf{no} va al MCU. El MCU lee temperatura por el TMP102 (I\textsuperscript{2}C).\\
Temperatura & NTC analógico $\rightarrow$ PB1 (si no hay SHT40) & Divisor 3V3 -- 10\,k (1\,\%) -- NTC 10\,k -- GND a PB1 (ADC1\_IN9). Firmware: Beta/Steinhart + posible corte CHRG\_EN. En el punto caliente (batería/módem). Bloque~11.\\
NTRIP & Modo B (relé / inyección \texttt{\$PHLG}) & F9P TX2 $\rightarrow$ PA10 $\rightarrow$ PA9 $\rightarrow$ 4G DIN (inyecta \texttt{\$PHLG}); RTCM3 DOUT $\rightarrow$ RX2 \textbf{directo}; breakout BOB-08276; switch $\rightarrow$ UART1; IOREF 3.3\,V.\\
Batería & Respaldo proto = TP4056 + MT3608 & 2$\times$ 1N5819 en «O» (OR) hacia MAIN5V; el PCB usa el LTC4040.\\
Firmware — pendiente & Gauge PB12--15 · CHRG\_EN · fan-fault por temperatura & \textbf{Bench-test antes de flashear} (el sandbox no compila STM32).\\
PCB — pendiente & Bloque B (LTC4040) + bypass fail-safe UART2 & El bypass \textbf{normalmente cerrado} evita que un MCU ausente/colgado corte las correcciones (Modo~B). Ver Bloque~9.\\
Cobertura de partes & Sección 1 + 3 = suficiente para el core & La sección 2 (TP4056/MT3608) solo hace falta para el respaldo de batería.\\
\bottomrule
\end{tabularx}}
\section{Leyenda de colores de cable}
Los mismos colores de los diagramas CircuiTikZ; úsalos también en el cableado físico.
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l l X@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Cable}} & \textcolor{white}{\textbf{Red}} & \textcolor{white}{\textbf{Qué lleva}}\\
\midrule
ROJO & \redV & 5\,V — alimentación principal (MAIN5V) y 5\,V separado del ventilador\\
NARANJA & \redT & 3.3\,V — sale del Blackpill (sensores, pull-ups, ignición, temperatura)\\
NEGRO & \redG & GND — tierra común (todo se une aquí)\\
AZUL & \redS & Señal lógica / digital / UART\\
VERDE & \redA & Sensado analógico ($\div$2, ADC): PA0, PA4, PB1\\
GUINDA & \redI & Ignición cruda 12--24\,V (a la entrada del DFR1015)\\
\bottomrule
\end{tabularx}}
\section{Mapa de pines del Blackpill}
Busca cada etiqueta impresa en la tarjeta. (Hoja \textit{Mapa de pines} del XLSX;
incluye PA8 y PC13, que no aparecían en la guía v2.)
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X l l@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Pin}} & \textcolor{white}{\textbf{Función}} & \textcolor{white}{\textbf{Tipo}} & \textcolor{white}{\textbf{Bloque(s)}}\\
\midrule
5V / GND / 3V3 & Rieles (3V3 = LDO del Blackpill) & Power & 1\\
PA0 & BAT\_SENSE — batería $\div$2 & ADC & 4, 10\\
PA1 & PWR\_CTRL — interruptor de carga del «stack» & Salida & 3\\
PA2 & USART2 TX $\rightarrow$ F9P UART1 RX (NMEA) & UART & 8, 9\\
PA3 & USART2 RX $\leftarrow$ F9P UART1 TX (NMEA) & UART & 8, 9\\
PA4 & 5V\_SENSE — vehículo $\div$2 & ADC & 4\\
PA5 & IGN\_SENSE — digital, \texttt{INPUT\_PULLDOWN}, \textbf{sin divisor} (máx 3.3\,V) & Entrada dig. & 4\\
PA6 & FAN\_PWM — 25\,kHz (TIM3\_CH1) & PWM & 5\\
PA8 & CHRG\_EN (planeado) — corta la carga si la celda está caliente & Salida & batería / firmware\\
PA9 & Modo B: USART1 TX $\rightarrow$ 4G DIN (relé \texttt{\$PHLG}) & UART & 9\\
PA10 & Modo B: USART1 RX $\leftarrow$ F9P TX2 (relé); 22\,k$\Omega \rightarrow$ 3V3 & UART & 9\\
PB0 & EXT\_LED — LED de estado & Salida & 2\\
PB1 & Temperatura analógica (divisor NTC) — ADC1\_IN9 (libre) & ADC & 11\\
PB6 & I\textsuperscript{2}C1 SCL — SHT40/TMP102 & I\textsuperscript{2}C & 6\\
PB7 & I\textsuperscript{2}C1 SDA — SHT40/TMP102 & I\textsuperscript{2}C & 6\\
PB10 & FAN\_TACH — DNP (ventilador de 2 hilos) & — & 5\\
PB12--PB15 & Gauge de batería (4 LEDs) — firmware pendiente & Salida & 7\\
PC13 & LED onboard (activo-bajo) & Salida & —\\
NRST & Reset (botón a GND) & Reset & 7\\
\bottomrule
\end{tabularx}}
\section{Fuentes y convertidores — ajústalos ANTES de conectar}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}L{2.5cm} X L{3.1cm} L{1.6cm}@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Componente}} & \textcolor{white}{\textbf{Qué es / ajuste}} & \textcolor{white}{\textbf{Entrada $\rightarrow$ salida}} & \textcolor{white}{\textbf{Bloque}}\\
\midrule
Mean Well SD-15B-05 & Fuente principal 24$\rightarrow$5\,V (o un banco de 5\,V). Es el riel \textbf{MAIN5V} (módulo industrial). & 18--36\,V $\rightarrow$ 5\,V · 3\,A & 1\\
LM2596 (o MP1584) & 5\,V \textbf{separado} para el ventilador. \textbf{¡Ajústalo a 5.0\,V con el multímetro ANTES de conectar!} Vienen en voltaje aleatorio. En el PCB este papel lo hace el MP1584 (U2). & 24\,V $\rightarrow$ 5.0\,V ajustable & 5\\
DFR1015 & Acondiciona la ignición. Acepta 12 y 24\,V; 4 terminales (IN$\pm$/OUT$\pm$) y \textbf{ambos GND al GND del sistema}. On-board en la v3 (GX16 pin~3 = ignición cruda). & 12--24\,V $\rightarrow$ 5\,V & 4\\
TP4056 & Cargador del 18650 (\textbf{proto}; stand-in de banco). El PCB usa el LTC4040. & 5\,V vehículo $\rightarrow$ carga 1S & 10\\
MT3608 & Elevador de respaldo. Ajústalo \textbf{apenas por debajo} del 5\,V del vehículo para que el vehículo tenga prioridad. & 3.6\,V $\rightarrow$ 5\,V & 10\\
LTC4040 (PCB) & Battery-backup manager: carga + power-path + boost + NTC. Carga temp-cualificada por NTC; R\textsubscript{PROG} $\approx$ C/5 $\le$ 2.5\,A para 12\,Ah. & 5\,V vehículo / batería $\rightarrow$ 5\,V & B (por diseñar)\\
18650 1S4P & Pack de respaldo \textbf{$\sim$12\,Ah} («40\,Ah» era un error, corregido 2026-06-30). \textbf{Respeta la polaridad.} & — $\rightarrow$ 3.6\,V · $\sim$12\,Ah & 4, 10\\
\bottomrule
\end{tabularx}}
\section{Conexiones por bloque (1--11)}
Cada tabla lista las conexiones como \textbf{desde $\rightarrow$ vía $\rightarrow$ hacia}, con la
red (color de cable) a la izquierda. Arma y prueba \textbf{un bloque a la vez}, en el orden de
la sección~\ref{sec:orden}.
\bloque{1}{Rieles de alimentación}
\queprueba{arma los rieles 5\,V / GND / 3.3\,V que alimentan todo.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redV & Fuente 5\,V (SD-15B-05 o banco) (+) $\rightarrow$ riel MAIN5V & Fuente principal\\
\redG & Fuente 5\,V ($-$) $\rightarrow$ riel GND & Tierra común\\
\redV & Riel MAIN5V $\rightarrow$ pin 5V del Blackpill & El Blackpill genera el 3.3\,V (LDO interno)\\
\redG & Riel GND $\rightarrow$ pin GND del Blackpill & \\
\redT & Blackpill 3V3 (salida) $\rightarrow$ sensores I\textsuperscript{2}C · pull-ups · ignición & Cargas pequeñas ($\mu$A--mA)\\
\redV & Riel MAIN5V $\rightarrow$ C 100\,$\mu$F + 100\,nF $\rightarrow$ riel GND & Desacople / reserva, cerca de la tarjeta\\
\bottomrule
\end{tabularx}}
\bloque{2}{LED de estado (PB0)}
\queprueba{los códigos de parpadeo cambian con el estado.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redS & PB0 $\rightarrow$ R 330\,$\Omega$ $\rightarrow$ ánodo del LED & LED 3/5\,mm\\
\redG & cátodo del LED $\rightarrow$ GND & códigos de parpadeo\\
\bottomrule
\end{tabularx}}
\bloque{3}{Interruptor de carga del «stack» (PA1) — EL CORAZÓN}
\queprueba{APAGADO al reset (estado seguro), ON cuando PA1 activa.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redS & PA1 $\rightarrow$ R 1\,k$\Omega$ $\rightarrow$ base 2N3904 (B) & Driver\\
\redG & 2N3904 emisor (E) $\rightarrow$ GND & \\
\redS & 2N3904 colector (C) $\rightarrow$ compuerta IRF9540 (G) & Nodo de compuerta\\
\redV & compuerta IRF9540 (G) $\rightarrow$ R 10\,k$\Omega$ $\rightarrow$ MAIN5V & Pull-up $\rightarrow$ \textbf{OFF por defecto} (estado seguro)\\
\redV & IRF9540 source (S) $\rightarrow$ MAIN5V & P-MOSFET (canal P)\\
\redS & IRF9540 drain (D) $\rightarrow$ SAL (salida conmutada «stack») & $\rightarrow$ Bloques 8/9 (stack RTK)\\
\redS & prueba: SAL $\rightarrow$ LED + R 330\,$\Omega$ $\rightarrow$ GND & Para ver el encendido/apagado\\
\bottomrule
\end{tabularx}}
\noindent{\small\textit{El pull-up de 10\,k$\Omega$ garantiza el invariante «apagado = estado
seguro»: sin MCU (o durante el reset) el stack queda \textbf{apagado}.}}
\begin{center}
\begin{adjustbox}{max width=\textwidth}
\begin{tikzpicture}[every node/.append style={font=\footnotesize}]\blkCarga\end{tikzpicture}
\end{adjustbox}\\
{\small\itshape Bloque 3 — el mismo dibujo que la lámina CircuiTikZ (\texttt{circuitikz-wiring/}).}
\end{center}
\bloque{4}{Sensado: batería / 5\,V / ignición}
\queprueba{\texttt{veh}/\texttt{ign}/\texttt{vbat} cambian en el log (TLM).}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redA & 18650+ (o potenciómetro) $\rightarrow$ R 10\,k$\Omega$ $\rightarrow$ PA0 & Divisor $\div$2 · BAT\_SENSE\\
\redA & PA0 $\rightarrow$ R 10\,k$\Omega$ $\rightarrow$ GND & Pierna inferior del divisor\\
\redA & MAIN5V (lado vehículo) $\rightarrow$ R 10\,k$\Omega$ $\rightarrow$ PA4 & Divisor $\div$2 · 5\,V/vehículo presente\\
\redA & PA4 $\rightarrow$ R 10\,k$\Omega$ $\rightarrow$ GND & \\
\redI & GX16 pin 3 (ignición 12--24\,V) $\rightarrow$ DFR1015 IN+ & Ignición \textbf{cruda} del gabinete\\
\redG & DFR1015 IN$-$ $\rightarrow$ GND & Retorno de ignición = GND del sistema\\
\redS & DFR1015 OUT+ (5\,V) $\rightarrow$ R 100\,$\Omega$ $\rightarrow$ PA5 & Acondiciona a nivel lógico\\
\redG & DFR1015 OUT$-$ $\rightarrow$ GND & \\
\redT & PA5 (ánodo) $\rightarrow$ BAT54 $\rightarrow$ 3V3 (cátodo) & Clamp: PA5 $\le$ 3.3\,V\\
\redG & PA5 $\rightarrow$ C 100\,nF $\rightarrow$ GND & Anti-rebote (con debounce en firmware)\\
\redS & Banco (proto): 3V3 $\rightarrow$ apagador / push-button $\rightarrow$ PA5 & Simula la ignición sin DFR1015. PA5 = digital, \texttt{INPUT\_PULLDOWN}, \textbf{sin divisor}\\
\bottomrule
\end{tabularx}}
\bloque{5}{Ventilador (2 hilos)}
\queprueba{el ventilador arranca/sube con la temperatura.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redV & 24\,V (gabinete) $\rightarrow$ LM2596 (buck, ajustar a 5.0\,V) $\rightarrow$ riel 5\,V sep. & Riel \textbf{SEPARADO} para el ventilador (PCB = MP1584)\\
\redG & LM2596 GND (in/out) $\rightarrow$ GND & \\
\redS & PA6 $\rightarrow$ R 220\,$\Omega$ $\rightarrow$ compuerta IRLZ44N (G) & PWM 25\,kHz\\
\redG & IRLZ44N source (S) $\rightarrow$ GND & Low-side switch\\
\redS & compuerta IRLZ44N (G) $\rightarrow$ R 100\,k$\Omega$ $\rightarrow$ GND & Mantiene el FET apagado\\
\redG & IRLZ44N drain (D) $\rightarrow$ ventilador ($-$) & Cable negro\\
\redV & ventilador (+) $\rightarrow$ riel 5\,V sep. & Ventilador de 2 hilos\\
\redV & 1N5819 en paralelo al ventilador (banda $\rightarrow$ +5\,V sep.) & Flyback / anti-retorno inductivo\\
\redN & PB10 (tach) $\rightarrow$ sin usar (DNP) & 2 hilos $\rightarrow$ sin tacómetro; el fallo se infiere por temperatura (firmware)\\
\bottomrule
\end{tabularx}}
\bloque{6}{Sensor de temperatura I\textsuperscript{2}C (si lo tienes)}
\queprueba{al calentar el sensor, el ventilador sube.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redT & SHT40 / TMP102 VCC $\rightarrow$ 3V3 & Parte de 3.3\,V (no 5\,V)\\
\redG & SHT40 / TMP102 GND $\rightarrow$ GND & \\
\redS & SCL $\rightarrow$ PB6 & I\textsuperscript{2}C1 SCL\\
\redT & SCL $\rightarrow$ R 4.7\,k$\Omega$ $\rightarrow$ 3V3 & Pull-up I\textsuperscript{2}C (muchos breakouts ya lo traen)\\
\redS & SDA $\rightarrow$ PB7 & I\textsuperscript{2}C1 SDA\\
\redT & SDA $\rightarrow$ R 4.7\,k$\Omega$ $\rightarrow$ 3V3 & Pull-up I\textsuperscript{2}C\\
\redN & Direcciones: SHT40 = 0x44 · TMP102 = 0x48 & TMP102 en pigtail a la celda/módem (punto caliente)\\
\redN & Sin SHT40/TMP102 $\rightarrow$ usa el Bloque 11 (NTC $\rightarrow$ PB1) & Alternativa analógica\\
\bottomrule
\end{tabularx}}
\bloque{7}{Reset (opcional) y gauge de batería (opcional)}
\queprueba{el botón reinicia; los 4 LEDs quedan listos para el firmware.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redS & NRST $\rightarrow$ push-button $\rightarrow$ GND & Reset por hardware\\
\redS & PB12 / PB13 / PB14 / PB15 $\rightarrow$ R 330\,$\Omega$ c/u $\rightarrow$ LED $\rightarrow$ GND ($\times$4) & Gauge de batería; \textbf{APAGADOS} hasta firmware\\
\bottomrule
\end{tabularx}}
\bloque{8}{Conexión del stack RTK (modo por defecto)}
\queprueba{el watchdog observa; solo 4 cables al stack.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redV & SAL (5\,V conmutado, Bloque 3) $\rightarrow$ simpleRTK2B Pro · 5V & Alimenta el stack RTK\\
\redG & GND del sistema $\rightarrow$ simpleRTK2B Pro · GND & \\
\redS & PA2 (USART2 TX) $\rightarrow$ F9P UART1 RX & NMEA · cruce TX$\rightarrow$RX\\
\redS & PA3 (USART2 RX) $\rightarrow$ F9P UART1 TX & NMEA · cruce RX$\leftarrow$TX\\
\redN & 4G NTRIP Master (XBee) $\rightarrow$ socket XBee del Pro (UART2) & 5\,V + datos por el socket (\textbf{no} al Blackpill)\\
\redN & Antena GNSS (SMA) $\rightarrow$ F9P & \\
\redN & 2$\times$ antenas LTE $\rightarrow$ 4G NTRIP Master & \\
\redN & Relé \texttt{\$PHLG} (PA9/PA10) = DNP / apagado & Config por defecto (solo monitor)\\
\bottomrule
\end{tabularx}}
\bloque{9}{Modo B — Diagnóstico por NTRIP (relé, opcional)}
\queprueba{inyecta \texttt{\$PHLG} al servidor por 4G. Requiere breakout XBee.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redV & SAL / GND (Bloque 3) $\rightarrow$ F9P · watchdog · 4G & IOREF = 3.3\,V (nivel de los UART del F9P)\\
\redN & switch XBee del Pro $\rightarrow$ UART1 & Libera UART2 para el relé\\
\redS & PA2 $\rightarrow$ F9P UART1 RX & Monitor de fix\\
\redS & PA3 $\rightarrow$ F9P UART1 TX & Monitor de fix\\
\redS & F9P TX2 (UART2) $\rightarrow$ PA10 (USART1 RX) & Relé: la subida entra al MCU\\
\redS & PA9 (USART1 TX) $\rightarrow$ 4G DIN & El MCU releva + inyecta \texttt{\$PHLG}\\
\redS & 4G DOUT $\rightarrow$ F9P RX2 (UART2) & RTCM3 \textbf{DIRECTO} (no pasa por el MCU) $\rightarrow$ correcciones intactas\\
\redT & PA10 $\rightarrow$ R 22\,k$\Omega$ $\rightarrow$ 3V3 & DFU-safe (idle high)\\
\redN & 4G NTRIP Master $\rightarrow$ breakout XBee (SparkFun BOB-08276), fuera del socket & Para interponer el MCU\\
\redN & 4G NTRIP Master $\rightarrow$ servidor (4G/NTRIP) & \texttt{\$PHLG} llega \textit{en banda} al backend\\
\bottomrule
\end{tabularx}}
\begin{helgennotice}[Fail-safe en el PCB v3: bypass UART2 normalmente cerrado]
En la tarjeta de producción, la bajada RTCM3 (4G DOUT $\rightarrow$ F9P RX2) pasa por un
\textbf{bypass normalmente cerrado}: si el MCU está \textbf{muerto, ausente o colgado}, el
bypass mantiene la ruta conectada y las correcciones \textbf{nunca se cortan} — el MCU solo
se interpone cuando está sano. En el protoboard este fail-safe \textbf{no existe}: si retiras
o cuelgas el Blackpill en Modo~B, regresa el 4G al socket XBee (modo por defecto, Bloque~8)
para no perder RTCM3. (Invariante: las correcciones viajan por el módem 4G; ningún estado del
MCU debe interrumpirlas.)
\end{helgennotice}
\bloque{10}{Respaldo de batería (proto): TP4056 + MT3608}
\queprueba{reproduce carga / respaldo. El PCB usa el LTC4040.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redV & 5\,V vehículo (SD-15B-05) $\rightarrow$ TP4056 IN+ & Camino de carga\\
\redG & TP4056 IN$-$ $\rightarrow$ GND & \\
\redN & TP4056 BAT+ $\rightarrow$ 18650+ (nodo compartido) & \\
\redN & 18650+ $\rightarrow$ MT3608 IN+ & Nodo compartido (carga + boost)\\
\redG & 18650$-$ $\rightarrow$ GND & \\
\redG & MT3608 IN$-$ / OUT$-$ $\rightarrow$ GND & \\
\redV & MT3608 OUT+ (eleva 3.6$\rightarrow$5\,V) $\rightarrow$ 1N5819 $\rightarrow$ MAIN5V & Respaldo (OR)\\
\redV & 5\,V vehículo $\rightarrow$ 1N5819 $\rightarrow$ MAIN5V & Primario (OR) — el vehículo tiene prioridad\\
\redN & NTC 10\,k $\rightarrow$ \textbf{pin TEMP del cargador} (TP4056 proto / LTC4040 PCB) & Temperatura de celda — \textbf{NO va al MCU} (ver aviso)\\
\redA & 18650+ $\rightarrow$ (Bloque 4) $\rightarrow$ PA0 (BAT\_SENSE) & Sensado de voltaje de batería\\
\redN & MT3608: ajustar \textbf{apenas} $<$ 5\,V del vehículo & Prioridad al vehículo; el PCB usa el LTC4040\\
\bottomrule
\end{tabularx}}
\begin{helgennotice}[El NTC del pack va al cargador, NUNCA al MCU]
El termistor pegado a la celda se conecta al \textbf{pin TEMP del cargador} (TP4056 en el
proto, LTC4040 en el PCB): es el \textbf{cargador} quien califica la carga por temperatura y
la corta si la celda está fría o caliente — protección por hardware, sin firmware de por
medio. \textbf{No lo lleves al Blackpill.} El MCU lee la temperatura por I\textsuperscript{2}C
con el \textbf{TMP102} (Bloque~6, en pigtail al punto caliente). El divisor
NTC $\rightarrow$ PB1 del \textbf{Bloque~11} es otra pieza: la ruta \textit{analógica} de
punto caliente cuando no hay SHT40/TMP102.
\end{helgennotice}
\noindent\textbf{Pack:} 1S4P $\sim$\textbf{12\,Ah} — \textit{nunca} 40\,Ah (ese dato fue un
error, corregido el 2026-06-30). Con 12\,Ah, la corriente de carga del LTC4040 se dimensiona
con R\textsubscript{PROG} $\approx$ C/5 $\le$ 2.5\,A.
\bloque{11}{Temperatura analógica (NTC 10\,k $\rightarrow$ PB1)}
\queprueba{sin SHT40, esta es tu temperatura.}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l X L{4.4cm}@{}}
\toprule
\theadconex
\midrule
\redT & 3V3 $\rightarrow$ R 10\,k$\Omega$ (1\,\%) $\rightarrow$ nodo & Divisor fijo (superior)\\
\redA & nodo $\rightarrow$ PB1 (ADC1\_IN9, libre) & $\approx$1.65\,V @ 25\,\textdegree C; baja al calentar\\
\redN & nodo $\rightarrow$ NTC 10\,k$\Omega$ $\rightarrow$ GND & Termistor · Beta $\approx$3950\\
\redG & nodo $\rightarrow$ C 100\,nF $\rightarrow$ GND & Filtro\\
\redN & Colócalo en el punto caliente (batería / módem) & Firmware: Beta/Steinhart + CHRG\_EN\\
\bottomrule
\end{tabularx}}
\noindent{\small\textit{Este NTC es \textbf{distinto} del NTC del cargador (Bloque~10): este
sí va al MCU (PB1) y mide el punto caliente; aquel va al pin TEMP del cargador y protege la
celda.}}
\section{Patitas de los componentes}
Míralos de frente, patitas hacia abajo.
\hwtab{%
\begin{tabularx}{\textwidth}{@{}L{4.6cm} X@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Componente}} & \textcolor{white}{\textbf{Orientación / pines}}\\
\midrule
2N3904 (TO-92) & Cara plana hacia ti, izq $\rightarrow$ der: \textbf{E -- B -- C}\\
IRF9540 (TO-220, canal P) & Metal atrás, izq $\rightarrow$ der: \textbf{G -- D -- S}. Metal = Drain\\
IRLZ44N (TO-220, lógico) & Metal atrás, izq $\rightarrow$ der: \textbf{G -- D -- S}. Debe ser «lógico» (\textbf{NO} IRF540/IRFZ44)\\
BAT54 · 1N5819 (diodos) & La banda impresa = \textbf{cátodo (K)}\\
NTC 10\,k (termistor) & Sin polaridad. Divisor con R 10\,k (1\,\%) a 3V3\\
\bottomrule
\end{tabularx}}
\section{Orden de armado (sigue este orden)}
\label{sec:orden}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}c L{3.2cm} X@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{\#}} & \textcolor{white}{\textbf{Paso}} & \textcolor{white}{\textbf{Acción}}\\
\midrule
1 & Solo USB & Compila y flashea el firmware v2.3 (Arduino/STM32duino, F411CE, DFU con BOOT0). Serial 115200: confirma \texttt{BOOT}/\texttt{COLS}/\texttt{TLM} y un \texttt{\$PHLG} cada 30\,s. Si falla, arregla el firmware antes de seguir.\\
2 & LED de estado & Bloque 2. Verás parpadeos.\\
3 & Interruptor de carga & Bloque 3. Confirma: \textbf{APAGADO al reset}, ON cuando PA1 activa.\\
4 & Sensado & Bloque 4. Divisores PA0/PA4; ignición por DFR1015 (12/24\,V) o el apagador a 3V3.\\
5 & Ventilador & Bloque 5. \textbf{Primero} ajusta el LM2596 a 5.0\,V, luego conecta el ventilador.\\
6 & Temperatura & Bloque 6 (si tienes SHT40/TMP102) o Bloque 11 (NTC $\rightarrow$ PB1).\\
7 & Respaldo de batería & Bloque 10. TP4056 + MT3608 (ajusta el MT3608 apenas $<$ 5\,V del vehículo).\\
8 & Stack RTK & Bloque 8. Solo 4 cables (SAL, GND, PA2, PA3); el 4G va en el socket XBee del Pro.\\
9 & (Opcional) Modo B & Bloque 9. Relé por breakout XBee — solo si vas a probar el diagnóstico por NTRIP.\\
\bottomrule
\end{tabularx}}
\section{Avisos importantes}
\begin{itemize}
\item El IRLZ44N debe ser «lógico» (\textbf{no} IRF540/IRFZ44). Si usaron TIP120, avísale a Leo.
\item \textbf{Nunca 5\,V directo a PA0/PA4/PA5.} PA0/PA4 por divisor $\div$2; PA5 lógico
$\le$ 3.3\,V (\texttt{INPUT\_PULLDOWN}, clamp BAT54, \textbf{sin divisor}).
\item LM2596: ajústalo a \textbf{5.0\,V con el multímetro ANTES de conectar} (vienen aleatorios).
\item El ventilador va en el 5\,V del LM2596 (\textbf{separado}), no en la salida «stack» ni en el 5\,V principal.
\item MT3608: ajústalo \textbf{apenas} $<$ 5\,V del vehículo (para que el vehículo tenga prioridad).
\item Ventilador de 2 hilos $\rightarrow$ sin tacómetro (PB10 sin usar).
\item El DFR1015 acepta 12 y 24\,V; su GND (IN$-$/OUT$-$) va al GND del sistema.
\item El 4G va en el \textbf{socket XBee del Pro} (no al Blackpill), salvo el Modo B.
En el PCB v3, el bypass UART2 \textbf{normalmente cerrado} garantiza que un MCU
muerto/ausente nunca corte el RTCM3 (ver Bloque~9).
\item El NTC del pack va al \textbf{pin TEMP del cargador} (TP4056 proto / LTC4040 PCB),
\textbf{nunca al MCU}. El MCU lee temperatura por el TMP102 (I\textsuperscript{2}C,
Bloque~6); el NTC $\rightarrow$ PB1 (Bloque~11) es la ruta de punto caliente cuando
no hay SHT40/TMP102.
\item 18650: respeta la polaridad; pack 1S4P $\sim$\textbf{12\,Ah} (nunca 40\,Ah).
\textbf{Bench-test} el firmware antes de flashear en campo.
\item Cobertura de partes: \textbf{Sección 1 + 3} de la lista de compras = suficiente para
el core; la Sección 2 (TP4056/MT3608) solo para el respaldo de batería.
\end{itemize}
\section{Historial del documento}
\hwtab{%
\begin{tabularx}{\textwidth}{@{}l l X@{}}
\toprule
\rowcolor{HelgenIndigo}\textcolor{white}{\textbf{Versión}} & \textcolor{white}{\textbf{Fecha}} & \textcolor{white}{\textbf{Cambios}}\\
\midrule
v2 & 2026-07-02 & Guía original (bloques 1--11), publicada solo como PDF (fuente perdida).\\
v2.1 & 2026-07-02 & Fuente LaTeX reconstruida y mantenida en el repo
(\texttt{03-Architecture-Hardware/}\allowbreak\texttt{Guia-Conexion-Protoboard/}). Contenido realineado al XLSX
autoritativo: mapa de pines completado (\textbf{PA8}, \textbf{PC13}), Bloque 9 con las filas
faltantes (alimentación, monitor PA2/PA3, ruta al servidor), fila LTC4040 en «Fuentes y
convertidores». Nuevo: tabla «Estado y cambios», aviso del \textbf{bypass UART2 normalmente
cerrado} del PCB (Bloque 9), aclaración \textbf{NTC del cargador vs TMP102 vs NTC$\rightarrow$PB1},
pack 1S4P $\sim$12\,Ah (nunca 40\,Ah), leyenda con colores de los diagramas CircuiTikZ,
figura del Bloque 3 y referencias cruzadas.\\
\bottomrule
\end{tabularx}}
\vspace{6pt}
\noindent{\footnotesize Helgen Technologies · Proyecto Drogheda · Guía de conexión en
protoboard v2.1 (bloques 1--11) · Firmware v2.3 · Documento para el técnico de armado.
Datos de conexión: \texttt{Drogheda\_Conexiones-por-Bloque\_Proto\_v1.xlsx} · Diagramas:
\texttt{circuitikz-wiring/}.}

View File

@ -0,0 +1,66 @@
% Helgen Drogheda — Guía de Conexión en Protoboard · DRG-PROTO-001 (es-MX)
% Watchdog HBOX v3 · tarjeta DEV STM32F411 Blackpill · bloques 1–11 · v2.1
%
% Compilar (preferido, con fuentes de marca): latexmk -xelatex main.tex
% Compilar (fallback sin fuentes de marca): latexmk -pdf main.tex (pdfLaTeX)
% El shim de abajo neutraliza polyglossia bajo pdfTeX para que el estilo
% compartido (_brand/estilo-helgen.tex) compile sin cambios en ambos motores.
%
% Fuente de datos autoritativa: ../Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx
% Diagramas: ../circuitikz-wiring/ (Drogheda_Diagrama_CircuiTikZ.pdf · _Beamer.pdf)
\documentclass[11pt]{article}
\newcommand{\sistema}{Helgen Drogheda — HBOX RTK}
\newcommand{\sistemapdf}{Helgen Drogheda HBOX RTK}
\newcommand{\doctipo}{Guía de Conexión en Protoboard}
% ---- Shim de compatibilidad pdfLaTeX (el estilo es canónicamente XeLaTeX) ----
\usepackage{iftex}
\ifPDFTeX
\usepackage[utf8]{inputenc}
\usepackage{lmodern} % fuentes escalables (espejo del fallback Latin Modern del estilo)
% Finge que polyglossia ya está cargado (el estilo lo pide sin condición)
\expandafter\def\csname ver@polyglossia.sty\endcsname{2020/01/01}
\providecommand{\setmainlanguage}[2][]{}
\fi
\input{../../_brand/estilo-helgen.tex}
\usepackage{circuitikz}
\input{../circuitikz-wiring/wiring-blocks.tex}
% ---- Colores de red / cable (mismos que los diagramas CircuiTikZ) ----
\definecolor{netIgn}{HTML}{7B1E3B} % GUINDA — ignición cruda 12–24 V
% Swatch de color + etiqueta para la columna «Red»
\newcommand{\redsw}[2]{\textcolor{#1}{\rule[-0.12ex]{0.72em}{0.72em}}\,{\footnotesize\textbf{#2}}}
\newcommand{\redV}{\redsw{net5V}{5V}}
\newcommand{\redT}{\redsw{net3V3}{3V3}}
\newcommand{\redG}{\redsw{netGND}{GND}}
\newcommand{\redS}{\redsw{netSig}{Señal}}
\newcommand{\redA}{\redsw{netAna}{Analóg.}}
\newcommand{\redI}{\redsw{netIgn}{12--24\,V}}
\newcommand{\redN}{{\footnotesize —}}
% ---- Encabezado de bloque + línea «Qué prueba» ----
\newcommand{\bloque}[2]{\subsection*{Bloque #1 · #2}}
\newcommand{\queprueba}[1]{\noindent{\small\textit{\textbf{Qué prueba:} #1}}\par\smallskip}
% ---- Encabezado estándar de las tablas de conexión ----
\newcommand{\theadconex}{\rowcolor{HelgenIndigo}
\textcolor{white}{\textbf{Red}} &
\textcolor{white}{\textbf{Conexión (desde $\rightarrow$ vía $\rightarrow$ hacia)}} &
\textcolor{white}{\textbf{Valor / Nota}}\\}
\begin{document}
\helgenportada{Guía de Conexión en Protoboard}{HBOX Watchdog v3 — tarjeta DEV / protoboard · bloques 1--11}{%
\begin{tabular}{@{}ll@{}}
\textbf{Documento} & DRG-PROTO-001 — Guía de Conexión en Protoboard\\
\textbf{Versión} & 2.1 (sucede a la v2; fuente LaTeX reconstruida y mantenida en el repo)\\
\textbf{Fecha} & 2 de julio de 2026\\
\textbf{Firmware} & v2.3 · MCU STM32F411 «Blackpill»\\
\textbf{Dirigido a} & Técnico de armado — sigue el orden de la sección~\ref{sec:orden}\\
\textbf{Fuente de datos} & \texttt{Drogheda\_Conexiones-por-Bloque\_Proto\_v1.xlsx} (autoritativa)\\
\textbf{Autor} & Dr.\ Leopoldo Rodríguez Salazar — Helgen Technologies\\
\textbf{Clasificación} & Confidencial — uso interno de Helgen\\
\textbf{Asistencia IA} & Elaborado con asistencia de Claude (Anthropic), revisado por el autor\\
\end{tabular}}
\input{cuerpo.tex}
\end{document}

View File

@ -0,0 +1,88 @@
% Helgen Technologies — Watchdog v3 proto wiring (Beamer / Metropolis)
% Based on assets/helgen-beamer-template.tex. Compile: latexmk -xelatex (brand fonts) or pdflatex.
\documentclass[10pt,aspectratio=169]{beamer}
\usetheme[progressbar=frametitle, numbering=fraction, block=fill]{metropolis}
% ---------- Helgen official palette (Guia de Identidad v1.5, 2026) ----------
\definecolor{HelgenIndigo}{HTML}{2C3C5B}
\definecolor{HelgenCyan}{HTML}{51F3DA}
\definecolor{HelgenTeal}{HTML}{17A08C}
\definecolor{HelgenMist}{HTML}{EFF1F5}
\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}
% ---------- Fonts (XeLaTeX → brand fonts; pdfLaTeX → clean fallback) ----------
\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{standout}{family=\helgentitle, series=\bfseries}
}{}
\IfFontExistsTF{MADE Evolve Sans}{\setsansfont{MADE Evolve Sans}}{}
\else
\usepackage[T1]{fontenc}
\usepackage{lmodern}% fallback vectorial (evita fuentes bitmap Type 3 en pdflatex)
\fi
\usepackage{booktabs}
\usepackage{adjustbox}
\usepackage{circuitikz}
\usetikzlibrary{arrows.meta, positioning, shapes.misc, calc}
\input{wiring-blocks}
% ---------- Footer ----------
\setbeamertemplate{frame footer}{%
\scriptsize\color{gray}\insertshortauthor\ \textbar\ \insertshorttitle\ \textbar\ Confidencial — Helgen Technologies}
% fit a block's tikzpicture inside the frame, preserving aspect
\newcommand{\blockframe}[2]{%
\begin{frame}{#1}\centering
\adjustbox{max width=0.96\textwidth, max height=0.78\textheight, center}{%
\begin{tikzpicture}#2\end{tikzpicture}}%
\end{frame}}
% ---------- Metadata ----------
\title[Watchdog v3 — Cableado del prototipo]{HBOX Watchdog v3 — Cableado del Prototipo}
\subtitle{Guía de armado en protoboard — Tarjeta DEV — Firmware v2.3}
\author[Helgen — Drogheda]{Helgen Technologies — Proyecto Drogheda}
\date{Diagramas v2 · 2026-07-02}
\begin{document}
\maketitle
\begin{frame}{Cómo usar este diagrama}
\begin{itemize}
\item Un bloque = un paso del armado; mismo orden que la guía PDF (1 $\rightarrow$ 11).
\item El \alert{color del cable} indica la red (5\,V, 3.3\,V, GND, señal, analógico, ignición cruda); une todos los GND. Sensados analógicos: \alert{PA0, PA4 y PB1}.
\item \alert{PA5 (ignición)} es digital, sin divisor, máx 3.3\,V.
\item El \alert{NTC de la batería} va al pin \alert{TEMP del cargador} (TP4056 proto / LTC4040 en PCB), no al MCU; el NTC en \alert{PB1} (bloque 11) mide el punto caliente de la placa.
\item El \alert{ventilador} usa un 5\,V separado, no la salida ``stack''.
\item Cobertura: \textbf{Sección 1 + 3} alcanza para todo esto; Sección 2 (TP4056/MT3608) sólo para el respaldo de batería.
\end{itemize}
\end{frame}
\blockframe{1 · Rieles de alimentación (5 V / GND / 3.3 V)}{\blkRieles}
\blockframe{2 · LED de estado (PB0)}{\blkLED}
\blockframe{3 · Interruptor de carga del ``stack'' (PA1) — el corazón}{\blkCarga}
\blockframe{4 · Sensado: batería / 5 V / ignición}{\blkSensado}
\blockframe{5 · Ventilador (2 hilos, 5 V — PA6)}{\blkVent}
\blockframe{6 · Sensor de temperatura I\textsuperscript{2}C (PB6 / PB7)}{\blkTemp}
\blockframe{7 · Reset (opcional) y Gauge de batería}{\blkResetGauge}
\blockframe{8 · Conexión del stack RTK — modo por defecto (observa)}{\blkStack}
\blockframe{9 · Modo B — Diagnóstico por NTRIP (relé + inyección \$PHLG)}{\blkStackB}
\blockframe{10 · Respaldo de batería (proto): TP4056 + MT3608}{\blkBatt}
\blockframe{11 · Temperatura analógica (NTC 10k $\rightarrow$ PB1)}{\blkTempA}
\begin{frame}[standout]
Diagrama de referencia\\ para el armado del prototipo
\end{frame}
\end{document}

View File

@ -0,0 +1,45 @@
\documentclass[border=16pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{circuitikz}
\usepackage{helvet}\renewcommand{\familydefault}{\sfdefault}
\input{wiring-blocks}
\begin{document}
\begin{tikzpicture}[every node/.append style={font=\footnotesize}]
% ---- title ----
\node[anchor=north west,font=\bfseries\Large,Indigo] at (-2,6.0)
{HBOX Watchdog v3 — Diagrama de Cableado del Prototipo (CircuiTikZ)};
\node[anchor=north west,font=\small,gray] at (-2,5.2)
{Tarjeta DEV · Firmware v2.3 · STM32F411 Blackpill · Proyecto Drogheda / Helgen · Diagramas v2 · 2026-07-02};
% legend
\begin{scope}[shift={(-2,4.2)}]
\foreach \i/\c/\t in {0/net5V/{5 V},1.7/net3V3/{3.3 V},3.3/netGND/GND,4.7/netSig/{Señal},6.3/netAna/{Analóg. (PA0, PA4, PB1)},10.1/netIgn/{Ign. cruda 12--24 V}}{
\draw[\c,line width=2pt] (\i,0)--(\i+0.5,0); \node[anchor=west,font=\scriptsize] at (\i+0.55,0){\t};}
\end{scope}
% ---- block grid ----
\def\cw{14.0} \def\ch{9.4}
\newcommand\cell[4]{\begin{scope}[shift={(#1*\cw, #2*\ch)}]
\node[anchor=north west,font=\bfseries,Indigo] at (-2,3.7){#3}; #4 \end{scope}}
\cell{0}{0}{1 · Rieles de alimentación}{\blkRieles}
\cell{1}{0}{2 · LED de estado (PB0)}{\blkLED}
\cell{0}{-1}{3 · Interruptor de carga (PA1) — el corazón}{\blkCarga}
\cell{1}{-1}{4 · Sensado: batería / 5 V / ignición}{\blkSensado}
\cell{0}{-2}{5 · Ventilador (2 hilos, 5 V)}{\blkVent}
\cell{1}{-2}{6 · Sensor de temperatura I\textsuperscript{2}C}{\blkTemp}
\cell{0}{-3}{7 · Reset (opcional) y Gauge de batería}{\blkResetGauge}
\cell{0}{-4}{8 · Conexión del stack RTK (modo por defecto): simpleRTK2B Pro + 4G NTRIP}{\blkStack}
\cell{0}{-5}{9 · Modo B — Diagnóstico por NTRIP (relé + inyección \$PHLG)}{\blkStackB}
\cell{0}{-6}{10 · Respaldo de batería (proto): TP4056 + MT3608 — el PCB usa LTC4040}{\blkBatt}
\cell{1}{-6}{11 · Temperatura analógica (NTC $\rightarrow$ PB1)}{\blkTempA}
% notes cell (1,-3)
\begin{scope}[shift={(1*\cw,-3*\ch)}]
\node[anchor=north west,font=\bfseries,Indigo] at (-2,3.4){Avisos};
\node[anchor=north west,font=\scriptsize,text width=11cm] at (-2,2.6){%
$\bullet$ IRLZ44N debe ser \textbf{lógico} (no IRF540/IRFZ44).\\
$\bullet$ Nunca 5 V directo a PA0/PA4/PB1/PA5 (PA5 lógico $\le$ 3.3 V).\\
$\bullet$ El ventilador usa un \textbf{5 V separado}, no la salida ``stack''.\\
$\bullet$ Apagado = estado seguro: el ``stack'' arranca APAGADO.\\
$\bullet$ Cobertura: \textbf{Sección 1 + 3} = suficiente; Sección 2 (TP4056/MT3608) sólo para el respaldo de batería.};
\end{scope}
\end{tikzpicture}
\end{document}

View File

@ -0,0 +1,275 @@
% wiring-blocks.tex — shared CircuiTikZ blocks (es-MX) — Drogheda Watchdog v3 proto
% Requires: \usepackage{circuitikz} in the host document, then \input{wiring-blocks}
\usetikzlibrary{calc}
\definecolor{net5V}{HTML}{C62828}
\definecolor{net3V3}{HTML}{EF6C00}
\definecolor{netGND}{HTML}{212121}
\definecolor{netSig}{HTML}{1565C0}
\definecolor{netAna}{HTML}{2E7D32}
\definecolor{netTac}{HTML}{B8860B}
\definecolor{netIgn}{HTML}{800020}% guinda — ignición cruda 12–24 V (GX16 p3)
\definecolor{Indigo}{HTML}{2C3C5B}
\ctikzset{bipoles/length=0.75cm, font=\footnotesize}
% \pin{color}{nodename}{coord}{label}
\newcommand{\pin}[4]{\node[circle,fill=#1,text=white,inner sep=1.7pt,font=\bfseries\tiny] (#2) at (#3) {#4};}
\usetikzlibrary{arrows.meta}
% \ant{x}{y} — small antenna glyph rooted at (x,y)
\newcommand{\ant}[2]{\draw (#1,#2) -- ++(0,0.34) -- ++(-0.18,0.22); \draw (#1,#2) ++(0,0.34) -- ++(0.18,0.22);}
% ===== 1 · RIELES =====
\newcommand{\blkRieles}{%
\coordinate (r5) at (0,3.0); \coordinate (rg) at (0,-2.2);
\draw[net5V,line width=1pt] (-1.6,3.0)--(10.6,3.0); \node[net5V,font=\bfseries,anchor=south east] at (10.6,3.05){5 V};
\draw[netGND,line width=1pt] (-1.6,-2.2)--(10.6,-2.2); \node[netGND,font=\bfseries,anchor=north east] at (10.6,-2.25){GND};
\node[draw,rounded corners,minimum width=2.1cm,minimum height=1.5cm,align=center,font=\scriptsize](src) at (-0.2,0.4){Fuente 5 V\\SD-15B-05\\o banco};
\draw[net5V] (src.north) -- (src.north|-r5);
\draw[netGND] (src.south) -- (src.south|-rg);
\node[draw,fill=blue!8,rounded corners,minimum width=2.6cm,minimum height=1.8cm,align=center,font=\scriptsize](bp) at (4.2,0.4){\textbf{Blackpill}\\STM32F411};
\draw[net5V] (bp.north) -- (bp.north|-r5);
\draw[netGND] (bp.south) -- (bp.south|-rg);
\node[net3V3,font=\scriptsize,anchor=west] at (bp.east) {$\rightarrow$ 3.3 V};
\draw (9.0,3.0) to[C,l_=$100\,\mu$F$+$100\,nF] (9.0,-2.2);
}
% ===== 2 · LED DE ESTADO =====
\newcommand{\blkLED}{%
\pin{netSig}{PB0}{-1,0}{PB0}
\draw[netSig] (PB0) to[R,l=$330\,\Omega$,*-] (2.6,0);
\draw (2.6,0) to[leD] (2.6,-2.2) node[ground]{};
\node[anchor=west,font=\scriptsize,align=left,text width=3.7cm] at (3.6,-0.9){PB0 $\rightarrow$ 330\,$\Omega$ $\rightarrow$ ánodo; cátodo $\rightarrow$ GND.};
}
% ===== 3 · INTERRUPTOR DE CARGA =====
\newcommand{\blkCarga}{%
\coordinate (r5) at (0,3.0);
\draw[net5V,line width=1pt] (-1.6,3.0)--(9.2,3.0); \node[net5V,font=\bfseries,anchor=south east] at (9.2,3.05){5 V};
\pin{netSig}{PA1}{-1.6,0}{PA1}
\node[npn,anchor=base](Q) at (2,0){};
\node[font=\scriptsize,anchor=north] at ($(Q.south)+(0,-0.05)$){2N3904};
\draw[netSig] (PA1) to[R,l=$1\,\mathrm{k}\Omega$] (Q.base);
\draw (Q.emitter) -- ++(0,-1.4) node[ground]{};
\node[pmos,anchor=gate](M) at (6,1.7){};
\node[font=\scriptsize,anchor=south] at ($(M.north)+(0,0.05)$){IRF9540 (P)};
\coordinate (corner) at (Q.collector |- M.gate);
\draw[netSig] (Q.collector) -- (corner) -- (M.gate);
\draw (corner) to[R,l_=$10\,\mathrm{k}\Omega$] (corner |- r5);
\fill (corner) circle(1.6pt);
\draw[net5V] (M.source) -- (M.source |- r5);
\draw (M.drain) -- ++(0,-1.6) coordinate(sal);
\pin{netSig}{SAL}{sal}{SAL}
\node[anchor=west,font=\scriptsize] at ($(sal)+(0.25,0)$){Salida ``stack'' ($\rightarrow$ bloque 8)};
}
% ===== 4 · SENSADO =====
\newcommand{\blkSensado}{%
% PA0
\draw (-1.7,2.2) to[battery1,l_={18650 (1S4P, $\sim$12 Ah)}] (-0.2,2.2);
\pin{netAna}{PA0}{2.6,2.2}{PA0}
\draw[netAna] (-0.2,2.2) to[R,l=$10$k] (PA0);
\draw[netAna] (PA0) to[R,l=$10$k] (5.2,2.2); \draw (5.2,2.2)--++(0,-0.7) node[ground]{};
\node[anchor=west,font=\scriptsize] at (6.2,2.2){$\div2$ analóg.};
% PA4
\node[net5V,font=\bfseries\scriptsize,anchor=east] at (-1.7,0.4){5 V}; \draw[net5V] (-1.7,0.4)--(-0.2,0.4);
\pin{netAna}{PA4}{2.6,0.4}{PA4}
\draw[netAna] (-0.2,0.4) to[R,l=$10$k] (PA4);
\draw[netAna] (PA4) to[R,l=$10$k] (5.2,0.4); \draw (5.2,0.4)--++(0,-0.7) node[ground]{};
\node[anchor=west,font=\scriptsize] at (6.2,0.4){$\div2$ analóg.};
% PA5 — ignición real: 12–24 V -> DFR1015 (IN+/IN-/OUT+/OUT-) -> 100R -> (clamp + cap) -> PA5
\node[draw,rounded corners,minimum width=1.5cm,minimum height=1.25cm,font=\tiny,align=center](DFR) at (-0.35,-1.45){DFR1015\\$\rightarrow$\,5 V};
% ignition -> IN+ (upper-left)
\node[netIgn,font=\tiny,align=right,anchor=east] at (-2.05,-1.15){Ign.\\12–24 V\\(GX16 p3)};
\draw[netIgn,line width=0.9pt] (-2.0,-1.15) -- (-1.1,-1.15); \node[font=\tiny,anchor=south west] at (-1.08,-1.12){+};
% IN- (lower-left) -> common GND
\draw[line width=0.9pt] (-1.1,-1.75) -- (-1.6,-1.75) -- (-1.6,-2.45); \node[font=\tiny,anchor=north west] at (-1.08,-1.78){$-$};
% OUT+ (upper-right) -> 100R -> PA5
\draw[line width=0.9pt] (0.4,-1.15) to[R,l=$100$] (2.2,-1.15); \node[font=\tiny,anchor=south east] at (0.38,-1.12){+};
\coordinate (p5) at (2.7,-1.15);
\pin{netSig}{PA5}{3.5,-1.15}{PA5}
\draw[netSig,line width=0.9pt] (2.2,-1.15) -- (PA5); \fill (p5) circle(1.3pt);
% OUT- (lower-right) -> common GND
\draw[line width=0.9pt] (0.4,-1.75) -- (0.9,-1.75) -- (0.9,-2.45); \node[font=\tiny,anchor=north east] at (0.38,-1.78){$-$};
% common DFR ground (IN-/OUT- = GND del sistema)
\draw[line width=0.9pt] (-1.6,-2.45) -- (0.9,-2.45); \draw (-0.35,-2.45) -- (-0.35,-2.55) node[ground]{};
\node[font=\tiny,anchor=north] at (-0.35,-2.98){GND (IN$-$/OUT$-$)};
% BAT54 clamp to 3V3 + 100nF debounce on PA5
\draw[line width=0.8pt] (p5) -- (2.7,-0.95); \draw[line width=0.8pt] (2.7,-0.95) to[D,l_=BAT54] (2.7,-0.2);
\draw[net3V3,line width=0.9pt] (2.35,-0.2) -- (3.05,-0.2); \node[net3V3,font=\tiny,anchor=south] at (2.7,-0.16){3V3};
\draw[line width=0.8pt] (p5) to[C,l_=100\,nF] (2.7,-2.5); \draw (2.7,-2.5) node[ground]{};
\node[font=\tiny,anchor=west] at (3.85,-1.15){PA5 digital};
\node[anchor=north west,font=\tiny,align=left,text width=9.8cm] at (-2.1,-3.5){\textbf{!} \textbf{Banco (proto):} sin DFR1015 — un apagador \textbf{3V3 $\rightarrow$ PA5} simula la ignición. \textbf{Sin divisor}; el DFR1015 acepta 12 y 24 V y su \textbf{GND (IN$-$/OUT$-$) va al GND del sistema}; PA5 $\le$ 3.3 V.};
}
% ===== 5 · VENTILADOR (horizontal) =====
\newcommand{\blkVent}{%
\coordinate (r5) at (0,2.6);
% LM2596 makes the fan's SEPARATE 5 V (24 V -> 5 V)
\node[net5V,font=\bfseries\tiny,anchor=east] at (-2.55,2.6){24 V};
\draw[net5V,line width=0.9pt] (-2.5,2.6) -- (-2.15,2.6);
\node[draw,rounded corners,fill=blue!6,minimum width=1.5cm,minimum height=0.85cm,font=\tiny,align=center](LM) at (-1.4,2.6){LM2596\\24$\rightarrow$5 V};
\draw[line width=0.8pt] (-1.4,2.175) -- (-1.4,1.55) node[ground]{};
\draw[net5V,line width=1pt] (-0.65,2.6)--(7.6,2.6); \node[net5V,font=\bfseries,anchor=south east] at (7.6,2.65){5 V sep.};
% gate drive: PA6 -> 220 -> gate ; 100k gate -> GND
\pin{netSig}{PA6}{-1.6,0}{PA6}
\draw[netSig,line width=0.9pt] (PA6) to[R,l=$220$] (1.4,0);
\node[nmos](M) at (2.7,0){};
\draw[netSig,line width=0.9pt] (1.4,0) -- (M.gate); \fill (1.4,0) circle(1.3pt);
\draw[line width=0.9pt] (1.4,0) to[R,l_=$100$k] (1.4,-1.6); \draw (1.4,-1.6) node[ground]{};
\draw[line width=0.9pt] (M.source) -- (M.source|-0,-1.6) node[ground]{};
\node[font=\tiny,anchor=south east] at ($(M.gate)+(-0.02,0.05)$){G};
\node[font=\tiny,anchor=north west] at ($(M.source)+(0.06,-0.04)$){S};
\node[font=\tiny,anchor=south west] at ($(M.drain)+(0.05,0.05)$){D};
\node[font=\scriptsize,anchor=south] at (2.7,0.95){IRLZ44N (N)};
% 2-wire fan to the right, AT drain height -> clean horizontal drain wire to fan(-)
\path (M.drain) ++(3.0,0) coordinate(fc);
\node[draw,circle,minimum size=1.25cm,font=\scriptsize](F) at (fc){VENT};
\node[font=\tiny,anchor=north] at ($(F.south)+(0,-0.03)$){2 hilos};
\coordinate (fk) at ($(F.west)+(-0.6,0)$);
\draw[line width=0.9pt] (M.drain) -- (F.west); \fill (fk) circle(1.3pt);
\node[font=\tiny,anchor=north west] at ($(F.west)+(0.02,-0.03)$){$-$};
\node[net5V,font=\tiny,anchor=south west] at ($(F.north)+(0.02,0.02)$){+};
\draw[net5V,line width=0.9pt] (F.north) -- (F.north|-r5);
% flyback diode across fan (band/cathode -> +5V)
\draw[line width=0.9pt] (fk) to[D,l=1N5819] (fk|-r5);
% note (2-wire fan: no tach)
\node[anchor=north west,font=\scriptsize,align=left,text width=9.7cm] at (-2.6,-2.2){\textbf{!} Ventilador de \textbf{2 hilos}: \textbf{+} $\rightarrow$ 5 V sep. y \textbf{$-$} $\rightarrow$ \textbf{DRAIN (D)}. \textbf{G} = control (PA6); \textbf{S} = GND. El \textbf{5 V sep. lo hace un LM2596} (24$\rightarrow$5 V, \textbf{ajústalo a 5.0 V}) para que el arranque del ventilador no hunda el 5 V principal. \textbf{Sin tach}: PB10 sin usar (DNP).};
}
% ===== 6 · TEMP I2C =====
\newcommand{\blkTemp}{%
\coordinate (r3) at (0,2.6);
\node[draw,rounded corners,minimum width=2.3cm,minimum height=2.7cm](S) at (0,0){};
\node[font=\bfseries\scriptsize,align=center] at (0,0.7){SHT40 /\\TMP102};
\node[font=\tiny] at (0,-0.7){0x44 / 0x48};
\foreach \y/\nm in {0.9/VCC,0.35/GND,-0.4/SCL,-0.95/SDA}{\draw (1.15,\y)--(1.7,\y); \node[anchor=east,font=\tiny] at (1.05,\y){\nm};}
\draw[net3V3] (1.7,0.9) -| (3.2,2.6); \node[net3V3,anchor=south,font=\scriptsize] at (3.2,2.6){3V3};
\draw[netGND] (1.7,0.35) -- ++(0.5,0) -- ++(0,-1.4) node[ground]{};
\pin{netSig}{PB6}{3.6,-0.4}{PB6} \draw[netSig] (1.7,-0.4)--(PB6);
\pin{netSig}{PB7}{3.6,-0.95}{PB7} \draw[netSig] (1.7,-0.95)--(PB7);
\draw[netSig] (2.6,-0.4) to[R,l=$4.7$k] (2.6,1.8) -- (2.6,2.6) -- (3.2,2.6);
\node[anchor=west,font=\scriptsize] at (4.4,-0.7){pull-ups 4.7\,k a 3V3};
}
% ===== 7 · RESET + GAUGE =====
\newcommand{\blkResetGauge}{%
\pin{netSig}{NRST}{-1.2,1.6}{NRST}
\draw (NRST) -- (0.6,1.6); \draw (0.6,1.6) to[push button] (2.4,1.6);
\draw[netGND] (2.4,1.6) -- ++(0,-0.8) node[ground]{};
\node[anchor=west,font=\scriptsize] at (3.0,1.6){botón de reset $\rightarrow$ GND};
\foreach \i/\nm in {0/PB12,1/PB13,2/PB14,3/PB15}{%
\pin{netSig}{\nm}{\i*2.1,-0.4}{\nm}
\draw (\nm) to[R,l=$330$] (\i*2.1,-1.9); \draw (\i*2.1,-1.9) to[leD] (\i*2.1,-3.0) node[ground]{};
}
\node[anchor=west,font=\scriptsize,Indigo] at (-0.3,-3.7){\textbf{!} Quedan apagados hasta tener firmware};
}
% ===== 8 · CONEXIÓN DEL STACK RTK (simpleRTK2B + 4G NTRIP) =====
\newcommand{\blkStack}{%
\node[font=\scriptsize\bfseries,Indigo,anchor=south] at (-1.3,1.9){del watchdog (Blackpill)};
\pin{net5V}{wSAL}{-1.3,1.2}{SAL}
\pin{netGND}{wGND}{-1.3,0.3}{GND}
\pin{netSig}{wTX}{-1.3,-0.7}{PA2}
\pin{netSig}{wRX}{-1.3,-1.7}{PA3}
\node[anchor=west,font=\tiny,gray] at (-0.95,-0.7){TX}; \node[anchor=west,font=\tiny,gray] at (-0.95,-1.7){RX};
\node[anchor=north,font=\tiny,gray] at (-1.3,0.95){SAL = bloque 3};
% simpleRTK2B Pro
\node[draw,fill=blue!7,rounded corners,minimum width=3.5cm,minimum height=4.1cm](F9P) at (4.3,-0.2){};
\node[font=\bfseries\scriptsize,align=center] at (4.3,1.35){simpleRTK2B Pro\\(ZED-F9P)};
\foreach \yy/\nm/\cc in {1.2/{5 V}/net5V,0.3/{GND}/netGND,-0.7/{UART1 RX}/netSig,-1.7/{UART1 TX}/netSig}{%
\draw[\cc,line width=0.9pt] (2.55,\yy)--(2.95,\yy); \node[anchor=west,font=\tiny] at (3.0,\yy){\nm};}
\draw[net5V,line width=1pt] (wSAL) -- (2.55,1.2); \node[net5V,font=\tiny,anchor=south] at (1.0,1.25){5 V conmutado};
\draw[netGND,line width=0.9pt] (wGND) -- (2.55,0.3);
\draw[netSig,line width=0.9pt] (wTX) -- (2.55,-0.7);
\draw[netSig,line width=0.9pt] (wRX) -- (2.55,-1.7);
% GNSS antenna
\draw (4.3,1.85) -- (4.3,2.45); \ant{4.3}{2.45} \node[anchor=west,font=\tiny] at (4.6,2.72){Antena GNSS (SMA)};
% 4G NTRIP master on the XBee socket
\node[draw,fill=black!8,rounded corners,minimum width=3.0cm,minimum height=2.3cm](G4) at (9.1,0.2){};
\node[font=\bfseries\scriptsize,align=center] at (9.1,0.7){4G NTRIP\\Master (XBee)};
\node[font=\tiny,align=center] at (9.1,-0.4){socket XBee del Pro\\(UART2 interno)};
\draw[densely dashed,line width=0.9pt] (6.05,0.2)--(7.6,0.2); \node[font=\tiny,anchor=south,align=center] at (6.82,0.3){socket XBee\\(5 V + datos)};
% LTE antennas
\draw (8.5,1.35)--(8.5,1.95); \ant{8.5}{1.95} \draw (9.7,1.35)--(9.7,1.95); \ant{9.7}{1.95} \node[anchor=west,font=\tiny] at (9.95,2.15){2$\times$ ant. LTE};
% RTCM flow
\draw[-{Stealth},Indigo,thick] (7.6,-0.55)--(6.05,-0.55); \node[Indigo,font=\tiny,anchor=north] at (6.82,-0.6){RTCM3 (correcciones)};
% notes
\node[anchor=north west,font=\scriptsize,align=left,text width=11.4cm] at (-1.3,-2.5){\textbf{!} El 4G va en el \textbf{socket XBee del simpleRTK2B Pro}, no al Blackpill; ahí recibe 5 V y datos. Las \textbf{correcciones (RTCM3) llegan por 4G}, no por el GNSS.\\ \textbf{!} Cruce \textbf{TX$\leftrightarrow$RX}: PA2 (TX) $\rightarrow$ UART1 RX y PA3 (RX) $\leftarrow$ UART1 TX. GND común. Relé \$PHLG opcional (PA9/PA10) = DNP, apagado por defecto.};
}
% ===== 10 · RESPALDO DE BATERÍA (PROTO): TP4056 + MT3608 =====
\newcommand{\blkBatt}{%
\coordinate (r5) at (0,2.4);
\draw[net5V,line width=1pt] (-2.0,2.4)--(8.8,2.4); \node[net5V,font=\bfseries,anchor=south east] at (8.8,2.45){MAIN5V (al sistema)};
% vehicle 5V + OR diode D1
\node[net5V,font=\bfseries\tiny,anchor=east,align=right] at (-2.05,1.4){5 V veh.\\(SD-15B-05)};
\draw[net5V,line width=0.9pt] (-2.0,1.4) -- (-0.125,1.4);
\fill (-1.1,1.4) circle(1.2pt); \draw[line width=0.9pt] (-1.1,1.4) -- (-1.1,1.8); \draw[line width=0.9pt] (-1.1,1.8) to[D] (-1.1,2.4); \node[font=\tiny,anchor=west] at (-1.0,2.06){1N5819};
% TP4056 charger
\node[draw,rounded corners,fill=blue!6,minimum width=1.55cm,minimum height=1.1cm,font=\tiny,align=center](TP) at (0.65,1.0){TP4056\\cargador};
\draw[line width=0.9pt] (-0.125,0.74) -- (-0.45,0.74) -- (-0.45,0.2) node[ground]{};
% shared battery+ node: TP BAT+ -- 18650+ -- MT IN+ (y=0.74)
\draw[line width=0.9pt] (1.425,0.74) -- (3.9,0.74);
\draw (2.5,0.74) -- (2.5,0.24); \draw (2.5,0.24) to[battery1] (2.5,-1.2); \fill (2.5,0.74) circle(1.2pt);
\node[font=\tiny,anchor=east,align=right] at (2.28,-0.55){18650\\1S4P $\sim$12 Ah};
\draw[line width=0.9pt] (2.5,-1.2) -- (2.5,-1.65) node[ground]{};
% NTC (cell temp)
\draw[line width=0.8pt] (3.8,-0.28) to[thR,l_={NTC 10k}] (3.8,-1.2) node[ground]{}; \node[font=\tiny,anchor=south,align=center] at (3.8,-0.23){NTC — temp de celda\\$\rightarrow$ TEMP del cargador};
% MT3608 boost
\node[draw,rounded corners,fill=blue!6,minimum width=1.7cm,minimum height=1.1cm,font=\tiny,align=center](MT) at (4.75,1.0){MT3608\\elev.$\rightarrow$5 V};
\draw[line width=0.9pt] (4.75,0.45) -- (4.75,-0.55) node[ground]{};
\draw[line width=0.9pt] (5.6,1.26) -- (6.2,1.26); \fill (6.2,1.26) circle(1.2pt); \draw[line width=0.9pt] (6.2,1.26) -- (6.2,1.8); \draw[line width=0.9pt] (6.2,1.8) to[D] (6.2,2.4); \node[font=\tiny,anchor=west] at (6.3,2.06){1N5819};
% note
\node[anchor=north west,font=\tiny,align=left,text width=10.4cm] at (-2.05,-2.05){\textbf{!} \textbf{Stand-in de banco} (ya lo tienes): el \textbf{vehículo carga el 18650} por el TP4056; el \textbf{MT3608 eleva} 3.6 V $\rightarrow$ 5 V; los \textbf{2× 1N5819} hacen OR de veh + respaldo hacia MAIN5V (ajusta el MT3608 apenas por debajo del 5 V del vehículo para que el vehículo tenga prioridad). \textbf{BAT\_SENSE} = 18650+ $\rightarrow$ PA0 (Bloque 4). El \textbf{NTC va al pin TEMP del cargador} (TP4056 proto / LTC4040 en PCB), \textbf{no al MCU}; el MCU lee la temperatura por el \textbf{TMP102} (I\textsuperscript{2}C, Bloque 6). El \textbf{PCB usa el LTC4040} (Bloque B, por diseñar).};
}
% ===== 11 · TEMPERATURA ANALÓGICA (NTC 10k -> PB1 ADC) =====
\newcommand{\blkTempA}{%
\node[net3V3,font=\bfseries\scriptsize,anchor=south] at (0,2.1){3V3};
\draw[net3V3,line width=0.9pt] (0,2.05) -- (0,1.85);
\draw (0,1.85) to[R,l=$10$k] (0,0.8);
\coordinate (nd) at (0,0.45);
\draw (0,0.8) -- (nd); \fill (nd) circle(1.3pt);
\draw (nd) to[thR,l=NTC\,10k] (0,-1.4) node[ground]{};
\draw[netAna,line width=0.9pt] (nd) -- (1.3,0.45); \pin{netAna}{PB1}{1.6,0.45}{PB1}
\node[font=\tiny,anchor=west] at (1.95,0.45){ADC (temperatura)};
\draw (nd) -- (-0.85,0.45); \draw (-0.85,0.45) to[C,l_=100\,nF] (-0.85,-0.75) node[ground]{};
\node[anchor=north west,font=\scriptsize,align=left,text width=9.4cm] at (-1.7,-1.9){\textbf{!} \textbf{Sin SHT40, ésta es tu temperatura.} Divisor \textbf{3V3 — 10k(1\%) — NTC 10k — GND} $\to$ \textbf{PB1} (ADC1\_IN9, libre). $\approx$1.65 V a 25 °C; baja al calentar. $\approx$165\,$\mu$A (sin auto-calentamiento). Firmware: leer ADC + \textbf{Beta} ($\approx$3950)/Steinhart. \textbf{Colócalo en el punto caliente} (batería/modem) $>$ aire; puede disparar \textbf{CHRG\_EN} (corte de carga). Es PCB/firmware — en protoboard puentea el NTC a PB1 para probar.};
}
% ===== 9 · MODO B — DIAGNÓSTICO POR NTRIP (relé + inyección $PHLG) =====
\newcommand{\blkStackB}{%
% ---------- F9P (left) ----------
\node[draw,fill=blue!7,rounded corners,minimum width=2.7cm,minimum height=4.6cm](F9P) at (1.75,0){};
\node[font=\bfseries\scriptsize,align=center] at (1.75,1.7){simpleRTK2B\\Pro (F9P)};
\node[font=\tiny,align=center,Indigo] at (1.75,-1.85){sw $\rightarrow$ UART1\\(UART2 libre)};
\draw (1.75,2.3)--(1.75,2.9); \ant{1.75}{2.9} \node[anchor=west,font=\tiny] at (2.0,3.05){Ant. GNSS};
\foreach \yy/\nm/\cc in {1.9/{5 V}/net5V,1.35/{GND}/netGND,0.6/{UART1 RX}/netSig,0.05/{UART1 TX}/netSig,-0.8/{TX2}/netSig,-1.5/{RX2}/netSig}{%
\draw[\cc,line width=0.9pt] (3.1,\yy)--(3.5,\yy); \node[anchor=east,font=\tiny] at (3.05,\yy){\nm};}
% ---------- Watchdog (middle, in-line) ----------
\node[draw,fill=Indigo!8,rounded corners,minimum width=2.5cm,minimum height=4.0cm](WD) at (6.4,0){};
\node[font=\bfseries\scriptsize,align=center,Indigo] at (6.4,1.5){Watchdog\\(Blackpill)};
\node[font=\tiny,align=center] at (6.4,-1.5){relé verbatim\\+ inyecta \$PHLG};
\foreach \yy/\nm/\cc in {1.9/{5 V}/net5V,1.35/{GND}/netGND,0.6/{PA2}/netSig,0.05/{PA3}/netSig,-0.8/{PA10}/netSig}{%
\draw[\cc,line width=0.9pt] (5.15,\yy)--(4.75,\yy); \node[anchor=west,font=\tiny] at (5.2,\yy){\nm};}
\draw[netSig,line width=0.9pt] (7.65,-0.8)--(8.05,-0.8); \node[anchor=east,font=\tiny] at (7.6,-0.8){PA9};
% ---------- 4G modem on breakout (right) ----------
\node[draw,fill=black!8,rounded corners,minimum width=2.7cm,minimum height=3.2cm](G4) at (10.6,-0.1){};
\node[font=\bfseries\scriptsize,align=center] at (10.6,0.8){4G NTRIP\\Master (XBee)};
\node[font=\tiny,align=center] at (10.6,-0.25){en breakout\\(BOB-08276)};
\draw (10.1,1.5)--(10.1,2.1); \ant{10.1}{2.1} \draw (11.1,1.5)--(11.1,2.1); \ant{11.1}{2.1} \node[anchor=west,font=\tiny] at (11.3,2.25){2$\times$ LTE};
\foreach \yy/\nm/\cc in {1.0/{VCC}/net5V,-0.8/{DIN}/netSig,-1.5/{DOUT}/netSig}{%
\draw[\cc,line width=0.9pt] (9.25,\yy)--(8.85,\yy); \node[anchor=west,font=\tiny] at (9.3,\yy){\nm};}
% ---------- data connections ----------
\draw[netSig,line width=0.9pt,{Stealth}-] (3.5,0.6)--(4.75,0.6); % UART1 RX <- PA2
\draw[netSig,line width=0.9pt,-{Stealth}] (3.5,0.05)--(4.75,0.05); % UART1 TX -> PA3
\node[gray,font=\tiny,anchor=south] at (4.12,0.62){monitor};
\draw[netSig,line width=1pt,-{Stealth}] (3.5,-0.8)--(4.75,-0.8); % TX2 -> PA10
\draw[netSig,line width=1pt,-{Stealth}] (8.05,-0.8)--(8.85,-0.8); % PA9 -> DIN
\node[Indigo,font=\tiny,anchor=south] at (8.45,-0.72){\$PHLG};
% corrections direct (dashed, around the bottom)
\draw[netSig,densely dashed,line width=1pt,-{Stealth}] (8.85,-1.5) -- (8.85,-2.75) -- (3.5,-2.75) -- (3.5,-1.5);
\node[font=\tiny,anchor=south] at (6.1,-2.72){RTCM3 directo (no pasa por el MCU)};
% to server
\draw[-{Stealth},Indigo,thick] (11.9,1.5)--(12.6,2.0); \node[Indigo,font=\tiny,anchor=west] at (12.0,1.9){$\rightarrow$ servidor};
% notes
\node[anchor=north west,font=\scriptsize,align=left,text width=13.4cm] at (-1.4,-3.2){\textbf{!} \textbf{5 V/GND} de F9P, watchdog y 4G $=$ SAL/GND (bloque 3). \textbf{IOREF $=$ 3.3 V}. El 4G va en \textbf{breakout} (fuera del socket) y el switch del Pro en \textbf{UART1}, dejando UART2 libre.\\ \textbf{!} El MCU queda \textbf{en línea} en la subida (F9P TX2 $\rightarrow$ PA10 $\rightarrow$ PA9 $\rightarrow$ 4G DIN) e inyecta \$PHLG. La bajada \textbf{RTCM3 (4G DOUT $\rightarrow$ F9P RX2) es directa} (punteada). \textbf{PCB:} bypass normalmente-cerrado en UART2 $\Rightarrow$ un MCU ausente/colgado nunca corta las correcciones.};
}

@ -1 +0,0 @@
Subproject commit 45eed65860823dd11044a02baa4c92a173d5e284

View File

@ -0,0 +1,955 @@
(kicad_symbol_lib
(version 20241209)
(generator "kicad-mcp")
(generator_version "9.0")
(symbol "MP1584EN"
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(property "Reference" "U"
(at 2.54 0 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Value" "MP1584EN"
(at 0 -2.54 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Footprint" "Package_SO:SOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.29x3mm"
(at 0 -5.08 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Datasheet" "https://www.monolithicpower.com/en/mp1584.html"
(at 0 -7.62 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Description" "MP1584EN 3A 28V step-down converter (SOIC-8-EP)"
(at 0 -10.16 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "ki_keywords" "buck regulator step-down MP1584"
(at 0 0 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(symbol "MP1584EN_0_1"
(rectangle
(start -5.08 -7.62)
(end 5.08 7.62)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "MP1584EN_1_1"
(pin power_in line
(at -7.62 5.08 0)
(length 2.54)
(name "VIN"
(effects (font (size 1.27 1.27)))
)
(number "7"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -7.62 2.54 0)
(length 2.54)
(name "EN"
(effects (font (size 1.27 1.27)))
)
(number "2"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -7.62 0 0)
(length 2.54)
(name "FREQ"
(effects (font (size 1.27 1.27)))
)
(number "6"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -7.62 -2.54 0)
(length 2.54)
(name "FB"
(effects (font (size 1.27 1.27)))
)
(number "4"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -7.62 -5.08 0)
(length 2.54)
(name "COMP"
(effects (font (size 1.27 1.27)))
)
(number "3"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 7.62 5.08 180)
(length 2.54)
(name "BST"
(effects (font (size 1.27 1.27)))
)
(number "8"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 7.62 2.54 180)
(length 2.54)
(name "SW"
(effects (font (size 1.27 1.27)))
)
(number "1"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 0 -10.16 90)
(length 2.54)
(name "GND"
(effects (font (size 1.27 1.27)))
)
(number "5"
(effects (font (size 1.27 1.27)))
)
)
)
)
(symbol "LTC4040EUFD"
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(property "Reference" "U"
(at 2.54 0 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Value" "LTC4040EUFD"
(at 0 -2.54 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Footprint" "Package_DFN_QFN:QFN-24-1EP_4x5mm_P0.5mm_EP2.65x3.65mm"
(at 0 -5.08 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/4040fb.pdf"
(at 0 -7.62 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Description" "2.5A Battery Backup Power Manager, 1S Li-Ion/LiFePO4, buck charger + boost backup, QFN-24 4x5"
(at 0 -10.16 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "ki_keywords" "battery backup charger boost power-path LTC"
(at 0 0 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(symbol "LTC4040EUFD_0_1"
(rectangle
(start -15.24 -20.32)
(end 15.24 20.32)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "LTC4040EUFD_1_1"
(pin input line
(at -17.78 17.78 0)
(length 2.54)
(name "PFI"
(effects (font (size 1.27 1.27)))
)
(number "19"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 15.24 0)
(length 2.54)
(name "BSTFB"
(effects (font (size 1.27 1.27)))
)
(number "18"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 12.7 0)
(length 2.54)
(name "RSTFB"
(effects (font (size 1.27 1.27)))
)
(number "10"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -17.78 10.16 0)
(length 2.54)
(name "PROG"
(effects (font (size 1.27 1.27)))
)
(number "2"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -17.78 7.62 0)
(length 2.54)
(name "CLPROG"
(effects (font (size 1.27 1.27)))
)
(number "3"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 5.08 0)
(length 2.54)
(name "NTC"
(effects (font (size 1.27 1.27)))
)
(number "17"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 2.54 0)
(length 2.54)
(name "CHGOFF"
(effects (font (size 1.27 1.27)))
)
(number "4"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 0 0)
(length 2.54)
(name "BSTOFF"
(effects (font (size 1.27 1.27)))
)
(number "5"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 -2.54 0)
(length 2.54)
(name "F2"
(effects (font (size 1.27 1.27)))
)
(number "12"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 -5.08 0)
(length 2.54)
(name "F1"
(effects (font (size 1.27 1.27)))
)
(number "13"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -17.78 -7.62 0)
(length 2.54)
(name "F0"
(effects (font (size 1.27 1.27)))
)
(number "14"
(effects (font (size 1.27 1.27)))
)
)
(pin open_collector line
(at -17.78 -10.16 0)
(length 2.54)
(name "CHRG"
(effects (font (size 1.27 1.27)))
)
(number "8"
(effects (font (size 1.27 1.27)))
)
)
(pin open_collector line
(at -17.78 -12.7 0)
(length 2.54)
(name "FAULT"
(effects (font (size 1.27 1.27)))
)
(number "9"
(effects (font (size 1.27 1.27)))
)
)
(pin open_collector line
(at -17.78 -15.24 0)
(length 2.54)
(name "PFO"
(effects (font (size 1.27 1.27)))
)
(number "20"
(effects (font (size 1.27 1.27)))
)
)
(pin open_collector line
(at -17.78 -17.78 0)
(length 2.54)
(name "RST"
(effects (font (size 1.27 1.27)))
)
(number "11"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 17.78 17.78 180)
(length 2.54)
(name "VIN"
(effects (font (size 1.27 1.27)))
)
(number "6"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 17.78 15.24 180)
(length 2.54)
(name "CLN"
(effects (font (size 1.27 1.27)))
)
(number "7"
(effects (font (size 1.27 1.27)))
)
)
(pin output line
(at 17.78 12.7 180)
(length 2.54)
(name "IGATE"
(effects (font (size 1.27 1.27)))
)
(number "15"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 17.78 10.16 180)
(length 2.54)
(name "VSYS"
(effects (font (size 1.27 1.27)))
)
(number "1"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 17.78 7.62 180)
(length 2.54)
(name "VSYS"
(effects (font (size 1.27 1.27)))
)
(number "24"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 17.78 2.54 180)
(length 2.54)
(name "SW"
(effects (font (size 1.27 1.27)))
)
(number "21"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 17.78 0 180)
(length 2.54)
(name "SW"
(effects (font (size 1.27 1.27)))
)
(number "22"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 17.78 -5.08 180)
(length 2.54)
(name "BAT"
(effects (font (size 1.27 1.27)))
)
(number "23"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at 17.78 -10.16 180)
(length 2.54)
(name "OVSNS"
(effects (font (size 1.27 1.27)))
)
(number "16"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 0 -22.86 90)
(length 2.54)
(name "GND_EP"
(effects (font (size 1.27 1.27)))
)
(number "25"
(effects (font (size 1.27 1.27)))
)
)
)
)
(symbol "AO4406A"
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(property "Reference" "Q"
(at 2.54 0 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Value" "AO4406A"
(at 0 -2.54 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"
(at 0 -5.08 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Datasheet" "~"
(at 0 -7.62 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Description" "N-Channel MOSFET 30V 13A 8.5mOhm SOIC-8 (pins 1-3=S, 4=G, 5-8=D) — VIN-VSYS disconnect"
(at 0 -10.16 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "ki_keywords" "nmos mosfet soic8 disconnect"
(at 0 0 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(symbol "AO4406A_0_1"
(rectangle
(start -5.08 -5.08)
(end 5.08 5.08)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "AO4406A_1_1"
(pin input line
(at -7.62 0 0)
(length 2.54)
(name "G"
(effects (font (size 1.27 1.27)))
)
(number "4"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -2.54 7.62 270)
(length 2.54)
(name "D"
(effects (font (size 1.27 1.27)))
)
(number "5"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 0 7.62 270)
(length 2.54)
(name "D"
(effects (font (size 1.27 1.27)))
)
(number "6"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 2.54 7.62 270)
(length 2.54)
(name "D"
(effects (font (size 1.27 1.27)))
)
(number "7"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 5.08 7.62 270)
(length 2.54)
(name "D"
(effects (font (size 1.27 1.27)))
)
(number "8"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -2.54 -7.62 90)
(length 2.54)
(name "S"
(effects (font (size 1.27 1.27)))
)
(number "1"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 0 -7.62 90)
(length 2.54)
(name "S"
(effects (font (size 1.27 1.27)))
)
(number "2"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 2.54 -7.62 90)
(length 2.54)
(name "S"
(effects (font (size 1.27 1.27)))
)
(number "3"
(effects (font (size 1.27 1.27)))
)
)
)
)
(symbol "SimpleRTK2B_Pro_Socket"
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(property "Reference" "MOD"
(at 2.54 0 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Value" "SimpleRTK2B_Pro_Socket"
(at 0 -2.54 0)
(effects
(font (size 1.27 1.27))
)
)
(property "Footprint" "Module:Arduino_UNO_R3"
(at 0 -5.08 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Datasheet" "https://www.ardusimple.com/simplertk2b-pro-hookup-guide/"
(at 0 -7.62 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "Description" "simpleRTK2B Pro (ZED-F9P) mounted as shield on Arduino-UNO-pattern female headers. Pads match Module:Arduino_UNO_R3. D0=TX1 D1=RX1 D2=RX2 D8=TX2 (Ardusimple pinout R00). IOREF driven 3.3V; 5V pin = input (5V=OUTPUT switch OFF); XBee-socket switch on the Pro parked on UART1."
(at 0 -10.16 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(property "ki_keywords" "ardusimple simplertk2b f9p shield socket carrier"
(at 0 0 0)
(effects
(font (size 1.27 1.27))
)
(hide yes)
)
(symbol "SimpleRTK2B_Pro_Socket_0_1"
(rectangle
(start -12.7 -26.67)
(end 12.7 24.13)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "SimpleRTK2B_Pro_Socket_1_1"
(pin output line
(at -15.24 20.32 0)
(length 2.54)
(name "TX1_D0"
(effects (font (size 1.27 1.27)))
)
(number "15"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -15.24 17.78 0)
(length 2.54)
(name "RX1_D1"
(effects (font (size 1.27 1.27)))
)
(number "16"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at -15.24 15.24 0)
(length 2.54)
(name "RX2_D2"
(effects (font (size 1.27 1.27)))
)
(number "17"
(effects (font (size 1.27 1.27)))
)
)
(pin output line
(at -15.24 12.7 0)
(length 2.54)
(name "TX2_D8"
(effects (font (size 1.27 1.27)))
)
(number "23"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 7.62 0)
(length 2.54)
(name "SDA"
(effects (font (size 1.27 1.27)))
)
(number "31"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 5.08 0)
(length 2.54)
(name "SCL"
(effects (font (size 1.27 1.27)))
)
(number "32"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 2.54 0)
(length 2.54)
(name "AREF"
(effects (font (size 1.27 1.27)))
)
(number "30"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 0 0)
(length 2.54)
(name "D3"
(effects (font (size 1.27 1.27)))
)
(number "18"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -2.54 0)
(length 2.54)
(name "D4"
(effects (font (size 1.27 1.27)))
)
(number "19"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -5.08 0)
(length 2.54)
(name "D5"
(effects (font (size 1.27 1.27)))
)
(number "20"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -7.62 0)
(length 2.54)
(name "D6"
(effects (font (size 1.27 1.27)))
)
(number "21"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -10.16 0)
(length 2.54)
(name "D7"
(effects (font (size 1.27 1.27)))
)
(number "22"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -12.7 0)
(length 2.54)
(name "D9"
(effects (font (size 1.27 1.27)))
)
(number "24"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -15.24 0)
(length 2.54)
(name "D10"
(effects (font (size 1.27 1.27)))
)
(number "25"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -17.78 0)
(length 2.54)
(name "FENCE_D11"
(effects (font (size 1.27 1.27)))
)
(number "26"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -20.32 0)
(length 2.54)
(name "EXTINT_D12"
(effects (font (size 1.27 1.27)))
)
(number "27"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at -15.24 -22.86 0)
(length 2.54)
(name "TPS_D13"
(effects (font (size 1.27 1.27)))
)
(number "28"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 15.24 20.32 180)
(length 2.54)
(name "5V"
(effects (font (size 1.27 1.27)))
)
(number "5"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 17.78 180)
(length 2.54)
(name "VIN"
(effects (font (size 1.27 1.27)))
)
(number "8"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 15.24 180)
(length 2.54)
(name "3V3_OUT"
(effects (font (size 1.27 1.27)))
)
(number "4"
(effects (font (size 1.27 1.27)))
)
)
(pin input line
(at 15.24 12.7 180)
(length 2.54)
(name "IOREF"
(effects (font (size 1.27 1.27)))
)
(number "2"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 10.16 180)
(length 2.54)
(name "RESET"
(effects (font (size 1.27 1.27)))
)
(number "3"
(effects (font (size 1.27 1.27)))
)
)
(pin power_in line
(at 15.24 7.62 180)
(length 2.54)
(name "GND"
(effects (font (size 1.27 1.27)))
)
(number "6"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 5.08 180)
(length 2.54)
(name "GND"
(effects (font (size 1.27 1.27)))
)
(number "7"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 2.54 180)
(length 2.54)
(name "GND"
(effects (font (size 1.27 1.27)))
)
(number "29"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 0 180)
(length 2.54)
(name "A0"
(effects (font (size 1.27 1.27)))
)
(number "9"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -2.54 180)
(length 2.54)
(name "A1"
(effects (font (size 1.27 1.27)))
)
(number "10"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -5.08 180)
(length 2.54)
(name "A2"
(effects (font (size 1.27 1.27)))
)
(number "11"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -7.62 180)
(length 2.54)
(name "A3"
(effects (font (size 1.27 1.27)))
)
(number "12"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -10.16 180)
(length 2.54)
(name "A4"
(effects (font (size 1.27 1.27)))
)
(number "13"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -12.7 180)
(length 2.54)
(name "A5"
(effects (font (size 1.27 1.27)))
)
(number "14"
(effects (font (size 1.27 1.27)))
)
)
(pin passive line
(at 15.24 -17.78 180)
(length 2.54)
(name "NC"
(effects (font (size 1.27 1.27)))
)
(number "1"
(effects (font (size 1.27 1.27)))
)
)
)
)
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -649,7 +649,7 @@
"uuid": "561403b3-895e-4153-a7be-3876ae930d43"
}
],
"used_designators": "",
"used_designators": "#PWR1-4",
"variants": []
},
"sheets": [

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,95 +0,0 @@
(kicad_pcb
(version 20260206)
(generator "pcbnew")
(generator_version "10.0")
(general
(thickness 1.6)
(legacy_teardrops no)
)
(paper "A4")
(title_block
(title "hbox-watchdog-v3")
(date "2026-06-23")
)
(layers
(0 "F.Cu" signal)
(2 "B.Cu" signal)
(9 "F.Adhes" user "F.Adhesive")
(11 "B.Adhes" user "B.Adhesive")
(13 "F.Paste" user)
(15 "B.Paste" user)
(5 "F.SilkS" user "F.Silkscreen")
(7 "B.SilkS" user "B.Silkscreen")
(1 "F.Mask" user)
(3 "B.Mask" user)
(17 "Dwgs.User" user "User.Drawings")
(19 "Cmts.User" user "User.Comments")
(21 "Eco1.User" user "User.Eco1")
(23 "Eco2.User" user "User.Eco2")
(25 "Edge.Cuts" user)
(27 "Margin" user)
(31 "F.CrtYd" user "F.Courtyard")
(29 "B.CrtYd" user "B.Courtyard")
(35 "F.Fab" user)
(33 "B.Fab" user)
(39 "User.1" user)
(41 "User.2" user)
(43 "User.3" user)
(45 "User.4" user)
)
(setup
(pad_to_mask_clearance 0)
(allow_soldermask_bridges_in_footprints no)
(tenting
(front yes)
(back yes)
)
(covering
(front no)
(back no)
)
(plugging
(front no)
(back no)
)
(capping no)
(filling no)
(pcbplotparams
(layerselection 0x00000000_00000000_55555555_5755f5ff)
(plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000)
(disableapertmacros no)
(usegerberextensions no)
(usegerberattributes yes)
(usegerberadvancedattributes yes)
(creategerberjobfile yes)
(dashed_line_dash_ratio 12)
(dashed_line_gap_ratio 3)
(svgprecision 4)
(plotframeref no)
(mode 1)
(useauxorigin no)
(pdf_front_fp_property_popups yes)
(pdf_back_fp_property_popups yes)
(pdf_metadata yes)
(pdf_single_document no)
(dxfpolygonmode yes)
(dxfimperialunits yes)
(dxfusepcbnewfont yes)
(psnegative no)
(psa4output no)
(plot_black_and_white yes)
(sketchpadsonfab no)
(plotpadnumbers no)
(hidednponfab no)
(sketchdnponfab yes)
(crossoutdnponfab yes)
(subtractmaskfromsilk no)
(outputformat 1)
(mirror no)
(drillshape 1)
(scaleselection 1)
(outputdirectory "")
)
)
(embedded_fonts no)
)

View File

@ -1,138 +0,0 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"prototype_zone_fills": false,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
"vias",
"footprint_text",
"footprint_anchors",
"ratsnest",
"grid",
"footprints_front",
"footprints_back",
"footprint_values",
"footprint_references",
"tracks",
"drc_errors",
"drawing_sheet",
"bitmaps",
"pads",
"zones",
"drc_warnings",
"drc_exclusions",
"locked_item_shadows",
"conflict_shadows",
"shapes",
"board_outline_area",
"ly_points"
],
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"integration_disabled": false,
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "hbox-watchdog-v3.kicad_prl",
"version": 5
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [
156,
141,
103,
71,
103,
103,
103,
74,
103,
103
],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_time_domain_details": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": 0
},
"open_jobsets": [],
"project": {
"files": []
},
"schematic": {
"hierarchy_collapsed": [],
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"ruleAreas": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

View File

@ -1,90 +0,0 @@
2026-06-24T03:08:57.372Z [kicad] [info] Initializing server... { metadata: undefined }
2026-06-24T03:08:57.859Z [kicad] [info] Using MCP server command: /Users/leo/.nvm/versions/node/v24.16.0/bin/node with args and path: {
metadata: {
args: [
'/Users/leo/Documents/Claude/Projects/KiCAD-MCP-Server/dist/index.js',
[length]: 1
],
paths: [
'/Users/leo/.mimocode/bin',
'/opt/homebrew/share/google-cloud-sdk/bin',
'/Users/leo/.nvm/versions/node/v24.16.0/bin',
'/opt/homebrew/Cellar/openjdk@17/17.0.19/libexec/openjdk.jdk/Contents/Home/bin',
'/Users/leo/Projects/flutter/bin',
'/opt/homebrew/bin',
'/usr/local/bin',
'/System/Cryptexes/App/usr/bin',
'/usr/bin',
'/bin',
'/usr/sbin',
'/sbin',
'/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin',
'/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin',
'/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin',
'/Users/leo/.pub-cache/bin',
'/Users/leo/.local/bin',
[length]: 17
]
}
} %o
2026-06-24T03:08:57.859Z [kicad] [info] Server started and connected successfully { metadata: undefined }
2026-06-24T03:08:59.453Z [kicad] [info] Message from client: {"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"extensions":{"io.modelcontextprotocol/ui":{"mimeTypes":["text/html;profile=mcp-app"]}}},"clientInfo":{"name":"claude-ai","version":"0.1.0"}},"jsonrpc":"2.0","id":0} { metadata: undefined }
[2026-06-23 21:09:02,095] [INFO] Using STDIO transport for local communication
[2026-06-23 21:09:02,104] [INFO] Registering KiCAD tools, resources, and prompts...
[2026-06-23 21:09:02,104] [INFO] Registering router tools
[2026-06-23 21:09:02,105] [INFO] Router tools registered successfully
[2026-06-23 21:09:02,105] [INFO] Registering board management tools
[2026-06-23 21:09:02,106] [INFO] Board management tools registered
[2026-06-23 21:09:02,106] [INFO] Registering component management tools
[2026-06-23 21:09:02,107] [INFO] Component management tools registered
[2026-06-23 21:09:02,109] [INFO] Registering design rule tools
[2026-06-23 21:09:02,110] [INFO] Design rule tools registered
[2026-06-23 21:09:02,110] [INFO] Registering export tools
[2026-06-23 21:09:02,112] [INFO] Export tools registered
[2026-06-23 21:09:02,117] [INFO] UI management tools registered
[2026-06-23 21:09:02,118] [INFO] Registering project resources
[2026-06-23 21:09:02,118] [INFO] Project resources registered
[2026-06-23 21:09:02,118] [INFO] Registering board resources
[2026-06-23 21:09:02,118] [INFO] Board resources registered
[2026-06-23 21:09:02,118] [INFO] Registering component resources
[2026-06-23 21:09:02,118] [INFO] Component resources registered
[2026-06-23 21:09:02,119] [INFO] Registering library resources
[2026-06-23 21:09:02,119] [INFO] Library resources registered
[2026-06-23 21:09:02,119] [INFO] Registering component prompts
[2026-06-23 21:09:02,119] [INFO] Component prompts registered
[2026-06-23 21:09:02,119] [INFO] Registering routing prompts
[2026-06-23 21:09:02,119] [INFO] Routing prompts registered
[2026-06-23 21:09:02,119] [INFO] Registering design prompts
[2026-06-23 21:09:02,120] [INFO] Design prompts registered
[2026-06-23 21:09:02,120] [INFO] Registering footprint prompts
[2026-06-23 21:09:02,120] [INFO] All KiCAD tools, resources, and prompts registered
[2026-06-23 21:09:02,120] [INFO] Starting KiCAD MCP server...
[2026-06-23 21:09:02,120] [INFO] Starting Python process with script: /Users/leo/Documents/Claude/Projects/KiCAD-MCP-Server/python/kicad_interface.py
[2026-06-23 21:09:02,120] [INFO] Found virtual environment Python at: /Users/leo/Documents/Claude/Projects/KiCAD-MCP-Server/venv/bin/python
[2026-06-23 21:09:02,120] [INFO] Using Python executable: /Users/leo/Documents/Claude/Projects/KiCAD-MCP-Server/venv/bin/python
[2026-06-23 21:09:02,120] [INFO] Validating pcbnew module access...
[2026-06-23 21:09:02,948] [INFO] ✓ pcbnew module validated successfully
[2026-06-23 21:09:02,949] [INFO] Waiting for Python process to be ready...
[2026-06-23 21:09:06,709] [INFO] Python process READY — stdin loop is live
[2026-06-23 21:09:06,711] [INFO] Python process is ready.
[2026-06-23 21:09:06,711] [INFO] Connecting MCP server to STDIO transport...
[2026-06-23 21:09:06,711] [INFO] Successfully connected to STDIO transport
[2026-06-23 21:09:06,866] [INFO] Sending warm-up command (background)...
2026-06-24T03:09:06.881Z [kicad] [info] Message from server: {"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2025-11-25","capabilities":{"tools":{"listChanged":true},"resources":{"listChanged":true},"prompts":{"listChanged":true}},"serverInfo":{"name":"kicad-mcp-server","version":"1.0.0","description":"MCP server for KiCAD PCB design operations"}}} { metadata: undefined }
2026-06-24T03:09:06.885Z [kicad] [info] Message from client: {"method":"notifications/initialized","jsonrpc":"2.0"} { metadata: undefined }
2026-06-24T03:09:06.885Z [kicad] [info] Message from client: {"method":"tools/list","params":{},"jsonrpc":"2.0","id":1} { metadata: undefined }
2026-06-24T03:09:06.885Z [kicad] [info] Message from client: {"method":"prompts/list","params":{},"jsonrpc":"2.0","id":2} { metadata: undefined }
2026-06-24T03:09:06.885Z [kicad] [info] Message from client: {"method":"resources/list","params":{},"jsonrpc":"2.0","id":3} { metadata: undefined }
2026-06-24T03:09:06.913Z [kicad] [info] Message from server: {"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"list_tool_categories","description":"List all available KiCAD tool categories with their descriptions and tool counts. Use this to discover which tools are available via the router.","inputSchema":{"$sche...[170002 chars truncated]...,"inputSchema":{"type":"object","properties":{"freeroutingJar":{"type":"string","description":"Path to freerouting.jar to check"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"execution":{"taskSupport":"forbidden"}}]}} { metadata: undefined }
2026-06-24T03:09:06.913Z [kicad] [info] Message from server: {"jsonrpc":"2.0","id":2,"result":{"prompts":[{"name":"component_selection","arguments":[{"name":"requirements","description":"Description of the circuit requirements and constraints","required":true}]},{"name":"component_placement_strategy","arguments":[{"...[3571 chars truncated]...uired":true},{"name":"libraryPath","description":"Target .pretty library path (optional)","required":false}]},{"name":"footprint_ipc_checklist","arguments":[{"name":"footprintPath","description":"Path to the .kicad_mod file to review","required":true}]}]}} { metadata: undefined }
2026-06-24T03:09:06.913Z [kicad] [info] Message from server: {"jsonrpc":"2.0","id":3,"result":{"resources":[{"uri":"kicad://project/info","name":"project_info"},{"uri":"kicad://project/properties","name":"project_properties"},{"uri":"kicad://project/files","name":"project_files"},{"uri":"kicad://project/status","name":"project_status"},{"uri":"kicad://project/summary","name":"project_summary"},{"uri":"kicad://board/info","name":"board_info"},{"uri":"kicad://board/layers","name":"layer_list"},{"uri":"kicad://board/statistics","name":"board_statistics"},{"uri":"kicad://components","name":"component_list"},{"uri":"kicad://components/placement","name":"component_placement"},{"uri":"kicad://components/groups","name":"component_groups"},{"uri":"kicad://libraries","name":"library_list"},{"uri":"kicad://board/extents/mm","name":"Millimeters"},{"uri":"kicad://board/extents/inch","name":"Inches"},{"uri":"kicad://board/2d-view/png","name":"PNG Format"},{"uri":"kicad://board/2d-view/jpg","name":"JPEG Format"},{"uri":"kicad://board/2d-view/svg","name":"SVG Format"},{"uri":"kicad://board/3d-view/isometric","name":"Isometric View"},{"uri":"kicad://board/3d-view/top","name":"Top View"},{"uri":"kicad://board/3d-view/bottom","name":"Bottom View"},{"uri":"kicad://components","name":"All Components"}]}} { metadata: undefined }
[2026-06-23 21:09:06,915] [ERROR] Python stderr: ./src/common/stdpbase.cpp(59): assert ""traits"" failed in Get(): create wxApp before calling this
[2026-06-23 21:09:06,964] [INFO] Warm-up succeeded: pcbnew 10.0.4 (0s)
[2026-06-23 21:09:06,964] [INFO] Warm-up complete — pcbnew/wxApp initialised
KiCAD MCP SERVER READY
[2026-06-23 21:09:06,964] [INFO] KiCAD MCP server started and ready
[2026-06-23 21:09:06,964] [INFO] KiCAD MCP server started with STDIO transport
2026-06-24T03:09:31.946Z [kicad] [info] Message from client: {"method":"tools/call","params":{"name":"check_kicad_ui","arguments":{}},"jsonrpc":"2.0","id":4} { metadata: undefined }
[2026-06-23 21:09:31,979] [INFO] Checking KiCAD UI status
2026-06-24T03:09:32.118Z [kicad] [info] Message from server: {"jsonrpc":"2.0","id":4,"result":{"content":[{"type":"text","text":"{\n \"success\": true,\n \"running\": true,\n \"processes\": [\n {\n \"pid\": \"98622\",\n \"name\": \"/Applications/KiCad/KiCad.app/Contents/MacOS/kicad\",\n \"command\": \"/Applications/KiCad/KiCad.app/Contents/MacOS/kicad\"\n }\n ],\n \"message\": \"KiCAD is running\",\n \"backend\": \"swig\",\n \"realtime_sync\": false,\n \"ipc_connected\": false,\n \"_backend\": \"swig\",\n \"_realtime\": false\n}"}]}} { metadata: undefined }

View File

@ -0,0 +1,4 @@
(sym_lib_table
(version 7)
(lib (name "Drogheda-sym")(type "KiCad")(uri "/Users/leo/Documents/Claude/Projects/Drogheda/03-Architecture-Hardware/kicad/Drogheda-sym.kicad_sym")(options "")(descr ""))
)

View File

@ -1 +0,0 @@
{"hostname":"Leopoldos-MacBook-Pro","username":"leo"}

View File

@ -189,7 +189,7 @@ outputs **3.3 V**, PA5 sees **≈1.4 V — below VIH**, and `ignitionOn` stays f
(b) **drop R9/R10** and feed the DFR1015 output **directly** to PA5 through the 100 Ω series +
D5 clamp (cleanest if DFR1015 ≤ 3.3 V). Confirm the measured DFR1015 output on the bench.
### 🔴 Finding 3 — `5V_SENSE` (PA4) must tap the *vehicle* side, and depends on the battery call
### 🔴 Finding 3 — `5V_SENSE` (PA4) must tap the *vehicle* side, and depends on the battery call — **implemented on PROD 2026-07-02** (`R7.1` → `VEH5V`)
"Vehicle‑power present" only works if PA4 senses a node that **drops when the machine is off**
— i.e. the **SD‑15B‑05 output**, *before* any battery hold‑up. The connection list assumes
the **battery is dropped** (MAIN5V = SD‑15B‑05 powers the MCU directly; PA4 senses MAIN5V; P4
@ -227,7 +227,30 @@ bring‑up**, none of this changes the bench steps: use a bench supply (correct
Q10/D10 are skipped anyway), confirm the ignition logic level with a meter, and the watchdog —
now including the smart‑fan loop — comes up exactly as the firmware expects.
## Related
---
## 7. Additions 2026-07-02 — Block B / H / I per-connection rationale
> The production capture session (Blocks **B** LTC4040 backup · **H** Modo-B bypass relay ·
> **I** NTC→PB1) added rows **129–193** to `watchdog-connections.xlsx`. Specs live in
> [[03-Architecture-Hardware/watchdog-production-schematic-delta|watchdog-production-schematic-delta.md]]
> §4/§5b/§5c; this section records the **why** per connection, same as §3 did for the core.
> Battery status here supersedes §5's "battery dropped" resolution text — the pack was
> **re-added 2026-06-24** (canonical state doc §3.3) and **Finding 3 is now implemented on
> PROD** (PA4 divider top `R7.1` re-tapped to `VEH5V`, 2026-07-02).
| Connection | How it's wired | Why |
|---|---|---|
| **PB1 NTC divider — 1 % top (R42)** | `3V3 → R42 10 k 1 % → PB1`; NTC 10 k (P12, at the hot spot) → GND | The top resistor is the *reference half* of the thermometer — its tolerance adds directly to the reading. A 5 % top can shift the computed temperature by several °C right at the 45–70 °C fan/charge decision band; 1 % keeps divider error below the NTC's own spread. |
| **PB1 filter — C24 100 nF** | `PB1 → C24 → GND` at the pin | ADC **source impedance**: the F411's sample cap needs a low-impedance source, and a 10 k/10 k divider alone is too stiff for a clean conversion. C24 is the local charge reservoir (and RC noise filter for the NTC pigtail). |
| **K1 relay, not an analog mux** | F9P TX2 → **K1 NC** → 4G DIN; PB5 → R40 1 k → Q6 base (R41 10 k → GND); D6 flyback; coil from SYS5V | **Fail-closed with no 3V3.** A mux is a powered semiconductor — it dies with the rail (or with the Blackpill removed). Relay **contacts are metal**: de-energized, NC keeps F9P TX2 → 4G DIN closed with the board unpowered or the MCU absent. Default-OFF base pull-down means the MCU must *actively* insert itself. Invariants #2/#3 on the diagnostic path. |
| **CHRG / FAULT 100 k pull-ups → 3V3** | `U6.CHRG → PB3`, `U6.FAULT → PB4`, each 100 k up to **3V3** | Open-drain status outputs need pull-ups, and these signals are **MCU-scope telemetry only** — nothing but the Blackpill reads them. Riding the MCU's own 3V3 rail means no leakage path into a dead/absent module; charging itself never depends on them. |
| **F2/F0 chemistry straps → VSYS, not 3V3** | JP2 (`F2`) / JP4 (`F0`) → MAIN5V(VSYS); JP3 (`F1`) → GND ⇒ 4.00 V Li-ion | **Chemistry selection must survive an absent MCU.** 3V3 is the Blackpill's on-module LDO output — pull the module and 3V3-referenced straps float while the charger keeps running (undefined charge voltage = safety hazard). VSYS is present whenever the LTC4040 can charge at all. |
| **CHGOFF 100 k pull-down** | `U6.CHGOFF → PA8` (`CHRG_EN`) + 100 k → GND | **Charge enabled by default**: MCU dead/absent ⇒ CHGOFF held low ⇒ the pack still charges, and the LTC4040's **hardware NTC still temperature-qualifies** every charge. The MCU's drive HIGH (TMP102/PB1 hot) is an *additional* cutoff lever, never the only guard. |
| **PFO — DNP / test point only** | `U6.PFO` → TP + DNP 100 k pull-up | The **PA4 divider already senses VEH5V** (vehicle-power-present, `V5V_ON/OFF` thresholds in firmware). Wiring PFO to a GPIO would duplicate that signal and burn a pin; the TP keeps it probe-able at bring-up. |
| **OVSNS shorted to VIN** | short at U6 (OVP FET + divider unpopulated) | **OVP unused by design**: VIN is the SD-15B-05's *regulated 5 V* inside the same cabinet — there is no plausible overvoltage source between them, and the 24 V side already carries SPD + reverse-polarity protection. Datasheet-sanctioned disposition for an unused OVSNS. |
- [[03-Architecture-Hardware/watchdog-connections|connection list (xlsx)]] ·
[[03-Architecture-Hardware/watchdog-pcb-v3-design|v3 design (sub‑circuits)]] ·
[[03-Architecture-Hardware/watchdog-protoboard-bringup|protoboard bring‑up]] ·

View File

@ -3,7 +3,7 @@ title: Watchdog v3 — Electrical Design State & Assumptions
tags: [project-drogheda, hardware, watchdog, electrical, assumptions, canonical]
project: Project Drogheda
author: Helgen CTO
date: 2026-06-24
date: 2026-07-02
status: Active — CANONICAL current electrical state (read this first)
---
@ -34,6 +34,33 @@ output connectors, PWR_FLAGs.
detailed switching reference circuit (symbol, inductor, program resistors sized to the real pack)
is a dedicated power-design pass — *not fabricated blind*.
## 0b. Update (2026-07-02) — DEV/PROD split + PCB push
- **File split (2026-06-25):** `kicad/hbox-watchdog-v3.kicad_sch` = **DEV/proto** (module buck,
no battery; reviewed: ERC 0 err, GNDREF→GND unified, 5V_SENSE re-wired) ·
`kicad/hbox-watchdog-v3-PROD.kicad_sch` = **PRODUCTION** (Blocks A discrete MP1584 buck /
C reset / D gauge BUILT, ERC 0 err). Build spec = [[watchdog-production-schematic-delta]].
**H1 SWD dropped** (USB-C flash/log path; optional DNP 4-pad).
- **Pack Ah confirmed ~12 Ah (2026-06-30)** → LTC4040 pass unblocked. **2026-07-02: Blocks
B (LTC4040) + E (cutoff) + F (PA4→VEH5V) + new Block H (fail-safe UART2 bypass) being wired
on PROD; PCB layout kickoff follows.** Sized values live in the delta doc §4.
- **Latest proto-assumptions ledger** = `Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx`
(sheet *Estado y cambios*) + `Drogheda_Guia-Conexion-Protoboard_ES_v2.1.pdf` (source:
`Guia-Conexion-Protoboard/`). Wiring diagrams: `circuitikz-wiring/` (sheet + Beamer, v2 2026-07-02).
- **New this pass:** analog **NTC→PB1** hot-spot temperature (block 11 — no SHT40 in hand for
the proto, so PB1 is the proto's temperature path); **Modo B** NTRIP diagnostic (watchdog
in-line on the uplink, injects `$PHLG`; RTCM3 downlink stays direct); on the PCB a
**normally-closed relay bypass** on the Modo-B uplink guarantees a dead/absent MCU never cuts
corrections (extends invariant #2/#3).
- **CARRIER-BOARD conversion (2026-07-02 PM, Leo's call):** the PROD board hosts **all three
modules on female headers** — Blackpill (J1/J2), **simpleRTK2B Pro as an Arduino-UNO shield**
(MOD1, `Module:Arduino_UNO_R3` pattern) and the **4G NTRIP Master on an on-board XBee socket**
(J7/J8, 2 mm, rows 22.35 mm). Board **120×100 mm**. New Block K: second MP1584 makes
**3V3_MODEM** (the Pro-class XBee socket is **3.3 V @ 1 A/1.5 A pk — not 5 V**) from **SW_5V**,
so the stack power-cycle also reboots the modem. Modo B + K1 NC bypass = the permanent uplink
path; F9P's own XBee socket stays empty (its switch parks on UART1); P3/P13/H3 = DNP harness
alternatives. Details + MOD1 pin map: delta doc **§5d/§5e**.
---
## 1. Power tree (current intent)
@ -43,7 +70,7 @@ Cabinet 24 V ─GX16─► Mean Well SD-15B-05 (24→5 V) ─► MAIN5V (board l
├─► Blackpill 5V (J1/20, J2/18) → 3V3 (on-module LDO)
├─► Load switch (Q5 NPN → Q1 P-FET) → SW_5V → RTK stack
└─► [PLANNED] LTC4040 backup ↔ 1S4P cell; boosts to 5 V on power loss
Cabinet 24 V ─GX16─► Q10 rev-pol P-FET (IRFR5305 + DzG 15 V Zener) ─► U2 fan buck (MP1584) → 5V_FAN → fan
Cabinet 24 V ─GX16─► Q10 rev-pol P-FET (IRFR5305 + DzG 15 V Zener) ─► U2 fan buck (MP1584; proto = LM2596 module set to 5.0 V) → 5V_FAN → fan
Machine ignition (12–24 V) ─GX16 pin 3─► DFR1015 (ON-BOARD, →5 V) ─► Rig 100 Ω ─► D5 BAT54 clamp→3V3 / C9 ─► PA5
[PLANNED] cutoff switch in series with SYS_5V (downstream of the battery merge) → kills vehicle + battery
```
@ -67,11 +94,15 @@ J1 = header P1, J2 = header P2. SWD (PA13/PA14) is **not** on the 2×20 → flas
| PA4 | `5V_SENSE` | ADC ÷2, vehicle 5 V present | — |
| PA5 | `IGN_SENSE` | **digital** `INPUT_PULLDOWN` | from DFR1015 via Rig + D5 clamp — **NO ÷2** (Finding 2) |
| PA6 | `FAN_PWM` | 25 kHz fan PWM | TIM3_CH1 |
| PA8 | `CHRG_EN` | **[PLANNED]** LTC4040 charge enable/disable | MCU cuts charge when TMP102 reads cell hot |
| PA9 / PA10 | `USART1` relay | optional NMEA relay | `ENABLE_PHLG_RELAY` default 0 |
| PA8 | `CHRG_EN` | LTC4040 charge disable (→ U6 CHGOFF) | **[PROD 2026-07-02]** HIGH = charge OFF; 100 k pull-down = charge enabled if MCU absent (NTC still guards) |
| PA9 / PA10 | `USART1` — Modo B uplink | PA10 ← F9P TX2 (monitor tap) · PA9 → relay NO → 4G DIN | injects `$PHLG`; RTCM3 downlink never passes through the MCU |
| PB0 | `EXT_LED` | status LED (low-side) | **FIXED 2026-06-24** (was disconnected) |
| PB1 | `NTC_TEMP` | **[NEW]** analog hot-spot temp, ADC1_IN9 | 3V3–10k(1 %)–NTC 10k–GND ÷ + 100 nF; Beta≈3950/Steinhart in firmware; proto's temperature path (no SHT40 in hand); can drive the `CHRG_EN` cutoff |
| PB3 | `CHRG_STAT` | **[PROD]** U6 CHRG open-drain | 100 k pull-up to 3V3; LOW = charging (>C/8) |
| PB4 | `CHRG_FAULT` | **[PROD]** U6 FAULT open-drain | 100 k pull-up to 3V3; LOW = temp/bad-battery fault |
| PB5 | `BYP_CTRL` | **[PROD]** Modo-B bypass relay driver | HIGH = energize K1 → MCU in-line; de-energized/absent = NC = corrections direct |
| PB6 / PB7 | `I2C1 SCL/SDA` | SHT40 (0x44) + TMP102 (0x48) | 4.7 k pull-ups |
| PB10 | `FAN_TACH` | fan RPM + stalled-fan fault | EXTI |
| PB10 | `FAN_TACH` | *(2-wire fan: tach unused)* | fans are **2-wire 5 V** → **DNP provision**; fan-fault inferred from temp |
| PB12–PB15 | `BATLED1–4` | **[NEW]** battery gauge bar | firmware-driven from `BAT_SENSE`, 330 Ω + LED each |
| PC13 | onboard LED | — | WeAct module |
| NRST | `NRST` | **[NEW]** reset | SW1 (on-board) + P10 (external), both → GND |
@ -103,6 +134,30 @@ J1 = header P1, J2 = header P2. SWD (PA13/PA14) is **not** on the 2×20 → flas
6. **Power cutoff** *(planned)* — external switch in series with the **system 5 V** (downstream of
the battery merge) so it kills vehicle **and** battery power.
## 3b. Decisions 2026-07-01/02 + rationale
7. **Block 11 — analog NTC→PB1 hot-spot temperature.** Divider 3V3 – 10 k (1 %) – NTC 10 k – GND
→ PB1 (ADC1_IN9) + 100 nF. ≈1.65 V @25 °C, ≈165 µA (no self-heating). Firmware: Beta (≈3950) /
Steinhart; may trigger the `CHRG_EN` charge cutoff. **Place the NTC at the hot spot
(battery/modem), not in the air.** No SHT40 in hand for the proto → this is the proto's
temperature path; the PCB keeps U3/U4 (I²C) *and* the PB1 channel.
8. **Battery NTC goes to the charger's TEMP/NTC pin** (TP4056 on proto / LTC4040 on PCB),
**not to the MCU** — hardware-qualified charging stays alive even with the MCU dead. The MCU's
view of cell temperature is the TMP102 (I²C) + PB1.
9. **Modo B — NTRIP diagnostic (relé + `$PHLG`).** 4G on a breakout (BOB-08276), F9P switch → UART1;
uplink F9P TX2 → PA10 (monitor) and PA9 → 4G DIN (MCU in-line, injects `$PHLG`); **RTCM3
downlink 4G DOUT → F9P RX2 stays direct** (never through the MCU). IOREF = 3.3 V.
10. **Block H — fail-safe uplink bypass (PROD).** SPDT **signal relay K1, normally-closed**
contacts route F9P TX2 → 4G DIN with the coil de-energized; the MCU must actively energize
(PB5 `BYP_CTRL` → Q6) to insert itself. Chosen over an analog mux because a mux dies with the
3V3 rail — a *relay* keeps corrections flowing even with the Blackpill physically absent.
Extends invariants #2/#3 to the diagnostic path.
11. **Charge voltage = 4.00 V Li-ion** (F2=1, F1=0, F0=1 via solder jumpers). Backup duty means the
cell sits full most of its life; 4.00 V ≈ 3× cycle life vs 4.2 V (datasheet Fig. 1) and is
kinder to hot cells — directly serves the RCA #1 failure mode. LiFePO4 future = re-strap F2.
12. **OVP module skipped** — VIN is the SD-15B-05's regulated 5 V inside the same cabinet;
`OVSNS` shorts to VIN per datasheet. The 24 V side already carries SPD + reverse protection.
---
## 4. Bug fixes this session
@ -129,13 +184,18 @@ J1 = header P1, J2 = header P2. SWD (PA13/PA14) is **not** on the 2×20 → flas
exactly is the *temperature-qualified charge cutoff* (LTC4040-only) — validate it in firmware logic.
- **GNSS + 4G: one F9P + 4G set, shared** across the three watchdog boards (the watchdog logic,
sensing, fan/temp, gauge, reset, cutoff and backup all test without them).
- **Proto fan rail = LM2596 module** (24→5 V, *adjust to 5.0 V with a meter*) so fan inrush never
sags MAIN5V; the PCB uses the discrete MP1584 (U2). Fans are **2-wire** (no tach).
- **Assembly references:** `Drogheda_Guia-Conexion-Protoboard_ES_v2.1.pdf` (blocks 1–11, source in
`Guia-Conexion-Protoboard/`) · `Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx` (authoritative
connection list) · `circuitikz-wiring/` diagrams (sheet + per-block Beamer).
---
## 6. Key assumptions / invariants (electrical)
- Backup pack is **1S4P, 3.6 V nominal** (NOT 3S). The "40 Ah" on the label is suspect (4× 18650 ≈
10–14 Ah max) — **confirm**; it sets charge current + the LTC4040 safety timer.
- Backup pack is **1S4P, 3.6 V nominal, ~12 Ah** (NOT 3S). The "40 Ah" label was a **mistake —
corrected 2026-06-30 to ~12 Ah** (≈3 Ah × 4 cells). Sizes the LTC4040 charge current (2.5 A max ≈ C/5) + safety timer.
- **GX16 pin 3 = raw machine ignition (12–24 V)** into the on-board DFR1015 (changed this session).
- **MAIN5V** = board logic rail (from SD-15B-05; backed up via the LTC4040 path once wired).
- Corrections ride the **4G modem** → recover the link by power-cycling the stack, never a GNSS reset.
@ -143,28 +203,50 @@ J1 = header P1, J2 = header P2. SWD (PA13/PA14) is **not** on the 2×20 → flas
- **Enclosure is ASA** (not PLA); the thermal liability is the **power components** (battery/boost/
modem), not the case. v3.0 thermal = **waterproof duct + Blackpill smart fan** (active managed).
- No material softening < ~80 °C in the thermal path.
- **The battery NTC belongs to the charger** (TEMP/NTC pin), never to the MCU; MCU temperature
view = TMP102 (I²C) + NTC→PB1 (ADC, hot spot).
- **Corrections must survive a dead MCU** on every path — in Modo B that means the K1
normally-closed bypass (Block H); the RTCM3 downlink is always direct.
---
## 7. Open items / TODO (electrical)
- [ ] **Wire the battery-backup section** into the schematic: LTC4040 block (U6) + battery connector
(BAT+, BAT−, NTC) + the `P2 → LTC4040 → MAIN5V` re-route + `CHRG_EN`/`BAT_SENSE` to the MCU.
- [ ] **Add the power-cutoff switch** in series with SYS_5V.
- [ ] **LTC4040 detailed reference design** — symbol, inductor, `RPROG` (charge current sized to
the real pack Ah), input-current limit, PFI divider, NTC bias, compensation — then **bench-validate**.
- [ ] **Confirm the real pack capacity** (the "40 Ah" label).
- [~] **Wire the battery-backup section** (Block B) on PROD: LTC4040 (U6) + battery connector
(BAT+, BAT−, NTC) + the `P2 → VEH5V → LTC4040 → MAIN5V` re-route + `CHRG_EN`/`CHRG_STAT`/
`CHRG_FAULT` to the MCU — **in progress 2026-07-02** (values sized, see delta §4).
- [~] **Power-cutoff switch** (Block E, P11 MAIN5V→SYS5V) — in progress 2026-07-02.
- [~] **Block H bypass relay** (K1 NC + Q6 + P13) — in progress 2026-07-02.
- [x] ~~LTC4040 detailed reference design~~ → **sized 2026-07-02** to the 12 Ah pack: RPROG 825 Ω
(2.42 A ≈ C/5), RS 8 mΩ (3.1 A input limit), PFI 287k/100k (trip 4.60 V), BSTFB=RSTFB
499k/100k (backup 4.79 V, RST −7.5 %), L 2.2 µH ≥8 A, NTC 10 k bias, F=4.00 V Li-ion.
**Bench-validate before fab** (unchanged gate).
- [x] ~~Confirm the real pack capacity~~ → **~12 Ah** (1S4P, ~3 Ah/cell); the "40 Ah" label was wrong (2026-06-30).
- [ ] **Firmware**: gauge-LED driver (PB12–15 from `BAT_SENSE`); `CHRG_EN` cut-charge-when-hot logic
(TMP102); reset is hardware-only.
(TMP102 + PB1); **PB1 NTC Beta/Steinhart channel**; `CHRG_STAT`/`CHRG_FAULT` into the STREAM
log; **deep-discharge note:** full recharge of 12 Ah @2.42 A ≈ 5 h exceeds the LTC4040's
internal safety timer — restart the cycle via `CHRG_EN` toggle while cell is cool and
`BAT_SENSE` low; Modo B `$PHLG` injection + `BYP_CTRL` handling; reset is hardware-only.
- [ ] **Fans are 2-wire 5 V (no tach)** (2026-06-24): drop the PB10 tach health check in firmware
and **infer fan-fault from temperature** (PWM commanded high but temp still climbing → fault);
keep PB10 + the tach pull-up as a **DNP provision** for future 3-wire fans. Optional: a fan
current-sense resistor gives positive stall detection without a tach.
- [ ] Cosmetic: position the new parts on-grid (clears off-grid warnings).
- [ ] **PCB layout** (kickoff 2026-07-02): outline/stackup per [[watchdog-pcb-v3-kicad-guide]],
SW nodes (U2, U6) tiny + away from P3; exposed-pad GND stitching; JLCPCB exports.
---
## 8. Pointers
- **Schematic:** `kicad/hbox-watchdog-v3.kicad_sch` (+ `…-schematic.pdf/.svg`).
- **Schematics:** `kicad/hbox-watchdog-v3.kicad_sch` (**DEV/proto**) ·
`kicad/hbox-watchdog-v3-PROD.kicad_sch` (**PRODUCTION**, + `.kicad_pcb`) · `Drogheda-sym.kicad_sym`.
- **Build spec (PROD Δ):** [[watchdog-production-schematic-delta]] — Block B values table lives here.
- **Design doc:** [[watchdog-pcb-v3-design]] (sub-circuits, pin map, findings).
- **Connections:** `watchdog-connections.xlsx` + [[watchdog-connections-rationale]].
- **Connections:** `Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx` (proto, authoritative) ·
`watchdog-connections.xlsx` (PCB list, H1 rows now DNP) + [[watchdog-connections-rationale]].
- **Assembly guide:** `Guia-Conexion-Protoboard/` (source) → `Drogheda_Guia-Conexion-Protoboard_ES_v2.1.pdf`.
- **Diagrams:** `circuitikz-wiring/` — full sheet + per-block Beamer (v2, 2026-07-02, blocks 1–11).
- **BOMs:** [[BOM-master]] (production) · `watchdog-protoboard-BOM-3boards.xlsx` +
`watchdog-LISTA-DE-COMPRAS-ES.xlsx` (proto) · [[watchdog-protoboard-bringup]] (bench order).
- **Firmware:** `04-Source-Code/firmware/blackpillrtkcode_v2/` (v2.3) + `docs/PINOUT.md`, `docs/LOGGING-SPEC.md`.

View File

@ -16,6 +16,10 @@ supersedes_section: hardware-respec-and-pcb-brief.md §4 (watchdog carrier detai
> 4-LED gauge + power-cutoff** were added. Where this doc disagrees with the canonical state, the
> canonical state wins. (Also: 1 fan, not "two" — see the 1-fan update.)
> **2026-07-02:** LTC4040 sized to the 12 Ah pack — values in
> [[03-Architecture-Hardware/watchdog-production-schematic-delta|watchdog-production-schematic-delta.md]] §4;
> capture + layout kickoff in progress.
> The production PCB for the STM32F411 watchdog, **expanded** to drive two
> extraction fans and monitor internal temperature/humidity. This is the
> schematic-capture spec: every sub-circuit, every value, every part, the pin
@ -94,7 +98,7 @@ fragile hardware**. Keep the brains, fix the body.
| `1.5 kΩ "????"` mystery R | undocumented | resolved on this schematic (it was the **LED series R**; dividers are 10k/10k — see §6) |
| MCU temp only | heat casualties are the **18650/modem**, not the die | **external** I²C sensors at the hot spot (§5) |
| No thermal *actuation* | firmware can derate but can't cool | **1 fan driver + closed-loop control** (§4, §7) |
| No SWD/header bring-out | can't debug a sealed unit | **SWD + USB + reserve-USART1** headers (§6) |
| No SWD/header bring-out | can't debug a sealed unit | **USB + reserve-USART1** headers (§6). H1 SWD **DROPPED 2026-06-25** (flash/log via USB-C; optional DNP 4-pad) |
---
@ -118,10 +122,15 @@ fragile hardware**. Keep the brains, fix the body.
PB12 (spare) EXTI reserved — 2nd fan tach if ever needed
PB6 I2C1_SCL I2C1 SHT40 + TMP102 (4.7k pull-ups to 3V3)
PB7 I2C1_SDA I2C1 SHT40 + TMP102
── NEW [2026-07-02] (PROD: battery backup + Modo-B bypass + hot-spot NTC) ──
PB1 NTC_TEMP ADC1_IN9 hot-spot NTC divider (3V3–10k 1%–NTC 10k–GND + 100 nF) — block 11
PB3 CHRG_STAT GPIO in LTC4040 CHRG open-drain, 100k↑3V3 (LOW = charging)
PB4 CHRG_FAULT GPIO in LTC4040 FAULT open-drain, 100k↑3V3 (LOW = NTC/bad-battery fault)
PB5 BYP_CTRL GPIO out K1 bypass-relay driver via Q6 (HIGH = MCU in-line, §2c)
── reserved (do not populate now; future in-band $PHLG telemetry relay) ───
PA9 USART1_TX header → future: inject $PHLG into modem uplink
PA10 USART1_RX header ← future: F9P UART2 NMEA tap
PA13 SWDIO / PA14 SWCLK SWD debug header
PA13 SWDIO / PA14 SWCLK SWD debug header — H1 DROPPED 2026-06-25 (USB-C; opt. DNP 4-pad)
PA11 USB_DM / PA12 USB_DP Blackpill micro-USB = STREAM log capture
```
@ -150,11 +159,11 @@ The module mounts on two 1×20 headers. From the WeAct **MiniF4x1Cx V3.0** schem
| 8 | PA2 | **GNSS_TX** | PA11 | — (USB) |
| 9 | PA3 | **GNSS_RX** | PA12 | — (USB) |
| 10 | PA4 | **5V_SENSE** | PA15 | — |
| 11 | PA5 | **IGN_SENSE** | PB3 | — |
| 12 | PA6 | **FAN_PWM** | PB4 | — |
| 13 | PA7 | — (spare) | PB5 | — |
| 11 | PA5 | **IGN_SENSE** | PB3 | **CHRG_STAT** [2026-07-02] |
| 12 | PA6 | **FAN_PWM** | PB4 | **CHRG_FAULT** [2026-07-02] |
| 13 | PA7 | — (spare) | PB5 | **BYP_CTRL** [2026-07-02] |
| 14 | PB0 | **EXT_LED** | PB6 | **I2C_SCL** |
| 15 | PB1 | — | PB7 | **I2C_SDA** |
| 15 | PB1 | **NTC_TEMP** [2026-07-02] | PB7 | **I2C_SDA** |
| 16 | PB2 | — (BOOT1, pulled low on-module) | PB8 | — |
| 17 | PB10 | **FAN_TACH** | PB9 | — |
| 18 | 3V3 | **3V3** (LDO out) | 5V | **MAIN5V** (in) |
@ -185,6 +194,22 @@ needs a **relay** (interpose the MCU between F9P-UART2 and the modem), which is
architecture change **deferred out of v3**. To *learn whether it's even possible*, run the
isolated bench experiment in **§7a** — it touches no PCB.
### 2c. Production additions [2026-07-02] — Block H (fail-safe uplink bypass) + Block I (NTC→PB1)
Two sub-circuits added on `kicad/hbox-watchdog-v3-PROD.kicad_sch`; full specs in
[[03-Architecture-Hardware/watchdog-production-schematic-delta|watchdog-production-schematic-delta.md]] **§5b / §5c**:
- **Block H — K1 normally-closed SPDT signal-relay bypass on the Modo-B uplink.** The §2b relay
is now real in **Modo B**: the watchdog sits in-line on the uplink (F9P TX2 → 4G DIN) to inject
`$PHLG`; the RTCM3 downlink stays direct. K1's **NC** contacts route F9P TX2 → 4G DIN with the
coil de-energized — the MCU must actively energize (PB5 `BYP_CTRL` → Q6) to insert itself.
Chosen over an analog mux because **a mux dies with the 3V3 rail; relay contacts keep
F9P TX2 → 4G DIN even with the Blackpill physically absent** (extends invariants #2/#3 to the
diagnostic path).
- **Block I — NTC→PB1 hot-spot temperature divider (block 11).** 3V3 – 10 k 1 % – NTC 10 k – GND
into PB1 (ADC1_IN9) + 100 nF; NTC placed at the battery/modem hot spot. The proto's temperature
path (no SHT40 in hand); the PCB keeps U3/U4 (I²C) *and* this channel.
---
## 3. Block diagram
@ -208,7 +233,7 @@ isolated bench experiment in **§7a** — it touches no PCB.
I²C1 (PB6/7) ─┬─ SHT40 (U3, 0x44) board ambient temp + RH
└─ TMP102 (U4, 0x48) on P5 pigtail → battery/modem hot spot
PB0 ─► Q4 (AO3400) ─► status LED (D1) SWD/USB/USART1 headers (H1/H2/H3)
PB0 ─► Q4 (AO3400) ─► status LED (D1) USB/USART1 headers (H2/H3; H1 SWD DROPPED 2026-06-25)
```
---
@ -332,7 +357,7 @@ ADC stays ≤3.3 V with margin (verified in firmware-review). Firmware
| P5 | JST-XH 4-pos | 4 | 3V3, GND, SDA, SCL → TMP102 probe pigtail |
| P6 | JST-XH 4-pos | 4 | 5V_FAN, Fan−(PWM), GND, Tach → fan |
| P8 | JST-XH 2-pos | 2 | EXT_LED+, EXT_LED− (panel LED) |
| H1 | 1×4 0.1″ | 4 | SWD: 3V3, SWDIO, SWCLK, GND |
| H1 | 1×4 0.1″ — **DROPPED 2026-06-25** | 4 | SWD: 3V3, SWDIO, SWCLK, GND — optional **DNP 4-pad** only (flash/debug via Blackpill USB-C) |
| H2 | (Blackpill micro-USB) | — | STREAM log capture / flashing |
| H3 | 1×3 0.1″ **DNP** | 3 | reserve USART1: PA9, PA10, GND (future $PHLG) |
| — | 2× 2×20 female headers | 40 | Blackpill seats here |

View File

@ -0,0 +1,377 @@
---
title: Watchdog v3 — Production Schematic Build Spec (delta from the prototype)
tags: [project-drogheda, hardware, watchdog, schematic, production, delta, build-spec]
project: Project Drogheda
author: Helgen CTO
date: 2026-06-25
status: Active — build spec for the PRODUCTION schematic (proto file = current; this = what to add/change)
supersedes: reconciles watchdog-connections.xlsx (Jun23) + watchdog-pcb-v3-bom.xlsx with the Jun-24 canonical state
---
# Watchdog v3 — Production Schematic Build Spec (Δ from prototype)
> **Why this exists.** Decision (2026-06-25): the current `kicad/hbox-watchdog-v3.kicad_sch`
> is the **PROTOTYPE** (module buck, no battery). This doc is the **delta to build the
> PRODUCTION schematic** on the copy `kicad/hbox-watchdog-v3-PROD.kicad_sch`. It is the
> single reconciled definition — the connection list (Jun 23) and the v3 BOM predate the
> Jun-24 battery re-add, so they are *not* on their own a production spec. **Authority order:**
> [[watchdog-electrical-design-state|electrical-design-state.md]] (CANONICAL) > design doc >
> BOM/connection-list. Build against this file.
## Build status (2026-06-25) — Blocks A / C / D BUILT on PROD
Built on `kicad/hbox-watchdog-v3-PROD.kicad_sch` via the KiCad MCP. **ERC = 0 errors**; ~20 cosmetic
warnings remain (off-grid auto-placement, reserved-pin NC flags now legitimately used, and L/SW_Push/
Q_NPN_BCE symbol-cache mismatches) — all clear during layout positioning + Tools→Update Symbols from Library.
- **Block A — discrete buck — DONE.** Replaced the 3-pin U2 module with a **custom MP1584EN symbol**
(`Drogheda-sym.kicad_sym`; datasheet pinout **1=SW 2=EN 3=COMP 4=FB 5=GND 6=FREQ 7=VIN 8=BST**,
registered in the project `sym-lib-table`). Wired: VIN←24V, SW→L2→5V_FAN, FB divider R20 100k /
R21 19.1k (→5.0 V), C22 22µF in, C23 22µF out, Dbk SS34 freewheel (K→SW, A→GND), Cbst 10nF BST–SW.
**New support parts added beyond the original BOM (required for the discrete IC):** Rfreq 100k
(FREQ→GND, sets fsw), Rcomp 40.2k + Ccomp 2.2nF (COMP loop comp), Ren1 100k / Ren2 20k (**EN UVLO
divider — EN abs-max is 6 V, so it must NOT tie directly to 24 V**). **⚠ Bench-tune (typical placeholders):**
Rfreq (target fsw), Rcomp/Ccomp (loop stability), Ren1/Ren2 (UVLO threshold).
- **Block C — reset — DONE.** SW1 (Switch:SW_Push) + P10 (2-pin ext) → NRST (J1.5) → GND.
- **Block D — 4-LED gauge — DONE.** RB1–4 330 Ω + DB1–4 LED on PB12–15 (J2.1–4) → GND.
- **Cleanup:** deleted 3 labels (24V/GND/5V_FAN) orphaned when the old U2 module was removed.
- **Footprints:** the new parts carry no footprint yet — assign at layout (same as the existing parts).
- **Still deferred:** Block B (LTC4040) + E (cutoff) + F (PA4→VEH5V). **Pack Ah confirmed = ~12 Ah** (2026-06-30) → LTC4040 sizing can proceed.
## Build status (2026-07-02) — Blocks B / E / F / H / I capture session
**LTC4040 sized to the 12 Ah pack** (§4 values table — datasheet 4040fb formulas; internally
compensated, no external comp). New Blocks **H** (K1 NC bypass relay, §5b) and **I** (NTC→PB1,
§5c) specified from the Jul-2 assumptions ledger.
**BUILT 2026-07-02 (all of B/E/F/H/I) — ERC = 0 errors**, 62 cosmetic warnings (off-grid
auto-placement + L/Q_NPN_BCE/SW_Push/AO4406A symbol-cache mismatches → clear during layout
positioning + Tools→Update Symbols from Library). Capture notes:
- 37 new components, 107 pins netted; sheet bumped **A4→A3**; custom symbols **LTC4040EUFD** +
**AO4406A** added to `Drogheda-sym.kicad_sym`.
- Rail split done: `P2/R7/JP1 → VEH5V` · `F1/R2/J1-20/J2-18 → SYS5V` (P11 cutoff between
MAIN5V→SYS5V). **JP1's alt rail is now VEH5V** (vehicle 5 V, never battery-backed — a fan on
the backed-up rail would drain the pack; refine of the old MAIN5V tie).
- **P4 → 3-pos** (BAT+, BAT−, NTC); legacy P4 GND stub wire cut, stale labels removed.
- Fixed a **duplicated U2** (two MP1584 instances stacked at the same position — deleted both,
re-placed one). Removed 10 stale no_connect flags on header pins that had gained nets.
- New MCU taps live: `CHRG_EN` J2/5 · `CHRG_STAT` J2/11 · `CHRG_FAULT` J2/12 · `BYP_CTRL` J2/13 ·
`NTC_TEMP` J1/15. §6.2 GNDREF note is **stale — no placed GNDREF remains on PROD** (verified).
- Footprints assigned at capture for all new parts except **L6** (8040 inductor) and **K1**
(HFD23 relay) — assigned during layout kickoff.
Fab gate: **bench validation of the LTC4040 backup transition + temp-qualified charge cutoff** (unchanged).
## 0. What the prototype schematic already has (the shared core — DO NOT re-draw)
49 parts, ERC-clean. Present and correct on **both** boards: MCU (J1/J2), MAIN5V/3V3 rails,
24 V reverse-polarity (Q10 IRFR5305 + DzG 15 V Zener + Rrp), TVS D10 + C10/C11, RTK-stack
high-side load switch (Q1 AO3401A / Q5 MMBT3904 / R1 / R2 / F1 PPTC / C3), the three sense
dividers (BAT PA0, 5V PA4, IGN PA5) incl. on-board ignition chain (Rig + D5 BAT54 + C9),
fan low-side driver (Q2 AO3400A + Rg + Rgs + D2 SS34), I²C temp/humidity (U3 SHT40 + U4
TMP102 + R30/R31), status LED (Q4 + D1 + R3 + Rled), connectors P1–P8, H3 (DNP).
**The production board keeps all of the above unchanged** except the two corrections in §6.
Everything in §1–§5 below is *added* on top.
## 1. Production delta — summary
| Block | Action | Status |
|---|---|---|
| A. Fan buck U2 | **Replace** the 3-pin module placeholder with the **discrete MP1584** circuit | ✅ fully specified · BUILT |
| B. LTC4040 battery backup | **Add** charger + power-path + NTC; re-route P2→VEH5V→LTC4040→MAIN5V | ✅ **sized 2026-07-02** (§4 values table) — bench-validate before fab |
| C. Reset | **Add** SW1 (on-board) + P10 (external) → NRST | ✅ fully specified · BUILT |
| D. 4-LED battery gauge | **Add** D_BAT1–4 + 4×330 Ω on PB12–PB15 | ✅ fully specified · BUILT |
| E. Power cutoff | **Add** P11 series switch in the post-merge 5 V (kills vehicle **and** battery) | ✅ node defined (MAIN5V→SYS5V, §5) |
| F. Corrections | Move PA4 sense tap to vehicle side (`VEH5V`); finish GND unify | ✅ do on both boards |
| G. H1 SWD | **DROP** (rely on USB-C flash + USB log); optional DNP 4-pad footprint | ✅ decided 2026-06-25 |
| H. Modo-B fail-safe bypass | **Add** K1 NC signal relay in the uplink (F9P TX2→4G DIN); MCU energizes to insert | ✅ specified 2026-07-02 (§5b) |
| I. NTC→PB1 hot-spot temp | **Add** P12 NTC connector + 10 k (1 %) divider + 100 nF on PB1 (block 11) | ✅ specified 2026-07-02 (§5c) |
## 2. New Blackpill pins consumed (WeAct pinout, design §2a)
| Pin | Header | Net | Use |
|---|---|---|---|
| PA8 | J2/5 | `CHRG_EN` | LTC4040 CHGOFF — MCU cuts charge when TMP102/PB1 reads cell hot (100 k pull-down = enabled by default) |
| PB12 | J2/1 | `BATLED1` | gauge 25 % (was reserved 2nd-fan-tach spare → reassigned) |
| PB13 | J2/2 | `BATLED2` | gauge 50 % |
| PB14 | J2/3 | `BATLED3` | gauge 75 % |
| PB15 | J2/4 | `BATLED4` | gauge 100 % |
| NRST | J1/5 | `NRST` | reset (SW1 + P10) |
| PB1 | J1/15 | `NTC_TEMP` | **[NEW 2026-07-02]** analog hot-spot temp (ADC1_IN9), block 11 |
| PB3 | J2/11 | `CHRG_STAT` | **[NEW]** U6 CHRG open-drain, 100 k↑3V3 (LOW = charging) |
| PB4 | J2/12 | `CHRG_FAULT` | **[NEW]** U6 FAULT open-drain, 100 k↑3V3 (LOW = NTC/bad-battery fault) |
| PB5 | J2/13 | `BYP_CTRL` | **[NEW]** K1 relay driver via Q6 (HIGH = MCU in-line on the Modo-B uplink) |
No peripheral conflict: PB12–15 plain GPIO; PA8 plain GPIO; NRST is the module reset pin.
---
## 3. Block A — Discrete fan buck (replace U2 module) ✅
**Remove:** the `U2 = Conn_01x03` placeholder ("MP1584 mod").
**Add** (values from design §4.2 + production BOM):
| Ref | Value / MPN | Pkg | LCSC | Note |
|---|---|---|---|---|
| U2 | MP1584EN | SOIC-8-EP | C107226 | 24→5.0 V buck |
| L2 | 10 µH ≥1 A | SMD 4×4 | verify | per datasheet |
| R20 | 100 k 1% | 0603 | C25803 | FB top |
| R21 | 19.1 k 1% | 0603 | verify | FB bottom → Vout=0.8·(1+R20/R21)≈5.0 V |
| C22 | 22 µF / 50 V | 1210 | verify | buck input cap |
| C23 | 22 µF / 16 V | 0805 | C45783 | buck output cap |
| Dbk | SS34 | DO-214AC | C8678 | buck freewheel (separate from fan flyback D2) |
| JP1 | 0 Ω / open | 0603 | C21189 | rail select — **OPEN** = use buck |
**Connections (From → To · Net):** (pin functions per MP1584 datasheet — confirm exact pin #s at capture)
```
U2.IN → 24V 24V (protected rail, post-Q10)
U2.EN → 24V - enable (or datasheet EN divider)
C22.1 → 24V 24V input cap at the IC
C22.2 → GND GND
U2.SW → L2.1 SW2_NODE keep switch-node copper tiny
Dbk.K → L2.1 SW2_NODE freewheel cathode to SW node
Dbk.A → GND GND
L2.2 → 5V_FAN 5V_FAN
C23.1 → 5V_FAN 5V_FAN output cap
C23.2 → GND GND
R20.1 → 5V_FAN 5V_FAN FB top
R20.2 → U2.FB FB
R21.1 → U2.FB FB
R21.2 → GND GND
JP1.1 → 5V_FAN 5V_FAN OPEN by default
JP1.2 → MAIN5V MAIN5V close ONLY if upsizing SD-15B-05 (never both)
```
BST/COMP/SS small caps **per MP1584 datasheet** (e.g. BST ~10 nF) — add at capture.
Keep U2 + L2 + the SW node **away from the GNSS antenna feed / P3** (RF, design §8).
The existing **fan flyback D2 (SS34)** across the fan stays as-is.
---
## 4. Block B — LTC4040 battery backup ✅ SIZED 2026-07-02 (datasheet 4040fb pass, 12 Ah pack)
**Intent (canonical power tree):** `P2 (vehicle 5 V from SD-15B-05) → VEH5V → RS → U6 power path
→ VSYS = MAIN5V (the backed-up rail) ; LTC4040 ↔ 1S4P cell on P4 ; NTC on the cell.`
LTC4040 architecture: single inductor SW↔BAT works as **step-down charger** (VSYS→BAT) when input
is good and **2.5 A step-up backup** (BAT→VSYS) when PFI trips. A **mandatory external NFET (Q7)**
between VIN and VSYS (gate = IGATE charge pump) disconnects the dead input during backup. Buck and
boost are **internally compensated** — no external comp network.
| Ref | Value / MPN | Formula → result | Note |
|---|---|---|---|
| U6 | **LTC4040EUFD** | — | QFN-24 4×5 mm, EP = GND (stitch) |
| Q7 | NFET 30 V ≥10 A, ≤15 mΩ, SOIC-8 (AO4406A-class) | — | VIN→VSYS disconnect, gate = IGATE |
| RS | **8 mΩ 1 %** (1206/2512 sense) | I_SYSLIM = 25 mV/RS → **3.1 A** | protects the SD-15B-05 (5 V/3 A); charge sheds first, load prioritized |
| RPROG | **825 Ω 1 %** | I_CHG = 2500·(0.8 V/RPROG) = 2000/RPROG → **2.42 A ≈ C/5** | ≤2.5 A max; PROG servos 0.8 V |
| RPF1/RPF2 | **287 k / 100 k 1 %** (VEH5V→PFI→GND) | trip = 1.19 V·(1+R1/R2) → **4.60 V falling**, ≈4.72 V recover | ⚠ bench-tune if the vehicle rail sags in service |
| RFB1/RFB2 | **499 k / 100 k 1 %** (VSYS→BSTFB=RSTFB→GND) | V_backup = 0.8 V·(1+R1/R2) → **4.79 V**; RST threshold −7.5 % ≈ 4.43 V | BSTFB+RSTFB shorted, one divider (datasheet) |
| L6 | **2.2 µH, Isat ≥ 8 A, DCR < 20 mΩ** (8040 power inductor) | datasheet range 1–2.2 µH; boost NMOS ILIM 5.5–7.5 A | SW↔BAT; tiny SW copper |
| CVIN | 10 µF X5R + 2.2 µF | — | at U6 VIN |
| CVSYS | **≥100 µF low-ESR ceramic** (2×47 µF 1210 + 10 µF) | datasheet minimum | backup-transition hold-up |
| CBAT | 22 µF X5R | ≥10 µF required | at U6 BAT |
| RNTB | **10 k 1 % low-drift** (VEH5V/VIN→NTC) | with RT1 10 k: datasheet default window | B3380 ideal; **B3950 acceptable** (trip shifts a few °C — note in bring-up) |
| RT1 | 10 k NTC **on the cell** (via P4.3) | — | NTC→GND at U6 |
| P4 | **JST-XH 3-pos** (was 2-pos) | — | 1=BAT+, 2=BAT−, 3=NTC |
| F2/F0 straps | **→ VSYS** · F1 → GND (solder jumpers JP2/3/4) | table: F2=1,F1=0,F0=1 → **4.00 V Li-ion** | strap to **VSYS not 3V3** so chemistry survives an absent MCU; 4.00 V ≈ 3× cycle life, kinder to hot cells (RCA #1); LiFePO4 = re-strap F2→GND (3.50 V) |
| CHGOFF | net `CHRG_EN` → PA8 + **100 k pull-down** | >1.2 V = charge OFF | default = charging enabled, NTC still guards |
| BSTOFF | **tie GND** | — | backup always armed; never float |
| CHRG / FAULT | → PB3 / PB4, **100 k↑3V3** | open-drain | STREAM-log telemetry |
| PFO | test point + DNP 100 k↑ | — | PA4 (VEH5V ÷2) already covers power-fail sensing |
| RST | leave open | — | Blackpill has its own supervisor |
| OVSNS | **short to VIN** | OVP module unused | input is the regulated SD-15B-05 inside the cabinet; 24 V side carries SPD |
| CLPROG | test point only | I_SYS = V_CLPROG/(32·RS) | unbuffered — do not load |
**Connections (From → To · Net):**
```
P2.1 → VEH5V VEH5V vehicle 5 V in (RENAMED from MAIN5V)
P2.2 → GND GND
VEH5V → RS.1 VEH5V RS = input current sense
RS.2 → U6.CLN + Q7.D VIN_SNS (U6.VIN Kelvin at RS.1 side: VIN pin → VEH5V node)
Q7.S → MAIN5V MAIN5V Q7 = VIN→VSYS disconnect NFET, gate → U6.IGATE
U6.VSYS(1,24) → MAIN5V MAIN5V backed-up system rail (feeds §5 cutoff merge)
U6.SW(21,22) → L6.1 SW_BAT keep copper tiny
L6.2 → U6.BAT + P4.1 BAT_PLUS (+ existing BAT_SENSE divider R5.1 stays on BAT_PLUS)
P4.2 → GND GND 1S4P −
P4.3 → U6.NTC NTC RT1 at the cell; RNTB 10 k VEH5V→NTC on-board
U6.PROG → RPROG → GND -
U6.CLPROG → TP -
U6.PFI → RPF1/RPF2 node PFI divider from VEH5V
U6.BSTFB + U6.RSTFB → RFB1/RFB2 node FB divider from MAIN5V
U6.CHGOFF → PA8 CHRG_EN + 100 k → GND
U6.BSTOFF → GND GND
U6.CHRG → PB3 CHRG_STAT + 100 k → 3V3
U6.FAULT → PB4 CHRG_FAULT + 100 k → 3V3
U6.F2/F0 → MAIN5V (VSYS) - via JP2/JP4 ; U6.F1 → GND via JP3
U6.OVSNS → U6.VIN VEH5V OVP unused
U6.EP → GND GND thermal/electrical
```
**Checklist (fab gate unchanged):**
- [x] ~~Confirm pack Ah~~ → **~12 Ah** (corrected 2026-06-30). RPROG sized (2.42 A ≈ C/5).
- [x] ~~Size L6, RS, PFI divider, compensation~~ → table above (internally compensated; no comp parts).
- [x] ~~Jumper-select charge voltage~~ → JP2/3/4 straps to VSYS/GND, default 4.00 V Li-ion.
- [ ] **Bench-validate** the temp-qualified charge cutoff + backup transition **before fab**.
- [ ] ⚠ **Safety-timer note:** deep-discharge full recharge (12 Ah @ 2.42 A ≈ 5 h) exceeds the
internal charge safety timer — firmware restarts the cycle via `CHRG_EN` when the cell is
cool and `BAT_SENSE` is low (see canonical §7 firmware items).
> The proto validates this path with the TP4056 + MT3608 + 1N5819 OR-ing + 10 k NTC stand-in
> (proto BOM). The PCB uses the LTC4040. Only the temp-qualified cutoff is LTC4040-only →
> validate that in firmware logic.
---
## 5. Blocks C / D / E — reset, gauge, cutoff ✅ (E node pending B)
**C. Reset**
| Ref | Part | Connections |
|---|---|---|
| SW1 | SPST momentary (SOT/SMD tact) | NRST → SW1 → GND |
| P10 | JST-XH 2-pos (external reset) | P10.1 → NRST · P10.2 → GND |
**D. 4-LED battery gauge** (firmware-driven from `BAT_SENSE`, HIGH = lit)
| Ref | Part | Connections |
|---|---|---|
| R_BL1..4 | 330 Ω 0603 ×4 | PB12→R_BL1, PB13→R_BL2, PB14→R_BL3, PB15→R_BL4 |
| D_BAT1..4 | LED 0805 ×4 | R_BLn → D_BATn.A ; D_BATn.K → GND |
**E. Power cutoff** (kills vehicle **and** battery)
- External switch in series in the **post-merge** 5 V (LTC4040 VSYS/MAIN5V → system loads).
- Define `SYS5V` = MAIN5V after the cutoff; route the Blackpill 5 V pin + load-switch (Q1 source
+ F1) + the K1 relay coil from `SYS5V`. Implement as 2-pos connector **P11** to an external
switch: `P11.1 → MAIN5V · P11.2 → SYS5V`. **Ship with a jumper plug installed** (open P11 =
dead board). The **PA4 divider taps VEH5V** (Block F), *not* SYS5V.
- Merge/cutoff node finalized with the §4 pass: MAIN5V = U6 VSYS output rail.
## 5b. Block H — Modo-B fail-safe uplink bypass ✅ NEW 2026-07-02
**Requirement (ledger):** a dead/absent/hung MCU must never cut RTCM3 corrections. In Modo B the
watchdog sits in-line on the *uplink* (F9P TX2 → 4G DIN) to inject `$PHLG`; the RTCM3 *downlink*
(4G DOUT → F9P RX2) is always direct and never enters the MCU.
**Implementation: SPDT signal relay, normally-closed** — chosen over an analog mux because a mux
dies with the 3V3 rail; relay contacts keep the direct path **even with the Blackpill physically
removed or the board unpowered**.
| Ref | Part | Note |
|---|---|---|
| K1 | SPDT signal relay, 5 V coil (HFD23/005-class) | NC = direct path; coil ~30 mA only while MCU inserted |
| Q6 | MMBT3904 (SOT-23) | low-side coil driver |
| R40 / R41 | 1 k (PB5→base) / 10 k (base→GND) | default OFF |
| D6 | 1N4148 (SOD-123) | coil flyback |
| P13 | JST-XH 3-pos | 1 = F9P_TX2 · 2 = 4G_DIN · 3 = GND |
```
P13.1 → K1.NC + PA10 F9P_TX2 PA10 = passive monitor tap (USART1 RX)
K1.COM → P13.2 4G_DIN
K1.NO → PA9 PA9_TX MCU uplink (USART1 TX, $PHLG injection)
SYS5V → K1.coil+ SYS5V
K1.coil− → Q6.C ; Q6.E → GND ; PB5 → R40 → Q6.B ; R41 B→GND ; D6 across coil (K→SYS5V)
```
De-energized (default, MCU dead, board cut off): **NC closes F9P TX2 → 4G DIN** — corrections
and position flow exactly as if the watchdog weren't there.
## 5d. Block J — CARRIER-BOARD sockets (F9P + 4G on the board) ✅ NEW 2026-07-02 (PM)
**Decision (Leo):** the PROD board is now the **HBOX carrier/motherboard** — all three modules
ride on female headers: Blackpill (J1/J2, already socketed), **simpleRTK2B Pro as an
Arduino-UNO-form shield** (MOD1), and the **4G NTRIP Master on its own XBee socket** (J7/J8).
Board grown **100×80 → 120×100 mm** (Leo approved; ASA case/plate to be reprinted).
| Ref | Part | Note |
|---|---|---|
| MOD1 | 4× UNO female headers (10+8+8+6, 2.54 mm) | footprint `Module:Arduino_UNO_R3`; custom symbol `SimpleRTK2B_Pro_Socket` in `Drogheda-sym` |
| J7/J8 | 2× PinSocket 1×10, **2.00 mm** | XBee socket, rows **22.35 mm** apart (J7 = pins 1–10 row) |
**MOD1 pin map (pads = KiCad UNO footprint; functions verified against the official
`pinout-simpleRTK2B_Pro-R00` image + UNO geometry cross-check):**
```
D0 = TX1 (F9P UART1 TX) → GNSS_RX (PA3) power hdr: 5V → SW_5V (Pro's "5V=OUTPUT" sw OFF)
D1 = RX1 (F9P UART1 RX) → GNSS_TX (PA2) IOREF → 3V3 (defines TX/RX levels)
D2 = RX2 (F9P UART2 RX) → DOUT_4G (RTCM3 in, direct) GND ×3 → GND
D8 = TX2 (F9P UART2 TX) → USART1_RX (K1.NC + PA10 tap) 3V3/VIN/RESET/A0–A5/D3–D7/D9–D13/
AREF/SDA/SCL → NC (per Ardusimple:
don't connect unused special pins)
```
**XBee socket:** J7.1 VCC → **3V3_MODEM** (⚠ the Pro's HP socket spec is **3.3 V, 1 A/1.5 A pk**
— NOT 5 V; the old "socket gives 5 V" note was wrong) · J7.2 DOUT → `DOUT_4G` → F9P RX2
(RTCM3 **direct**, never through the MCU) · J7.3 DIN ← K1.COM (`DIN_4G`) · J7.10 GND. J8 all NC.
**Consequences:** Modo B is now the *permanent* uplink architecture with the K1 NC bypass as the
hardware fail-safe (dead/absent MCU ⇒ TX2→DIN direct). The F9P's own XBee socket stays EMPTY;
its **XBEE↔UART switch parks on UART1** so UART2 stays on the rails. **P3 / P13 / H3 → DNP**
(harness alternatives for non-socketed installs).
## 5e. Block K — 3V3_MODEM buck (U7) ✅ NEW 2026-07-02 (PM)
The modem needs 3.3 V @ ≥1.5 A pk — too much for the Blackpill's LDO, and an LDO from 5 V would
burn ~1.7 W. Second **MP1584EN** (U7, same BOM as Block A) fed from **SW_5V** so the watchdog's
stack power-cycle also reboots the modem (invariant #3):
`U7: VIN/EN=SW_5V · SW→L7 10 µH→3V3_MODEM · FB R60 100k / R61 31.6k (→3.33 V) · Dbk2 SS34 ·
Cbst2 10 nF · Rfreq2 100k · Rcomp2 40.2k + Ccomp2 2.2 nF · C40 22 µF in · C41 22 µF + C43 100 µF
elco out (LTE bursts)`.
## Build status (2026-07-02 PM) — carrier conversion BUILT
MOD1 + J7/J8 + Block K captured; **ERC 0 errors** (82 cosmetic). Board **120×100**, outline +
GND pour resized, holes at (5,5)(115,5)(5,95)(115,95). Placement: shield field center-bottom
(courtyard ≈ x22.6–98, y45–99) with **only SMD ≤6 mm underneath** (LTC4040 block, dividers,
I²C, NTC, Rdfu); Blackpill sockets horizontal above it; XBee rows vertical right (module field
x≈92–119, y26–44); K1/relay + buck A top-right; all operator/access parts (SW1, gauge, JSTs,
P1) outside the shield. **DRC: 87 pre-route errors** — ~55 are the *by-design* under-shield
courtyard overlaps vs MOD1 + ~29 sub-mm courtyard kisses left for the placement review.
⚠ Review notes: P3 (DNP) sits in the shield's notch corner; J8 is 1.2 mm from the board edge;
**verify D2/D8 = RX2/TX2 against a physical Pro before routing** (positions read from the
official pinout image).
## 5c. Block I — NTC→PB1 hot-spot temperature (block 11) ✅ NEW 2026-07-02
| Ref | Part | Note |
|---|---|---|
| R42 | 10 k **1 %** (3V3 → PB1 node) | divider top |
| P12 | JST-XH 2-pos | external 10 k NTC (B≈3950), placed at the hot spot (battery/modem) |
| C24 | 100 nF (PB1 → GND) | ADC settling |
`3V3 → R42 → PB1 (+C24) → P12.1 ; P12.2 → GND`. ≈1.65 V @ 25 °C; firmware Beta/Steinhart;
can drive the `CHRG_EN` cutoff. This is the proto's temperature path (no SHT40 in hand);
the PCB keeps U3/U4 (I²C) **and** this channel.
---
## 6. Corrections to make on BOTH boards (proto + production) ✅
1. **PA4 5V-sense tap → vehicle side (live Finding 3).** With the LTC4040 backing MAIN5V,
`R7.1` must move from `MAIN5V` to **`VEH5V`** (the P2/SD-15B-05 node, before hold-up).
On the **proto** (no LTC4040) MAIN5V == vehicle 5 V so it's harmless there, but make the
net `VEH5V` now so both boards match and production is correct. *Without this, `v5v` never
drops below `V5V_OFF`, `vehiclePower` never clears, and the cell drains.*
2. **Finish the GND unify.** The file still has **4 `power:GNDREF`** symbols (canonical §4
claimed these were converted to `power:GND` — not persisted). Convert all 4 to `power:GND`
(or wire them to the GND-label net) and re-run ERC, or ground splits into GND vs GNDREF.
---
## 7. Open decisions / flags
- **H1 (SWD header) — DECIDED 2026-06-25: DROP.** SWD (PA13/PA14) isn't on the Blackpill
2×20 socket — it's on the module's own separate SWD header — so a carrier H1 buys nothing the
USB-C path doesn't already give: flashing via USB DFU (BOOT0), diagnostics via the USB CDC
STREAM log. **Optional:** lay an **unpopulated (DNP) 4-pad** SWD footprint (3V3 / SWDIO /
SWCLK / GND) for bench bring-up; if ever used, jumper SWDIO/SWCLK to the module's SWD header.
**Remove or mark DNP** the H1 rows in `watchdog-connections.xlsx` and `watchdog-pcb-v3-bom.xlsx`.
- **PB12 reassigned** from "2nd-fan-tach spare" to gauge BATLED1 (fans are 2-wire, no tach —
canonical open item). PB10 tach stays a DNP provision.
- **JP1 stays OPEN** (dedicated fan rail). Only close if SD-15B-05 is upsized to 5 V/5 A.
## 8. Build mechanics
- Production project copy already created: `kicad/hbox-watchdog-v3-PROD.kicad_{pro,sch,pcb}`
(the proto file is untouched — it was open in KiCad).
- I can generate this in KiCad once the KiCad backend is back up **and** the proto is closed
(so there's no file conflict). Suggest also renaming the proto to `…-proto` once you're out.
## Related
- [[watchdog-electrical-design-state]] (CANONICAL) · [[watchdog-pcb-v3-design]] (§4 sub-circuits) ·
[[watchdog-connections-rationale]] (Finding 3) · `watchdog-connections.xlsx` ·
`watchdog-pcb-v3-bom.xlsx` · `kicad/hbox-watchdog-v3-PROD.kicad_sch`

View File

@ -0,0 +1,181 @@
---
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
date: 2026-06-24
status: Active — tomorrow's bench guide (supersedes the procedure half of watchdog-protoboard-bringup.md for v3)
---
# Watchdog v3 — Proto Build Readiness & Bench Bring-up
> **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`.
---
## 0. Verdict — are you ready to build? **Yes, with three caveats**
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:
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.
**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.
---
## 1. What you can prove tomorrow (firmware v2.3 supports it) vs. not
| Sub-circuit | Pins | v2.3 firmware | Testable tomorrow? |
|---|---|---|---|
| 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 + tach | PA6 / PB10 | ✅ 25 kHz PWM, RPM, stall fault | **Yes (3-wire fan)** |
| I²C temp/RH (closed-loop fan) | PB6/PB7 → SHT40 0x44 + TMP102 0x48 | ✅ + MCU-temp fallback | **Yes** (fallback works even with no sensor) |
| 4-LED battery gauge | PB12–15 | ❌ not coded | wire OK, **stays dark** |
| Temp-qualified charge cut (`CHRG_EN`) | PA8 | ❌ not coded | **No** (also LTC4040/PROD-only) |
| Reset (hardware) | NRST | n/a (HW only) | **Yes** — button just works |
**Fan note:** v2.3 reads a **3-wire** tach on PB10, so use a **3-wire 5 V fan** on the breadboard.
(The "2-wire production fan" decision in the canonical doc is a *PCB* change; it doesn't apply to
tomorrow's bench.)
---
## 2. The ERC situation (so you can stop worrying about it tonight)
- **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. Pre-build parts checklist (reconstructed — confirm against your box)
**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.*
**Core (the "brains" — must-have):**
- [ ] 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)
**Thermal (v3 new):**
- [ ] **3-wire** 5 V fan, 40–60 mm (3-wire so PB10 reads RPM — matches v2.3)
- [ ] **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)
- [ ] I²C **SHT40/SHT31** breakout (0x44) — *or* LM35/DS18B20 fallback (tell me which; I'll patch the read)
**v3 additions (build only if you want them wired now — see §4):**
- [ ] 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) +
**10 kΩ NTC** *(reproduces charge / power-loss→backup / BAT_SENSE; the temp-qualified cutoff is
LTC4040-only → firmware-validated, not on the proto)*
---
## 4. Decision before you sit down: how much of v3 to wire
- **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)
```
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.
```
> **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.
---
## 7. After the proto works — next steps (not tomorrow)
- 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).
## 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`

View File

@ -1,41 +0,0 @@
$$$AS+I=1111
$$$AS+A=internet.itelcel.com
$$$AS+Q=webgprs
$$$AS+q=webgprs2002
$$$AS+O=0
$$$AS+L=1
$$$AS+D=1
$$$AS+f=0
$$$AS+B=115200
$$$AS+N=1
$$$AS+S=rtk2go.com
$$$AS+P=2101
$$$AS+U=rtkh0021@helgen.tech:none
$$$AS+M=HelgenTestStation
$$$AS+n=0
$$$AS+s=
$$$AS+p=
$$$AS+u=
$$$AS+m=0
$$$AS+i=
$$$AS+a=0
$$$AS+Z=0
$$$AS+z=pp.services.u-blox.com
$$$AS+Y=
$$$AS+y=0
$$$AS+X=0
$$$AS+x=0
$$$AS+W=0
$$$AS+w=
$$$AS+V=
$$$AS+v=
$$$AS+t=
$$$AS+T=1
$$$AS+r=199.85.208.94
$$$AS+h=5010
$$$AS+k=2
$$$AS+K=H0021
$$$AS+j=300
$$$AS+C=1
$$$AS+c=0
$$$AS+F=1

View File

@ -0,0 +1,513 @@
% 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 (pdflatex tambien funciona, con fuentes fallback)
% v1.1 (2026-07-02): REGISTRO HISTORICO INTACTO — el contenido entregado el 22-jun no se modifica
% (verificado contra el ledger 2026-07-02: ASA correcto, rectificacion master-14 presente, sin
% "40 Ah"/"PLA"/tach, honestidad termica presente). Unico cambio: se AGREGA una lamina de adenda
% al final (sin numero de pagina) con el avance al 2-jul. v1.0 se conserva intacta.
\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}
% =====================================================================
% v1.1 — ADENDA (2026-07-02). El contenido anterior es el registro entregado
% el 22-jun y se conserva sin cambios; esta lámina documenta el avance.
% [noframenumbering] preserva la numeración original del deck entregado.
\begin{frame}[noframenumbering]{Actualización al 2 de julio de 2026 — adenda}
\footnotesize El diagnóstico entregado el 22 de junio \textbf{se mantiene vigente, sin fe de erratas}: carcasa ASA adecuada, rectificación de master-14 sostenida (solo master-21 confirmada) e hipótesis térmica de campo aún por confirmar con soak instrumentado. Avance desde la entrega:
\vfill
\centering\scriptsize
\setlength{\tabcolsep}{4pt}\renewcommand{\arraystretch}{1.12}
\begin{tabular}{@{}L{0.15\textwidth} L{0.30\textwidth} L{0.47\textwidth}@{}}
\toprule
Frente & Estado al 22 jun & \textbf{Estado al 2 jul} \\
\midrule
Backend & Reescritura lista (asíncrono + anti-salto corregido) & \textbf{Desplegado en producción} y estable \\
Térmico & Hipótesis de campo abierta & Cámara a 50\,°C: el RTK opera \textbf{normal}; la víctima es la \textbf{energía} (respaldo ${\sim}30\,\%$ con celda caliente); 2 soluciones en prueba (ducto impermeable / disipador de aluminio) \\
Watchdog v3 / PCB & Diagrama de bloques (plan) & Esquemáticos verificados (\textbf{ERC: 0 errores}); circuito \textbf{operando en protoboard} (campaña de banco en curso); \textbf{cierre de esquemático de producción y layout de PCB inician el 2 jul} \\
Batería de respaldo & 18650 + booster \emph{hobby} & Pack 1S4P ${\sim}$12\,Ah con cargador de grado industrial y \textbf{carga calificada por temperatura} — cierra el eslabón \#1 del RCA \\
\bottomrule
\end{tabular}
\vfill
\footnotesize Cronograma vigente: unidades nuevas a ICAVE \textbf{7 jul} \sep\ comparativa de disponibilidad al \textbf{17 jul} \sep\ despliegue a las 4 BUs desde \textbf{mediados de julio} \sep\ meta: 30 unidades operando hacia agosto.
\end{frame}
\end{document}

View File

@ -70,6 +70,28 @@ easy-to-find parts (`watchdog-protoboard-BOM-3boards.xlsx` + Spanish shop list
`watchdog-LISTA-DE-COMPRAS-ES.xlsx`). **Canonical electrical state →
`03-Architecture-Hardware/watchdog-electrical-design-state.md` — read first for any electrical context.**
**PROD schematic complete + PCB layout kickoff (2026-07-02).** `hbox-watchdog-v3-PROD.kicad_sch`
now carries **all blocks — ERC 0 errors**: LTC4040 Block B **sized to the 12 Ah pack** (RPROG
825 Ω → 2.42 A ≈ C/5 · RS 8 mΩ → 3.1 A input limit · PFI trip 4.60 V · backup 4.79 V · charge
4.00 V Li-ion via VSYS-referenced straps), Block E cutoff (P11, MAIN5V→SYS5V), Block F PA4→VEH5V
re-tap, **Block H fail-safe Modo-B bypass** (K1 *normally-closed* signal relay — corrections
survive a dead/absent MCU), Block I NTC→PB1 (block 11). New MCU pins live: PB1 · PB3 · PB4 · PB5 ·
PA8. **Same day (PM): CARRIER-BOARD conversion** — the PROD board now sockets **all three
modules on female headers**: Blackpill (J1/J2) + **simpleRTK2B Pro as UNO-form shield** (MOD1,
D0/D1=UART1, D2=RX2, D8=TX2, IOREF=3V3, 5V=SW_5V) + **4G NTRIP Master on an on-board XBee
socket** (J7/J8 2 mm; VCC = **3V3_MODEM**, a second MP1584 buck off SW_5V — the HP XBee socket
is 3.3 V not 5 V). Modo B + K1 NC bypass = permanent uplink; RTCM3 downlink direct; P3/P13/H3
DNP. **Board 120×100 mm**, shield field with SMD-only underneath, XBee field right, access
parts outside; ERC 0; **carrier DRC baseline saved** (`…-drc-carrier-baseline.txt`; ~29 sub-mm
placement kisses + by-design under-shield courtyard overlaps). **Next gate: placement review vs
HBOX/cabinet mechanicals (+ verify D2/D8=RX2/TX2 on a physical Pro), then routing** (5 V ≥0.5 mm,
SW_5V ≥0.8 mm per kicad-guide). Fab gate unchanged: bench-validate the LTC4040 backup +
hot-cell charge cutoff on the proto first. Latest proto
assumptions ledger = `Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx` (*Estado y cambios*) +
`Drogheda_Guia-Conexion-Protoboard_ES_v2.1.pdf` (LaTeX source now in repo:
`Guia-Conexion-Protoboard/`). Wiring diagrams v2 (blocks 1–11) in `circuitikz-wiring/`;
client decks Avance + RCA refreshed to v1.1.
---
## 1. System architecture (corrected from the BOM, 2026-06-20)
@ -144,7 +166,7 @@ these before presenting; if it breaks one, say so and propose the compliant fix.
| `00-Project-Management` | plan, ethos, hackathon, **financials**, **handover**, client comms, Drive tooling | [[00-Project-Management/PLAN\|PLAN]] · [[00-Project-Management/Engineering-Handover\|Engineering-Handover]] · `ethos.md` · `hackathon-plan.md` · `Financials.md` · `Drive-Upload/` · `client-comms/` |
| `01-Requirements` | what we build | `SRS.md` · `HBOX-product-spec.md` |
| `02-Architecture-Software` | backend/software analysis, ADRs | `backend-review.md` |
| `03-Architecture-Hardware` | HBOX/cabinet, wiring, BOM, **watchdog PCB v3** | `hardware-respec-and-pcb-brief.md` · `cabinet-electrical-bom.md` · `watchdog-schematic.md` · `watchdog-health-telemetry.md` · `firmware-review.md` · `BOM-master.md` · **`watchdog-pcb-v3-design.md`** (schematic spec: +1 fan, +I²C temp/RH) · `watchdog-pcb-v3-bom.xlsx` (proto+production, LCSC) · `watchdog-pcb-v3-kicad-guide.md` (KiCad→JLCPCB) · `watchdog-pcb-v3-blockdiagram.svg` · `watchdog-protoboard-bringup.md` (shop list) · `watchdog-connections.xlsx` (pin/net connection list, PCB+proto) · `watchdog-connections-rationale.md` (per-connection justification + firmware cross-check; flags Q10 Vgs, ignition level, 5V-sense tap) · **`watchdog-electrical-design-state.md`** (CANONICAL electrical state — read first) · `kicad/hbox-watchdog-v3.kicad_sch` (schematic, ERC-clean) · `watchdog-protoboard-BOM-3boards.xlsx` + `watchdog-LISTA-DE-COMPRAS-ES.xlsx` (proto BOMs) |
| `03-Architecture-Hardware` | HBOX/cabinet, wiring, BOM, **watchdog PCB v3** | `hardware-respec-and-pcb-brief.md` · `cabinet-electrical-bom.md` · `watchdog-schematic.md` · `watchdog-health-telemetry.md` · `firmware-review.md` · `BOM-master.md` (+§5 Block B/E/H/I parts) · **`watchdog-pcb-v3-design.md`** (schematic spec) · `watchdog-pcb-v3-bom.xlsx` · `watchdog-pcb-v3-kicad-guide.md` (KiCad→JLCPCB) · `watchdog-pcb-v3-blockdiagram.svg` · `watchdog-protoboard-bringup.md` + `watchdog-proto-bench-bringup-v3.md` · `watchdog-connections.xlsx` (PCB pin/net list; H1 DNP; +B/H/I rows) · `watchdog-connections-rationale.md` (+§7 additions 2026-07-02) · **`watchdog-electrical-design-state.md`** (CANONICAL — read first) · **`watchdog-production-schematic-delta.md`** (PROD build spec; LTC4040 §4 values) · `kicad/` — `hbox-watchdog-v3.kicad_sch` (**DEV/proto**) · `hbox-watchdog-v3-PROD.kicad_sch/.kicad_pcb` (**PRODUCTION**: ERC 0, layout started, DRC baseline) · `Drogheda-sym.kicad_sym` (MP1584EN · LTC4040EUFD · AO4406A) · `Drogheda_Conexiones-por-Bloque_Proto_v1.xlsx` (**proto assumptions ledger**) · `Guia-Conexion-Protoboard/` (LaTeX source) → `Drogheda_Guia-Conexion-Protoboard_ES_v2.1.pdf` · `circuitikz-wiring/` (sheet + Beamer v2, blocks 1–11) · `watchdog-protoboard-BOM-3boards.xlsx` + `watchdog-LISTA-DE-COMPRAS-ES.xlsx` (proto BOMs) |
| `04-Source-Code` | firmware + backend repos | `firmware/` (**own git repo `hbox-firmware`**: `blackpillrtkcode_v2/` deploy · `legacy/` v1 · `docs/LOGGING-SPEC.md` v2.1) · `htracker/` · `notifications/` · `rtk-config/` |
| `05-Analytics-Reports` | SQL views, dashboards (VERONICA/PowerBI), **observability** | `2026-06-22_Drogheda_Manual-Logs-Grafana_v1.0.pdf` (Grafana/Loki log-consultation manual) |
| `06-Testing-Validation` | RCA, diagnostics, test evidence, **log analysis & tooling** | `RCA-2026-06-field-failures.md` · `remote-diagnostic-protocol.md` · `2026-06-20_Drogheda_Bench-Log-Analysis_v1.0.md` (rev-3) · `2026-06-20_Drogheda_GNSS-Findings-Summary.md` · `log-analysis/` (repo **`hbox-log-tools`**: `log-explorer.html` · `analyze_logs.py` · `build_dashboard.py` · `docs/manual.pdf`) |

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -0,0 +1,357 @@
% Helgen Technologies — HBOX RTK \hdot Pitch Deck (Ronda de inversión)
% Helgen Servicios Especializados S.A. de C.V. — Querétaro, México.
% Audiencia: inversionistas (plataforma / equity crowdfunding). Idioma: es-MX.
% Tesis: la demanda ya existe (los puertos lo pidieron). 3 MDP para entregar 6 MDP.
% Compilar: latexmk -xelatex HBOX-PitchDeck.tex
\documentclass[10pt,aspectratio=169]{beamer}
\usetheme[progressbar=frametitle, numbering=fraction, block=fill]{metropolis}
% ---------- Paleta oficial Helgen (Guía de Identidad v1.5, 2026) ----------
\definecolor{HelgenIndigo}{HTML}{2C3C5B}
\definecolor{HelgenCyan}{HTML}{51F3DA}
\definecolor{HelgenTeal}{HTML}{17A08C}
\definecolor{HelgenMist}{HTML}{EFF1F5}
\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 body}{bg=HelgenMist!50}
\setbeamercolor{section title}{fg=HelgenIndigo}
\setbeamercolor{standout}{bg=HelgenIndigo, fg=white}
% ---------- Paquetes ----------
\usepackage{iftex}
\ifXeTeX
\usepackage{fontspec}
\usepackage{polyglossia}\setmainlanguage[variant=mexican]{spanish}
\IfFontExistsTF{League Spartan}{%
\newfontfamily\helgentitle{League Spartan}[BoldFont={* Bold}]
\newfontfamily\helgenwordmark{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}
}{\newcommand{\helgenwordmark}{\sffamily\bfseries}}
\IfFontExistsTF{MADE Evolve Sans}{\setsansfont{MADE Evolve Sans}}{}
\else
\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}
\usepackage[spanish,es-noindentfirst]{babel}
\newcommand{\helgentitle}{\sffamily\bfseries}
\newcommand{\helgenwordmark}{\sffamily\bfseries}
\fi
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, shapes.misc, calc, fit}
\usepackage{adjustbox}
% ---------- Estilos TikZ de marca ----------
\tikzset{
caja/.style={draw=HelgenIndigo, fill=HelgenMist, rounded corners=2pt, text=HelgenIndigo,
align=center, font=\footnotesize, inner sep=5pt, minimum height=9mm},
cajaoscura/.style={draw=HelgenIndigo, fill=HelgenIndigo, rounded corners=2pt, text=white,
align=center, font=\footnotesize\bfseries, inner sep=5pt, minimum height=9mm},
cajacian/.style={draw=HelgenTeal, fill=HelgenCyan!25, rounded corners=2pt, text=HelgenIndigo,
align=center, font=\footnotesize\bfseries, inner sep=5pt, minimum height=9mm},
etiqueta/.style={font=\scriptsize\bfseries, text=HelgenTeal},
flecha/.style={-{Stealth[length=2.6mm]}, thick, draw=HelgenIndigo},
flechaacento/.style={-{Stealth[length=2.6mm]}, very thick, draw=HelgenTeal},
}
% ---------- Viñetas y separadores de marca (independientes de la fuente de texto) ----------
\setbeamertemplate{itemize item}{\raise0.18ex\hbox{\color{HelgenTeal}\rule{0.42em}{0.42em}}}
\setbeamertemplate{itemize subitem}{\raise0.18ex\hbox{\color{HelgenCyan}\rule{0.32em}{0.32em}}}
\newcommand{\hdot}{\ensuremath{\,\cdot\,}} % punto medio via fuente matemática (la de texto no lo trae)
% ---------- Imagotipo Helgen (anillo + dos "gotas/ojos"), reconstruido en vector ----------
% NOTA: reconstrucción fiel del logotipo Helgen. Para usar el PNG/SVG oficial, ver _brand/.
\newcommand{\helgenmarkraw}[1]{%
\begin{tikzpicture}[line cap=round, line join=round]
\draw[#1, line width=1.7pt] (0,0) circle (0.46);
\begin{scope}[shift={(-0.15,-0.02)}, rotate=8, scale=0.70]
\fill[#1] (0,0.30) .. controls (-0.15,0.06) and (-0.15,-0.17) .. (0,-0.17)
.. controls (0.15,-0.17) and (0.15,0.06) .. (0,0.30);
\end{scope}
\begin{scope}[shift={(0.17,-0.03)}, rotate=26, scale=0.95]
\fill[#1] (0,0.30) .. controls (-0.15,0.06) and (-0.15,-0.17) .. (0,-0.17)
.. controls (0.15,-0.17) and (0.15,0.06) .. (0,0.30);
\end{scope}
\end{tikzpicture}}
\newcommand{\helgenmark}[2]{\resizebox{#1}{!}{\helgenmarkraw{#2}}} % {ancho}{color}
% Lockup claro (sobre indigo): marca + wordmark en blanco
\newcommand{\helgenlockuplight}[1]{%
\raisebox{-0.30\height}{\helgenmark{#1}{white}}\hspace{6pt}%
{\helgenwordmark\fontsize{24}{26}\selectfont\color{white}Helgen}}
% ---------- Pie: marca nativa + confidencialidad ----------
\setbeamertemplate{frame footer}{%
\raisebox{-0.8mm}{\includegraphics[height=3.2mm]{helgen-logo.png}}\hspace{5pt}%
\scriptsize\color{gray}\insertshorttitle\ \hdot\ Confidencial}
% ---------- Metadatos ----------
\title[HBOX RTK \hdot Industria pesada]{HBOX RTK}
\subtitle{Posicionamiento de precisión para la industria pesada}
\author[Helgen]{Helgen Servicios Especializados S.A. de C.V.}
\date{2026}
\begin{document}
% ============================ PORTADA ============================
\begin{frame}[plain]
\begin{tikzpicture}[remember picture, overlay]
\fill[HelgenIndigo] (current page.south west) rectangle (current page.north east);
\node[anchor=north west] at ([xshift=1.0cm, yshift=-0.85cm]current page.north west)
{\includegraphics[height=0.95cm]{helgen-logo-white.png}};
\node[anchor=north west, text=HelgenCyan] at ([xshift=1.05cm, yshift=-1.95cm]current page.north west)
{\helgentitle\small Ingeniería que produce, mantenimiento que protege};
\draw[HelgenCyan, line width=2pt]
([xshift=1.05cm, yshift=-3.0cm]current page.north west) -- ([xshift=8.6cm, yshift=-3.0cm]current page.north west);
\node[anchor=north west, text=white, text width=14cm] at ([xshift=1.0cm, yshift=-3.75cm]current page.north west)
{\helgentitle\fontsize{50}{54}\selectfont HBOX\,\textcolor{HelgenCyan}{RTK}};
\node[anchor=north west, text=white, text width=13cm] at ([xshift=1.05cm, yshift=-5.35cm]current page.north west)
{\helgentitle\fontsize{17}{22}\selectfont Posicionamiento centimétrico y telemetría\\ para maquinaria pesada — puertos e industria};
\node[anchor=south west, text=HelgenCyan] at ([xshift=1.05cm, yshift=1.55cm]current page.south west)
{\helgentitle\normalsize RONDA DE INVERSIÓN 2026\, \hdot\, \$3{,}000{,}000 MXN};
\node[anchor=south west, text=white] at ([xshift=1.05cm, yshift=0.7cm]current page.south west)
{\scriptsize Querétaro, México\, \hdot \,leo@helgen.tech\, \hdot \,ventas@helgen.tech\, \hdot \,Confidencial};
\end{tikzpicture}
\end{frame}
% ============================ LA DEMANDA ============================
\section{La demanda ya existe}
\begin{frame}{Qué hace Helgen}
Ponemos \alert{posición de centímetros} y \alert{telemetría confiable} en la maquinaria
pesada que mueve la economía — y convertimos esos datos en decisiones.
\vfill
\begin{columns}[T]
\column{0.33\textwidth}
\begin{block}{HBOX (hardware)}
\footnotesize Unidad RTK ruggedizada, IP67, con watchdog. Diseño propio.
\end{block}
\column{0.33\textwidth}
\begin{block}{Correcciones RTK}
\footnotesize Red de estaciones base + NTRIP sobre 4G. Precisión $<$2 cm.
\end{block}
\column{0.33\textwidth}
\begin{block}{Plataforma de datos}
\footnotesize Backend Helgen: flota, seguridad, eficiencia y analítica.
\end{block}
\end{columns}
\end{frame}
\begin{frame}{La demanda ya existe: los puertos nos lo pidieron}
\begin{columns}[T]
\column{0.56\textwidth}
\textbf{Operando / contratado — red Hutchison MX}
\begin{itemize}
\item Puerto de \alert{Veracruz}
\item Puerto de \alert{Manzanillo}
\item Puerto de \alert{Ensenada}
\item Puerto de \alert{Lázaro Cárdenas}
\end{itemize}
\vspace{4pt}
\textbf{En negociación}
\begin{itemize}
\item Puerto de \alert{Panamá} \hdot Puerto de \alert{Caucedo} (RD)
\end{itemize}
\column{0.44\textwidth}
\begin{block}{Nueva vertical: industria pesada}
\footnotesize Seguimiento de maquinaria en planta — \alert{automotriz y montacargas}.
Piloto en marcha con \alert{Toyota (TMMGT)}.
\end{block}
\vfill
\begin{alertblock}{No vendimos esto en frío}
\footnotesize Llegamos porque los clientes lo solicitaron. Ahora levantamos capital para \emph{cumplir}.
\end{alertblock}
\end{columns}
\end{frame}
% ============================ EL PROBLEMA Y LA SOLUCIÓN ============================
\section{El problema y la solución}
\begin{frame}{El problema: la industria pesada opera a ciegas}
\begin{itemize}
\item El GPS convencional yerra por \alert{metros}: inservible entre contenedores, grúas y naves.
\item Sin posición \alert{centimétrica} no hay automatización, anticolisión ni gemelo digital.
\item La telemetría genérica se degrada bajo sol, polvo y vibración; las unidades ``mueren'' sin avisar.
\item Resultado: \alert{ineficiencia, riesgo y datos no confiables} sobre activos de millones.
\end{itemize}
\end{frame}
\begin{frame}{HBOX: precisión centimétrica, lista para el campo}
\begin{columns}[T]
\column{0.56\textwidth}
\begin{itemize}
\item Unidad RTK ruggedizada: \alert{$<$2 cm} sobre 4G (NTRIP/RTCM3).
\item u-blox ZED-F9P multibanda; gabinete \alert{IP67}; conector GX16-5.
\item \alert{Watchdog} embebido (STM32): recupera el enlace solo — \emph{nunca queda en silencio}.
\item Telemetría al backend Helgen para flota, eficiencia y seguridad.
\end{itemize}
\column{0.44\textwidth}
\begin{block}{Especificaciones}
\footnotesize
\begin{tabular}{@{}ll@{}}
GNSS & u-blox ZED-F9P \\
Precisión & $<$2 cm (NTRIP) \\
Tasa & desde 1 Hz \\
Correcciones& NTRIP/RTCM3 \hdot 4G \\
Entrada & 24 V + ignición \\
Carcasa & IP67 \\
\end{tabular}
\end{block}
\end{columns}
\end{frame}
\begin{frame}{Arquitectura: Rover + Estación Base + datos}
\centering
\begin{tikzpicture}[font=\footnotesize, node distance=9mm and 15mm]
\node[cajaoscura, text width=2.3cm] (base) {Estación\\Base RTK};
\node[caja, right=of base, text width=2.5cm] (rover) {Rover HBOX\\(en la máquina)};
\node[cajacian, right=of rover, text width=2.5cm] (back) {Plataforma\\Helgen};
\draw[flechaacento] (base) -- node[etiqueta, above]{RTCM3 \hdot 4G} (rover);
\draw[flechaacento] (rover) -- node[etiqueta, above]{NMEA \hdot UDP} (back);
\node[etiqueta, below=2mm of rover] {posición $<$2 cm};
\node[caja, below=12mm of back, text width=2.6cm] (bi) {Analítica \hdot BI\\Seguridad};
\draw[flecha] (back) -- (bi);
\end{tikzpicture}
\vfill
Las correcciones viajan por el \alert{módem 4G} — el enlace se recupera reiniciando la pila, sin tocar el GNSS.
\end{frame}
\begin{frame}{El verdadero activo: los datos}
Cada HBOX transmite \alert{posición de centímetros + telemetría} de un activo crítico, 24/7.
El hardware es la cuña; \alert{la plataforma de datos es el valor que compone}.
\vfill
\begin{columns}[T]
\column{0.5\textwidth}
\begin{itemize}
\item Gemelo digital del patio y utilización de flota.
\item \alert{Anticolisión} y seguridad de personal.
\end{itemize}
\column{0.5\textwidth}
\begin{itemize}
\item Mantenimiento \alert{predictivo} por uso real.
\item Capa recurrente, de alto margen y \alert{defensible}.
\end{itemize}
\end{columns}
\vfill
{\footnotesize\color{HelgenTeal}\textbf{De caja de rastreo} $\to$ \textbf{sistema operativo de datos para la industria pesada.}}
\end{frame}
% ============================ MERCADO ============================
\section{Mercado y momento}
\begin{frame}{Por qué ahora}
\begin{itemize}
\item Ola de \alert{automatización portuaria}: $\sim$71 terminales de contenedores ya automatizadas.
\item Los fabricantes integran telemetría/IoT en grúas y montacargas (p.\,ej.\ Hyster-Yale, 2024).
\item El RTK se abarata y el \alert{4G es ubicuo}: la precisión centimétrica ya escala.
\item En México hay demanda desatendida — y nosotros \alert{ya estamos dentro}.
\end{itemize}
\end{frame}
\begin{frame}{Mercado}
\centering
\begin{tikzpicture}[font=\footnotesize, node distance=3mm]
\node[cajaoscura, text width=11.2cm] (tam)
{TAM \hdot RTK GNSS global $\approx$ \textbf{USD 4.2\,B} (2024), $\sim$9\% CAGR $\to$ $\sim$USD 9\,B (2033)};
\node[caja, below=of tam, text width=9.0cm] (sam)
{SAM \hdot Posición + telemetría para industria pesada\\ (puertos + intralogística automotriz, LatAm)};
\node[cajacian, below=of sam, text width=6.8cm] (som)
{SOM \hdot Puertos de México (red Hutchison)\\ + primeras plantas automotrices (Toyota)};
\end{tikzpicture}
\vfill
{\scriptsize\color{gray} Fuentes (estimaciones externas): Dataintelo / Growth Market Reports (RTK GNSS);
Polaris / GM Insights (equipo de manejo de contenedores), 2025.}
\end{frame}
% ============================ EJECUCIÓN Y OFERTA ============================
\section{Ejecución y oferta}
\begin{frame}{Aprendizaje de campo $\to$ producto endurecido}
\begin{itemize}
\item \textbf{Térmico:} calor en batería/módem en gabinete sellado $\to$ \alert{carga calificada por temperatura} (LTC4040 + NTC) y enfriamiento por conducción.
\item \textbf{Backend:} bloqueo de cabeza de línea y veto de ``saltos'' $\to$ \alert{corregido y desplegado}, con observabilidad (Grafana Loki).
\item \textbf{Hardware:} prototipo cableado a mano $\to$ \alert{PCB de producción} (watchdog v3, ERC-limpio); Serie 2 en curso.
\end{itemize}
\vfill
\begin{alertblock}{La ventaja de estar desplegados}
\footnotesize Desplegamos, medimos y endurecemos rápido. Cada falla de campo es una mejora que un competidor de laboratorio aún no ha visto.
\end{alertblock}
\end{frame}
\begin{frame}{Modelo de negocio: hardware + recurrente}
\begin{itemize}
\item \textbf{Hardware:} venta del gabinete HBOX \alert{por máquina} (CapEx del cliente).
\item \textbf{Recurrente:} datos/SIM, correcciones (NTRIP) y plataforma \alert{por unidad/mes}.
\item \textbf{Expansión por sitio:} de decenas a cientos de máquinas en cada puerto o planta.
\item Precios y márgenes unitarios: \alert{[marcador — dato interno]} (sala de datos bajo NDA).
\end{itemize}
\end{frame}
\begin{frame}{Por qué ganamos}
\begin{itemize}
\item \alert{Integración vertical}: hardware + firmware + datos bajo una sola responsabilidad.
\item \alert{Ingeniería a prueba de fallos}: estado seguro por defecto; ni silencio ni reinicios en bucle.
\item \alert{Referencia desplegada} en la red de puertos más grande de México — difícil de replicar.
\item \alert{Base en México}: costo, cercanía y soporte frente a proveedores extranjeros.
\end{itemize}
\end{frame}
\begin{frame}{Equipo}
\begin{itemize}
\item \textbf{Leo Rodríguez} — Fundador y CEO/CTO \hdot arquitecto principal HW/SW.
\item \textbf{Adriana Del Ángel} — Implementación y operación.
\item \textbf{Gibran Ortega} — GPS / telemetría.
\item \textbf{Daniel Martínez} \hdot \textbf{Paola Rodríguez} — Ingeniería y despliegue.
\end{itemize}
\vfill
{\footnotesize\color{gray} Helgen Servicios Especializados S.A. de C.V. — Querétaro, México.}
\end{frame}
\begin{frame}{La oferta}
\begin{columns}[T]
\column{0.5\textwidth}
\begin{block}{Levantamos}
\centering
{\helgentitle\fontsize{26}{28}\selectfont\color{HelgenIndigo}\$3 MDP}\\[2pt]
{\normalsize para entregar \textbf{\$6 MDP} en ingresos}\\[1pt]
{\scriptsize\color{gray}$\approx$ USD \$170K $\to$ \$345K \hdot FX 17.5}
\end{block}
\textbf{Uso de fondos}
\small
\begin{itemize}
\item Producción y primer lote de unidades
\item Despliegue e instalación (4 puertos)
\item Validación: térmica \hdot vibración \hdot IP67
\item Plataforma de datos + comercial
\end{itemize}
\column{0.5\textwidth}
\begin{alertblock}{Por qué es de bajo riesgo}
\footnotesize \alert{2$\times$ ingreso sobre capital}, respaldado por demanda existente — los clientes ya lo pidieron.
\end{alertblock}
\textbf{Hitos}
\small
\begin{itemize}
\item Entregar los 4 puertos en operación
\item Cerrar Panamá y Caucedo
\item Lanzar piloto automotriz (Toyota)
\item Serie 2 (PCB de producción) lista
\end{itemize}
\vspace{3pt}
{\scriptsize\color{gray} Valuación y términos: [marcador] — a definir con la plataforma.}
\end{columns}
\end{frame}
% ============================ CIERRE ============================
\begin{frame}[standout]
\includegraphics[height=1.0cm]{helgen-logo-white.png}\par\vspace{10pt}
Los puertos ya dijeron sí.\\ Construyamos la capa de datos\\ de la industria pesada.\par\vspace{14pt}
{\normalsize\normalfont leo@helgen.tech\quad\hdot\quad ventas@helgen.tech}
\end{frame}
\end{document}

View File

@ -11,7 +11,14 @@ high-vibration port environment.
---
## Where we are (2026-06-20)
## Where we are (2026-06-20 · updated 2026-07-02)
> **2026-07-02:** backend deployed + stable; thermal chamber run done; 3-board protoboard
> campaign in flight (units to ICAVE 7-jul). **Watchdog v3 PROD schematic is complete (ERC 0)**
> — LTC4040 battery-backup sized to the 12 Ah pack, fail-safe Modo-B relay bypass — and the
> **PCB is now a 120×100 carrier board**: Blackpill + simpleRTK2B Pro (UNO-shield sockets) +
> 4G NTRIP Master (on-board XBee socket) all on female headers. Layout in placement review;
> fab gate = proto bench validation. Canonical: `03-Architecture-Hardware/watchdog-electrical-design-state.md`.
We deployed a first batch of HBOX trackers on ICAVE machines in **Veracruz**. They worked
"ish," then failed. We are **mid-crisis, hardening for scale** — target **30 units by