2026-03-03 10:20:49 +07:00
# Wokwi Libraries Integration
2026-03-05 04:41:49 +07:00
Este proyecto utiliza los repositorios oficiales de Wokwi clonados localmente, lo que permite mantenerlos actualizados y compatibles con las últimas versiones. Los repositorios locales alimentan tanto la emulación AVR como el sistema dinámico de componentes con 48+ elementos electrónicos.
2026-03-03 10:20:49 +07:00
## Repositorios Clonados
2026-03-05 05:16:00 +07:00
### wokwi-elements
2026-03-03 10:20:49 +07:00
- **Ubicación**: `wokwi-libs/wokwi-elements/`
2026-03-05 04:41:49 +07:00
- **Descripción**: Web Components (Lit) para 48+ elementos electrónicos (LEDs, resistencias, botones, LCDs, sensores, etc.)
2026-03-03 10:20:49 +07:00
- **Repositorio**: https://github.com/wokwi/wokwi-elements
- **Licencia**: MIT
2026-03-05 04:41:49 +07:00
- **Uso actual**: Renderizado visual de todos los componentes en el canvas de simulación. Un script de generación de metadata (`scripts/generate-component-metadata.ts`) parsea el código fuente TypeScript para descubrir automáticamente todos los componentes, sus propiedades y pines.
2026-03-03 10:20:49 +07:00
2026-03-05 05:16:00 +07:00
### avr8js
2026-03-03 10:20:49 +07:00
- **Ubicación**: `wokwi-libs/avr8js/`
2026-03-05 04:41:49 +07:00
- **Descripción**: Emulador completo de microcontroladores AVR8 (ATmega328p) en JavaScript
2026-03-03 10:20:49 +07:00
- **Repositorio**: https://github.com/wokwi/avr8js
- **Licencia**: MIT
2026-03-05 04:41:49 +07:00
- **Uso actual**: Emulación real del CPU a 16MHz, con Timer0/1/2, USART, ADC, y puertos GPIO (PORTB/C/D). Ejecuta ~267,000 ciclos por frame a ~60fps.
2026-03-03 10:20:49 +07:00
2026-03-05 05:16:00 +07:00
### rp2040js
2026-03-03 10:20:49 +07:00
- **Ubicación**: `wokwi-libs/rp2040js/`
- **Descripción**: Emulador de Raspberry Pi Pico (RP2040) en JavaScript
- **Repositorio**: https://github.com/wokwi/rp2040js
- **Licencia**: MIT
2026-03-05 04:41:49 +07:00
- **Uso**: Clonado para futuro soporte de Raspberry Pi Pico
2026-03-03 10:20:49 +07:00
2026-03-05 05:16:00 +07:00
### wokwi-features
2026-03-03 10:20:49 +07:00
- **Ubicación**: `wokwi-libs/wokwi-features/`
- **Descripción**: Documentación y tracking de features de Wokwi
- **Repositorio**: https://github.com/wokwi/wokwi-features
## Configuración del Proyecto
### Frontend (Vite)
2026-03-05 04:41:49 +07:00
El archivo `frontend/vite.config.ts` está configurado para usar los repositorios locales mediante aliases:
2026-03-03 10:20:49 +07:00
```typescript
resolve: {
alias: {
'avr8js': path.resolve(__dirname, '../wokwi-libs/avr8js/dist/esm'),
'@wokwi/elements': path.resolve(__dirname, '../wokwi-libs/wokwi-elements/dist/esm'),
},
2026-03-05 04:41:49 +07:00
},
optimizeDeps: {
include: ['avr8js', '@wokwi/elements'],
2026-03-03 10:20:49 +07:00
}
```
2026-03-05 04:41:49 +07:00
El archivo `frontend/package.json` referencia los paquetes locales:
2026-03-03 10:20:49 +07:00
```json
{
"dependencies": {
"@wokwi/elements": "file:../wokwi-libs/wokwi-elements",
"avr8js": "file:../wokwi-libs/avr8js"
}
}
```
2026-03-05 04:41:49 +07:00
### Generación Automática de Metadata
El script `scripts/generate-component-metadata.ts` parsea el código fuente de wokwi-elements usando AST de TypeScript para extraer:
- Nombre del tag (`@customElement('wokwi-led')` → `wokwi-led` )
- Propiedades (`@property()` decorators → tipo, valor por defecto)
- Cantidad de pines
- Categoría, descripción y tags
El resultado se almacena en `frontend/public/components-metadata.json` y es consumido por el `ComponentRegistry` en tiempo de ejecución.
2026-03-03 10:20:49 +07:00
## Actualizar las Librerías de Wokwi
Para mantener tu proyecto actualizado con las últimas versiones de Wokwi:
### Opción 1: Actualizar todas las librerías (Recomendado)
```bash
# Script para actualizar todos los repositorios
2026-03-05 04:41:49 +07:00
update-wokwi-libs.bat
2026-03-03 10:20:49 +07:00
```
### Opción 2: Actualizar manualmente cada repositorio
```bash
2026-03-05 04:41:49 +07:00
cd wokwi-libs
2026-03-03 10:20:49 +07:00
# Actualizar wokwi-elements
cd wokwi-elements
git pull origin main
npm install
npm run build
# Actualizar avr8js
cd ../avr8js
git pull origin main
npm install
npm run build
# Actualizar rp2040js
cd ../rp2040js
git pull origin main
npm install
npm run build
```
### Opción 3: Actualizar a una versión específica
```bash
2026-03-05 04:41:49 +07:00
cd wokwi-libs/wokwi-elements
2026-03-03 10:20:49 +07:00
# Ver versiones disponibles
git tag -l
# Cambiar a una versión específica
git checkout v1.9.2
# Recompilar
npm install
npm run build
```
2026-03-05 04:41:49 +07:00
### Después de Actualizar wokwi-elements
Si actualizaste wokwi-elements, regenera la metadata de componentes para que nuevos componentes aparezcan en la UI:
```bash
cd frontend
npx tsx ../scripts/generate-component-metadata.ts
```
2026-03-03 10:20:49 +07:00
## Script de Actualización Automática
2026-03-05 04:41:49 +07:00
El script `update-wokwi-libs.bat` facilita las actualizaciones:
2026-03-03 10:20:49 +07:00
```batch
@echo off
echo ========================================
echo Actualizando Wokwi Libraries
echo ========================================
cd wokwi-libs
echo [1/3] Actualizando wokwi-elements...
cd wokwi-elements
git pull origin main
npm install
npm run build
cd ..
echo [2/3] Actualizando avr8js...
cd avr8js
git pull origin main
npm install
npm run build
cd ..
echo [3/3] Actualizando rp2040js...
cd rp2040js
git pull origin main
npm install
npm run build
cd ..
echo ========================================
echo Actualizacion completada!
echo ========================================
pause
```
2026-03-05 04:41:49 +07:00
## Cómo Se Usan las Librerías
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
### avr8js — Emulación AVR
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
El `AVRSimulator` (`frontend/src/simulation/AVRSimulator.ts`) usa avr8js para crear:
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
```typescript
import { CPU, avrInstruction, AVRTimer, AVRUSART, AVRADC, AVRIOPort } from 'avr8js';
// CPU ATmega328p a 16MHz
const cpu = new CPU(programMemory);
// Periféricos
const timer0 = new AVRTimer(cpu, timer0Config);
const timer1 = new AVRTimer(cpu, timer1Config);
const timer2 = new AVRTimer(cpu, timer2Config);
const usart = new AVRUSART(cpu, usart0Config, CLOCK);
const adc = new AVRADC(cpu, adcConfig);
const portB = new AVRIOPort(cpu, portBConfig); // pins 8-13
const portC = new AVRIOPort(cpu, portCConfig); // A0-A5
const portD = new AVRIOPort(cpu, portDConfig); // pins 0-7
// Loop de simulación (~60fps)
function runFrame() {
const cyclesToRun = Math.floor(267000 * speed);
for (let i = 0; i < cyclesToRun ; i + + ) {
avrInstruction(cpu); // Ejecuta instrucción AVR
cpu.tick(); // Actualiza periféricos
}
requestAnimationFrame(runFrame);
}
```
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
### wokwi-elements — Componentes Visuales
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
Los componentes se renderizan de dos formas:
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
**1. DynamicComponent (sistema actual — 48 componentes)**
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
```typescript
import { ComponentRegistry } from './services/ComponentRegistry';
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
// Carga metadata desde /components-metadata.json
const registry = ComponentRegistry.getInstance();
const metadata = registry.getById('led');
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
// DynamicComponent crea el web component dinámicamente
// document.createElement(metadata.tagName) → < wokwi-led >
// Sincroniza propiedades React → web component
// Extrae pinInfo del DOM para wire connections
```
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
**2. React wrappers legacy (5 componentes)**
2026-03-03 10:20:49 +07:00
```tsx
2026-03-05 04:41:49 +07:00
// ArduinoUno.tsx — sigue en uso activo para el board principal
< wokwi-arduino-uno ref = {ref} led13 = {led13} / >
2026-03-03 10:20:49 +07:00
```
2026-03-05 04:41:49 +07:00
### PartSimulationRegistry — Comportamientos de Simulación
16 partes tienen lógica de simulación registrada que conecta los web components con el emulador AVR:
| Parte | Tipo | Comportamiento |
|-------|------|----------------|
| `led` | Output | Pin state → `element.value` |
| `rgb-led` | Output | Digital + PWM en R/G/B |
| `led-bar-graph` | Output | 10 LEDs independientes |
| `7segment` | Output | 8 segmentos (A-G + DP) |
| `pushbutton` | Input | Press/release → `setPinState()` |
| `pushbutton-6mm` | Input | Mismo que pushbutton |
| `slide-switch` | Input | Change event → pin state |
| `dip-switch-8` | Input | 8 switches independientes |
| `potentiometer` | Input | Valor → voltaje ADC |
| `slide-potentiometer` | Input | Misma lógica por SIG/OUT |
| `photoresistor-sensor` | Input/Output | Voltaje analógico + LED digital |
| `analog-joystick` | Input | VRX/VRY (ADC) + SW (digital) |
| `servo` | Output | Registros OCR1A/ICR1 → ángulo 0-180° |
| `buzzer` | Output | Web Audio API + Timer2 |
| `lcd1602` | Output | Protocolo HD44780 4-bit completo (16× 2) |
| `lcd2004` | Output | Protocolo HD44780 4-bit completo (20× 4) |
## Componentes Wokwi Disponibles (48)
### Boards (4)
- `wokwi-arduino-uno` — Arduino Uno R3
- `wokwi-arduino-mega` — Arduino Mega 2560
- `wokwi-arduino-nano` — Arduino Nano
- `wokwi-esp32-devkit-v1` — ESP32 DevKit v1
### Sensors (6)
- `wokwi-dht22` — Temperatura y humedad
- `wokwi-hc-sr04` — Ultrasónico de distancia
- `wokwi-pir-motion-sensor` — Sensor de movimiento PIR
- `wokwi-photoresistor-sensor` — Fotoresistor (LDR)
- `wokwi-ntc-temperature-sensor` — Sensor NTC
- `wokwi-analog-joystick` — Joystick analógico
### Displays (3)
- `wokwi-lcd1602` — LCD 16x2 con protocolo HD44780
- `wokwi-lcd2004` — LCD 20x4 con protocolo HD44780
- `wokwi-7segment` — Display de 7 segmentos
### Input (5)
- `wokwi-pushbutton` — Botón pulsador
- `wokwi-pushbutton-6mm` — Botón 6mm
- `wokwi-slide-switch` — Interruptor deslizante
- `wokwi-dip-switch-8` — DIP switch de 8 posiciones
- `wokwi-potentiometer` — Potenciómetro
### Output (5)
- `wokwi-led` — LED de colores
- `wokwi-rgb-led` — LED RGB
- `wokwi-led-bar-graph` — Barra de LEDs (10)
- `wokwi-buzzer` — Buzzer piezoeléctrico
- `wokwi-neopixel` — LED RGB direccionable (WS2812)
### Motors (2)
- `wokwi-servo` — Servo motor
- `wokwi-stepper-motor` — Motor paso a paso
### Passive (4)
- `wokwi-resistor` — Resistencia con código de colores
- `wokwi-slide-potentiometer` — Potenciómetro deslizante
- `wokwi-led-ring` — Anillo de LEDs
- `wokwi-membrane-keypad` — Teclado matricial
### Other (19)
- Componentes variados incluyendo `wokwi-ir-receiver` , `wokwi-ds1307` , breadboards, etc.
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
## Ventajas de Este Enfoque
2026-03-03 10:20:49 +07:00
2026-03-05 05:16:00 +07:00
### Ventajas
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
1. **Actualización Fácil** : Un simple `git pull` + rebuild te da las últimas mejoras
2. **Compatible con Wokwi** : Usas exactamente el mismo código que Wokwi.com
3. **Descubrimiento Automático** : Nuevos componentes aparecen automáticamente tras regenerar metadata
4. **Control de Versiones** : Puedes hacer checkout a versiones específicas
5. **Desarrollo Flexible** : Código fuente disponible para debugging y modificaciones
6. **Sin Dependencia de npm** : No dependes de que publiquen actualizaciones en npm
7. **100% Offline** : Funciona completamente sin internet después de la configuración inicial
2026-03-03 10:20:49 +07:00
2026-03-05 05:16:00 +07:00
### Consideraciones
2026-03-05 04:41:49 +07:00
1. **Espacio en Disco** : Los repositorios clonados ocupan más espacio (~200MB)
2. **Compilación** : Debes compilar los repositorios después de actualizarlos
3. **Metadata** : Regenerar `components-metadata.json` después de actualizar wokwi-elements
2026-03-03 10:20:49 +07:00
## Troubleshooting
### Error: "Module not found: @wokwi/elements"
2026-03-05 04:41:49 +07:00
Asegúrate de que wokwi-elements esté compilado:
2026-03-03 10:20:49 +07:00
```bash
cd wokwi-libs/wokwi-elements
npm install
npm run build
```
### Error: "Cannot find module 'avr8js'"
2026-03-05 04:41:49 +07:00
Verifica que el alias en `vite.config.ts` esté correcto y que avr8js esté compilado:
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
```bash
cd wokwi-libs/avr8js
npm install
npm run build
```
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
### Los componentes no se muestran en el picker
2026-03-03 10:20:49 +07:00
2026-03-05 04:41:49 +07:00
Regenera la metadata de componentes:
```bash
cd frontend
npx tsx ../scripts/generate-component-metadata.ts
2026-03-03 10:20:49 +07:00
```
2026-03-05 04:41:49 +07:00
### Nuevo componente de wokwi-elements no aparece
1. Actualiza wokwi-elements: `cd wokwi-libs/wokwi-elements && git pull && npm run build`
2. Regenera metadata: `cd frontend && npx tsx ../scripts/generate-component-metadata.ts`
3. Si necesita simulación, registra su comportamiento en `frontend/src/simulation/parts/`
### Los componentes se ven pero no responden a la simulación
Verifica que el componente tenga lógica de simulación registrada en `PartSimulationRegistry` (archivos `BasicParts.ts` o `ComplexParts.ts` ). Solo los 16 componentes registrados tienen comportamiento interactivo.
2026-03-03 10:20:49 +07:00
## Referencias
- [Wokwi Elements Documentation ](https://elements.wokwi.com/ )
2026-03-05 04:41:49 +07:00
- [AVR8js Repository ](https://github.com/wokwi/avr8js )
2026-03-03 10:20:49 +07:00
- [Wokwi Simulator ](https://wokwi.com )
2026-03-05 04:41:49 +07:00
- [Lit Documentation ](https://lit.dev/ ) — Framework usado por wokwi-elements
2026-03-03 10:20:49 +07:00
- [Web Components Guide ](https://developer.mozilla.org/en-US/docs/Web/Web_Components )