DOOM corre en una placa embebida con ESP32-P4, y lo juega una inteligencia artificial que solo mira la pantalla, como lo haría una persona. El proyecto es de Andrea Ricci y usa la placa SCINTIX P4, con una pantalla MIPI-DSI de 7 pulgadas y un ESP32-C6 como coprocesador inalámbrico. El modelo de lenguaje Claude Sonnet controla el juego mediante una interfaz MCP y nunca accede al estado interno del motor.

La IA recibe lo mismo que tendría un jugador humano. Un abanico de 51 rayos de profundidad, los enemigos que están en su línea de visión y un mapa ASCII con las paredes que ya descubrió.

El resultado se parece bastante más a una partida humana. El modelo no sabe dónde están los demonios detrás de una pared ni qué hay en la sala siguiente. Tiene que explorar, recordar y equivocarse. Ese enfoque es el centro del proyecto, y todo el código fuente está en el repositorio de Andrea Ricci.

¿Cómo corre DOOM en el ESP32-P4?

El juego corre completo en la placa, con renderizado por software a 320×200. El acelerador de procesamiento de píxeles del ESP32-P4 (PPA, por Pixel Processing Accelerator) escala por hardware la imagen hasta 1024×600, la resolución de la pantalla. El escalado de cada cuadro baja de unos 24,5 ms con la CPU a cerca de 9 ms con el PPA.

El renderizador por software de DOOM tarda unos 25 ms por cuadro y el ciclo lógico del juego corre a 35 Hz (TICRATE). En la práctica la partida se mantiene cerca de los 30 cuadros por segundo.

La placa trae 32 MB de PSRAM y 32 MB de flash, con una partición SPIFFS de unos 12 MB para almacenamiento. La pantalla de 7 pulgadas va conectada por MIPI-DSI y la maneja el controlador ST7701S. Los efectos de sonido salen por el códec ES8311 vía I2S, con el reloj derivado de SCLK y el amplificador deshabilitado a través del expansor de E/S PI4IOE5V6408.

¿Cómo controla el modelo la partida?

El juego se expone mediante un servidor WebSocket en modo lockstep, o sea por turnos sincronizados. El modelo envía una acción, el juego avanza algunos ticks y devuelve una observación estructurada en JSON. Después se detiene y espera la acción siguiente.

Un servidor MCP (tools/doom_mcp_server.py) envuelve ese WebSocket y registra el juego como un conjunto de herramientas para clientes compatibles con MCP, como Claude Code. Las herramientas disponibles son estas.

  • observar
  • moverse
  • disparar
  • abrir
  • seleccionar arma
  • mapa

La observación que recibe el modelo se limita a lo que ve un jugador. Los 51 rayos de profundidad, los enemigos en línea de visión (nunca a través de las paredes), el mapa ASCII y pistas sobre puertas y bloqueos. El audio pasa por el códec ES8311 en la dirección I2C 0x18, y el expansor de E/S usa la dirección 0x43.

Entrada y configuración de Wi-Fi

La placa acepta entrada por USB, tanto teclado como gamepad. En el primer encendido se configura por Wi-Fi con un portal cautivo. El software usa ESP-IDF v5.5.x, doomgeneric, esp_hosted y las API del PPA.

El ESP32-C6 se encarga de la conectividad inalámbrica y el ESP32-P4 hace todo lo demás.