Arduinoと0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・周波数カウンタ
更新日 2024.10.04 登録日 2024.10.04
大阪教育大学の光永さんの
Arduino でオシロスコープ
は古い128x64のLCDディスプレイ用に作られたものですが、
それを基に128x64の1.3インチOLEDで使えるように変更して
ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
とSTM32F103C8T6用の
STM32F103C8T6と0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
を作ったので、それを基に0.96-inch 80x160 LCDで使えるようにしてみました。このディスプレイはAmazonだと1000円くらいしますが、AliExpressだと送料込みで300円くらいで買えるので気軽に使えます。OLED版よりも少し広い範囲を表示できますが、解像度が高くなった分文字表示が小さくなりました。その代わりカラーで表示出来るので、2チャンネルの区別が分かりやすくなりました。
画面レイアウトとGUIはOLED版、波形描画方法は古い波形を消してから描画するTFT版を元にしています。Arduino NanoやArduino Unoで使えます。DDS Function GeneratorはSPIインターフェースにPin11を取られてしまうので使えなくなりました。
radiopenchさんが開発された128x64OLEDモジュールを使ったペン型オシロスコープ
ラジオペンチ ペン型オシロスコープ
を機能拡張して
Arduinoでオシロスコープ
を作ったので、そこから電圧測定と周波数測定とFFT表示を流用しています。
また、等価時間サンプリングをを実装するために、九州工業大学大学院情報工学府の
Arduino 簡易オシロスコープ
のソースコードを利用させていただきました。
開発環境は Arduino IDE 1.8.19です。
ソースコード
最新版はGitHubに置いてあります
https://github.com/siliconvalley4066/ArduinoIPSOscilloscope
GOscilloIPS100.zip
以下のライブラリはライブラリマネージャからインストールできます。
FreqCount
fix_fft
Adafruit ST7735 and ST7789 Library
回路図
10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので次のような入力回路にしました。ATMEGA328のADC入力の信号源インピーダンスが大きくなり過ぎるのでいろいろと変なことが起こるかもしれません。5V以上の信号に10:1プローブを使えるようになります。入力インピーダンスに拘らなくてデジタル信号しか見ないのなら2Mohmを100kohmくらいに変更してもいいかもしれません。
直流信号だけで良いならA0/A1から直結でも動作確認出来ます。
操作方法
タクトスイッチ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 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ボタンを同時押しすると標準の位置最下端にリセットします(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番目が時間軸レンジです。
6番目は周波数と電圧を計測するチャンネルを選択できます。Rightボタンを押すとCH2、Leftボタンを押すとCH1になります。
7番目"FCNT"は周波数カウンタのOn/Offです。Rightボタンを押すとOnになり、Leftボタンを押すとOffになります。8行目に計測した周波数を表示します。他のページでは表示しません。OnにするとPulse 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レンジよりも綺麗な波形を観測できます。
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について
SPIインターフェースにPin11を取られてしまうので使えなくなりました。
周波数カウンタについて
サンプリングした波形から算出して画面上部に表示している周波数とは別物です。D5ピンに入力されてたデジタル信号の周波数をカウントする機能です。周波数の上限は6MHz位までです。
GitHub - PaulStoffregen/FreqCount: Measures the frequency of a signal by counting the number of pulses during a fixed time.
を流用させていただきました。これを起動するとPulse Generatorを停止するので、その周波数をカウントすることはできません。入力があるとインタラプト処理が入るので速いサンプリング時に波形にノイズが入るようなら明示的にOFFにした方が良い。
Known Bugs
波形表示が所々途切れることがある。
0.5s/divレンジ以上でFFT表示にならない。そもそもそのようにコーディングしていないし直す気は無い。
原理的に周波数測定には画面上で2周期以上が必要。
トリガモードのOneがうまく機能しないので外してある。
トリガが掛からない状態でトリガモードをNormにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。
2ch表示で信号源インピーダンスが大きい場合は(目安として100kohm以上で入力無接続や10:1プローブ接続を含む)相互に観測波形に影響が出る。入力インピーダンスが下がるのを許容して入力回路の抵抗値2Mohmを100kohm以下に下げれば軽減できると思う。
1ch表示でも信号源インピーダンスが大きい場合はトリガーソースを他チャンネルにすると波形の最初500us程度が乱れる。
2ch間でレベル差が大きい部分には相互干渉が発生することがある。
等価時間サンプリングでは50usecのディレイトリガ固定にしている。
ATMEGA328の性能限界のため、実時間サンプリングの100us/divレンジ以下では実効分解能が6bit以下になる。そのために波形がつぶれて見える。
等価時間サンプリングではTimer1とTimer2を使うので、Timer1を使うPulse generatorと周波数カウンタは使えない。
等価時間サンプリングの特定の周波数でトリガが不安定になる。
一旦等価時間サンプリングにするとPulse generatorのレジスタ設定が壊れる。実時間サンプリングに戻してから再びONにすれば復帰する。
ADC入力の保護抵抗を省略したのでATMEGAが壊れやすいかもしれない。
Pulse generatorはCPUクロックを分周していて1/2から整数分の1の周波数を発生する。周波数の高い方は8MHz, 5.33MHz, 4MHz, 3.2MHz, 2.67MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になる。
改良可能性
電源電圧を測定して電圧を表示・補正。特にArduino NanoではUSB給電時は逆流防止のダイオードが入るので電源電圧が4.7V程度になるので補正した方が良い。
内部基準電圧1.1Vを使って電圧感度アップ。
Hold Off調整機能を入れた方が便利かもしれない。
等価時間サンプリングでのディレイトリガのディレイ量を変更できるようにUIを追加したい。
特に等価時間サンプリングの時間軸が中途半端な値になっているので、スケーリングしてきりの良い値にしたい。水平軸の目盛の縦線の間隔を変えてもいいかもしれません。
A4, A5, A6, A7ピンが余っているので何かに使えるかも。
とは言え、スケッチが29168バイト、UNOで90%、Nanoで94%なので何かを加えると何かを削る必要がある。
機能概要
機能 |
内容 |
入力チャンネル数 |
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以下) |
サンプル数 |
160samples/channel (8bits/channel) 10bit/sampleを電圧レンジに応じて0-79にスケーリングして表示 |
表示解像度 |
160x80 dots, 10dots/div |
等価時間サンプリング |
Yes |
設定状態EEPROM保存 |
Yes |
操作方法 |
タクトスイッチ4個 または 5方向スイッチ (Left, Right, Down, Up) |
プリトリガー |
No |
ホールドオフ機能 |
No |
時間軸拡大表示 |
No |
X-Y表示 |
No |
Pulse Generator |
0.238Hz to 8MHz 約5Vpp方形波 Duty ratio可変 |
Function Generator |
No |
周波数カウンタ |
デジタル入力 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オシロスコープ
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