velxio/frontend/esp32 plan.md

4.9 KiB

Por qué no existe un avr8js para ESP32?

El problema de la arquitectura Xtensa

avr8js funciona porque AVR es una arquitectura abierta, simple y bien documentada (instrucciones de 16-bit, ~130 opcodes, spec pública). Se implementó en ~3.500 líneas de TypeScript.

La arquitectura Xtensa LX6/LX7 (ESP32/S3) es radicalmente diferente:

  • Propiedad de Cadence Design Systems — no hay especificación pública completa
  • VLIW configurable — instrucciones de 16, 24 o 32 bits mezcladas
  • ISA personalizable — cada vendor puede añadir extensiones (Espressif tiene la suya)
  • Cadence vende el simulador oficial (xt-run) por miles de dólares/año

Implementar un emulador Xtensa open-source limpio legalmente es extremadamente difícil. Por eso no existe un paquete npm equivalente a avr8js.


Lo que sí existe

  1. El propio Wokwi — propietario y cerrado

El Wokwi real (que este proyecto clona) sí tiene un emulador ESP32 en WASM, pero es 100% propietario y cerrado. Su fundador Uri Shaked publicó avr8js como open source, pero el emulador Xtensa nunca lo hizo. Es el núcleo comercial de su negocio.

  1. ESP32-C3: sí hay camino en JS (RISC-V)

El ESP32-C3 usa RISC-V rv32imc — arquitectura completamente abierta. Existen emuladores RISC-V en JS/WASM:

┌────────────────────────────────────────┬─────────────────────────┬──────────────────────┐ │ Proyecto │ Tipo │ Estado │ ├────────────────────────────────────────┼─────────────────────────┼──────────────────────┤ │ https://github.com/cnlohr/mini-rv32ima │ C, compilable a WASM │ Activo, ~1000 líneas │ ├────────────────────────────────────────┼─────────────────────────┼──────────────────────┤ │ https://github.com/cnlohr/espwebc3 │ In-browser IDE ESP32-C3 │ Experimental │ ├────────────────────────────────────────┼─────────────────────────┼──────────────────────┤ │ RISC-V en Wokwi │ Propietario │ Sí funciona │ └────────────────────────────────────────┴─────────────────────────┴──────────────────────┘

  1. HackCable — el más cercano a lo que buscas

https://github.com/ClementGre/HackCable — TypeScript + Webpack, usa avr8js para Arduino y tiene soporte ESP32 parcial. Pero está abandonado y el ESP32 no tiene emulación real de CPU.

  1. esp32-machine-emulator — Python, no JS

https://github.com/tflander/esp32-machine-emulator — emula GPIO/UART de MicroPython sobre ESP32, pero en Python puro. No sirve para firmware Arduino compilado.


Resumen realista de opciones

ESP32 (Xtensa LX6) en JS/WASM: ├── Open source: NO EXISTE ├── Propietario: Wokwi (cerrado) └── Posible hacerlo: MUY difícil (ISA propietaria)

ESP32-C3 (RISC-V rv32imc) en JS/WASM: ├── mini-rv32ima compilado a WASM: POSIBLE ├── Periféricos (GPIO, UART): habría que implementarlos └── Esfuerzo: mediano (similar a rp2040js pero para C3)

Vía QEMU (lcgamboa) con bridge Python↔WS: ├── ESP32 + C3: VIABLE ├── GPIO real: SÍ (con callbacks) └── Arquitectura: nativa servidor, no browser


Recomendación práctica para este proyecto

La única ruta open-source viable que da emulación ESP32 real con GPIO en el browser hoy es compilar QEMU (lcgamboa fork) a WASM. Emscripten puede compilar QEMU a WASM — de hecho es lo que hace Wokwi internamente para algunos targets. El repositorio https://github.com/copy/v86 demuestra que QEMU→WASM es factible. Pero es un proyecto de meses.

Para el corto plazo, la integración más pragmática sigue siendo lcgamboa como proceso servidor + WebSocket bridge descrita antes.


Sources: