velxio/test/test_circuit/autosearch/03_gaps_and_ideas.md

66 lines
3.4 KiB
Markdown
Raw Normal View History

feat: electrical simulation via ngspice-WASM (eecircuit-engine) Adds full SPICE-accurate electrical simulation to Velxio, behind a lazy- loaded ⚡ toolbar toggle. Arduino / ESP32 / RP2040 sketches now co-simulate with real analog behaviour: correct voltages on wires, real I–V curves on LEDs, working potentiometers, NTC thermistors read by analogRead(), PWM driving RC filters, transistors, op-amps, diodes, MOSFETs, etc. Engine: eecircuit-engine (ngspice compiled to WebAssembly). Main bundle stays at 2.4 MB; the 20 MB SPICE chunk only loads when the user activates electrical mode. Disabled at build time via VITE_ELECTRICAL_SIM=false. Frontend additions: - simulation/spice/: SpiceEngine wrapper + lazy entry, NetlistBuilder with UnionFind over wires, componentToSpice mapping (24 metadataIds incl. real part numbers: 2N2222, 2N3055, BC547, IRF540, 2N7000, 1N4148, 1N4007, 1N4733, LEDs, NTC, op-amp ideal), CircuitScheduler with debounced coalescing, AVRSpiceBridge for quasi-static co-simulation. - store/useElectricalStore: Zustand slice, feature-flag aware. - components/analog-ui/: ⚡ toolbar toggle + SVG voltage overlay. - components/components-instruments/: Voltmeter, Ammeter probes. - 62 tests (spice-*, netlist-builder, component-to-spice, instruments). Sandbox (test/test_circuit/): 47-test validation sandbox that proved the approach (hand-rolled MNA baseline + ngspice pipeline) before porting to the app. Kept as reference. Docs: docs/wiki/circuit-emulation-*.md (13 engineering pages covering architecture, solvers, components, AVR bridge, gotchas, performance, integration plan, API reference, appendix) + electrical-simulation- user-guide.md (end-user facing). Reference plan: test/test_circuit/plan/phase_8_velxio_implementation.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 19:11:54 +07:00
# Gaps identificados y posibles mejoras
## Modelado físico
- **Inductor**: trapezoidal companion model (`G = 2L/dt, Ieq = -V_prev/G - I_prev`). Requiere tracking de corriente por inductor entre pasos. Útil para motor back-EMF, filtros LC.
- **MOSFET**: modelo Shichman-Hodges nivel-1 (`Id = k·(Vgs-Vth)²·(1+λ·Vds)` en saturación). ~50 líneas. Útil para H-bridges, drivers de motor.
- **Op-amp ideal**: fuente controlada con `A_vol ≈ 1e6`; se estampa como fuente de voltaje dependiente de la diferencia de entrada.
- **Zener**: Shockley con breakdown en `-Vz`. Útil para protección / regulación.
- **Modelo térmico** del LED: brillo saturado a `I_rated` puede extenderse con curva de eficiencia luminosa.
## Del solver
- **AC / análisis de frecuencia**: reemplazar conductancias reales por complejas. `jωC`, `jωL`. Útil para filtros y osciladores.
- **Newton con continuación de fuente** (source stepping): para circuitos donde Newton no converge, rampear `V_supply` de 0 al valor final en 10 pasos.
- **GMIN stepping**: empezar con `GMIN` grande (1e-3) y reducirlo iterativamente. Truco clásico de SPICE para mejorar convergencia.
- **Matriz dispersa**: para > 50 nodos, cambiar a sparse CSR (librería `mathjs` o nativa). No urgente; nuestros circuitos son pequeños.
## Integración Velxio
### 1. Parseo automático de `useSimulatorStore.wires[]` → `Circuit`
```typescript
function buildCircuit(components: Component[], wires: Wire[]): Circuit {
const unionFind = new UnionFind();
wires.forEach(w => {
const from = `${w.start.componentId}:${w.start.pinName}`;
const to = `${w.end.componentId}:${w.end.pinName}`;
unionFind.union(from, to);
});
// pin canónico GND / VCC → colapsar a 'gnd' / 'vcc'
// Emitir Circuit correspondiente con los stamps apropiados por componente
}
```
### 2. `metadataId` → clase del solver
```typescript
const componentFactory: Record<string, (id, pins, props) => SolverComponent> = {
'resistor': (id, pins, props) => new Resistor(id, pins[0], pins[1], parseFloat(props.resistance)),
'led': (id, pins, props) => new LED(id, pins[0], pins[1], props.color),
'capacitor': (id, pins, props) => new Capacitor(id, pins[0], pins[1], parseFloat(props.capacitance)),
'ntc-temperature-sensor': (id, pins, props) => new NTCThermistor(id, pins[0], pins[1], { R0: ..., beta: ... }),
// ...
};
```
### 3. UI
- Toggle **"⚡ Voltajes"** en toolbar → overlay SVG con V de cada nodo.
- Panel lateral con tabla `nodo | V | I`.
- Warning: si el solver no converge (`state.converged === false`) mostrar banner naranja.
## Tests que faltaría añadir
- `transient_rlc.test.js` — oscilador LC amortiguado
- `opamp.test.js` — inverting, non-inverting, buffer
- `voltage_regulator.test.js` — zener + R de balasto
- `pwm_rc_filter.test.js` — PWM → RC → salida DC filtrada (ripple real)
- `debounce.test.js` — botón con RC de debounce → AVR detecta pulsación única
## Riesgos conocidos
1. **MNA no maneja bien bucles de fuentes de voltaje sin impedancia**: p.ej. dos V-source en paralelo → matriz singular. Mitigable añadiendo `GMIN` en diagonal (ya hecho) o detección/advertencia al usuario.
2. **Precisión del modelo BJT**: el simplified Ebers-Moll no captura bien la saturación profunda. Para tests didácticos basta; para diseño real se necesitaría Gummel-Poon.
3. **PWM cuasi-estático**: el brillo del LED es el promedio, no modela ripple ni la frecuencia de PWM audible.