• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于Arduino Nano的DIY示波器

05/13 08:37
1410
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联系方式.txt

共1个文件

基于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.


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

博客主页:https://blog.csdn.net/weixin_51141489,需要源码或相关资料实物的友友请关注、点赞,私信吧!

  • 联系方式.txt
    下载

相关推荐