• 方案介紹
    • 基于Arduino Nano的DIY示波器:打造屬于你的口袋實(shí)驗(yàn)室
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于Arduino Nano的DIY示波器

22小時(shí)前
217
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

聯(lián)系方式.txt

共1個(gè)文件

基于Arduino Nano的DIY示波器:打造屬于你的口袋實(shí)驗(yàn)室

前言

在電子愛(ài)好者的世界里,示波器是不可或缺的工具之一。它能夠幫助我們觀察和分析各種電子信號(hào)的波形,從而更好地理解和調(diào)試電路。然而,市面上的示波器價(jià)格往往較高,對(duì)于一些初學(xué)者或預(yù)算有限的愛(ài)好者來(lái)說(shuō),可能是一個(gè)不小的負(fù)擔(dān)。幸運(yùn)的是,隨著開(kāi)源硬件和軟件的發(fā)展,我們可以通過(guò)一些簡(jiǎn)單的組件和代碼,自己動(dòng)手制作一個(gè)功能強(qiáng)大的示波器。今天,我們將詳細(xì)介紹如何使用Arduino Nano和SH1106 OLED顯示屏,打造一個(gè)屬于自己的DIY示波器。

在這里插入圖片描述

項(xiàng)目簡(jiǎn)介

這個(gè)項(xiàng)目的目標(biāo)是制作一個(gè)基于Arduino Nano的便攜式示波器,它具備以下特點(diǎn):

  • 緊湊的設(shè)計(jì):基于Arduino Nano的緊湊設(shè)計(jì),便于攜帶和使用。
  • OLED顯示屏:使用SH1106 128x64 I2C OLED顯示屏,實(shí)時(shí)顯示波形。
  • 功能豐富:支持垂直和水平縮放、頻率和占空比計(jì)算、設(shè)置保存、觸發(fā)極性檢測(cè)以及波形凍結(jié)功能。
  • 成本低廉:使用常見(jiàn)的電子元件,總成本遠(yuǎn)低于市售示波器。
  • 開(kāi)源代碼:基于開(kāi)源代碼,易于修改和擴(kuò)展。

硬件需求

制作這個(gè)DIY示波器,你需要準(zhǔn)備以下硬件組件:

  1. Arduino Nano:作為核心控制器。
  2. SH1106 128x64 I2C OLED顯示屏:用于顯示波形和其他信息。
  3. 輕觸按鈕:4個(gè),分別用于選擇、向上、向下和保持功能。
  4. 電壓分壓電阻:用于調(diào)整輸入信號(hào)的電壓范圍。
  5. 肖特基二極管:用于防止過(guò)電壓。
  6. 電容:104型號(hào),用于濾波。
  7. 面包板或自制PCB:用于組裝電路。
  8. 跳線:用于連接各個(gè)組件。
  9. 電源:5V穩(wěn)壓電源。

電路設(shè)計(jì)

電路圖概述

在這里插入圖片描述

整個(gè)電路的設(shè)計(jì)相對(duì)簡(jiǎn)單,主要分為以下幾個(gè)部分:

  • 信號(hào)輸入:通過(guò)電壓分壓電路和可選的衰減器,將信號(hào)輸入到Arduino Nano的模擬輸入引腳A0。
  • OLED顯示屏連接:使用I2C接口,連接到Arduino Nano的A4(SDA)和A5(SCL)引腳。
  • 按鈕連接:使用肖特基二極管將按鈕信號(hào)合并,并連接到數(shù)字引腳D2,用于中斷操作。
  • 保護(hù)電路:肖特基二極管用于防止過(guò)電壓,電阻用于正確縮放輸入電壓。

詳細(xì)電路圖

以下是電路的詳細(xì)連接方式:

  • 信號(hào)輸入
    • 輸入信號(hào)通過(guò)一個(gè)電壓分壓電路連接到A0引腳。
    • 為了保護(hù)Arduino Nano,使用一個(gè)肖特基二極管防止輸入電壓過(guò)高。
  • OLED顯示屏
    • SDA引腳連接到A4。
    • SCL引腳連接到A5。
    • VCC和GND分別連接到電源和地。
  • 按鈕
    • 4個(gè)按鈕分別連接到D2引腳,每個(gè)按鈕之間通過(guò)肖特基二極管隔離。
    • 按鈕的另一端連接到地。
  • 電源
    • 使用5V穩(wěn)壓電源為整個(gè)電路供電。

PCB設(shè)計(jì)

在這里插入圖片描述

為了使項(xiàng)目更加緊湊和美觀,可以設(shè)計(jì)一個(gè)定制的PCB。PCB設(shè)計(jì)包括以下部分:

  1. Arduino Nano插座:方便插入和更換Arduino Nano。
  2. OLED顯示屏:預(yù)留空間和接口。
  3. 按鈕:4個(gè)按鈕的安裝位置。
  4. 電壓分壓和衰減電路:集成在PCB上。
  5. 電源接口和去耦元件:確保電源穩(wěn)定。

PCB布局

PCB的布局應(yīng)盡量簡(jiǎn)潔,減少布線長(zhǎng)度,提高信號(hào)質(zhì)量。以下是PCB布局的建議:

  • 將Arduino Nano插座和OLED顯示屏放置在PCB的中心位置。
  • 按鈕分布在顯示屏的周?chē)?,方便操作?/li>
  • 電源接口和去耦元件放置在靠近電源輸入的位置。

軟件設(shè)計(jì)

在這里插入圖片描述

核心代碼功能

示波器的核心功能由一個(gè)復(fù)雜的Arduino程序?qū)崿F(xiàn),以下是代碼的主要功能:

  1. 波形采集:每屏刷新時(shí)采集200個(gè)樣本。
  2. 頻率分析:計(jì)算波形的頻率和占空比。
  3. EEPROM存儲(chǔ):保存最后的設(shè)置,如電壓量程、時(shí)間基準(zhǔn)和觸發(fā)極性。
  4. 用戶界面:按鈕用于循環(huán)選擇設(shè)置,OLED顯示屏實(shí)時(shí)顯示數(shù)據(jù)。
  5. 觸發(fā)檢測(cè):支持正負(fù)邊沿觸發(fā)模式。
  6. 電池電壓模式:在啟動(dòng)時(shí)按下按鈕,顯示電池電壓。

代碼實(shí)現(xiàn)

以下是代碼的關(guān)鍵部分:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>

#define SCREEN_WIDTH 128 // OLED顯示屏幕寬度,以像素為單位
#define SCREEN_HEIGHT 64 // OLED顯示屏幕高度,以像素為單位

// 定義OLED顯示屏的復(fù)位引腳
#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; // 每屏采集樣本數(shù)
float voltageScale = 1.0; // 電壓量程
float timeBase = 1.0; // 時(shí)間基準(zhǔn)
bool triggerPositive = true; // 觸發(fā)極性

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讀取最后的設(shè)置
  voltageScale = EEPROM.read(0);
  timeBase = EEPROM.read(1);
  triggerPositive = EEPROM.read(2);
}

void loop() {
  // 檢測(cè)按鈕操作
  if (digitalRead(BUTTON_SELECT) == LOW) {
    // 切換設(shè)置選項(xiàng)
  }
  if (digitalRead(BUTTON_UP) == LOW) {
    // 調(diào)整當(dāng)前選中的參數(shù)
  }
  if (digitalRead(BUTTON_DOWN) == LOW) {
    // 調(diào)整當(dāng)前選中的參數(shù)
  }
  if (digitalRead(BUTTON_HOLD) == LOW) {
    // 凍結(jié)或恢復(fù)波形顯示
  }

  // 采集波形數(shù)據(jù)
  int samples[sampleRate];
  for (int i = 0; i < sampleRate; i++) {
    samples[i] = analogRead(A0);
  }

  // 分析波形數(shù)據(jù)
  float frequency = calculateFrequency(samples);
  float dutyCycle = calculateDutyCycle(samples);

  // 顯示波形和數(shù)據(jù)
  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();
}

// 計(jì)算頻率的函數(shù)
float calculateFrequency(int *samples) {
  // 實(shí)現(xiàn)頻率計(jì)算邏輯
}

// 計(jì)算占空比的函數(shù)
float calculateDutyCycle(int *samples) {
  // 實(shí)現(xiàn)占空比計(jì)算邏輯
}

// 繪制波形的函數(shù)
void drawWaveform(int *samples) {
  // 實(shí)現(xiàn)波形繪制邏輯
}

代碼上傳

  1. 使用USB線將Arduino Nano連接到計(jì)算機(jī)。
  2. 在Arduino IDE中安裝所需的庫(kù):
    • Adafruit GFX
    • Adafruit SH1106
  3. 打開(kāi)代碼文件,選擇正確的開(kāi)發(fā)板和COM端口。
  4. 點(diǎn)擊“上傳”按鈕,將代碼上傳到Arduino Nano。

操作指南

按鈕功能說(shuō)明

在這里插入圖片描述

  • SELECT:循環(huán)切換控制選項(xiàng)(垂直量程 → 時(shí)間基準(zhǔn) → 觸發(fā))。
  • UP/DOWN:調(diào)整當(dāng)前選中的參數(shù)。
  • HOLD:凍結(jié)或恢復(fù)波形顯示。
  • 自動(dòng)保存:在最后一次按鈕按下后的5秒內(nèi),設(shè)置將自動(dòng)保存到EEPROM。

啟動(dòng)模式

在啟動(dòng)時(shí),按下UP或DOWN按鈕可以進(jìn)入電壓表模式,選擇5V或50V量程。

應(yīng)用場(chǎng)景

在這里插入圖片描述

這個(gè)DIY示波器具有多種應(yīng)用場(chǎng)景,包括:

  1. 信號(hào)可視化:觀察各種電子信號(hào)的波形。
  2. 頻率測(cè)量:測(cè)量信號(hào)的頻率。
  3. 調(diào)試小型電子電路:幫助快速定位電路問(wèn)題。
  4. 教育工具:用于學(xué)習(xí)波形分析和電子基礎(chǔ)。

總結(jié)

通過(guò)這個(gè)項(xiàng)目,我們不僅能夠制作一個(gè)功能強(qiáng)大的示波器,還能在這個(gè)過(guò)程中學(xué)習(xí)到硬件設(shè)計(jì)固件開(kāi)發(fā)和信號(hào)分析等多方面的知識(shí)。雖然這個(gè)DIY示波器在功能上可能無(wú)法與高端示波器相比,但它完全能夠滿足日常的電子實(shí)驗(yàn)和學(xué)習(xí)需求。更重要的是,這個(gè)項(xiàng)目激發(fā)了我們的創(chuàng)造力和動(dòng)手能力,讓我們?cè)趯?shí)踐中不斷學(xué)習(xí)和進(jìn)步。

未來(lái)改進(jìn)方向

雖然這個(gè)項(xiàng)目已經(jīng)具備了基本的示波器功能,但仍有很大的改進(jìn)空間。例如:

  • 增加更多量程選項(xiàng):目前只支持兩種量程,可以增加更多量程以適應(yīng)更廣泛的信號(hào)范圍。
  • 提高采樣率:通過(guò)優(yōu)化代碼和硬件,提高波形的采樣率,從而獲得更清晰的波形。
  • 增加更多顯示功能:如添加峰值檢測(cè)、平均值計(jì)算等。
  • 開(kāi)發(fā)更高級(jí)的觸發(fā)模式:如窗口觸發(fā)、延遲觸發(fā)等。

總之,這個(gè)基于Arduino Nano的DIY示波器項(xiàng)目是一個(gè)很好的起點(diǎn),它不僅能夠滿足你的實(shí)際需求,還能激發(fā)你的創(chuàng)造力和探索精神。希望這篇文章能激發(fā)你的興趣,讓你也動(dòng)手制作一個(gè)屬于自己的示波器!


希望你喜歡這個(gè)項(xiàng)目,并在構(gòu)建過(guò)程中找到樂(lè)趣!如果你有任何問(wèn)題或需要幫助,歡迎在評(píng)論區(qū)交流。

作者:Svan.


注意:本博文為不得在未經(jīng)本人同意進(jìn)行轉(zhuǎn)載或者二次創(chuàng)作,違者必究!??!

博客主頁(yè):https://blog.csdn.net/weixin_51141489,需要源碼或相關(guān)資料實(shí)物的友友請(qǐng)關(guān)注、點(diǎn)贊,私信吧!

  • 聯(lián)系方式.txt
    下載

相關(guān)推薦