ArduinoとLCDタッチシールドで2CHオシロスコープ
更新日 2021.07.31
大阪教育大学の光永さんの
Arduino でオシロスコープ
を基にしてロシアの方(?)がタッチスクリーンで操作できるようにしたもの
Arduino uno Oscilloscope for touch 2,4" TFT display
があったので、そちらを参考にしていろいろと機能拡張してみました。
また、radiopenchさんが開発された128x64OLEDモジュールを使ったペン型オシロスコープ
ラジオペンチ ペン型オシロスコープ
を機能拡張して
Arduinoでオシロスコープ
を作ったので、そこから電圧測定と周波数測定とFFT表示を流用しました。
また、等価時間サンプリングをを実装するために、九州工業大学大学院情報工学府の
Arduino 簡易オシロスコープ
のソースコードを利用させていただきました。
タッチパネル付きの320x240の2.4インチTFT液晶シールドはSDカードインターフェースを残しておくとA5とTXDとRXDしか空きがありません。A5をアナログ入力にするとして、残るTXDとRXDはUSBからのプログラムのダウンロード用に内部で接続されているのでなるべく使いたくない。とりあえずA5だけを使って動作確認することができますがそれだけではつまらない。せっかく2CHを想定したソフトを生かしたい。
Arduino UNO互換機でCPUにQFPパッケージを使ったものの中にはA6とA7のスルーホール付きのものがあるので、それを使ってA6をCH1のA/D入力に、A7をCH2のA/D入力にすれば、2チャンネルオシロスコープにすることができます。さらに、Arduino NanoやPro Miniでシールド基板を使ってUNOもどきを作り、SDカード端子を配線しなければD10-D13が使えるのでDC/AC切り替え等の判定に使えるようになります。
画面はほぼフルに波形に使いたかったので、横10目盛、縦8目盛にすると30dot/目盛で300x240で水平方向に20ドット余ります。右側20ドット幅には画面外アイコンにつながるボタンエリアにしました。入手した液晶シールドは表示画面外にアイコンがあって、そこまでタッチセンサの検出範囲が広がっています。旧型スマホ用でしょうか、今は入手し難いかもしれません。このボタンエリアやアイコンや文字表示位置をタッチすることで操作できるようにしました。
Arduino Project HUBにも公開しました。
Arduino LCD touch shield dual channel oscilloscope
ソースコード
使ったLCDシールドが普通にライブラリを使うと左右反転するとか赤と青が逆とか何か変なので参考までにしかならないとは思いますが、ソースコードは
update on 2022.03.29 TFT_Oscillo_v113.zip
Old version TFT_Oscillo_v110.zip
操作方法
CH1をタップすると上下正転表示->上下反転表示->非表示->上下正転表示と切り替わります。CH2が非表示の時は非表示になりません。上下反転時は下矢印を表示します。AC入力の時は"~"を表示します。
CH2をタップすると上下正転表示->上下反転表示->非表示->上下正転表示と切り替わります。CH1が非表示の時は非表示になりません。上下反転時は下矢印を表示します。AC入力の時は"~"を表示します。1ms以下のレンジではCH2は表示できません。
電圧レンジをタップすると1V, 0.5V, 0.2V, 0.1V, 50mV, 1Vの順にレンジが切り替わります。
時間軸レンジをタップすると色がCyanになり、右下の"+"ボタンと"-"ボタンで変更できます。
TGLVをタップするとトリガレベルとCyan色の横線が表示され、右下の"+"ボタンと"-"ボタンで変更できます。"+"ボタンと"-"ボタンを長押しするとレベルの変化量が加速されます。再度トリガレベルをタップすると横線が消えて元の表示に戻ります。
VPOSは通常Gray表示ですが、タップするとPOS1->POS2->VPOSと順に変化します。POS1ではCH1の波形表示上下位置を"+"ボタンと"-"ボタンで変更できます。"+"ボタンと"-"ボタンを長押しするとレベルの変化量が加速されます。POS2ではCH2の波形表示上下位置を変更できます。調整中に"!!"ボタンをタップすると標準の位置にリセットします。DC時は最下端、AC時は中央になります。
TG1が表示されている時はCH1をトリガソースにします。タップするとCH2をトリガソースにします。
上矢印か下矢印が表示されているトリガエッジをタップすると、上下の切り替えが出来ます。
トリガモードはタップする度にAuto->Norm->Scan->One->Autoと切り替わります。Oneの場合は右上に赤字でHALTと表示します。右上の"!!"ボタンをタップすると1回ずつトリガが掛かります。他のトリガモードでは"!!"ボタンをタップするとトリガを停止し、再度タップすると再開します。
右中央の"f"ボタンをタップするとFFTモードに切り替わります。再度タップすると波形表示に戻ります。FFT表示はCH1のみです。
"?"ボタンをタップすると文字の大きさの大小や非表示が切り替わります。
等価時間サンプリングについて
出来るだけ高い周波数まで見てみたいということで、等価時間サンプリングを追加してみました。九州工業大学のkitscopeは安全を見てか1Mspsが上限ですが、ハードウェアの限界の16Mspsまで試して結構安定しています。
TFT液晶シールドにD6ピンを使われているのでトリガ電圧を入力できないため内部基準電圧を使ってA/D入力端子の所で約1.1V固定にしました。Delayed trigger量は固定で50usにしました。等価時間サンプリング時はTimer1をタイミング調整に使うので、Timer1で発生するCalibration pulseは使えません。
追加した時間軸は、1.9us, 3.8us, 9.4us, 19us, 38us, 94us, 188us/div の7通りです。
サンプリングしたデータをそのまま表示しているので中途半端な値ばかりです。スケーリングして1,2,5に合わせることも可能でしょうが、素の性能を見たかったのでこんなことになっています。
水平軸の目盛の縦線の位置をずらしてもいいかもしれません。
結果として100kHz程度の矩形波はゆったり全体像が見えるようになりました。200kHzあたりになると立ち上がり立下りのスルーレートの限界を超えて振幅が小さくなり始めます。1MHzでは振幅がかなり小さくなりますが、トリガは安定して掛かっているようです。A/Dコンバータのクロック分周比は16で1MHzを使用しているので実時間サンプリングの200us/divレンジや82usレンジよりも綺麗な波形を観測できます。
入力回路
10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので次のような入力回路にしました。ATMEGA328のADC入力の信号源インピーダンスが大きくなり過ぎるのでいろいろと変なことが起こるかもしれません。5V以上の信号に10:1プローブを使えるようになります。入力インピーダンスに拘らなくてデジタル信号しか見ないのなら2Mohmを100kohmくらいに変更してもいいかもしれません。
負信号も観測できるようにするにはOPアンプを使った回路も試したい。とにかく部品点数を減らしたいのでOPアンプの出力をVCC側に引っ張りました。動作は未検証です。ゲインが1/2になるので垂直軸の表示を変更する必要がある。
Known Bugs
波形表示が所々途切れることがある。
起動時等に電圧表示がボタン領域まではみ出ることがある。
97us/divレンジでトリガーチャンネルをTG2にすると、CH2の波形が観測できる。これはこれで使えそうなバグなので残しておく。
100ms/divレンジ以上でFFT表示にならない。そもそもそのようにコーディングしていないし直す気は無い。
原理的に周波数測定には画面上で2周期以上が必要。
周波数測定と電圧測定はCH1のみ。CH2のみ表示でもCH1の測定値が出る。
トリガが掛からない状態でトリガモードをNormかOneにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。リセットしてもEEPROMにNormかOneのモードででセーブされているとトリガが掛からないと復帰できない。EEPROMの先頭アドレスをずらしてスケッチを書き込み直せばデフォールトの設定に戻る。
2ch表示で信号源インピーダンスが大きい場合は(目安として100kohm以上で入力無接続や10:1プローブ接続を含む)相互に観測波形に影響が出る。どちらか一方のチャンネルをOFFにすれば回避できるようにした。入力にOPアンプのボルテージフォロワを入れれば良さそうだが手軽に作れることから外れるので諦めた。入力インピーダンスが下がるのを許容して入力回路の抵抗値2Mohmを100kohm以下に下げれば軽減できると思う。
1ch表示でも信号源インピーダンスが大きい場合はトリガーソースを他チャンネルにすると波形の最初500us程度が乱れる。
2ch間でレベル差が大きい部分には相互干渉が発生することがある。
等価時間サンプリングではトリガレベルは内部基準電圧の約1.1V固定で変更できない。D6ピンがLCDシールドで使われているためどうしようもない。また、50usecのディレイトリガ固定にしている。
等価時間サンプリングでは基本的にCH1のみの計測だが、CH2をOnにするとCH2の波形をCH1の色で表示する。極性の反転はCH1側の設定に従う。実際の波形の取り込みはどちらか一方しかしない。
ATMEGA328の性能限界のため、実時間サンプリングの200us/divレンジ以下では実効分解能が6bit以下になる。500us/divレンジでも8bit未満になる。そのために波形がつぶれて見える。
等価時間サンプリングではTimer1を使うので、Timer1を使うキャリブレーションパルスは使えない。
等価時間サンプリングの特定の周波数でトリガが不安定になる(例えば94usレンジで入力2kHz)。
改良可能性
CH1/CH2のモード選択をポップアップメニュー風にした方が便利かもしれない。
電圧レンジの選択も一方向順次切り替えよりもup/downにするか、ポップアップメニュー風にした方が便利かもしれない。
トリガレベルの変更をドラッグ風にしたい。(update on 2022.03.29 version 1.13) 画面タッチでも変えられるようにしてみた。
垂直位置の変更をドラッグ風にしたい。
時間軸拡大を追加したい。部分的に盛り込み済みだが未使用。スケッチ中のClearAndDrawGraphMag(1)の"1"を2から10程度に変えれば1ms以下のレンジで拡大できる。ただしグリッドの線の再描画まで対応できていない。
電源電圧を測定して電圧を表示・補正。
内部基準電圧1.1Vを使って電圧感度アップ。タッチスクリーンが5V基準なので面倒くさい。
Hold Off調整機能を入れた方が便利かもしれない。
等価時間サンプリングでのディレイトリガのディレイ量を変更できるようにGUIを追加したい。
特に等価時間サンプリングの時間軸が中途半端な値になっているので、スケーリングしてきりの良い値にしたい。
とは言え、スケッチが27484バイト、UNOで85%、Nanoで90%なので何かを加えると何かを削る必要がある。
(追記 2021.08.25)
元々は128x64 LCDを使ったものなので、それを基に128x64 OLEDに表示できるようにし、多機能化したものもあります。等価時間サンプリングはもとよりパルスジェネレータやファンクションジェネレータや周波数カウンタも使えるようになりました。
ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
機能概要
機能 |
内容 |
入力チャンネル数 |
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 (15ksps),
(samples only 1 channel) 1ms,500us,200us,177us,97us (307ksps)
(Equivalent time sampling)
187.5us, 93.75us, 37.5us, 18.75us, 9.375us, 3.75us, 1.875us (16Msps) |
トリガモード |
Auto, normal, scan, and one shot |
トリガ極性 |
rise/fall edge |
トリガソース |
CH1 or CH2 |
トリガレベル調整 |
画面内位置を上下に調整 |
外部トリガ |
No |
波形位置調整 |
上下に調整可能 |
波形反転表示 |
Yes |
電圧測定表示 |
Max, Average, Min (AC入力でもDCレベルを表示) |
周波数&Duty測定 |
Yes |
電圧・周波数・Duty表示 |
表示・非表示切り替え |
文字表示 |
表示・大小・非表示切り替え |
FFT |
Yes (8bits 256 samples) 50ms/div以下 |
校正信号出力 |
1.00kHz 約5Vpp方形波 |
A/D変換分解能 |
10bits (200usレンジ以下では精度8bit以下) |
サンプル数 |
300samples/channel (8bits/channel) 10bit/sampleを8bitにスケーリングして表示 |
表示解像度 |
320x240 dots, 30dots/div |
等価時間サンプリング |
Yes |
設定状態EEPROM保存 |
Yes |
タッチスクリーン操作 |
Yes |
プリトリガー |
No |
ホールドオフ機能 |
No |
時間軸拡大表示 |
No |
X-Y表示 |
No |
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