ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ

更新日 2023.10.02
*

大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを基に128x64の1.3インチOLEDで使えるように変更しました。操作のためにスイッチや抵抗を11個も付けるのは大変なのでスイッチ4個で操作出来るようにしました。Arduino NanoやArduino Unoで使えます。
また、radiopenchさんが開発された128x64OLEDモジュールを使ったペン型オシロスコープ ラジオペンチ ペン型オシロスコープ を機能拡張して Arduinoでオシロスコープ を作ったので、そこから電圧測定と周波数測定とFFT表示を流用しました。
また、等価時間サンプリングをを実装するために、九州工業大学大学院情報工学府の Arduino 簡易オシロスコープ のソースコードを利用させていただきました。
さらに、PultoscopeやOscilloscope in a Matchboxに対抗してPulse generatorとPWM DDS Function Generatorと周波数カウンタを実装して多機能化しました。


*

Arduino Project HUBにも公開しました。 Arduino OLED dual channel oscilloscope

ESP32版はこちら ESP32とOLEDで2CHオシロスコープ・Pulse generator・Function Generator (追記 2022.05.31)

Raspberry Pi Pico版はこちら Raspberry Pi PicoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ (追記 2022.05.31)

インドネシアの人が基板を作ってYoutubeで紹介してくれています。 https://www.youtube.com/watch?v=jiItsXJYbo8

別のインドネシアの人がブレッドボードで作ってYoutubeで紹介してくれています。 https://www.youtube.com/watch?v=bAjnO_gjYS0&t=73s

ソースコード

GOscillo132.zip (追記 2023.10.03)

GOscillo130.zip (追記 2023.07.05)

GOscillo120.zip

OLEDのドライバはSH1106です。SSD1306にするとスケッチサイズがオーバーしてしまうが、波形データを減らせば納まります。

回路図

10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので次のような入力回路にしました。ATMEGA328のADC入力の信号源インピーダンスが大きくなり過ぎるのでいろいろと変なことが起こるかもしれません。5V以上の信号に10:1プローブを使えるようになります。入力インピーダンスに拘らなくてデジタル信号しか見ないのなら2Mohmを100kohmくらいに変更してもいいかもしれません。
直流信号だけで良いならA0/A1から直結でも動作確認出来ます。
*

操作方法

画面右側のメニューは4ページ構成になっています。UpボタンとDownボタンでメニュー内の項目を移動します。一番上の項目でUpボタンを押すと前のページに切り替わります。一番下の項目でDownボタンを押すと次のページに切り替わります。それぞれの項目の位置でRightボタンかLeftボタンを押すとその項目の値を変更したりOn/Offの切り替えをします。
ページに関係なくUpボタンとDownボタンを同時押しすると文字表示を消して全画面波形表示になります。再度同時押しすれば元に戻ります。

Page 1

  • 一番上がCH1の電圧レンジ、2番目がCH2の電圧レンジです。Rightボタンを押すと値が上がり、Leftボタンを押すと下がります。
  • 3番目が時間軸レンジです。Rightボタンを押すと早くなり、Leftボタンを押すと遅くなります。
  • 4番目はReal Time SamplingかEquivalent Time Samplingかの表示で、この位置はスキップします。
  • 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ボタンを同時押しすると標準の位置最下端にリセットします。
  • 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"はPWM DDS Function GeneratorのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。
  • 4番目はPWM DDS Function Generatorの波形切り替えです。RightボタンとLeftボタンでは逆方向に切り替わります。
  • 5番目"FREQ"はPWM DDS Function Generatorの周波数設定です。Rightボタンを押すと増加し、Leftボタンを押すと減少します。ボタンを長押しすると連続変化し加速します。
  • 6番目"FCNT"は周波数カウンタのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。7行目に計測した周波数を表示します。他のページでは表示しません。OnにするとPulse generatorとPWM DDS Function Generatorは停止します。
  • 等価時間サンプリングについて

    出来るだけ高い周波数まで見てみたいということで、等価時間サンプリングを追加してみました。九州工業大学のkitscopeは安全を見てか1Mspsが上限ですが、ハードウェアの限界の16Mspsまで試して結構安定しています。
    トリガレベルは調整可能です。Delayed trigger量は固定で50usにしました。kitscopeはtrigger levelをTimer0のPWMで発生していますが、delayMicroseconds()が使えなくなるのでTimer2のPWMに変更しました。したがって等価時間サンプリング時はDDS Function Generatorを使えません。また、Timer1をタイミング調整に使うので、Timer1で発生するPulse generatorも使えません。周波数カウンタも使えません。
    追加した時間軸は、0.625us, 1.25us, 3.125us, 6.25us, 12.5us, 31.25us, 62.5us/div の7通りです。 サンプリングしたデータをそのまま表示しているので中途半端な値ばかりです。スケーリングして1,2,5に合わせることも可能でしょうが、素の性能を見たかったのでこんなことになっています。 水平軸の目盛の縦線の位置をずらしてもいいかもしれません。
    結果として100kHz程度の矩形波はゆったり全体像が見えるようになりました。200kHzあたりになると立ち上がり立下りのスルーレートの限界を超えて振幅が小さくなり始めます。1MHzでは振幅がかなり小さくなりますが、トリガは安定して掛かっているようです。A/Dコンバータのクロック分周比は16で1MHzを使用しているので実時間サンプリングの100us/divレンジや33us/divレンジよりも綺麗な波形を観測できます。

    ブレッドボード上に作ったこのオシロスコープで発生した200kHzのパルスをUNOシールドで作ったこのオシロスコープで観測するとこんな感じでなまってます。パルス自体はもっと綺麗です。
    *

    Pulse Generatorについて

    Timer1で発生できるパルスを全て出せるようにしました。16MHzを1/2から1/65536まで設定できます。分周比は1/1から1/1024まで全て使います。発生できる周波数は0.238Hzから8MHzまでになります。周波数自体を設定するのではなく、発生できる上または下の周波数へレジスタ設定を変更して、その設定で発生される周波数を計算して表示します。周波数の高い方は8MHz, 5.33MHz, 4MHz, 3.2MHz, 2.67MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になり細かく設定できます。インタラプトは発生しませんが、等価時間サンプリングや周波数カウンタとは同時には使えません。

    PWM DDS Function Generatorについて

    Lab3 - Laboratory for Experimental Computer Science を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。等価時間サンプリングや周波数カウンタとは同時には使えません。
    (追記 2022.08.09)リンク先が消えているようなので同じ内容を探してみました。 Arduino Sinewave Generator

    周波数カウンタについて

    サンプリングした波形から算出して画面上部に表示している周波数とは別物です。D5ピンに入力されてたデジタル信号の周波数をカウントする機能です。周波数の上限は6MHz位までです。
    GitHub - PaulStoffregen/FreqCount: Measures the frequency of a signal by counting the number of pulses during a fixed time. を流用させていただきました。これを起動するとPulse GeneratorとPWM DDS Function Generatorを停止するので、その周波数をカウントすることはできません。入力があるとインタラプト処理が入るので速いサンプリング時に波形にノイズが入るようなら明示的にOFFにした方が良い。

    Known Bugs

  • 波形表示が所々途切れることがある。
  • 0.5s/divレンジ以上でFFT表示にならない。そもそもそのようにコーディングしていないし直す気は無い。
  • 原理的に周波数測定には画面上で2周期以上が必要。
  • 周波数測定と電圧測定はCH1のみ。CH2のみ表示でもCH1の測定値が出る。
  • トリガモードのOneがうまく機能しないので外してある。
  • トリガが掛からない状態でトリガモードをNormにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。
  • 2ch表示で信号源インピーダンスが大きい場合は(目安として100kohm以上で入力無接続や10:1プローブ接続を含む)相互に観測波形に影響が出る。入力インピーダンスが下がるのを許容して入力回路の抵抗値2Mohmを100kohm以下に下げれば軽減できると思う。
  • 1ch表示でも信号源インピーダンスが大きい場合はトリガーソースを他チャンネルにすると波形の最初500us程度が乱れる。
  • 2ch間でレベル差が大きい部分には相互干渉が発生することがある。
  • 等価時間サンプリングでは50usecのディレイトリガ固定にしている。
  • 等価時間サンプリングでは基本的にCH1のみの計測だが、CH2をOnにするとCH2の波形をCH1の色で表示する。極性の反転はCH1側の設定に従う。実際の波形の取り込みはどちらか一方しかしない。
  • ATMEGA328の性能限界のため、実時間サンプリングの100us/divレンジ以下では実効分解能が6bit以下になる。そのために波形がつぶれて見える。
  • 等価時間サンプリングではTimer1とTimer2を使うので、Timer1を使うPulse generatorとDDSと周波数カウンタは使えない。
  • 等価時間サンプリングの特定の周波数でトリガが不安定になる。
  • 一旦等価時間サンプリングにするとPulse generatorとDDSのレジスタ設定が壊れる。実時間サンプリングに戻してから再びONにすれば復帰する。
  • ADC入力の保護抵抗を省略したのでATMEGAが壊れやすいかもしれない。
  • Pulse generatorはCPUクロックを分周していて1/2から整数分の1の周波数を発生する。周波数の高い方は8MHz, 5.33MHz, 4MHz, 3.2MHz, 2.67MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になる。
  • DDS Function Generatorは31kHzで割込みが頻繁にかかるので、CPU実行時間に依存する時間軸レンジではOscilloscopeのサンプリング時間に誤差が出る。特に580usと200us以下ではDDSをOFFにしないと誤差が大きい。
  • 実時間サンプリングではこれ単体で2チャンネル入力にPulse generatorとDDS Function Generatorの出力を入れて波形観測して遊べますが、等価時間サンプリングではD3ピンから62.5kHzが出ているのでトリガレベルを変えてパルス幅が変わることを確認できます。
  • 改良可能性

  • 電源電圧を測定して電圧を表示・補正。特にArduino NanoではUSB給電時は逆流防止のダイオードが入るので電源電圧が4.7V程度になるので補正した方が良い。
  • 内部基準電圧1.1Vを使って電圧感度アップ。
  • Hold Off調整機能を入れた方が便利かもしれない。
  • 等価時間サンプリングでのディレイトリガのディレイ量を変更できるようにUIを追加したい。
  • 特に等価時間サンプリングの時間軸が中途半端な値になっているので、スケーリングしてきりの良い値にしたい。水平軸の目盛の縦線の間隔を変えてもいいかもしれません。
  • A2, A3, A6, A7ピンが余っているので何かに使えるかも。
  • とは言え、スケッチが30578バイト、UNOで94%、Nanoで99%なので何かを加えると何かを削る必要がある。

    機能概要

    機能 内容
    入力チャンネル数 2
    入力結合 DC and AC
    入力電圧範囲 0 to 5V
    入力インピーダンス 1Mohm
    電圧レンジ(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, 800us, 580us (17ksps),
    (samples only 1 channel) 500us, 200us, 100us, 49us, 33us (307ksps)
    (Equivalent time sampling) 62.5us, 31.25us, 12.5us, 6.25us, 3.125us, 1.25us, 0.625us (16Msps)
    トリガモード Auto, Normal, Scan
    トリガ極性 rise/fall edge
    トリガソース CH1 or CH2
    トリガレベル調整 画面内位置を上下に調整
    外部トリガ No
    波形位置調整 上下に調整可能
    波形反転表示 Yes
    電圧測定表示 Max, Average, Min (AC入力でもDCレベルを表示)
    周波数&Duty測定 Yes
    電圧・周波数・Duty表示 表示・非表示切り替え
    文字表示 文字サイズ固定
    FFT Yes (8bits 128 samples) 200ms/div以下
    A/D変換分解能 10bits (100usレンジ以下では精度8bit以下)
    サンプル数 100samples/channel (8bits/channel) 10bit/sampleを電圧レンジに応じて6bitにスケーリングして表示
    表示解像度 128x64 dots, 10dots/div
    等価時間サンプリング Yes
    設定状態EEPROM保存 Yes
    操作方法 タクトスイッチ4個 (Left, Right, Down, Up)
    プリトリガー No
    ホールドオフ機能 No
    時間軸拡大表示 No
    X-Y表示 No
    Pulse Generator 0.238Hz to 8MHz 約5Vpp方形波 Duty ratio可変
    Function Generator PWM DDS 0.01Hz to 9999.99Hz(実用は1kHzまで) 約5Vpp
    8波形 sine, saw, revsaw, triangle, noise, sinc5, trapezoid, chainsaw
    周波数カウンタ デジタル入力 up to 約6MHz、 分解能1Hz ゲートタイム1秒、 感度2Vpp
    PCへのデータ転送 No
    SDカードへの波形保存 No

    関連するオシロスコープ

  • Arduino UNO/Nano OLED版: ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • Arduino UNO/Pro Mini LCD版: ArduinoとLCDタッチシールドで2CHオシロスコープ
  • 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・周波数カウンタ
  • 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 DLO-138-SPI: STM32F103C8T6とTFT LCDで2CHオシロスコープDLO-138-SPI

  • <=Arduinoで電子工作に戻る
    <=Siliconvalley4066番地に戻る
    ゲストブックへ
    siliconvalley4066@yahoo.co.jp