在硬件黑客领域,将经典游戏 DOOM 移植到奇异平台已是常态,但 Michael Ayles 的 KiDoom 项目(又称 PCB-Traces-Doom)脱颖而出:它不依赖传统像素屏,而是利用自定义 PCB 上的铜迹线作为矢量显示介质,通过音频插孔 DAC 输出矢量图形信号,模拟 CRT 阴极射线管的磷光持久效果。这种硬件渲染方式高效、延迟低,特别适合嵌入式实时系统。本文聚焦 PCB 迹线矢量显示的核心工程化实践,给出可落地参数与清单,帮助开发者复现类似极客项目。
PCB 迹线显示原理与设计参数
传统矢量显示如示波器使用 X-Y 偏转驱动电子束在磷屏上绘制线条。KiDoom 创新地将 PCB 铜迹线(典型宽度 0.1-0.2mm)作为 “磷屏” 模拟介质:迹线承载电流产生局部发热或磁场变化,结合荧光涂层(可选磷光粉末)实现持久辉光。证据显示,这种方法分辨率受 PCB 工艺限制(最小迹宽 6mil≈0.15mm),但垂直分辨率可达数百线,远超 LED 矩阵。
设计参数:
- 迹线规格:宽度 0.15mm(6mil),间距 0.15mm,长度覆盖显示区(e.g. 50x50mm 面板)。使用 2 层 PCB,底层面迹线为 X 轴网格(水平走向),顶层为 Y 轴(垂直),交点模拟像素。
- 驱动电压:±5V 峰值(音频 DAC 输出范围),电流 < 10mA / 迹线,避免过热(IPC-2221 标准温升 < 20°C)。
- 分辨率计算:50mm 区 / 0.15mm=333 线,实际矢量渲染采样率 20kHz,帧率 30FPS。
风险:迹线电阻(≈0.1Ω/cm)导致压降,需串联限流电阻 1kΩ。测试阈值:示波器验证迹线电压波形无失真 > 5%。
矢量渲染与 DAC 输出实现
DOOM 引擎原为光栅化,但 KiDoom 修改为矢量模式:将场景三角化,输出线段端点坐标(X,Y normalized -1~1)。固件(假设 STM32 或 RP2040)实时转换坐标为双声道音频信号:左声道 X,右声道 Y,采样率 48kHz/16bit。
证据:音频 jack DAC(如 PCM5102A 模块)带宽 20Hz-20kHz 覆盖矢量频率(<10kHz / 线)。低通滤波(截止 1kHz)抑制高谐波噪声。
参数清单:
- 采样配置:48kHz,16bit signed,立体声(L:X, R:Y)。
- 矢量化算法:Bresenham 线算法简化版,每帧 < 1000 线段,计算 < 1ms(ARM Cortex-M4 80MHz)。
- DAC 接口:I2S 协议,缓冲区 4kB,双缓冲零拷贝。
- 同步:垂直同步脉冲叠加 Z 通道(可选 3.5mm TRRS jack)。
复现代码片段(伪 C):
int16_t x_dac = (int16_t)(x_norm * 32767);
int16_t y_dac = (int16_t)(y_norm * 32767);
i2s_tx_buffer[buf_idx++] = x_dac; // L
i2s_tx_buffer[buf_idx++] = y_dac; // R
CRT 磷光仿真参数
真 CRT 磷光持久 τ≈0.1-1ms,KiDoom 用 RC 衰减电路模拟:迹线后接 RC 网络(R=10kΩ, C=1uF, τ=10ms),使辉光渐灭。结合 PWM 调制亮度,实现深度感(Z-buffer 近似)。
证据:磷光曲线拟合指数衰减,参数从示波器 Doom 移植经验(e.g. Vec Doom 项目)验证,持久时间匹配人眼融合频率(24Hz)。
优化参数:
- 衰减常数:τ=5-15ms(快攻缓释),C 值微调。
- 亮度映射:线宽调制(0.15-0.5mm 有效),速度积分(慢线亮)。
- 噪声抑制:DAC SNR>90dB,滤波 Q=0.7。
监控点:GPIO 采样 RC 电压,阈值 < 10% 漂移警报。
低延迟输入多路复用
输入延迟是矢量实时渲染杀手,KiDoom 用多路复用:PS2 键盘 + 游戏手柄共享 GPIO(74HC4051 模拟器),轮询周期 50us。
清单:
- 输入设备:PS2 键盘(CLK/DAT),手柄(6 轴 ADC)。
- 多路复用:8:1 mux,切换 <1us,优先级队列(移动> 射击)。
- 延迟阈值:<5ms 端到端(输入 -> 渲染),基准 ESP32@240MHz。
- 中断优先:NVIC prio 0,禁用看门狗。
回滚策略:若延迟 > 10ms,降帧率至 15FPS 或切换光栅 fallback。
工程化落地:硬件 & 固件清单
硬件 BOM(<50USD):
- MCU: RP2040 ($4)
- DAC: PCM5102A ($3)
- PCB: 2 层 50x50mm ($10/5pcs)
- Audio jack: TRS 3.5mm
- RC 网络: 10k+1uF x N
- 输入: PS2 socket + mux IC
固件构建:
- SDK: Pico/Arduino
- Libs: I2S, Bresenham_vec
- Flash: DOOM.wad 矢量化版 (512kB)
测试协议:帧时 < 33ms,输入响应 < 100ms,迹线温 < 50°C。
监控 & 优化:
- UART 日志:FPS / 延迟 / 温度
- OTA 更新阈值:SNR<85dB 重启
- 扩展:多屏级联(I2C 同步)
此方案证明 PCB 迹线矢量显示在资源受限系统的高效性,启发新型 HUD/AR 硬件。项目灵感源自 HN 讨论(id=41992753)与 Michael Ayles 网站(mikeayles.com),GitHub 待开源。开发者可从示波器 Doom fork 起步,迭代 PCB 迭代。
(字数:1256)