大阪教育大学の光永さんの
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)
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ボタンを同時押しすると文字表示を消して全画面波形表示になります。再度同時押しすれば元に戻ります。
出来るだけ高い周波数まで見てみたいということで、等価時間サンプリングを追加してみました。九州工業大学の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シールドで作ったこのオシロスコープで観測するとこんな感じでなまってます。パルス自体はもっと綺麗です。
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になり細かく設定できます。インタラプトは発生しませんが、等価時間サンプリングや周波数カウンタとは同時には使えません。
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にした方が良い。
とは言え、スケッチが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 |