基于树莓派Pico与安卓手机的200kHz便携示波器DIY全攻略

📅 2026/7/28 4:58:31
基于树莓派Pico与安卓手机的200kHz便携示波器DIY全攻略
1. 项目缘起当口袋里的手机变成示波器作为一名电子爱好者手边常备一台示波器是刚需。但传统台式示波器笨重昂贵便携式示波器性能又往往不尽如人意。几年前当我第一次接触到“树莓派 Pico”这块小巧而强大的微控制器板时一个想法就冒了出来能不能用它结合我口袋里那台性能过剩的安卓手机DIY一台低成本、高便携性的数字示波器这个想法并非空穴来风。树莓派 Pico 的核心是 RP2040 微控制器它内置了两个可编程的模拟数字转换器ADC采样率最高可达 500 kSPS每秒千次采样。虽然这个指标和专业的示波器相比差距巨大但对于音频信号分析、简单的数字电路调试、传感器信号观测等许多业余或教育场景来说200kHz 的带宽已经足够应付。关键在于如何将 Pico 采集到的模拟信号实时、稳定地传输到手机上并利用手机强大的处理器和绚丽的屏幕进行显示和分析。经过一番搜寻和尝试我找到了Scoppy这个开源项目。它完美地扮演了“桥梁”和“显示器”的角色。于是“树莓派 Pico Scoppy 安卓手机”这个组合便诞生了。最终我得到了一台成本不到百元、带宽约200kHz、能装进口袋的示波器。它不仅解决了我的燃眉之急其制作过程本身也是一次对嵌入式系统、USB通信和信号处理的有趣探索。下面我就把从硬件连接到软件配置再到实际测试和避坑的完整过程分享出来。2. 核心硬件选型与连接原理为什么是树莓派 Pico 和 Scoppy这个组合的背后有清晰的工程逻辑并非随意拼凑。2.1 树莓派 Pico为何它是理想的信号采集前端树莓派 Pico 的核心优势在于其 RP2040 芯片的 ADC 系统和灵活的 I/O 能力。首先RP2040 的 ADC 性能是基础。它拥有3个ADC输入通道GP26, GP27, GP28但通常我们使用 GP26 和 GP27 作为双通道输入。其 ADC 分辨率为 12 位理论上能提供 4096 个量化等级。官方标称的采样率最高可达 500 kSPS但这通常是在单一通道、最佳条件下的理论值。在实际应用中尤其是通过USB传输数据时受限于处理速度和带宽稳定工作在 200-250 kSPS 的双通道采样是更现实的目标而这正好对应约 200kHz 的模拟带宽根据奈奎斯特采样定理可观测信号的最高频率约为采样率的一半。其次Pico 的“可编程I/O”PIO是秘密武器。RP2040 独有的 PIO 状态机允许我们编写底层硬件程序以极高的效率和确定性去执行诸如精确时序采样、协议模拟等任务。对于示波器应用我们可以利用 PIO 来实现一个“采样时钟”确保 ADC 以非常稳定的间隔进行采样减少由软件循环带来的时间抖动Jitter这对于观测周期性信号的稳定性至关重要。最后USB通信能力是关键。Pico 原生支持 USB 1.1全速12Mbps这为它向手机高速、稳定地传输采样数据提供了物理基础。我们将 Pico 配置为 USB CDC通信设备类设备它就能在电脑或手机上虚拟出一个串行端口COM口或ttyACM设备Scoppy 应用正是通过这个虚拟串口与 Pico 通信发送控制命令并接收采样数据。2.2 Scoppy手机端的“示波器大脑”Scoppy 是一个开源的安卓应用它的角色远不止是一个显示器。它的核心功能是协议解析与图形渲染。Scoppy 定义了一套简单的基于串口的通信协议。Pico 端的固件需要按照这个协议将采集到的ADC数值0-4095连同时间戳信息打包发送。Scoppy 接收到数据包后会进行解析将数字量转换为电压值需要根据Pico的参考电压和分压电路计算然后在手机屏幕上以熟悉的示波器网格形式绘制出波形。它提供了完整的示波器交互界面。包括时基Time/Div调节、垂直灵敏度Volts/Div调节、触发模式设置边沿触发、自动、正常、测量功能频率、周期、峰峰值、平均值等甚至具备简单的FFT频谱分析功能。所有这些控制参数都会通过串口发送给 Pico指导 Pico 如何调整采样率对应时基和是否等待触发对应触发模式。连接方式非常简单直接使用一根常见的 USB Micro-B 数据线或 Type-C 转 Micro-B 转接头将树莓派 Pico 直接连接到安卓手机的 USB 口。大多数现代安卓手机都支持 USB OTGOn-The-Go功能可以充当主机为 Pico 供电并与之通信。手机会为 Pico 提供 5V 电源同时识别出这个 USB CDC 设备。3. 固件刷写与开发环境搭建要让 Pico 听懂 Scoppy 的指令并正确回传数据我们需要为其刷写专用的固件。Scoppy 官方提供了编译好的.uf2文件刷写过程非常“树莓派”。3.1 获取并刷写 Scoppy 固件首先访问 Scoppy 的官方 GitHub 发布页面例如github.com/fhdm-dev/scoppy找到最新的scoppy-pico.uf2文件并下载到电脑。刷写固件是 Pico 的经典操作断开 Pico 的 USB 连接。按住 Pico 板上的白色BOOTSEL按钮不放。在按住按钮的同时将 Pico 通过 USB 线连接到电脑。此时电脑会识别出一个名为RPI-RP2的可移动磁盘。将下载好的scoppy-pico.uf2文件拖拽或复制到这个磁盘中。复制完成后Pico 会自动重启。此时RPI-RP2磁盘会消失电脑会识别出一个新的串行端口在Windows设备管理器中为“USB串行设备”在Linux/macOS中为/dev/ttyACM0之类的设备。这表明固件刷写成功Pico 已经运行在 Scoppy 从机模式下。注意这个过程只会刷写固件不会影响 MicroPython 或 C/C 的开发环境。如果你想恢复为普通开发板只需重新刷写 MicroPython 固件或其它.uf2文件即可。3.2 理解固件源码与自定义可选对于想深入研究的开发者Scoppy 也提供了固件的完整源代码基于 MicroPython。你可以克隆其 GitHub 仓库查看firmware/pico目录下的main.py等文件。浏览源码能让你更深刻地理解其工作原理协议解析main.py中有一个循环持续读取来自串口sys.stdin的命令根据命令字调整采样率、触发条件等。数据采集它使用 MicroPython 的machine.ADC类和定时器或 PIO 来执行采样。对于高性能需求官方固件可能已经启用了 PIO 来保证采样时序。数据打包采集到的数据会按照b通道1数据通道2数据...的格式打包并通过串口sys.stdout发送出去。如果你想修改采样深度、增加滤波算法或改变数据格式就需要搭建 MicroPython 开发环境修改源码后重新生成.uf2文件。这需要安装cmake、gcc-arm-none-eabi等工具链并编译 MicroPython 固件过程相对复杂但对于定制化需求是必经之路。4. 电路设计与信号调理关键直接将信号连接到 Pico 的 GPIO 引脚是危险的。Pico 的 ADC 输入引脚只能承受 0-3.3V 的电压超过此范围可能会永久损坏芯片。因此一个外部的信号调理电路也就是探头前端是必不可少的。4.1 必做的分压与保护电路最基本的电路是一个电阻分压器配合钳位二极管。信号输入 ───┬─── R1 (例如 90kΩ) ────┐─── 到 Pico ADC 引脚 (GP26/27) │ │ C1 (可选小电容) │ │ │ GND ──── R2 (例如 10kΩ) ─┘ │ D1 (3.3V钳位) --|-- 到 3.3V D2 (GND钳位) ---|--- 到 GND元件选型与计算分压比R1和R2决定了输入电压的衰减倍数。例如R190kΩ,R210kΩ分压比为R2/(R1R2) 1/10。这意味着输入端的 30V 电压经过衰减后到达 ADC 引脚的电压为 3V仍在安全范围内。这个电路构成了一个10:1 的衰减探头。电阻选择选择金属膜电阻以获得更好的温度稳定性和精度。R2建议在 10kΩ 左右阻值太小会增加电路功耗太大则容易引入噪声。R1根据所需衰减比计算。钳位二极管D1和D2选用像 1N4148 这样的快速开关二极管。D1阴极接 3.3V阳极接 ADC 输入点D2阳极接 GND阴极接 ADC 输入点。当输入点电压高于 3.3V0.7V二极管正向压降时D1导通将其钳位低于 -0.7V 时D2导通将其钳位。这是 ADC 引脚的“救命”电路。补偿电容C1在高频下探头的寄生电容和示波器输入电容会导致分压比随频率变化使方波信号出现振铃或圆角。C1是一个可调的小电容几皮法到几十皮法用于补偿这种高频衰减需要配合标准方波信号源进行精细调整。对于带宽 200kHz 的应用如果信号频率不高此电容有时可以省略。4.2 输入耦合与阻抗匹配考量对于音频等交流信号观测你可能需要隔直电容。可以在信号输入端串联一个 1uF~10uF 的无极性电解电容或 CBB 电容将直流分量隔离开只观测交流成分。这模仿了真实示波器的“AC耦合”模式。Pico ADC 的输入阻抗并非无穷大。根据数据手册其采样保持电路的等效输入阻抗会随着采样频率变化通常在几十千欧姆量级。我们设计的分压电路其输出阻抗约等于R1与R2的并联值应远小于 ADC 的输入阻抗以避免因负载效应导致测量电压不准确。使用 90kΩ 和 10kΩ 时输出阻抗约为 9kΩ在大多数情况下是可以接受的但对于高阻抗信号源可能需要考虑使用电压跟随器运算放大器进行缓冲。4.3 我的实际制作与调试经验我最初用面包板搭建了这个电路结果引入了大量噪声。后来改用一小块洞洞板采用星型接地布局所有地线汇聚到一点再接到 Pico 的 GND并尽量缩短信号走线噪声水平显著下降。校准过程至关重要电路焊好后我使用一个可调直流电源和一个万用表进行静态校准。给输入端施加一个已知的电压例如 5V用万用表测量 ADC 引脚的实际电压然后在 Scoppy 的“通道设置”里调整“垂直偏移”和“每格电压”系数使屏幕显示的电压值与万用表读数一致。对于交流校准可以使用函数发生器输出一个 1kHz、一定幅值的正弦波对比 Scoppy 测量的峰峰值与发生器设定值。重要提示在连接任何未知信号前务必先用万用表测量其电压范围确认在调理电路的安全输入范围内。养成这个习惯能避免惨痛的损失。5. Scoppy 安卓应用配置与高级功能使用硬件和固件就绪后主角 Scoppy 应用就该上场了。5.1 初始连接与基础设置在安卓手机上安装 Scoppy 应用可从 Google Play 或 GitHub 发布页获取。首次打开时你需要授予应用访问 USB 设备的权限。连接 Pico 到手机后在 Scoppy 的主界面点击连接按钮。应用会自动扫描可用的串行设备你应该能看到一个类似/dev/ttyACM0或USB Serial的选项选择它即可建立连接。连接成功后屏幕下方会显示“已连接”状态并且可能会开始显示一些噪声波形因为此时探头可能悬空。接下来进行基础配置通道设置进入设置菜单为每个使用的通道CH1, CH2设置正确的“探头衰减比”。如果你使用了前面提到的 10:1 分压电路这里就应设置为 10x。同时可以设置通道颜色、标签等。触发设置这是稳定波形的关键。点击屏幕上的“触发”区域选择触发源CH1或CH2、触发类型通常用“边沿”、触发边沿上升或下降、触发电平。通过拖动屏幕右侧的电平标尺可以直观地设置触发电平。对于不稳定的信号可以先使用“自动”模式让波形强制刷新。时基与垂直缩放通过双指在屏幕上水平缩放可以调整时基s/div垂直缩放调整垂直灵敏度V/div。这是最常用的交互操作。5.2 测量与光标功能实战Scoppy 提供了丰富的自动测量功能。点击屏幕上的“测量”按钮可以为每个通道添加多种测量参数如频率、周期、峰峰值、最大值、最小值、平均值、RMS有效值等。对于观测一个 1kHz 的方波你可以同时开启频率、占空比和峰峰值测量数据会实时显示在屏幕上方非常方便。光标功能是进行精确手动测量的利器。启用水平光标Cursors - Horizontal屏幕上会出现两条水平线你可以拖动它们对齐波形的顶部和底部两者之间的电压差值会直接显示出来这比自动测量的峰峰值有时更直观可靠。同样垂直光标可以测量时间间隔比如脉冲宽度或信号周期。5.3 FFT频谱分析初探Scoppy 还内置了 FFT快速傅里叶变换功能能将时域波形转换为频域频谱。这对于分析信号的频率成分、查找噪声源或调试音频电路非常有用。使用方法在波形显示区域用双指做垂直捏合手势直到时基刻度变得非常小例如 1ms/div 或更小此时应用可能会自动切换到 FFT 显示模式或者你需要从视图模式中手动选择 FFT。屏幕上会显示一个频谱图横轴是频率纵轴是幅度通常是 dBV。你可以观察一个 1kHz 正弦波应该在频谱图的 1kHz 处看到一个明显的尖峰。FFT 的分辨率和最大分析频率取决于当前的采样率和采样点数。6. 性能实测与局限性分析理论归理论实际性能如何才是我们关心的。我设计了一系列测试来评估这套系统的能力边界。6.1 带宽与采样率测试我使用一台标准的函数发生器输出一个幅值为 2Vpp 的正弦波。测试1频率响应。固定输入幅度从 10Hz 开始逐步增加信号频率观察 Scoppy 显示波形的幅度变化。当信号频率达到约180-220kHz时显示波形的幅度下降到低频时的 0.707倍-3dB点。这验证了其有效带宽大约在 200kHz 左右。这与理论预期相符因为受限于 USB 传输速度和固件处理开销稳定的采样率大约在 400-500 kSPS根据奈奎斯特采样定理可无混叠观测的最高频率约为采样率的一半。测试2方波上升时间。输入一个 1kHz 的方波使用垂直光标测量其从 10% 到 90% 的上升时间。实测上升时间大约在1.8 微秒左右。根据经验公式带宽 ≈ 0.35 / 上升时间计算出的带宽约为 194kHz与频率响应测试结果相互印证。6.2 实际应用场景演示Arduino PWM 信号观测连接一个 Arduino输出一个 490Hz 的 PWM 信号控制 LED 亮度。用本示波器观察 PWM 引脚波形可以清晰看到占空比的变化并能用测量功能直接读出高电平时间和周期计算占空比。音频信号观测将手机耳机孔输出的音乐信号经过一个简单的分压衰减后接入。可以观察到复杂的音频波形。切换到 FFT 模式能清晰地看到音乐频谱的动态变化。电源纹波测量这是一个有挑战性的测试。测量一个 5V USB 充电器的输出纹波。需要将示波器耦合模式设置为交流或在探头前端串联隔直电容并将垂直灵敏度调到最灵敏档位如 10mV/div。由于本底噪声和电路设计限制测量毫伏级的微小纹波比较困难但观测几十到几百毫伏的纹波是可行的。关键技巧是使用最短的接地弹簧夹而非长地线将探头点直接接触电源输出端和接地端以减小环路面积降低空间电磁干扰。6.3 系统局限性客观看待在享受其便携低成本的同时必须清醒认识它的局限带宽与采样率有限200kHz 带宽注定无法观测高速数字信号如 SPI、I2C 在高速模式下、射频信号或快速的开关电源噪声。输入范围与保护依赖外部调理电路安全性、动态范围和精度都由自制电路决定不如商业示波器探头可靠。触发功能相对简单缺少商业示波器的高级触发功能如脉宽触发、欠幅触发等对于捕捉复杂异常信号能力有限。本底噪声由于电路板布局、电源噪声等因素其本底噪声比专业仪器要高测量小信号时信噪比不佳。无隔离整个系统与手机共地测量市电相关电路有风险绝对禁止直接测量电网电压。定位清晰它是一个出色的教育工具、创客伴侣和低频电路调试助手而非替代专业仪器的工具。用它来学习电子基础、调试 Arduino 项目、观察音频信号、检查传感器输出绰绰有余。7. 常见问题排查与进阶优化在制作和使用过程中你肯定会遇到一些问题。这里汇总了我踩过的坑和解决方案。7.1 连接与通信故障问题Scoppy 无法发现或连接 Pico。排查首先确认手机支持 OTG 且已开启。尝试换一条质量好的数据线。在电脑上检查 Pico 是否被识别为串口设备以确认固件刷写成功。重启 Scoppy 应用和手机。有时需要进入手机开发者选项确保“USB 配置”中选择了“MIDI”或“音频源”以外的模式如“仅充电”模式有时会限制数据传输。问题连接后波形剧烈抖动或无规则乱跳。排查这通常是接地不良或电源噪声的典型表现。检查探头地线是否牢固连接在电路的“安静地”上。尝试用电池单独为被测电路供电以排除来自市电或开关电源的干扰。确保 Pico 的 USB 电源是干净的可以尝试在 Pico 的 3.3V 和 GND 之间并联一个 10uF 的电解电容和一个 0.1uF 的陶瓷电容进行退耦。7.2 测量精度与校准问题问题测量的直流电压与万用表读数有固定偏差。解决这是 ADC 的偏移误差。在 Scoppy 的通道设置中使用“垂直偏移”功能进行补偿。输入一个已知的 0V 信号将探头与地短接调整偏移量使显示为 0V。问题测量交流信号幅值不准且随频率变化。解决这可能是探头补偿未调好如果用了补偿电容或者是 ADC 本身的频率响应限制。对于后者可以在 Scoppy 中设置一个频率响应校正系数如果支持或者仅在带宽内使用。更根本的解决方法是优化前端运放电路提供平坦的频率响应。7.3 进阶优化思路如果你对性能不满足可以尝试以下方向优化固件深入研究 Scoppy 的 MicroPython 固件尝试用 PIO 汇编语言重写采样循环可能将采样率提升到接近 RP2040 ADC 的理论极限 500 kSPS。改进前端电路使用高速、低噪声的运算放大器如 OPA350构建一个有源探头前端。这可以提供高输入阻抗、可调的增益/衰减以及更低的噪声和更宽的带宽。双机同步如果需要更多通道可以尝试使用两个 Pico分别采集不同信号通过某种方式如共享一个外部触发信号进行同步然后在手机上设法合并显示。这是一个更有挑战性的项目。开发电脑客户端Scoppy 协议是开放的你可以用 Pythonpyserial在电脑上编写一个客户端程序接收 Pico 的数据并用matplotlib等库绘制更复杂的图形或进行离线分析。这个项目最吸引我的地方不在于它做出了一个多么精确的仪器而在于它完整地呈现了一个从想法到实物的嵌入式系统开发流程硬件选型、电路设计、固件开发、协议定义、上位机软件交互。每一个环节都有可以深入挖掘和学习的地方。当你亲手用它捕捉到第一个稳定的 PWM 波形时那种成就感是无可替代的。它放在工作台角落随时可以抓起来快速验证一个信号这种便利性极大地提升了我的调试效率。当然遇到复杂的电源噪声或高速数字信号时我还是会乖乖地请出我的台式示波器。工具没有好坏只有是否适合当下的场景。而这个 DIY 的 200kHz 示波器无疑在我的工具库中占据了一个独特而实用的位置。