1. 项目缘起:为什么在2021年复刻一台GameBoy示波器?
你可能觉得奇怪,都2021年了,示波器从模拟到数字,从台式到手持,甚至直接用电脑声卡或手机APP都能凑合看波形,为什么还要折腾一台基于二十年前老杂志(Elektor 2000年10月刊)设计的、用任天堂GameBoy当显示器的数字采样示波器(GBDSO)?这事儿听起来就带着一股“复古硬核”的酸爽味儿。但对我来说,理由简单得有点幼稚:自从几年前偶然在网上看到Steve Willis的这个设计,我心里就种了草,那种将经典游戏硬件“废物利用”成专业测试仪器的巧妙构思,一直让我念念不忘。所以,与其一直惦记,不如动手把它做出来。
当然,这不只是情怀。在动手之前,我仔细盘算过:第一是成本,全套物料算下来不到40欧元,这价格在如今的测试仪器市场连个像样的探头都买不到。第二是教育意义,这个项目麻雀虽小五脏俱全,涉及模拟前端调理、ADC采样、单片机控制、与老旧游戏机的通信协议,是一个绝佳的、贯穿硬件与底层软件的嵌入式系统学习案例。第三是独特的便携性与体验,用五号电池供电,能连续工作5小时,揣口袋里就能走,那块低分辨率但极具特色的绿色液晶屏,显示波形时有种别样的赛博朋克美感。
所以,这个项目就成了。我不仅复刻了它,还修复了原设计因年代久远导致的部分元器件采购问题,优化了PCB布局,甚至增加了一个原版没有的“在线编程ROM”的小功能。最终,所有的设计文件、源码、物料清单和详细的搭建指南,我都开源在了GitHub上。下面,我就把这台“古董级”数字示波器从原理到实作的方方面面,为你彻底拆解清楚。
2. 核心设计解析:GameBoy如何变身示波器?
要理解GBDSO,我们得先抛开现代示波器复杂的菜单和高速处理器,回到一个更本质的问题:示波器的核心任务是什么?是捕获电压随时间的变化并将其显示出来。GBDSO巧妙地分解了这个任务,并由两个主要部分协同完成:一个定制的、负责信号采集与处理的硬件采集盒,以及一台负责图形显示和用户交互的原版任天堂GameBoy。
2.1 系统架构与分工
整个系统的架构可以看作一个经典的“采集-处理-显示”流水线,但处理环节被极大地简化了。
硬件采集盒(核心):
- 模拟前端:负责接收外部信号。包括输入耦合选择(AC/DC)、衰减/放大(实现50mV/div到10V/div的量程)、以及阻抗匹配(1MΩ输入阻抗,与标准示波器探头兼容)。这部分主要依靠运放电路实现。
- 采样与量化:使用一颗ADC(模数转换器)以最高1Msps(每秒百万次采样)的速度,将连续的模拟电压转换为离散的数字值。这是实现“数字采样”的关键。
- 逻辑控制与缓存:使用一颗单片机(或类似的逻辑器件)来控制ADC的采样时序,并将采样得到的数据暂存于RAM中。
- 通信接口:负责与GameBoy通信。GameBoy通过它的卡带接口(Cartridge Port)与采集盒连接。这个接口不仅提供电源,更是一条并行的数据/地址总线。采集盒需要模拟一个GameBoy卡带的行为,将波形数据按照特定协议“喂”给GameBoy。
GameBoy(显示与交互终端):
- 图形显示:GameBoy的CPU(一颗改版的Z80)和GPU会从采集盒“映射”到其内存地址空间中的特定区域读取波形数据,然后将其渲染到那块160x144像素的绿色LCD屏幕上。所有网格、刻度、波形绘制均由GameBoy完成。
- 用户界面:通过GameBoy的十字键和A/B按钮,用户可以操作菜单,改变时基(时间/格)、垂直灵敏度(电压/格)、触发模式等。这些操作指令通过卡带接口发送给采集盒。
- 数据处理与高级功能:令人惊讶的是,一些“高级”功能如FFT(快速傅里叶变换)、XY模式、波形平均等,竟然也是由GameBoy那颗主频仅4.19MHz的8位CPU来计算的。这充分体现了当年程序员在极端资源限制下的优化功力。
这种分工的精妙之处在于,它让采集盒的硬件设计变得相对简单和专注,而将复杂的图形和人机交互逻辑交给了本就擅长此道的GameBoy。你不需要在采集盒上设计屏幕、绘制UI、编写图形库,这些都直接“借用”了GameBoy成熟且现成的能力。
2.2 关键芯片选型与替代方案
原设计发表于2000年,许多当时的“常青树”芯片在今天可能已经停产或难以购买。我在复刻时首要任务就是解决元器件的可获得性问题。
运算放大器(Op-Amp)的替换:原设计使用MC33182D,这是一款低功耗、轨到轨输出的运放,用于模拟前端放大。我在DigiKey等主流平台已找不到现货。经过参数对比,我选择了TL072。这是一款极其通用、双电源供电的JFET输入运放。虽然功耗比MC33182D稍高,但其高输入阻抗、低噪声和广泛的可用性使其成为完美的替代品。在±5V的供电环境下,TL072完全能满足前端缓冲和放大电路的需求。
注意:TL072不是轨到轨运放,其输出电压无法达到电源轨(+5V/-5V),会有一个约1.5V的裕量。这意味着在最大量程(10V/div)时,需要确保输入信号幅度留有余地,避免顶部或底部被削波。在实际电路中,通过合理的分压和偏置设计,这个影响可以被控制在可接受范围内。
数字电位器(Digital Potentiometer):原设计使用DS1267S100(100kΩ)。这款芯片现在仍有衍生型号(如DS1267-100)可用。它在电路中可能用于软件可调的增益或偏置,是实现自动设置或微调的关键。
程序存储器(ROM):原设计使用一颗27C256(32KB容量)的EPROM。这是标准的并行接口EPROM,至今仍有新品或库存品可买。我购买到了Elektor官方提供的、已烧录好GBDSO固件的最后一片ROM。更重要的是,在获得Elektor授权后,我将这个**.bin文件开源了**。这意味着你可以购买一颗空白的27C256(或兼容的W27C256等),用通用编程器自行烧录,成本更低。
ADC与主控:这部分是设计的核心,原文未明确型号,但从1Msps的采样率和与GameBoy通信的复杂度推断,很可能使用了一颗具备高速ADC和足够GPIO的微控制器,或者是“ADC + CPLD/FPGA”的组合。在我的复刻版中,我沿用了原设计的选择(具体型号需查阅开源原理图),因为它经过了时间验证,与GameBoy的通信时序已经调通,稳定性是第一位的。
3. 硬件制作全流程:从原理图到焊接调试
有了设计文件,下一步就是把它变成实物。这个过程充满了工程实践的细节,任何一个疏忽都可能导致板子变成“砖头”。
3.1 PCB设计与打样要点
我的设计文件(在GitHub仓库中)包含原理图和PCB。即使你直接使用我的文件去生产,也需要了解几个关键点:
- 板层与工艺:这是一个双面板设计。对于这种低速数字混合模拟电路,双面板完全足够。在JLCPCB等工厂下单时,选择最基础的FR-4材质、1.6mm厚度、有铅喷锡(HASL)即可,性价比最高。
- 接口与布局:
- GameBoy连接器:这是整个PCB上最精密的部件。它是一个与GameBoy卡带金手指匹配的edge connector。PCB设计时必须确保金手指的尺寸、间距和位置绝对准确,否则插不进GameBoy。我的设计中已经包含了这个封装。
- BNC输入接口:两个通道的BNC座子应选用质量可靠的型号,并确保其在PCB上的固定孔位牢固,能承受反复插拔探头的应力。
- 电源部分:由于使用电池供电,需要有电源开关、电池座(或连接器)以及良好的电源去耦电路。钽电容和瓷片电容要靠近芯片的电源引脚放置。
- 我的三次改版教训:我前后做了三个版本的PCB才成功。主要踩的坑有:
- 原理图网络标号错误:一个运放的反相/同相输入端画反了,导致放大电路工作异常。教训:画完原理图后,必须逐个模块进行功能仿真(哪怕只是脑补电流电压方向),并邀请他人复查。
- 封装错误:一个去耦电容用了0805的封装,但BOM里写的是0603。焊接时才发现对不上。教训:生成BOM和PCB前,必须进行封装的一致性检查(ERC/DRC)。
- GameBoy连接器引脚顺序:最初误以为卡带接口是镜像对称的,导致一组地址线接反。教训:对于不熟悉的接口,一定要找到官方的引脚定义图或拆解一个现有卡带进行实物比对,不能想当然。
3.2 元器件采购与焊接
BOM清单上有大约70个元件。除了前面提到的几个关键芯片,大部分都是电阻、电容、二极管等无源器件。
- 采购渠道:像Digi-Key, Mouser, LCSC这样的国际分销商是首选,确保正品。对于TL072、阻容件等通用料,也可以在淘宝/天猫找到可靠的商家。特别注意:27C256 EPROM,如果你要自己烧录,需要确认编程器支持。
- 焊接顺序:建议采用“先低后高,先内后外”的原则。
- 焊接所有贴片电阻、电容、二极管。
- 焊接贴片芯片(如TL072、数字电位器、逻辑门芯片等)。可以使用热风枪或细尖烙铁配合焊锡丝。
- 焊接插接件:BNC座、电源开关、电池座、GameBoy连接器。这些元件需要更大的热量,注意不要烫坏周围已焊好的贴片元件。
- 最后焊接EEPROM插座和任何需要通过插座安装的芯片,方便调试和更换。
- 在线编程扩展板:这是我添加的一个特色功能。原版ROM是焊死在板子上的,或者插在插座里。我设计了一个小转接板,将PLCC32封装的ROM座转接到DIP32插座,并在主板上预留了跳线。通过切换跳线,可以将主控芯片的数据/地址总线切换到编程器,从而在不拔下ROM芯片的情况下,直接对板载的27C256进行编程。这对于调试和固件更新非常方便。
3.3 上电调试与功能验证
焊接完成后,切勿直接插入GameBoy!必须按步骤进行安全检查。
- 目视与连通性检查:用放大镜检查有无桥接、虚焊、漏焊。用万用表二极管档检查电源对地是否短路(这是最重要的第一步!)。
- 空载上电:不插GameBoy,仅连接电池。测量各路电源电压(如+5V, -5V, +3.3V等)是否正常、稳定。
- 静态电流测试:串联电流表,测量整板空载电流。应与预估功耗(根据芯片手册估算)在一个数量级。如果电流过大(比如上百mA),说明有短路或芯片损坏。
- 连接GameBoy:在确认电源无异常后,关闭采集盒电源,插入GameBoy,再打开采集盒电源。此时,GameBoy应该正常开机,并显示GBDSO的启动画面或菜单。如果GameBoy无法开机或花屏,立即断电!检查GameBoy连接器是否接触不良,或电源引脚是否有短路。
- 基本功能测试:
- 输入一个已知信号(如函数发生器产生的1kHz, 1Vpp正弦波)。
- 在GameBoy上调整时基和垂直灵敏度,观察屏幕是否能稳定显示波形。
- 测试两个通道是否都工作。
- 尝试切换AC/DC耦合,观察波形变化(DC耦合能看到直流偏置,AC耦合会滤除直流分量)。
- 高级功能验证:进入FFT模式,观察频谱;测试XY模式(李萨如图形);测试自动触发和平均功能。
4. 软件、固件与使用技巧
硬件是躯体,软件是灵魂。GBDSO的“灵魂”分为两部分:运行在采集盒微控制器上的固件,以及运行在GameBoy上的卡带程序。由于我们拿到了完整的ROM文件,所以GameBoy部分已经搞定。我们的工作主要集中在理解和使用上。
4.1 固件烧录与更新
如果你使用的是我从Elektor购买并开源的那个.bin文件,你需要一个能烧录27C256或类似并行EPROM的编程器。将空白芯片放入编程器,选择正确的芯片型号,加载.bin文件,执行“编程”即可。烧录完成后,将芯片插入采集板的插座。
对于我设计的“在线编程”版本,操作更简单:
- 将主板上的编程跳线设置为“编程模式”。
- 通过扩展板上的接口,用编程器电缆连接电脑和采集板。
- 在编程器软件中,像对待一颗独立的ROM一样进行擦除、查空、编程、校验。
- 完成后,将跳线切回“运行模式”,重启系统。
4.2 GameBoy端操作指南
GBDSO的UI完全通过GameBoy的按键操作,虽然复古,但逻辑清晰。
- 方向键:移动光标,选择菜单项,调整参数(左右键增减数值)。
- A键:确认选择。
- B键:返回上一级菜单。
- Select:可能在特定模式下切换功能(如冻结波形)。
- Start:可能用于启动/停止采样或进入主菜单。
主要菜单结构通常包括:
- 垂直系统:设置每个通道的V/div(电压每格)、耦合方式(AC/DC)、探头衰减比。
- 水平系统:设置s/div(时间每格,从100秒到5微秒),以及采样模式(实时、等效采样等)。
- 触发系统:设置触发源(CH1/CH2)、触发边沿(上升/下降)、触发电平。自动触发功能非常实用,它能在无稳定触发时强制刷新波形,避免屏幕空白。
- 显示模式:选择YT模式(常规波形)、XY模式(用于相位比较,显示李萨如图)、FFT模式(频谱分析)、Chart Recorder(图表记录仪,慢速滚动模式)。
- 测量与工具:可能包含光标测量、波形平均、参考波形存储/调出等功能。
4.3 实测应用与性能边界
这台示波器能做什么,不能做什么,心里必须有数。
它能胜任的工作:
- 音频电路调试:20Hz-20kHz范围内的信号观察,比如检查麦克风前置放大、功放输出波形是否失真。FFT功能可以分析谐波成分。
- 数字逻辑入门:观察Arduino、STM32等开发板的GPIO输出,测量脉冲宽度、频率,看串口通信波形(如UART的Start/Stop bit)。1Msps的采样率对于几百kHz的数字信号足够了。
- 传感器信号观察:读取光敏电阻、热敏电阻、电位器等模拟传感器的缓慢变化信号,使用Chart Recorder模式非常直观。
- 教学演示:由于其结构透明、成本低廉,是讲解示波器原理、ADC采样、数字信号处理的绝佳教具。
它的局限性:
- 带宽与采样率:1Msps的采样率,根据奈奎斯特采样定理,理论上能无失真显示的最高频率信号是500kHz。但实际上,模拟前端电路也有带宽限制,实际可用带宽可能在200-300kHz左右。绝对无法测量高频开关电源、射频信号等。
- 分辨率:垂直分辨率受限于ADC的位数(很可能是8位),也就是256个量化等级。在10V/div量程下,每格电压对应的数字量很少,测量精度有限。它更适合观察波形形状和相对变化,而非高精度电压测量。
- 存储深度:受限于GameBoy的内存和传输速度,波形存储点数是有限的。这意味着在高速时基下,只能捕获很短时间窗口的信号。
- 输入保护:原设计可能没有强大的过压/过流保护电路。切勿直接测量市电或高压电路!如果需要测量,务必使用高压差分探头进行隔离和衰减。
重要安全提示:GBDSO的输入阻抗是1MΩ,与普通示波器相同。但它的输入耐压值未知。为安全起见,假设它非常脆弱。测量未知电压时,先使用一个高阻值电阻(如1MΩ)串联进行分压测试,确认电压范围安全后再直接连接。
5. 常见问题排查与进阶玩法
即使按照指南制作,也可能会遇到问题。以下是一些常见故障的排查思路。
5.1 硬件故障排查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| GameBoy无法开机,或开机后白屏/花屏 | 1. 电源短路 2. GameBoy连接器接触不良或引脚错误 3. 核心芯片(如MCU、ROM)损坏或未插好 4. 复位电路故障 | 1. 断开采集盒,检查GameBoy单独是否正常。 2. 测量采集盒各电源对地电阻,排除短路。 3. 用万用表蜂鸣档,逐点检查GameBoy连接器到PCB的连通性。 4. 重新插拔所有插座芯片。 5. 检查复位信号电平。 |
| GameBoy能开机,但无法进入GBDSO界面,卡在Nintendo Logo | 1. ROM数据读取错误 2. 主控芯片未正确初始化或损坏 3. 通信总线有断路或短路 | 1. 确认ROM已正确烧录,并尝试更换一片ROM。 2. 用逻辑分析仪或示波器(如果你有另一台的话)探测GameBoy卡带接口的读信号(RD)和地址/数据线,看是否有正常的读写周期。 |
| 通道无信号,或信号严重失真 | 1. 输入BNC座损坏或虚焊 2. 模拟前端运放电路故障(如TL072损坏、供电异常) 3. 衰减/放大网络电阻值错误 4. ADC不工作 | 1. 输入一个已知的小信号(如从手机耳机孔输出的1kHz正弦波),用万用表交流档或另一台示波器,从BNC入口开始,逐级向后测量,追踪信号在哪一级丢失或变形。 2. 检查运放的电源电压(±5V)是否正常,输出是否饱和。 3. 检查ADC的参考电压、采样时钟是否正常。 |
| 波形显示不稳定,抖动严重 | 1. 触发设置不当 2. 电源噪声大 3. 信号地线环路干扰 | 1. 尝试使用“自动触发”模式,或调整触发电平至信号幅度的中间值。 2. 给电池仓并联一个大的电解电容(如100uF)以稳定电源。 3. 确保被测电路、探头地线、GBDSO地线连接良好,尽量采用单点接地。 |
5.2 性能优化与校准
出厂设置可能并非最佳,你可以尝试微调。
- 直流偏移校准:将输入耦合设为DC,并将探头短路(或输入接地)。理论上波形应是一条位于屏幕中央的直线。如果存在垂直偏移,可以通过软件菜单中的“DC Offset”或“Position”功能进行调零。如果软件无法调零,则可能是硬件前端运放的输入偏置电压过大,需要考虑更换输入级运放为低失调电压型号(但这涉及硬件改动)。
- 增益校准:输入一个精确的、已知幅度的信号(例如,使用校准过的信号源输出一个1.000Vpp的正弦波)。调整垂直灵敏度至合适的档位,观察屏幕显示的格数是否与计算值一致。如果不一致,通常需要通过软件校准菜单,输入实际电压值进行校准。有些设计也可能通过调整数字电位器的值来微调硬件增益。
- 提高信噪比:
- 为模拟部分(运放、ADC)提供干净的、经过LC滤波的电源。
- 在PCB布局上,让模拟地(AGND)和数字地(DGND)单点连接。
- 使用屏蔽线连接探头,并尽量缩短地线夹的长度。
5.3 扩展与改造想法
GBDSO是一个开放的平台,你可以基于它进行改造:
- 升级ADC:如果能找到引脚兼容但速度更快(如5Msps)、位数更高(如12位)的ADC芯片,可以大幅提升性能。但这需要同步修改固件以支持新的采样率和数据格式。
- 增加通信接口:除了GameBoy,是否可以增加一个蓝牙或Wi-Fi模块,将波形数据发送到电脑或手机上进行更复杂的分析和存储?这需要主控MCU有额外的处理能力和接口。
- 设计新外壳:为采集盒和GameBoy设计一个3D打印的一体化外壳,让它看起来更像一台专业的便携设备,而不仅仅是“板子加游戏机”。
- 开发新固件:如果你精通GameBoy的汇编或C开发,甚至可以尝试为这个硬件平台编写全新的应用程序,比如逻辑分析仪、频谱图记录仪等等。
复刻GBDSO的过程,更像是一次对电子工程黄金时代的致敬和亲手实践。它没有现代仪器的华丽屏幕和复杂功能,但它教会你从最基础的层面理解信号是如何被捕获、处理和显示的。当你按下GameBoy的电源键,绿色的波形在像素屏幕上跳动起来的那一刻,你会觉得所有的调试和等待都是值得的。这不仅仅是一台工具,更是一个凝结了智慧与情怀的作品。