基于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)備以下硬件組件:
- Arduino Nano:作為核心控制器。
- SH1106 128x64 I2C OLED顯示屏:用于顯示波形和其他信息。
- 輕觸按鈕:4個(gè),分別用于選擇、向上、向下和保持功能。
- 電壓分壓電阻:用于調(diào)整輸入信號(hào)的電壓范圍。
- 肖特基二極管:用于防止過(guò)電壓。
- 電容:104型號(hào),用于濾波。
- 面包板或自制PCB:用于組裝電路。
- 跳線:用于連接各個(gè)組件。
- 電源: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ì)包括以下部分:
- Arduino Nano插座:方便插入和更換Arduino Nano。
- OLED顯示屏:預(yù)留空間和接口。
- 按鈕:4個(gè)按鈕的安裝位置。
- 電壓分壓和衰減電路:集成在PCB上。
- 電源接口和去耦元件:確保電源穩(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),以下是代碼的主要功能:
- 波形采集:每屏刷新時(shí)采集200個(gè)樣本。
- 頻率分析:計(jì)算波形的頻率和占空比。
- EEPROM存儲(chǔ):保存最后的設(shè)置,如電壓量程、時(shí)間基準(zhǔn)和觸發(fā)極性。
- 用戶界面:按鈕用于循環(huán)選擇設(shè)置,OLED顯示屏實(shí)時(shí)顯示數(shù)據(jù)。
- 觸發(fā)檢測(cè):支持正負(fù)邊沿觸發(fā)模式。
- 電池電壓模式:在啟動(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)波形繪制邏輯
}
代碼上傳
- 使用USB線將Arduino Nano連接到計(jì)算機(jī)。
- 在Arduino IDE中安裝所需的庫(kù):
- Adafruit GFX
- Adafruit SH1106
- 打開(kāi)代碼文件,選擇正確的開(kāi)發(fā)板和COM端口。
- 點(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)景,包括:
- 信號(hào)可視化:觀察各種電子信號(hào)的波形。
- 頻率測(cè)量:測(cè)量信號(hào)的頻率。
- 調(diào)試小型電子電路:幫助快速定位電路問(wèn)題。
- 教育工具:用于學(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)贊,私信吧!