基于Arduino Nano的DIY示波器
基于Arduino Nano的DIY示波器:打造属于你的口袋实验室
前言
在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高,对于一些初学者或预算有限的爱好者来说,可能是一个不小的负担。幸运的是,随着开源硬件和软件的发展,我们可以通过一些简单的组件和代码,自己动手制作一个功能强大的示波器。今天,我们将详细介绍如何使用Arduino Nano和SH1106 OLED显示屏,打造一个属于自己的DIY示波器。
项目简介
这个项目的目标是制作一个基于Arduino Nano的便携式示波器,它具备以下特点:
- 紧凑的设计:基于Arduino Nano的紧凑设计,便于携带和使用。
- OLED显示屏:使用SH1106 128x64 I2C OLED显示屏,实时显示波形。
- 功能丰富:支持垂直和水平缩放、频率和占空比计算、设置保存、触发极性检测以及波形冻结功能。
- 成本低廉:使用常见的电子元件,总成本远低于市售示波器。
- 开源代码:基于开源代码,易于修改和扩展。
硬件需求
制作这个DIY示波器,你需要准备以下硬件组件:
- Arduino Nano:作为核心控制器。
- SH1106 128x64 I2C OLED显示屏:用于显示波形和其他信息。
- 轻触按钮:4个,分别用于选择、向上、向下和保持功能。
- 电压分压电阻:用于调整输入信号的电压范围。
- 肖特基二极管:用于防止过电压。
- 电容:104型号,用于滤波。
- 面包板或自制PCB:用于组装电路。
- 跳线:用于连接各个组件。
- 电源:5V稳压电源。
电路设计
电路图概述
整个电路的设计相对简单,主要分为以下几个部分:
- 信号输入:通过电压分压电路和可选的衰减器,将信号输入到Arduino Nano的模拟输入引脚A0。
- OLED显示屏连接:使用I2C接口,连接到Arduino Nano的A4(SDA)和A5(SCL)引脚。
- 按钮连接:使用肖特基二极管将按钮信号合并,并连接到数字引脚D2,用于中断操作。
- 保护电路:肖特基二极管用于防止过电压,电阻用于正确缩放输入电压。
详细电路图
以下是电路的详细连接方式:
- 信号输入:
- 输入信号通过一个电压分压电路连接到A0引脚。
- 为了保护Arduino Nano,使用一个肖特基二极管防止输入电压过高。
- OLED显示屏:
- SDA引脚连接到A4。
- SCL引脚连接到A5。
- VCC和GND分别连接到电源和地。
- 按钮:
- 4个按钮分别连接到D2引脚,每个按钮之间通过肖特基二极管隔离。
- 按钮的另一端连接到地。
- 电源:
- 使用5V稳压电源为整个电路供电。
PCB设计
为了使项目更加紧凑和美观,可以设计一个定制的PCB。PCB设计包括以下部分:
- Arduino Nano插座:方便插入和更换Arduino Nano。
- OLED显示屏:预留空间和接口。
- 按钮:4个按钮的安装位置。
- 电压分压和衰减电路:集成在PCB上。
- 电源接口和去耦元件:确保电源稳定。
PCB布局
PCB的布局应尽量简洁,减少布线长度,提高信号质量。以下是PCB布局的建议:
- 将Arduino Nano插座和OLED显示屏放置在PCB的中心位置。
- 按钮分布在显示屏的周围,方便操作。
- 电源接口和去耦元件放置在靠近电源输入的位置。
软件设计
核心代码功能
示波器的核心功能由一个复杂的Arduino程序实现,以下是代码的主要功能:
- 波形采集:每屏刷新时采集200个样本。
- 频率分析:计算波形的频率和占空比。
- EEPROM存储:保存最后的设置,如电压量程、时间基准和触发极性。
- 用户界面:按钮用于循环选择设置,OLED显示屏实时显示数据。
- 触发检测:支持正负边沿触发模式。
- 电池电压模式:在启动时按下按钮,显示电池电压。
代码实现
以下是代码的关键部分:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>#define SCREEN_WIDTH 128 // OLED显示屏幕宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕高度,以像素为单位// 定义OLED显示屏的复位引脚
#define OLED_RESET -1
Adafruit_SH1106 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// 定义按钮引脚
#define BUTTON_SELECT 2
#define BUTTON_UP 3
#define BUTTON_DOWN 4
#define BUTTON_HOLD 5// 其他变量定义
int sampleRate = 200; // 每屏采集样本数
float voltageScale = 1.0; // 电压量程
float timeBase = 1.0; // 时间基准
bool triggerPositive = true; // 触发极性void setup() {// 初始化OLED显示屏display.begin(SH1106_SWITCHCAPVCC, 0x3C);display.display();delay(2000); // 等待显示屏初始化display.clearDisplay();// 初始化按钮引脚pinMode(BUTTON_SELECT, INPUT_PULLUP);pinMode(BUTTON_UP, INPUT_PULLUP);pinMode(BUTTON_DOWN, INPUT_PULLUP);pinMode(BUTTON_HOLD, INPUT_PULLUP);// 从EEPROM读取最后的设置voltageScale = EEPROM.read(0);timeBase = EEPROM.read(1);triggerPositive = EEPROM.read(2);
}void loop() {// 检测按钮操作if (digitalRead(BUTTON_SELECT) == LOW) {// 切换设置选项}if (digitalRead(BUTTON_UP) == LOW) {// 调整当前选中的参数}if (digitalRead(BUTTON_DOWN) == LOW) {// 调整当前选中的参数}if (digitalRead(BUTTON_HOLD) == LOW) {// 冻结或恢复波形显示}// 采集波形数据int samples[sampleRate];for (int i = 0; i < sampleRate; i++) {samples[i] = analogRead(A0);}// 分析波形数据float frequency = calculateFrequency(samples);float dutyCycle = calculateDutyCycle(samples);// 显示波形和数据display.clearDisplay();drawWaveform(samples);display.setTextSize(1);display.setTextColor(SSD1306_WHITE);display.setCursor(0, 10);display.println("Frequency: " + String(frequency) + " Hz");display.println("Duty Cycle: " + String(dutyCycle) + " %");display.display();
}// 计算频率的函数
float calculateFrequency(int *samples) {// 实现频率计算逻辑
}// 计算占空比的函数
float calculateDutyCycle(int *samples) {// 实现占空比计算逻辑
}// 绘制波形的函数
void drawWaveform(int *samples) {// 实现波形绘制逻辑
}
代码上传
- 使用USB线将Arduino Nano连接到计算机。
- 在Arduino IDE中安装所需的库:
- Adafruit GFX
- Adafruit SH1106
- 打开代码文件,选择正确的开发板和COM端口。
- 点击“上传”按钮,将代码上传到Arduino Nano。
操作指南
按钮功能说明
- SELECT:循环切换控制选项(垂直量程 → 时间基准 → 触发)。
- UP/DOWN:调整当前选中的参数。
- HOLD:冻结或恢复波形显示。
- 自动保存:在最后一次按钮按下后的5秒内,设置将自动保存到EEPROM。
启动模式
在启动时,按下UP或DOWN按钮可以进入电压表模式,选择5V或50V量程。
应用场景
这个DIY示波器具有多种应用场景,包括:
- 信号可视化:观察各种电子信号的波形。
- 频率测量:测量信号的频率。
- 调试小型电子电路:帮助快速定位电路问题。
- 教育工具:用于学习波形分析和电子基础。
总结
通过这个项目,我们不仅能够制作一个功能强大的示波器,还能在这个过程中学习到硬件设计、固件开发和信号分析等多方面的知识。虽然这个DIY示波器在功能上可能无法与高端示波器相比,但它完全能够满足日常的电子实验和学习需求。更重要的是,这个项目激发了我们的创造力和动手能力,让我们在实践中不断学习和进步。
未来改进方向
虽然这个项目已经具备了基本的示波器功能,但仍有很大的改进空间。例如:
- 增加更多量程选项:目前只支持两种量程,可以增加更多量程以适应更广泛的信号范围。
- 提高采样率:通过优化代码和硬件,提高波形的采样率,从而获得更清晰的波形。
- 增加更多显示功能:如添加峰值检测、平均值计算等。
- 开发更高级的触发模式:如窗口触发、延迟触发等。
总之,这个基于Arduino Nano的DIY示波器项目是一个很好的起点,它不仅能够满足你的实际需求,还能激发你的创造力和探索精神。希望这篇文章能激发你的兴趣,让你也动手制作一个属于自己的示波器!
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!