8.6 KiB
Fase 10 — Electromecánica + ICs integrados
Destino:
frontend/src/simulation/spice/componentToSpice.ts,frontend/src/simulation/parts/,scripts/component-overrides.json,frontend/src/components/components-wokwi/. Pre-requisito leído:phase_9_component_catalog_expansion.md(completada). Meta: cubrir los componentes que quedaban fuera del catálogo analógico puro — electromecánicos (relé), aislamiento óptico (optoacopladores), packaging de lógica combinacional (74HC series) y electromecánica compleja (driver de motores).
0. Resumen ejecutivo
| Alcance | 5 familias nuevas: relé electromecánico, optoacopladores, 74HC logic ICs, flip-flops, driver de motor L293D |
| Componentes nuevos | ≈ 10 (1 relé + 2 optos + 5 ICs 74HC + 3 flip-flops + L293D) |
| Patrón arquitectónico nuevo | Mappers SPICE que emiten varias B-sources / .subckt por componente (primera vez en el proyecto — hasta fase 9 cada mapper emitía una device card) |
| Limitación conocida | Flip-flops solo en digital-sim: SPICE no puede hacer edge detection sin ddt() en .op — se documenta y se añade en digital-sim layer únicamente |
| Validación | Tests de electrical-mode en test/test_circuit/test/ + tests de digital-sim en frontend/src/__tests__/ |
1. Componentes
1.1 Relé electromecánico (5-pin SPDT)
Pins: COIL+, COIL-, COM (común), NO (normalmente abierto), NC (normalmente cerrado).
Modelo SPICE:
* Coil: resistencia + inductancia con diodo flyback integrado
R_coil COIL+ COIL- 70
L_coil COIL+ COIL- 20m
D_fly COIL- COIL+ D1N4148 ; flyback integrado (opcional por propiedad)
* Contactos: conmutados por el voltaje de la bobina
.model RELAY_SW SW(Vt=3 Vh=0.5 Ron=0.05 Roff=1G)
S_no COM NO COIL+ COIL- RELAY_SW off
S_nc COM NC COIL+ COIL- RELAY_SW
El switch S de ngspice tiene histéresis nativa vía Vt / Vh — esto evita oscilación cuando V(COIL) cruza el umbral.
Propiedades expuestas:
coil_voltage(V) — voltaje nominal de activación (5V, 12V, 24V)coil_resistance(Ω) — afecta corriente requeridainclude_flyback(bool) — si se incluye el diodo integrado
1.2 Optoacopladores (4N25, PC817)
Pins: AN (anodo LED), CAT (cátodo LED), COL (colector phototransistor), EMIT (emisor).
Modelo SPICE:
* LED del optoacoplador (IR, Vf ≈ 1.2V)
D_led AN _led_mid DLED_OPTO
V_sense _led_mid CAT DC 0 ; 0V para medir I_LED
* Phototransistor: CCCS con CTR (Current Transfer Ratio)
F_pt COL EMIT V_sense ${CTR}
* Saturación del phototransistor: limita I_C a ~50 mA
R_pt_leak COL EMIT 100Meg
.model DLED_OPTO D(Is=1e-14 N=2 Rs=5)
- 4N25: CTR = 0.5 (50%)
- PC817: CTR = 1.0 (100%, rangos 80–600% típicos)
1.3 74HC logic ICs
Primer caso de "un componente = múltiples gates en un package de 14 pines".
| IC | Contenido | Pins (1..14) |
|---|---|---|
ic-74hc00 |
4× NAND 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
ic-74hc04 |
6× NOT | 1A,1Y,2A,2Y,3A,3Y,GND,4Y,4A,5Y,5A,6Y,6A,VCC |
ic-74hc08 |
4× AND 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
ic-74hc32 |
4× OR 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
ic-74hc14 |
6× Schmitt NOT | 1A,1Y,2A,2Y,3A,3Y,GND,4Y,4A,5Y,5A,6Y,6A,VCC |
Mapper emite 4 o 6 tarjetas B-source (una por gate) reutilizando las expresiones de fase 9.1:
B_${id}_1 1Y 0 V = Vcc * (1 - u(V(1A)-T)*u(V(1B)-T))
R_${id}_1_load 1Y 0 1Meg
B_${id}_2 2Y 0 V = ...
... (3 más)
El Schmitt (74HC14) añade histéresis: umbral rising = 0.6·Vcc, falling = 0.4·Vcc. Implementado con una resistencia de realimentación al input:
B_${id}_1 1Y 0 V = Vcc * (1 - u(V(1A) - (V(1Y) > Vcc/2 ? 0.4*Vcc : 0.6*Vcc)))
1.4 Flip-flops (digital-sim only)
Pins (D-FF): D, CLK, Q, Qbar
Pins (JK-FF): J, K, CLK, Q, Qbar
Pins (T-FF): T, CLK, Q, Qbar
Edge detection requiere comparar el estado previo del CLK contra el actual. En PartSimulationRegistry:
register('flip-flop-d', {
attachEvents: (element, simulator, getPin) => {
let prevClk = false;
let q = false;
const pinCLK = getPin('CLK');
const pinD = getPin('D');
const pinQ = getPin('Q');
const pinQbar = getPin('Qbar');
// ... listeners detect rising edge of CLK → sample D into Q
},
});
SPICE: NO se implementa mapper para FFs — edge detection en .op no es posible y .tran con sample-and-hold requeriría ddt() / sistemas más complejos. Los usuarios que necesiten FFs reales usan ICs como 74HC74 (más adelante, fase 11).
1.5 L293D motor driver dual H-bridge
Pins (16, pero funcional: 8 por canal): EN1, IN1, IN2, OUT1, OUT2, EN2, IN3, IN4, OUT3, OUT4, VCC1 (lógica), VCC2 (motor), GND.1..GND.4.
Modelo SPICE (por canal):
* Canal 1: si EN1 HIGH, OUT1 sigue a IN1 (HIGH/LOW) con V = Vcc2
B_${id}_ch1a OUT1 0 V = u(V(EN1)-Vcc/2) * (u(V(IN1)-Vcc/2) * Vcc2 + (1-u(V(IN1)-Vcc/2))*0)
B_${id}_ch1b OUT2 0 V = u(V(EN1)-Vcc/2) * (u(V(IN2)-Vcc/2) * Vcc2 + (1-u(V(IN2)-Vcc/2))*0)
R_ch1a_load OUT1 0 1Meg
R_ch1b_load OUT2 0 1Meg
Cuando EN = LOW, los outputs flotan (alta impedancia) — representado con una resistencia débil a tierra.
2. Plan de ejecución
Fase 10.1 — Relé (1 día)
- Mapper SPICE emite 5 cartas (R_coil, L_coil, D_fly opcional, 2× S switch).
- Web Component: dibujo schematic con bobina + contactos NC/NO.
- Metadata: pinCount=5, categoría
electromech(categoría nueva). - Añadir
'electromech'aComponentCategoryydisplayNames. - Tests sandbox: (a) relé en reposo (contactos NC cerrados), (b) relé energizado (contactos NO cerrados), (c) histéresis (V_COIL justo debajo del threshold no activa).
Fase 10.2 — Optoacopladores (1 día)
- Mapper SPICE: diodo LED + V-sense + F-source con CTR.
- Web Component: DIP-4 con divisor visual entre LED y phototransistor.
- Metadata: 4N25 y PC817, categoría
analog. - Tests: (a) LED off → I_C ≈ 0, (b) LED forward biased → I_C ≈ CTR · I_LED.
Fase 10.3 — 74HC ICs (2 días)
- Mapper emite 4 (o 6 para 74HC04/14) B-sources.
- Web Component: rectángulo DIP-14 con label del part number.
- Metadata: 5 ICs nuevos, categoría
logic. - Tests: truth table completa para cada gate del package.
Fase 10.4 — Flip-flops (1 día)
- Helper genérico
edgeTriggeredFF(inputsLogic)enLogicGateParts.ts. - Registrar
flip-flop-d,flip-flop-jk,flip-flop-t. - Web Component: rectángulo con inputs en la izquierda, Q/Qbar a la derecha, triángulo de clock inverter en CLK.
- Metadata: pinCount según tipo.
- Tests digital-sim: secuencia de CLK pulses + verificar transiciones de Q.
Fase 10.5 — L293D (1–2 días)
- Mapper emite 4 B-sources + 4 pull-downs (1 por output).
- Web Component: DIP-16 con labels.
- Metadata: pinCount=16.
- Tests: (a) EN=LOW → outputs en alta-Z, (b) EN=HIGH, IN=HIGH → OUT a V_motor, (c) combinaciones forward/reverse/brake.
3. Criterios de aceptación
- Cada mapper nuevo pasa un test
.open < 1 s (el test de componentToSpice "minimal fixtures" incluye todos). - Cada componente tiene entrada en
_customComponentsconcategoryválida. - 74HC00 (4-NAND) produce la truth table correcta para LOS CUATRO gates en el mismo test.
- Relay S-switch histéresis verificada: V_COIL en banda muerta no cambia estado.
- Flip-flop D dispara solo en rising edge — test inyecta un level-HIGH sostenido de D y verifica que Q cambia sólo al próximo CLK edge.
- 0 errores
tsc --noEmiten los nuevos archivos. npm testsandbox y frontend pasan con los nuevos tests.
4. Out-of-scope
- 74HC74 (D-FF real en IC): se hará como subcircuit de 2× FF en fase 11.
- Audio-capable opamps (NE5532, OPA1612): fase 11 o fase 12.
- Motor con back-EMF / modelado mecánico: se queda como
RLestático — modelo mecánico completo (J · dω/dt = k·I − τ_load) excede el alcance del simulador eléctrico. - Contactores / SSR (solid-state relays): variantes del relé básico; se añadirán si hay demanda.
5. Referencias
phase_9_component_catalog_expansion.md— fase previaautosearch/05_velxio_component_inventory.md— gap analysisautosearch/06_ngspice_convergence.md— gotchas conocidos- ngspice manual §B.4 "S-switch" (histéresis Vt/Vh)
- ngspice manual §B.2 "F-source" (CCCS para optoacopladores)