Arduino UNO R4 Minimaと0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
更新日 2025.05.13 登録日 2025.03.14
大阪教育大学の光永さんの
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
R4IPSOscillo102.zip (2025.05.13 update)
以下のライブラリはライブラリマネージャからインストールできます。
arduinoFFT by Enrique Condes 2.0.0
Adafruit ST7735 and ST7789 Library
回路図
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方向スイッチでは右上同時押しになります)。再度同時押しすれば元に戻ります。
Page 1
一番上がCH1の電圧レンジ、2番目がCH2の電圧レンジです。Rightボタンを押すと値が上がり、Leftボタンを押すと下がります。
3番目が時間軸レンジです。Rightボタンを押すと早くなり、Leftボタンを押すと遅くなります。
4番目はトリガ方式の表示で、real又はscanと表示されます。本機では時間軸30us/divレンジだけがscanです。また、時間軸の拡大を、RightボタンとLeftボタンで x1,x2,x5,x10 が選択出来ます。
5番目はトリガモードで、Rightボタンを押すとAuto->Norm->Scan->One->Autoと切り替わります。Leftボタンを押すと逆方向に切り替わります。
6番目はトリガソースとトリガエッジの設定です。TG1が表示されている時はCH1をトリガソースにします。Leftボタンを押すとトリガソースを切り替えます。Rightボタンを押すとトリガエッジの上下の切り替えが出来ます。上矢印か下矢印が表示されてます。
7番目はトリガレベルです。Rightボタンを押すと値が上がり、Leftボタンを押すと下がります。波形エリアのグリッドの右端に短い線でトリガレベルを表示しています。ボタンを長押しすると連続変化します。
8番目はRun/Holdの切り替えです。RightボタンでもLeftボタン交互に切り替わります。
Page 2
上半分がCH1の設定項目、下半分がCH2の設定項目。
2番目がCH1の、6番目がCH2の非表示や反転表示の切り替えです。Leftボタンで表示・非表示、Rightボタンで正転・反転の
切り替えが出来ます。
3番目がCH1の電圧レンジ、7番目がCH2の電圧レンジです。
4番目はCH1の、8番目がCH2の波形表示上下位置です。Rightボタンを押すと上に上がり、Leftボタンを押すと下がります。ボタンを長押しすると連続変化します。RightボタンとLeftボタンを同時押しすると標準の位置最下端にリセットします(5方向スイッチでは左下同時押しになります)。
Page 3
一番上がCH1の電圧レンジです。
2番目が時間軸レンジです。
3番目がFFTモード切り替えです。Rightボタンを押すとFFT表示になります。Leftボタンを押すと波形表示に戻ります。FFT表示はCH1のみです。
4番目"FREQ"は周波数とDuty比計測結果の表示切り替えです。Rightボタンを押すと表示になり、Leftボタンを押すと非表示になります。
5番目"VOLT"は電圧計測結果の表示切り替えです。Rightボタンを押すと表示になり、Leftボタンを押すと非表示になります。
6番目"PWM"はPulse generatorのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。
7番目"DUTY"はPulse generatorのDuty比設定です。Rightボタンを押すと増加し、Leftボタンを押すと減少します。ボタンを長押しすると連続変化し加速します。
8番目"FREQ"はPulse generatorの周波数設定です。Rightボタンを押すと増加し、Leftボタンを押すと減少します。ボタンを長押しすると連続変化し加速します。
Page 4
一番上がCH1の電圧レンジです。
2番目が時間軸レンジです。
3番目"DDS"はDAC DDS Function GeneratorのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。
4番目はDAC DDS Function Generatorの波形切り替えです。RightボタンとLeftボタンでは逆方向に切り替わります。
5番目"FREQ"はDAC DDS Function Generatorの周波数設定です。Rightボタンを押すと増加し、Leftボタンを押すと減少します。ボタンを長押しすると連続変化し加速します。
6番目"MSR1/MSR2"はどちらのチャンネルの周波数測定と電圧測定をするかの選択です。Leftボタンを押すとMSR1でCH1に、Rightボタンを押すとMSR2でCH2になります。
7番目"FCNT"は周波数カウンタのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。7行目に計測した周波数を表示します。他のページでは表示しません。周波数カウンタがOn時にRightボタンを押すとCalibrationができます。
Pulse Generatorについて
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になり細かく設定できます。インタラプトは発生しないはずです。
DAC DDS Function Generatorについて
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の周波数も計測出来ます。
Known Bugs
まだソフトの完成度が低いので、時々暴走してマイコンボードに書き込み出来なくなることがあります。そんな時はリセットボタンをダブルタップすればブートモードになって書き込みできるようになります。ブートモードではオンボードのLEDがフワフワと点滅します。
波形表示が所々途切れることがある。
Arduino UNO R4のADCの入力インピーダンスが低いので、信号源インピーダンスが高いと波形が乱れます。OPアンプのバッファを入れた方が良い。
0.5s/divレンジ以上でFFT表示にならない。そもそもそのようにコーディングしていないし直す気は無い。
原理的に周波数測定には画面上で2周期以上が必要。
トリガモードのOneがうまく機能しないので外してある。
トリガが掛からない状態でトリガモードをNormにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。
2ch間でレベル差が大きい部分には相互干渉が発生することがある。
入力の保護抵抗を省略したのでオペアンプが壊れやすい。直列に1kohmから10kohmの抵抗を入れておいた方が良い。
Pulse generatorはCPUクロックを分周していて1/2から整数分の1の周波数を発生する。周波数の高い方は24MHz, 16MHz, 12MHz, 9.6MHz, 8MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になる。
これ単体で2チャンネル入力にPulse generatorとFunction Generatorの出力を入れて波形観測して遊べます。
改良可能性
DMAを使って709kspsまでに高速にできるはず。ただしHigh-precision channelの使い方が分からない。
取り込みサンプル数を増やして表示位置を移動できるようにしてみたい。
時間軸拡大表示、2倍、5倍、10倍にできますが位置は波形の先頭に固定です。位置を変更できるようにしたい
Hold Off調整機能を入れた方が便利かもしれない。
機能概要
機能 |
内容 |
入力チャンネル数 |
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 UNO/Nano OLED版:
ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
Arduino UNO/Pro Mini LCD版:
ArduinoとLCDタッチシールドで2CHオシロスコープ
Arduino UNO/Nano 0.96-inch 80x160 LCD版:
Arduinoと0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・周波数カウンタ
ESP32 OLED版:
ESP32とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
ESP32 OLED WEB版:
ESP32で2CH WEBオシロスコープ・Pulse generator・Function Generator
ESP32 LCD WEB版:
ESP32とTFTタッチスクリーンLCDで2CH WEBオシロスコープ・Pulse generator・Function Generator
Raspberry Pi Pico OLED版:
Raspberry Pi Pico WとOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
Raspberry Pi Pico LCD版:
Raspberry Pi Pico WとTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
Raspberry Pi Pico 0.96-inch 80x160 LCD版:
Raspberry Pi Pico Wと0.96-inch 80x160 LCDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
STM32F103C8T6 OLED版:
STM32F103C8T6とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
STM32F103C8T6 LCD版:
STM32F103C8T6とTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator
STM32F103C8T6 0.96-inch 80x160 LCD版:
STM32F103C8T6と0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
STM32F103C8T6 USB版:
STM32F103C8T6で2CH USBオシロスコープ・Pulse generator・Function Generator
STM32F103C8T6 DLO-138-SPI:
STM32F103C8T6とTFT LCDで2CHオシロスコープDLO-138-SPI
Arduino UNO R4 Minima OLED版:
Arduino UNO R4 MinimaとOLEDで2CHオシロスコープ・Pulse generator・Function Generator
Arduino UNO R4 Minima USB版:
Arduino UNO R4 Minimaで2CH USBオシロスコープ・Pulse generator・Function Generator
Arduino UNO R4 Minima 0.96-inch 80x160 LCD版:
Arduino UNO R4 Minimaと0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
Arduinoで電子工作に戻る
Siliconvalley4066番地に戻る
ゲストブックへ
siliconvalley4066@yahoo.co.jp