Arduino Nanoで作るDIYミニオシロスコープ – ステップバイステップチュートリアル
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| ElectroPeak 0.96インチ OLED 64x128 ディスプレイモジュール (SSD1306) | 1 |
| タクトスイッチ(トップアクチュエート) | 9 |
| 1N4148 高速スイッチングダイオード | 4 |
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
この動画では、自宅で簡単に作れるミニオシロスコープの製作方法を紹介します。シンプルで簡単な構成です。※このコードは私がオリジナルで書いたものではなく、チュートリアルとしてまとめたものです。サードパーティのソースコードを参考にしています(リンクは下記参照)。ご質問やご提案があれば、YouTube動画のコメント欄へどうぞ。チャンネル登録と高評価もよろしくお願いします!
完全なチュートリアルとソースコードはこちら:リンク
Instagram: @pm.goharian
必要な部品
- Arduino Nano
- SSD1306 OLEDディスプレイ
- 1N4148ダイオード
- マイクロスイッチ(タクトスイッチ)
- 104セラミックコンデンサ(0.1μF)
- 抵抗: 100Ω, 12kΩ, 120kΩ, 510kΩ
オシロスコープとは?
『オシロスコープ』(以前は『オシログラフ』と呼ばれた)は、非公式には『スコープ』『オースコープ』『CRO』(陰極線オシロスコープ)、『DSO』(デジタルストレージオシロスコープ)とも呼ばれ、電気信号の変化をグラフィカルに表示する電子測定器です。通常、電圧をY軸、時間をX軸とした2次元プロットとして、1つ以上の信号を時間の関数として表示します。音や振動などの他の信号も電圧に変換すれば表示可能です。
オシロスコープは電気信号の時間変化を表示し、キャリブレーションされたスケール上で波形を表示します。この波形から振幅、周波数、立ち上がり時間、時間間隔、歪みなどの特性を解析できます。最新のデジタル機器ではこれらの値を自動計算・表示します。本来は、画面に内蔵されたスケールで波形を手動測定してこれらの値を求めていました。
回路図
注意: 回路のすべての接続が、以下の回路図と完全に一致するようにしてください。



参考資料:
コード
このオシロスコープのスケッチコードです。OLEDディスプレイ制御にAdafruit GFX/SSD1306ライブラリを使用し、EEPROMで設定を保存、割り込みでトリガー同期を実現しています。
/* (_20190212_OLEDoscilloscope.ino) 1285byte ram free 2019/02/12 */
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <avr/pgmspace.h> // PROGMEM
#include <EEPROM.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define REC_LENGTH 200
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 電圧レンジ名(PROGMEMに格納)
const char vRangeName[10][5] PROGMEM = {"A50V", "A 5V", " 50V", " 20V", " 10V", " 5V", " 2V", " 1V", "0.5V", "0.2V"};
const char * const vstring_table[] PROGMEM = {vRangeName[0], vRangeName[1], vRangeName[2], vRangeName[3], vRangeName[4], vRangeName[5], vRangeName[6], vRangeName[7], vRangeName[8], vRangeName[9]};
// 時間レンジ名
const char hRangeName[8][6] PROGMEM = {" 50ms", " 20ms", " 10ms", " 5ms", " 2ms", " 1ms", "500us", "200us"};
const char * const hstring_table[] PROGMEM = {hRangeName[0], hRangeName[1], hRangeName[2], hRangeName[3], hRangeName[4], hRangeName[5], hRangeName[6], hRangeName[7]};
int waveBuff[REC_LENGTH];
char chrBuff[10];
String hScale = "xxxAs";
String vScale = "xxxx";
float lsb5V = 0.0055549;
float lsb50V = 0.051513;
volatile int vRange;
volatile int hRange;
volatile int trigD;
volatile int scopeP;
volatile boolean hold = false;
volatile boolean paraChanged = false;
volatile int saveTimer;
int timeExec;
int dataMin;
int dataMax;
int dataAve;
int rangeMax;
int rangeMin;
int rangeMaxDisp;
int rangeMinDisp;
int trigP;
boolean trigSync;
int att10x;
void setup() {
pinMode(2, INPUT_PULLUP); // INT0
pinMode(8, INPUT_PULLUP); // Select
pinMode(9, INPUT_PULLUP); // Up
pinMode(10, INPUT_PULLUP); // Down
pinMode(11, INPUT_PULLUP); // Hold
pinMode(12, INPUT); // 1/10分圧切替
pinMode(13, OUTPUT); // LED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;); // 失敗時は無限ループ
}
loadEEPROM();
analogReference(INTERNAL); // 1.1V基準電圧
attachInterrupt(0, pin2IRQ, FALLING);
startScreen();
}
void loop() {
digitalWrite(13, HIGH);
setConditions();
readWave();
digitalWrite(13, LOW);
dataAnalize();
writeCommonImage();
plotData();
dispInf();
display.display();
saveEEPROM();
while (hold == true) {
dispHold();
delay(10);
}
}
// 以下、各関数の実装(setConditions, writeCommonImage, readWave, dataAnalize, startScreen, dispHold, dispInf, plotData, saveEEPROM, loadEEPROM, pin2IRQ)
// 完全なコードはダウンロードしてご確認ください。
主な機能:
- 10段階の電圧レンジ(オートレンジ含む)
- 8段階の時間ベース(50ms〜200μs/div)
- 立ち上がり/立ち下がりトリガー選択
- ホールド機能
- 設定のEEPROM保存/読み出し
- ピーク検出と自動レンジ調整
- 波形表示とグリッド描画
回路図

製造プロセス
- 自宅で作るDIY宿題自動筆記マシン:AxiDraw風ペンプロッターの自作ガイド
- Arduino Nano RP2040で作るDIY Photoshopコントロールコンソール
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduinoで作るパンチングキーボードボタン:ストレス解消カスタムキー
- Arduinoで地球の質量を測定:ステップバイステップDIYガイド
- PHPベースのWebインターフェースでArduino Unoを制御する構築ガイド
- Arduinoで楽器演奏:音階生成のステップバイステップガイド
- Arduinoと超音波センサーで自動ドアを制御:LCD・ブザー付き完全ガイド
- Arduino Nanoで作る「食べさせロボット」:超音波センサーで食べ物検知し口を開閉
- ArduinoとProcessingで作るリアルタイムデジタルコンパス
- DIYカーボンファイバー製作:自宅でカーボンファイバーパーツを作るステップバイステップガイド