大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、 それを基に128x64の1.3インチOLEDで使えるように変更して ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ と Arduinoと0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・周波数カウンタ を作ったので、それを基にArduino UNO R4 Minimaに移植しました。このディスプレイはAmazonだと1000円くらいしますが、AliExpressだと送料込みで300円くらいで買えるので気軽に使えます。OLED版よりも少し広い範囲を表示できますが、解像度が高くなった分文字表示が小さくなりました。その代わりカラーで表示出来るので、2チャンネルの区別が分かりやすくなりました。
画面レイアウトとGUIはOLED版、波形描画方法は古い波形を消してから描画するTFT版を元にしています。Arduino UNO R4 WiFiではレジスタ割り当てが異なるので使えません。DDS Function Generatorは12ビットDACを使って8ビットデータを出力します。
radiopenchさんが開発された128x64OLEDモジュールを使ったペン型オシロスコープ ラジオペンチ ペン型オシロスコープ を機能拡張して Arduinoでオシロスコープ を作ったので、そこから電圧測定と周波数測定を流用しています。 等価時間サンプリングは実装していません。
開発環境は Arduino IDE 1.8.19です。
最新版はGitHubに置く予定です
https://github.com/siliconvalley4066/R4IPSOscilloscope
R4IPSOscillo103.zip (2026.07.14 update)
以下のライブラリはライブラリマネージャからインストールできます。
Arduino UNO R4のADCの入力インピーダンスが2.5kohmから6.7kohmと低いので、信号源インピーダンスが高いと波形が乱れます。回路図上では高入力インピーダンスにするためにオペアンプMCP6002によるボルテージフォロワを入れてありますが、動作確認するだけならこの入力回路は不要で、直接A1とA2に接続しても構いません。ただし、0Vから5Vの範囲を超える電圧を与えるとマイコンチップが壊れる恐れがありますので注意してください。
タクトスイッチ4個で操作するようにしましたが、スイッチの場所を取るので5方向スイッチでも使えるようにしました。5方向スイッチでは上下同時押しや左右同時押しが出来ないので、右上同時押しと左下同時押しに変更しました。#define BUTTON5DIR を有効にすれば5方向スイッチにすることができます。
画面右側のメニューは4ページ構成になっています。UpボタンとDownボタンでメニュー内の項目を移動します。一番上の項目でUpボタンを押すと前のページに切り替わります。一番下の項目でDownボタンを押すと次のページに切り替わります。それぞれの項目の位置でRightボタンかLeftボタンを押すとその項目の値を変更したりOn/Offの切り替えをします。
ページに関係なくUpボタンとDownボタンを同時押しすると文字表示を消して全画面波形表示になります(5方向スイッチでは右上同時押しになります)。再度同時押しすれば元に戻ります。
R4のPWMのことはよく分かっていませんが、カウントとプリスケーラの分周比を直接設定する方法が分かったので、クロック周波数48MHzを元にして分周比は、1倍、4倍、16倍、64倍、256倍、1024倍で、カウントは1/2から1/65536まで使います。発生できる周波数は0.715Hzから24MHzまでになります。周波数自体を設定するのではなく、発生できる上または下の周波数へ設定を変更して、その設定で発生される周波数を計算して表示します。周波数の高い方は24MHz, 16MHz, 12MHz, 9.6MHz, 8MHzのように飛び飛びの値になります。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になり細かく設定できます。インタラプトは発生しないはずです。
Lab3 - Laboratory for Experimental Computer Science を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。 Arduino UNO R4には12bit DACがあってA0ピンに出力できますが、変換速度があまり速くなく30us程度なので サンプリング周波数は30kHzにしました。メモリに余裕があるので用意した23波形すべてを使えます。 他のオシロで使っているデータを流用しているので8ビットデータになっています。
DAC出力の負荷抵抗が30kohm以上という仕様なので、必要に応じてバッファアンプを付けてください。
R4にはanalogWaveというライブラリがあってDACで波形を出力できますが、サイン波とのこぎり波と矩形波だけで時間方向の分割数が粗いのと周波数が飛び飛びになるので利用していません。
リンク先が消えているようなので同じ内容を探してみました。 Arduino Sinewave Generator
(2025.05.13 update) version1.02から別ページArduino UNO R4で周波数カウンタで作っていた周波数カウンタを実装しました。ゲート時間は1秒です。 プリアンプは付けていませんが、5V系のデジタル回路のクロック周波数の確認等に使えると思います。
周波数カウンタを使ってもPulse GeneratorやDDS Function Generatorには影響ありません。自身のPulse Generatorの周波数も計測出来ます。
| 機能 | 内容 |
|---|---|
| 入力チャンネル数 | 2 |
| 入力結合 | DC and AC |
| 入力電圧範囲 | 0 to 5V |
| 入力インピーダンス | 1Mohm。オペアンプ無しの場合は信号源2.5kohmから6.7kohm以下 |
| 電圧レンジ(volts/div) | 1V, 0.5V, 0.2V, 0.1V, 50mV |
| 時間レンジ(time/div) | 10s, 5s, 2s, 1s, 0.5s, 0.2s, 0.1s, 50ms, 20ms, 10ms, 5ms, 2ms, 1ms, 500us, 200us, 100us, 70us (141ksps), (1 channel) 30us (346ksps) |
| トリガモード | Auto, Normal, Scan |
| トリガ極性 | rise/fall edge |
| トリガソース | CH1 or CH2 |
| トリガレベル調整 | 画面内位置を上下に調整 |
| 外部トリガ | No |
| 波形位置調整 | 上下に調整可能 |
| 波形反転表示 | Yes |
| 電圧測定表示 | Max, Average, Min (AC入力でもDCレベルを表示) |
| 周波数&Duty測定 | Yes |
| 電圧・周波数・Duty表示 | 表示・非表示切り替え |
| 文字表示 | 文字サイズ固定 |
| FFT | Yes |
| A/D変換分解能 | 12bits |
| サンプル数 | 160samples/channel (12bits/channel) 12bit/sampleを電圧レンジに応じて0-79にスケーリングして表示 |
| 表示解像度 | 160x80 dots, 10dots/div |
| 等価時間サンプリング | No |
| 設定状態EEPROM保存 | Yes |
| 操作方法 | タクトスイッチ4個 または 5方向スイッチ (Left, Right, Down, Up) |
| プリトリガー | No |
| ホールドオフ機能 | No |
| 時間軸拡大表示 | x2, x5, x10 sin(x)/x補間 |
| X-Y表示 | No |
| Pulse Generator | 0.715Hz to 24MHz 約5Vpp方形波 Duty ratio可変 |
| Function Generator | 8bit DAC DDS 0.01Hz to 9999.99Hz(実用は400Hzまで) 約5Vpp
23波形 sine, saw, revsaw, triangle, rectangle, 20% pulse, 10% pulse, 5% pulse, 1dot pulse, noise, gaussian noise, ECG, sinc5, sinc10, sinc20, sine 2 harmonic, sine 3 harmonic, chopped sine, sine abs, trapezoid, step2, step4, chainsaw |
| 周波数カウンタ | デジタル入力 1Hzから16MHzまでのゲート時間1秒のパルスカウンタ。実力で19MHzまで。精度2000ppm程度 |
| PCへのデータ転送 | No |
| SDカードへの波形保存 | No |
Arduinoで電子工作に戻る
Siliconvalley4066番地に戻る