当前位置: 首页 > news >正文

基于Arduino Nano的DIY示波器

基于Arduino Nano的DIY示波器:打造属于你的口袋实验室

前言

在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高,对于一些初学者或预算有限的爱好者来说,可能是一个不小的负担。幸运的是,随着开源硬件和软件的发展,我们可以通过一些简单的组件和代码,自己动手制作一个功能强大的示波器。今天,我们将详细介绍如何使用Arduino Nano和SH1106 OLED显示屏,打造一个属于自己的DIY示波器。
在这里插入图片描述

项目简介

这个项目的目标是制作一个基于Arduino Nano的便携式示波器,它具备以下特点:

  • 紧凑的设计:基于Arduino Nano的紧凑设计,便于携带和使用。
  • OLED显示屏:使用SH1106 128x64 I2C OLED显示屏,实时显示波形。
  • 功能丰富:支持垂直和水平缩放、频率和占空比计算、设置保存、触发极性检测以及波形冻结功能。
  • 成本低廉:使用常见的电子元件,总成本远低于市售示波器。
  • 开源代码:基于开源代码,易于修改和扩展。

硬件需求

制作这个DIY示波器,你需要准备以下硬件组件:

  1. Arduino Nano:作为核心控制器。
  2. SH1106 128x64 I2C OLED显示屏:用于显示波形和其他信息。
  3. 轻触按钮:4个,分别用于选择、向上、向下和保持功能。
  4. 电压分压电阻:用于调整输入信号的电压范围。
  5. 肖特基二极管:用于防止过电压。
  6. 电容:104型号,用于滤波。
  7. 面包板或自制PCB:用于组装电路。
  8. 跳线:用于连接各个组件。
  9. 电源: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设计包括以下部分:

  1. Arduino Nano插座:方便插入和更换Arduino Nano。
  2. OLED显示屏:预留空间和接口。
  3. 按钮:4个按钮的安装位置。
  4. 电压分压和衰减电路:集成在PCB上。
  5. 电源接口和去耦元件:确保电源稳定。

PCB布局

PCB的布局应尽量简洁,减少布线长度,提高信号质量。以下是PCB布局的建议:

  • 将Arduino Nano插座和OLED显示屏放置在PCB的中心位置。
  • 按钮分布在显示屏的周围,方便操作。
  • 电源接口和去耦元件放置在靠近电源输入的位置。

软件设计

在这里插入图片描述

核心代码功能

示波器的核心功能由一个复杂的Arduino程序实现,以下是代码的主要功能:

  1. 波形采集:每屏刷新时采集200个样本。
  2. 频率分析:计算波形的频率和占空比。
  3. EEPROM存储:保存最后的设置,如电压量程、时间基准和触发极性。
  4. 用户界面:按钮用于循环选择设置,OLED显示屏实时显示数据。
  5. 触发检测:支持正负边沿触发模式。
  6. 电池电压模式:在启动时按下按钮,显示电池电压。

代码实现

以下是代码的关键部分:

#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) {// 实现波形绘制逻辑
}

代码上传

  1. 使用USB线将Arduino Nano连接到计算机。
  2. 在Arduino IDE中安装所需的库:
    • Adafruit GFX
    • Adafruit SH1106
  3. 打开代码文件,选择正确的开发板和COM端口。
  4. 点击“上传”按钮,将代码上传到Arduino Nano。

操作指南

按钮功能说明

在这里插入图片描述

  • SELECT:循环切换控制选项(垂直量程 → 时间基准 → 触发)。
  • UP/DOWN:调整当前选中的参数。
  • HOLD:冻结或恢复波形显示。
  • 自动保存:在最后一次按钮按下后的5秒内,设置将自动保存到EEPROM。

启动模式

在启动时,按下UP或DOWN按钮可以进入电压表模式,选择5V或50V量程。

应用场景

在这里插入图片描述

这个DIY示波器具有多种应用场景,包括:

  1. 信号可视化:观察各种电子信号的波形。
  2. 频率测量:测量信号的频率。
  3. 调试小型电子电路:帮助快速定位电路问题。
  4. 教育工具:用于学习波形分析和电子基础。

总结

通过这个项目,我们不仅能够制作一个功能强大的示波器,还能在这个过程中学习到硬件设计、固件开发和信号分析等多方面的知识。虽然这个DIY示波器在功能上可能无法与高端示波器相比,但它完全能够满足日常的电子实验和学习需求。更重要的是,这个项目激发了我们的创造力和动手能力,让我们在实践中不断学习和进步。

未来改进方向

虽然这个项目已经具备了基本的示波器功能,但仍有很大的改进空间。例如:

  • 增加更多量程选项:目前只支持两种量程,可以增加更多量程以适应更广泛的信号范围。
  • 提高采样率:通过优化代码和硬件,提高波形的采样率,从而获得更清晰的波形。
  • 增加更多显示功能:如添加峰值检测、平均值计算等。
  • 开发更高级的触发模式:如窗口触发、延迟触发等。

总之,这个基于Arduino Nano的DIY示波器项目是一个很好的起点,它不仅能够满足你的实际需求,还能激发你的创造力和探索精神。希望这篇文章能激发你的兴趣,让你也动手制作一个属于自己的示波器!


希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.


注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!

http://www.xdnf.cn/news/381493.html

相关文章:

  • 2505d,d的借用检查器
  • 基于Spring Boot + Vue的母婴商城系统( 前后端分离)
  • InnoDB结构与表空间文件页的详解
  • 前端性能优化
  • Pycharm(二十)张量的运算与操作
  • Webug4.0靶场通关笔记-靶场搭建方法(3种方法)
  • Kubernetes生产实战(十三):灰度发布与蓝绿发布实战指南
  • 关于流媒体的知识总结
  • 全息美AISEO引领未来智能营销新趋势
  • SRP单一职责原则
  • 备战菊厂笔试3
  • short变量赋值为32768, 实际为什么是-32768?不同语言的不同进制字面量?字面量?编程语言的基本类型?
  • Java、Python、NodeJS等开发环境安装及配置镜像加速到国内源
  • .Net HttpClient 使用准则
  • 【脑机接口临床】脑机接口手术的风险?脑机接口手术的应用场景?脑机接口手术如何实现偏瘫康复?
  • RT-Thread 深入系列 Part 6:高性能与低功耗优化策略
  • 智能库室联管联控系统|智能兵器室门禁管理系统
  • AI日报 · 2025年5月10日|OpenAI“Stargate”超级数据中心项目掀起美国各州争夺战
  • Dify+Ollama+Deepseek+BGE-M3来搭建本地知识库实操
  • C++ Vector深度易错点指南(临时抱佛脚)(基础用法;进阶;高级;实战)
  • PyTorch API 1 - 概述、数学运算、nn、实用工具、函数、张量
  • 【LangChain全景指南】构建下一代AI应用的开发框架
  • 数字相机的快门结构
  • not a genuine st device abort connection的问题
  • 实现三个采集板数据传送到一个显示屏的方案
  • null 的安全操作 vs 危险操作
  • Linux环境下基于Ncurses开发贪吃蛇小游戏
  • Java 内存模型 JMM
  • Edububtu 系统详解
  • Exploring Temporal Event Cues for Dense Video Captioning in Cyclic Co-Learning