Drogheda/02-Architecture-Software/img/2026-10-22_Drogheda_FOTA-4G-Caminos-por-Tarjeta_v1.0.html

291 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!doctype html>
<html><head><meta charset="utf-8">
<style>
html,body{margin:0;background:#fff}
svg{display:block;font-family:Inter,"DejaVu Sans",sans-serif}
.t{fill:#1b2430}
.m{fill:#5b6675}
.h1{font-size:34px;font-weight:700}
.h2{font-size:24px;font-weight:700}
.h3{font-size:19px;font-weight:700}
.b{font-size:16px}
.s{font-size:14.5px}
.xs{font-size:13px}
.box{fill:#fff;stroke:#9aa6b5;stroke-width:1.5}
.mod{fill:#eef3fb;stroke:#4a6fa5;stroke-width:1.8}
.mcu{fill:#f4f0fb;stroke:#6b4fa5;stroke-width:1.8}
.f9p{fill:#eef8f1;stroke:#3d8a5a;stroke-width:1.8}
.k1{fill:#fff7ec;stroke:#c27a1a;stroke-width:1.8}
.srv{fill:#fff;stroke:#7d8a9a;stroke-width:1.5}
.dn{stroke:#1f5fa8;stroke-width:3;fill:none}
.up{stroke:#d0700f;stroke-width:3;fill:none}
.no{stroke:#9aa6b5;stroke-width:2.5;fill:none;stroke-dasharray:7 6}
.exp{stroke:#8a4fbf;stroke-width:2.5;fill:none;stroke-dasharray:2 5;stroke-linecap:round}
.at{stroke:#2d3a4a;stroke-width:3;fill:none}
.gr{stroke:#8a96a6;stroke-width:3;fill:none}
</style></head><body>
<svg width="2000" height="1530" viewBox="0 0 2000 1530" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="aDn" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#1f5fa8"/></marker>
<marker id="aUp" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#d0700f"/></marker>
<marker id="aAt" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#2d3a4a"/></marker>
<marker id="aGr" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#7d8a9a"/></marker>
<marker id="aEx" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#8a4fbf"/></marker>
</defs>
<!-- ======= Título ======= -->
<text x="40" y="52" class="t h1">FOTA por 4G — cómo llega el firmware a cada versión de la EinarBoard</text>
<text x="40" y="86" class="m b">22-oct-2026 · Helgen / Drogheda · sin hardware nuevo en V5.6, V5.7 ni v6 · propuesta D-22-6 · detalle: hardware/fota-4g-factibilidad</text>
<!-- ======= Banda del servidor ======= -->
<rect x="40" y="108" width="1920" height="196" rx="14" fill="#f3f6fa" stroke="#c9d3df"/>
<text x="62" y="138" class="t h3">Servidor de Helgen (HelgenSRV)</text>
<rect x="62" y="156" width="250" height="96" rx="10" class="srv"/>
<text x="78" y="184" class="t h3">Llave de firma</text>
<text x="78" y="208" class="t s">Ed25519, fuera del repo</text>
<text x="78" y="230" class="t s">y del servidor (la guarda Leo)</text>
<rect x="352" y="156" width="300" height="96" rx="10" class="srv"/>
<text x="368" y="184" class="t h3">Imagen firmada</text>
<text x="368" y="208" class="t s">manifiesto: versión · tarjeta · ranura</text>
<text x="368" y="230" class="t s">tamaño · SHA-256 · firma</text>
<rect x="692" y="156" width="350" height="96" rx="10" class="srv"/>
<text x="708" y="184" class="t h3">Campañas en htracker</text>
<text x="708" y="208" class="t s">banco → 1 por sitio → 10 % → todas</text>
<text x="708" y="230" class="t s">lee $PHLG · manda CONFIRMAR</text>
<rect x="1082" y="156" width="410" height="96" rx="10" class="srv" style="stroke:#1f5fa8;stroke-width:2"/>
<text x="1098" y="184" class="t h3">Caster de Helgen + inyector</text>
<text x="1098" y="208" class="t s">relevo de la base RTK + marcos RTCM 4xxx</text>
<text x="1098" y="230" class="t s">con pedazos · ≤ 1 KB/s · solo a las unidades objetivo</text>
<rect x="1532" y="156" width="404" height="96" rx="10" class="srv" style="stroke:#1f5fa8;stroke-width:2"/>
<text x="1548" y="184" class="t h3">Servidor HTTPS de imágenes</text>
<text x="1548" y="208" class="t s">TLS · descarga por rangos</text>
<text x="1548" y="230" class="t s">(solo la v6)</text>
<path d="M312,204 L346,204" class="at" marker-end="url(#aAt)"/>
<path d="M652,204 L686,204" class="at" marker-end="url(#aAt)"/>
<path d="M1042,204 L1076,204" class="at" marker-end="url(#aAt)"/>
<path d="M867,156 L867,146 L1734,146 L1734,150" class="at" marker-end="url(#aAt)"/>
<!-- ======= Flechas servidor ↔ columnas ======= -->
<!-- Col A -->
<path d="M330,304 L330,382" class="gr" marker-end="url(#aGr)"/>
<text x="342" y="338" class="m s">NTRIP: la corrección</text>
<text x="342" y="356" class="m s">solo llega al F9P</text>
<path d="M130,382 L130,304" class="up" marker-end="url(#aUp)"/>
<text x="142" y="338" class="t s" style="fill:#a8560a">UDP: NMEA</text>
<text x="142" y="356" class="t s" style="fill:#a8560a">+ $PHLG</text>
<!-- Col B -->
<path d="M1180,304 L1180,382" class="dn" marker-end="url(#aDn)"/>
<text x="1192" y="330" class="t s" style="fill:#174a85">NTRIP: corrección + marcos 4xxx</text>
<text x="1192" y="348" class="t s" style="fill:#174a85">(pedazos de la imagen, CONFIRMAR)</text>
<path d="M760,382 L760,304" class="up" marker-end="url(#aUp)"/>
<text x="772" y="330" class="t s" style="fill:#a8560a">UDP: NMEA + $PHLG</text>
<text x="772" y="348" class="t s" style="fill:#a8560a">(versión · ranura · tengo/total · estado)</text>
<!-- Col C -->
<path d="M1800,304 L1800,382" class="dn" marker-end="url(#aDn)"/>
<text x="1812" y="330" class="t s" style="fill:#174a85">HTTPS:</text>
<text x="1812" y="348" class="t s" style="fill:#174a85">imagen</text>
<path d="M1470,382 L1470,304" class="up" marker-end="url(#aUp)"/>
<text x="1482" y="330" class="t s" style="fill:#a8560a">UDP: NMEA + $PHLG</text>
<text x="1482" y="348" class="t s" style="fill:#a8560a">confirmación por HTTPS</text>
<!-- ======= Columna A: V3 / V4 / V5.5 ======= -->
<rect x="40" y="384" width="560" height="726" rx="14" fill="#fff" stroke="#d6dbe2" stroke-width="1.5"/>
<text x="60" y="420" class="t h2">V3 · V4 · V5.5</text>
<text x="590" y="420" class="m b" text-anchor="end">33 unidades</text>
<rect x="60" y="436" width="520" height="40" rx="8" fill="#fdecec" stroke="#c62828"/>
<text x="76" y="462" class="b" style="fill:#a01d1d;font-weight:700">✗ Por 4G no: no hay RX del módem al MCU</text>
<rect x="180" y="506" width="280" height="62" rx="10" class="mod"/>
<text x="320" y="532" class="t h3" text-anchor="middle">4G NTRIP Master</text>
<text x="320" y="554" class="m s" text-anchor="middle">XBee · Telit + app ArduSimple</text>
<!-- DOUT al F9P -->
<path d="M400,568 L400,632" class="dn" marker-end="url(#aDn)"/>
<text x="410" y="600" class="m xs">DOUT</text>
<rect x="300" y="636" width="240" height="64" rx="10" class="f9p"/>
<text x="420" y="662" class="t h3" text-anchor="middle">ZED-F9P · RX2</text>
<text x="420" y="684" class="m s" text-anchor="middle">usa la corrección</text>
<!-- sin conexión al MCU -->
<path d="M400,604 L240,604 L240,766" class="no" marker-end="url(#aGr)"/>
<circle cx="240" cy="690" r="15" fill="#fff" stroke="#c62828" stroke-width="2.5"/>
<path d="M231,681 L249,699 M249,681 L231,699" stroke="#c62828" stroke-width="3"/>
<text x="232" y="726" class="xs" style="fill:#a01d1d" text-anchor="end">V5.5: PC7 NC</text>
<text x="232" y="744" class="xs" style="fill:#a01d1d" text-anchor="end">Blackpill: sin PC7</text>
<!-- subida Modo B -->
<path d="M90,768 L90,588 L210,588 L210,572" class="up" marker-end="url(#aUp)"/>
<text x="100" y="640" class="xs" style="fill:#a8560a">Modo B</text>
<text x="100" y="656" class="xs" style="fill:#a8560a">(subida sí)</text>
<!-- experimento -->
<path d="M500,700 L500,766" class="exp" marker-end="url(#aEx)"/>
<text x="510" y="740" class="xs" style="fill:#6d3a9c">F0-d</text>
<rect x="60" y="770" width="520" height="70" rx="10" class="mcu"/>
<text x="320" y="798" class="t h3" text-anchor="middle">STM32F411</text>
<text x="320" y="822" class="m s" text-anchor="middle">Blackpill (V3/V4) · RET6 soldado (V5.5)</text>
<text x="60" y="880" class="t h3">Cómo sí</text>
<text x="60" y="908" class="t b">① USB (DFU en J11) en cada visita — lo de hoy</text>
<text x="60" y="934" class="t b">② Reemplazarlas por V5.6 / V5.7 si siguen en</text>
<text x="84" y="956" class="t b">servicio después del primer trimestre</text>
<text x="60" y="982" class="t b">③ Experimento F0-d: el F9P reporta el tipo de</text>
<text x="84" y="1004" class="t b">cada marco (UBX-RXM-RTCM → PA3), ≈ 75 B/s;</text>
<text x="84" y="1026" class="t b">igual requiere 1 visita para el bootloader</text>
<text x="60" y="1052" class="t b">④ Cable DOUT → PC7 en la V5.5: no (vibración)</text>
<!-- ======= Columna B: V5.6 / V5.7 ======= -->
<rect x="630" y="384" width="760" height="726" rx="14" fill="#fff" stroke="#3d8a5a" stroke-width="2"/>
<text x="650" y="420" class="t h2">V5.6 · V5.7</text>
<text x="1370" y="420" class="m b" text-anchor="end">108 + 322 (piloto 5 + 5)</text>
<rect x="650" y="436" width="720" height="40" rx="8" fill="#e8f5ec" stroke="#3d8a5a"/>
<text x="666" y="462" class="b" style="fill:#1e6b3a;font-weight:700">✓ Sin hardware nuevo · falta firmware y el caster con inyector</text>
<rect x="900" y="506" width="300" height="62" rx="10" class="mod"/>
<text x="1050" y="532" class="t h3" text-anchor="middle">4G NTRIP Master</text>
<text x="1050" y="554" class="m s" text-anchor="middle">zócalo XBee · MODEM_EN PC3 · RST PC1</text>
<!-- DOUT_4G -->
<path d="M1110,568 L1110,604" class="dn"/>
<text x="1120" y="592" class="m xs">DOUT_4G · 115200</text>
<path d="M1110,604 L1270,604 L1270,632" class="dn" marker-end="url(#aDn)"/>
<rect x="1160" y="636" width="214" height="64" rx="10" class="f9p"/>
<text x="1267" y="662" class="t h3" text-anchor="middle">ZED-F9P · RX2</text>
<text x="1267" y="684" class="m s" text-anchor="middle">descarta los 4xxx</text>
<path d="M1110,604 L1110,628" class="dn" marker-end="url(#aDn)"/>
<rect x="1040" y="632" width="104" height="34" rx="7" class="box"/>
<text x="1092" y="655" class="t s" text-anchor="middle">R111 1 k</text>
<path d="M1092,666 L1092,690" class="dn" marker-end="url(#aDn)"/>
<rect x="978" y="694" width="232" height="38" rx="7" class="box" style="stroke:#1f5fa8;stroke-width:2"/>
<text x="1094" y="719" class="t s" text-anchor="middle" style="font-weight:700">PC7 · USART6_RX (DMA)</text>
<path d="M1094,732 L1094,766" class="dn" marker-end="url(#aDn)"/>
<rect x="900" y="770" width="470" height="70" rx="10" class="mcu"/>
<text x="1135" y="798" class="t h3" text-anchor="middle">STM32F411RET6</text>
<text x="1135" y="822" class="m s" text-anchor="middle">arma los marcos 4xxx · verifica · escribe la ranura B</text>
<!-- subida: MCU → K1 → DIN -->
<path d="M900,805 L864,805" class="up" marker-end="url(#aUp)"/>
<text x="868" y="796" class="xs" style="fill:#a8560a" text-anchor="start">PA9</text>
<rect x="650" y="770" width="210" height="70" rx="10" class="k1"/>
<text x="755" y="796" class="t h3" text-anchor="middle">K1 (PB5)</text>
<text x="755" y="818" class="m xs" text-anchor="middle">NO = MCU, Modo B ($PHLG)</text>
<text x="755" y="834" class="m xs" text-anchor="middle">NC = F9P directo si el MCU cae</text>
<path d="M755,770 L755,592 L940,592 L940,572" class="up" marker-end="url(#aUp)"/>
<text x="766" y="584" class="xs" style="fill:#a8560a">DIN_4G</text>
<text x="650" y="880" class="t h3">Ya está en la tarjeta</text>
<text x="650" y="904" class="t b">Toma RTCM en PC7 (R111) · Modo B por K1 · control del módem ·</text>
<text x="650" y="926" class="t b">respaldo LTC4040 para escribir la flash</text>
<text x="650" y="958" class="t h3">Falta</text>
<text x="650" y="982" class="t b">Bootloader A/B + receptor en el firmware (FOTA 1–2) ·</text>
<text x="650" y="1004" class="t b">caster con inyector y campañas (FOTA 3) · matriz de banco (FOTA 4)</text>
<text x="650" y="1036" class="t h3">Por validar en banco (F0)</text>
<text x="650" y="1060" class="t b">a: el marco 4xxx sale por DOUT · b: RTK fijo con carrusel · c: $$$AS+R? por Modo B</text>
<text x="650" y="1092" class="m s">De regalo: parámetros del módem ($$$AS+X, con regreso automático) y config. del F9P a distancia.</text>
<!-- ======= Columna C: v6 ======= -->
<rect x="1420" y="384" width="540" height="726" rx="14" fill="#fff" stroke="#3d8a5a" stroke-width="2"/>
<text x="1440" y="420" class="t h2">v6</text>
<text x="1940" y="420" class="m b" text-anchor="end">130 + reemplazos (piloto 20)</text>
<rect x="1440" y="436" width="500" height="40" rx="8" fill="#e8f5ec" stroke="#3d8a5a"/>
<text x="1456" y="462" class="b" style="fill:#1e6b3a;font-weight:700">✓ Sin hardware nuevo · va dentro de FW-3</text>
<rect x="1550" y="506" width="300" height="62" rx="10" class="mod"/>
<text x="1700" y="532" class="t h3" text-anchor="middle">A7670SA (soldado)</text>
<text x="1700" y="554" class="m s" text-anchor="middle">HTTP(S) · sistema de archivos · CFOTA</text>
<path d="M1610,766 L1610,572" class="at" marker-end="url(#aAt)"/>
<rect x="1448" y="608" width="226" height="30" rx="6" fill="#fff" stroke="#2d3a4a"/>
<text x="1561" y="628" class="t xs" text-anchor="middle">AT: PC6 → R148 0 Ω → U23 → RXD</text>
<path d="M1790,568 L1790,766" class="dn" marker-end="url(#aDn)"/>
<rect x="1702" y="680" width="238" height="30" rx="6" fill="#fff" stroke="#1f5fa8"/>
<text x="1821" y="700" class="xs" style="fill:#174a85" text-anchor="middle">TXD → U24 → R106 → PC7</text>
<rect x="1440" y="770" width="500" height="70" rx="10" class="mcu"/>
<text x="1690" y="798" class="t h3" text-anchor="middle">STM32F411RET6</text>
<text x="1690" y="822" class="m s" text-anchor="middle">HTTPACTION / HTTPREAD → ranura B · RTCM al F9P por USART2</text>
<text x="1440" y="880" class="t h3">Ya está en la tarjeta</text>
<text x="1440" y="906" class="t b">UART completo con el módem (K1 DNP) ·</text>
<text x="1440" y="928" class="t b">PWRKEY PC8 · PWR_EN PC10 · RST PC11 · LTC4040</text>
<text x="1440" y="962" class="t h3">Falta</text>
<text x="1440" y="988" class="t b">FOTA dentro de FW-3 (socket NTRIP no transparente</text>
<text x="1440" y="1010" class="t b">para dejar libre el canal AT) · servidor HTTPS</text>
<text x="1440" y="1040" class="b" style="fill:#a01d1d;font-weight:700">Sin K1: si el MCU cae, nada reporta →</text>
<text x="1440" y="1062" class="b" style="fill:#a01d1d;font-weight:700">el bootloader regresa solo, sin esperar al servidor</text>
<g transform="translate(0,30)">
<!-- ======= Banda común: bootloader y mapa de flash ======= -->
<rect x="40" y="1100" width="1920" height="372" rx="14" fill="#f7f5fb" stroke="#d9d0ea"/>
<text x="62" y="1134" class="t h3">Común a V5.6, V5.7 y v6 — bootloader A/B y mapa de flash del STM32F411 (512 KB)</text>
<!-- barra de flash: 1000 px = 512 KB -->
<g transform="translate(62,1160)">
<rect x="0" y="0" width="62.5" height="58" fill="#6b4fa5"/>
<rect x="62.5" y="0" width="31.25" height="58" fill="#9c86c9"/>
<rect x="93.75" y="0" width="31.25" height="58" fill="#c3b6e0"/>
<rect x="125" y="0" width="375" height="58" fill="#e4f0e8" stroke="#3d8a5a" stroke-width="1.5"/>
<rect x="125" y="0" width="187.5" height="58" fill="#b9dcc5"/>
<rect x="500" y="0" width="500" height="58" fill="#e7eef8" stroke="#1f5fa8" stroke-width="1.5"/>
<rect x="0" y="0" width="1000" height="58" fill="none" stroke="#4b3a73" stroke-width="2"/>
<text x="31" y="35" class="xs" style="fill:#fff;font-weight:700" text-anchor="middle">boot</text>
<text x="312" y="27" class="t s" text-anchor="middle" style="font-weight:700">Ranura A · 192 KB · sectores 4–5</text>
<text x="312" y="47" class="m xs" text-anchor="middle">corre hoy (0.6.2 = 96 KB, en verde)</text>
<text x="750" y="27" class="t s" text-anchor="middle" style="font-weight:700">Ranura B · 256 KB · sectores 6–7</text>
<text x="750" y="47" class="m xs" text-anchor="middle">aquí se escribe la imagen nueva</text>
<rect x="0" y="84" width="14" height="14" fill="#6b4fa5"/><text x="22" y="96" class="t xs">sect. 0–1 · 32 KB · bootloader (nunca por aire)</text>
<rect x="0" y="106" width="14" height="14" fill="#9c86c9"/><text x="22" y="118" class="t xs">sect. 2 · 16 KB · metadatos (ranura activa, prueba)</text>
<rect x="0" y="128" width="14" height="14" fill="#c3b6e0"/><text x="22" y="140" class="t xs">sect. 3 · 16 KB · EEPROM (hoy en el último sector)</text>
<text x="420" y="96" class="t xs">Dos builds por versión (build.flash_offset): el servidor manda</text>
<text x="420" y="114" class="t xs">el de la ranura que no corre. Cambiar de imagen = escribir un</text>
<text x="420" y="132" class="t xs">registro de metadatos; regresar es inmediato. Borrar 128 KB detiene</text>
<text x="420" y="150" class="t xs">el núcleo ≈ 1–2 s: K1 suelto (la NMEA sigue), borrado al inicio,</text>
<text x="420" y="168" class="t xs">nunca con batería baja.</text>
</g>
<!-- máquina de estados -->
<g>
<rect x="1110" y="1156" width="250" height="62" rx="10" class="box"/>
<text x="1235" y="1182" class="t s" text-anchor="middle" style="font-weight:700">1 · Descarga</text>
<text x="1235" y="1204" class="m xs" text-anchor="middle">a la ranura libre, por pedazos</text>
<path d="M1360,1187 L1384,1187" class="at" marker-end="url(#aAt)"/>
<rect x="1390" y="1156" width="270" height="62" rx="10" class="box"/>
<text x="1525" y="1182" class="t s" text-anchor="middle" style="font-weight:700">2 · Verifica</text>
<text x="1525" y="1204" class="m xs" text-anchor="middle">SHA-256 + Ed25519 + tarjeta</text>
<path d="M1660,1187 L1684,1187" class="at" marker-end="url(#aAt)"/>
<rect x="1690" y="1156" width="248" height="62" rx="10" class="box"/>
<text x="1814" y="1182" class="t s" text-anchor="middle" style="font-weight:700">3 · Arranca en prueba</text>
<text x="1814" y="1204" class="m xs" text-anchor="middle">contador en BKP12R–13R</text>
<path d="M1814,1218 L1814,1238 L1310,1238 L1310,1254" class="at" marker-end="url(#aAt)"/>
<rect x="1110" y="1258" width="400" height="62" rx="10" fill="#fff" stroke="#2d3a4a" stroke-width="2"/>
<text x="1310" y="1284" class="t s" text-anchor="middle" style="font-weight:700">¿CONFIRMAR del servidor en 30 min?</text>
<text x="1310" y="1306" class="m xs" text-anchor="middle">(la unidad sana: NMEA 1 Hz + $PHLG con la versión nueva)</text>
<path d="M1510,1278 L1544,1278" class="at" marker-end="url(#aAt)"/>
<rect x="1550" y="1258" width="170" height="40" rx="8" fill="#e8f5ec" stroke="#3d8a5a"/>
<text x="1635" y="1284" class="s" style="fill:#1e6b3a;font-weight:700" text-anchor="middle">sí → confirmada</text>
<path d="M1510,1306 L1544,1318" class="at" marker-end="url(#aAt)"/>
<rect x="1550" y="1306" width="388" height="40" rx="8" fill="#fdecec" stroke="#c62828"/>
<text x="1744" y="1332" class="s" style="fill:#a01d1d;font-weight:700" text-anchor="middle">no, o 3 reinicios → regresa a la anterior</text>
</g>
<text x="62" y="1384" class="t b"><tspan style="font-weight:700">Siempre:</tspan> DFU por USB en J11 (memoria de sistema del STM32, no se borra) → en el peor caso una visita, nunca una unidad inservible.</text>
<text x="62" y="1412" class="t b"><tspan style="font-weight:700">Nunca por aire:</tspan> firmware del F9P · app del 4G NTRIP Master (643 KB) · el propio bootloader.</text>
<text x="62" y="1440" class="t b"><tspan style="font-weight:700">Compuerta (D-22-6):</tspan> la imagen de fábrica de las 108 / 322 y de las 130 v6 lleva bootloader + receptor, y no se graba sin FOTA 4 aprobada en banco.</text>
<!-- leyenda -->
<g transform="translate(1110,1372)">
<path d="M0,8 L40,8" class="dn"/><text x="48" y="13" class="t xs">bajada (imagen)</text>
<path d="M170,8 L210,8" class="up"/><text x="218" y="13" class="t xs">subida (estado)</text>
<path d="M340,8 L380,8" class="at"/><text x="388" y="13" class="t xs">comandos AT / flujo</text>
<path d="M0,38 L40,38" class="no"/><text x="48" y="43" class="t xs">no existe</text>
<path d="M170,38 L210,38" class="exp"/><text x="218" y="43" class="t xs">experimento</text>
</g>
</g>
</svg>
</body></html>