基于Arduino Nano的DIY示波器:打造屬于你的口袋實驗室
前言
在電子愛好者的世界里,示波器是不可或缺的工具之一。它能夠幫助我們觀察和分析各種電子信號的波形,從而更好地理解和調試電路。然而,市面上的示波器價格往往較高,對于一些初學者或預算有限的愛好者來說,可能是一個不小的負擔。幸運的是,隨著開源硬件和軟件的發(fā)展,我們可以通過一些簡單的組件和代碼,自己動手制作一個功能強大的示波器。今天,我們將詳細介紹如何使用Arduino Nano和SH1106 OLED顯示屏,打造一個屬于自己的DIY示波器。
項目簡介
這個項目的目標是制作一個基于Arduino Nano的便攜式示波器,它具備以下特點:
- 緊湊的設計:基于Arduino Nano的緊湊設計,便于攜帶和使用。
- OLED顯示屏:使用SH1106 128x64 I2C OLED顯示屏,實時顯示波形。
- 功能豐富:支持垂直和水平縮放、頻率和占空比計算、設置保存、觸發(fā)極性檢測以及波形凍結功能。
- 成本低廉:使用常見的電子元件,總成本遠低于市售示波器。
- 開源代碼:基于開源代碼,易于修改和擴展。
硬件需求
制作這個DIY示波器,你需要準備以下硬件組件:
- Arduino Nano:作為核心控制器。
- SH1106 128x64 I2C OLED顯示屏:用于顯示波形和其他信息。
- 輕觸按鈕:4個,分別用于選擇、向上、向下和保持功能。
- 電壓分壓電阻:用于調整輸入信號的電壓范圍。
- 肖特基二極管:用于防止過電壓。
- 電容:104型號,用于濾波。
- 面包板或自制PCB:用于組裝電路。
- 跳線:用于連接各個組件。
- 電源:5V穩(wěn)壓電源。
電路設計
電路圖概述
整個電路的設計相對簡單,主要分為以下幾個部分:
- 信號輸入:通過電壓分壓電路和可選的衰減器,將信號輸入到Arduino Nano的模擬輸入引腳A0。
- OLED顯示屏連接:使用I2C接口,連接到Arduino Nano的A4(SDA)和A5(SCL)引腳。
- 按鈕連接:使用肖特基二極管將按鈕信號合并,并連接到數(shù)字引腳D2,用于中斷操作。
- 保護電路:肖特基二極管用于防止過電壓,電阻用于正確縮放輸入電壓。
詳細電路圖
以下是電路的詳細連接方式:
- 信號輸入:
- 輸入信號通過一個電壓分壓電路連接到A0引腳。
- 為了保護Arduino Nano,使用一個肖特基二極管防止輸入電壓過高。
- OLED顯示屏:
- SDA引腳連接到A4。
- SCL引腳連接到A5。
- VCC和GND分別連接到電源和地。
- 按鈕:
- 4個按鈕分別連接到D2引腳,每個按鈕之間通過肖特基二極管隔離。
- 按鈕的另一端連接到地。
- 電源:
- 使用5V穩(wěn)壓電源為整個電路供電。
PCB設計
為了使項目更加緊湊和美觀,可以設計一個定制的PCB。PCB設計包括以下部分:
- Arduino Nano插座:方便插入和更換Arduino Nano。
- OLED顯示屏:預留空間和接口。
- 按鈕:4個按鈕的安裝位置。
- 電壓分壓和衰減電路:集成在PCB上。
- 電源接口和去耦元件:確保電源穩(wěn)定。
PCB布局
PCB的布局應盡量簡潔,減少布線長度,提高信號質量。以下是PCB布局的建議:
- 將Arduino Nano插座和OLED顯示屏放置在PCB的中心位置。
- 按鈕分布在顯示屏的周圍,方便操作。
- 電源接口和去耦元件放置在靠近電源輸入的位置。
軟件設計
核心代碼功能
示波器的核心功能由一個復雜的Arduino程序實現(xiàn),以下是代碼的主要功能:
- 波形采集:每屏刷新時采集200個樣本。
- 頻率分析:計算波形的頻率和占空比。
- EEPROM存儲:保存最后的設置,如電壓量程、時間基準和觸發(fā)極性。
- 用戶界面:按鈕用于循環(huán)選擇設置,OLED顯示屏實時顯示數(shù)據(jù)。
- 觸發(fā)檢測:支持正負邊沿觸發(fā)模式。
- 電池電壓模式:在啟動時按下按鈕,顯示電池電壓。
代碼實現(xiàn)
以下是代碼的關鍵部分:
#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; // 每屏采集樣本數(shù)
float voltageScale = 1.0; // 電壓量程
float timeBase = 1.0; // 時間基準
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讀取最后的設置
voltageScale = EEPROM.read(0);
timeBase = EEPROM.read(1);
triggerPositive = EEPROM.read(2);
}
void loop() {
// 檢測按鈕操作
if (digitalRead(BUTTON_SELECT) == LOW) {
// 切換設置選項
}
if (digitalRead(BUTTON_UP) == LOW) {
// 調整當前選中的參數(shù)
}
if (digitalRead(BUTTON_DOWN) == LOW) {
// 調整當前選中的參數(shù)
}
if (digitalRead(BUTTON_HOLD) == LOW) {
// 凍結或恢復波形顯示
}
// 采集波形數(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();
}
// 計算頻率的函數(shù)
float calculateFrequency(int *samples) {
// 實現(xiàn)頻率計算邏輯
}
// 計算占空比的函數(shù)
float calculateDutyCycle(int *samples) {
// 實現(xiàn)占空比計算邏輯
}
// 繪制波形的函數(shù)
void drawWaveform(int *samples) {
// 實現(xiàn)波形繪制邏輯
}
代碼上傳
- 使用USB線將Arduino Nano連接到計算機。
- 在Arduino IDE中安裝所需的庫:
- Adafruit GFX
- Adafruit SH1106
- 打開代碼文件,選擇正確的開發(fā)板和COM端口。
- 點擊“上傳”按鈕,將代碼上傳到Arduino Nano。
操作指南
按鈕功能說明
- SELECT:循環(huán)切換控制選項(垂直量程 → 時間基準 → 觸發(fā))。
- UP/DOWN:調整當前選中的參數(shù)。
- HOLD:凍結或恢復波形顯示。
- 自動保存:在最后一次按鈕按下后的5秒內,設置將自動保存到EEPROM。
啟動模式
在啟動時,按下UP或DOWN按鈕可以進入電壓表模式,選擇5V或50V量程。
應用場景
這個DIY示波器具有多種應用場景,包括:
- 信號可視化:觀察各種電子信號的波形。
- 頻率測量:測量信號的頻率。
- 調試小型電子電路:幫助快速定位電路問題。
- 教育工具:用于學習波形分析和電子基礎。
總結
通過這個項目,我們不僅能夠制作一個功能強大的示波器,還能在這個過程中學習到硬件設計、固件開發(fā)和信號分析等多方面的知識。雖然這個DIY示波器在功能上可能無法與高端示波器相比,但它完全能夠滿足日常的電子實驗和學習需求。更重要的是,這個項目激發(fā)了我們的創(chuàng)造力和動手能力,讓我們在實踐中不斷學習和進步。
未來改進方向
雖然這個項目已經具備了基本的示波器功能,但仍有很大的改進空間。例如:
- 增加更多量程選項:目前只支持兩種量程,可以增加更多量程以適應更廣泛的信號范圍。
- 提高采樣率:通過優(yōu)化代碼和硬件,提高波形的采樣率,從而獲得更清晰的波形。
- 增加更多顯示功能:如添加峰值檢測、平均值計算等。
- 開發(fā)更高級的觸發(fā)模式:如窗口觸發(fā)、延遲觸發(fā)等。
總之,這個基于Arduino Nano的DIY示波器項目是一個很好的起點,它不僅能夠滿足你的實際需求,還能激發(fā)你的創(chuàng)造力和探索精神。希望這篇文章能激發(fā)你的興趣,讓你也動手制作一個屬于自己的示波器!
希望你喜歡這個項目,并在構建過程中找到樂趣!如果你有任何問題或需要幫助,歡迎在評論區(qū)交流。
作者:Svan.
注意:本博文為不得在未經本人同意進行轉載或者二次創(chuàng)作,違者必究!??!
博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關資料實物的友友請關注、點贊,私信吧!