Arduinoで作るオシロ、ACモードを追加(回路、ソフト解説)
前回の記事で回路の検討が終わったので、今回はいよいよソフトを修正して完成形に持っていきます。
まずは全体写真から、
▼ArduinoとOLEDを使ったオシロ

ブレッドボードで動かすスタイルは変わりません。表示は1.3インチのモノクロOLED(SH1106)です。
old virsion below
ブレッドボードの実装状態に合わせて書き直しましたが、中身は以前の記事とほとんど同じです。
◆プログラム (program code can be downloaded from following link)
20200728_OLEDoscilloScopeSh1106_V300E(JIS).txt
20200728_OLEDoscilloScopeSh1106_V300E(utf8)
海外の読者用にutf8 エンコードのファイルも置いておきます。どちらか使い易い方をお使いください。なお、ファイルの拡張子は.ino に要変更。(both the same except character code)
コンパイルするとArduino IDE から赤字で、
「スケッチが使用できるメモリが少なくなっています。動作が不安定になる可能性があります。」というワーニングが出ますが、とりあえず大丈夫です。
プログラムはOLEDのSH1106用に書かれていますが、コメントアウトを変更することで、SD1306でも動きます(動作確認済)。SH1306の状態ではコンパイラからのワーニングは出ませんが、メモリーがギリギリである状況は変わりません。
◆機能説明
1) DCモード
これは従来からあったDCモードの画面で、写真のようにマイナス側の波形を表示することが出来ませんでした。なお、画面からモードが判るようにするために、左上に「DC」という表示を追加しています。
DCモードでゼロボルトの位置は波形表示エリアの下端になります。(緑色矢印)
ACモード
これが今回追加した画面で、スライドスイッチをACモードに切り替えるとこの画面に切り替わります。垂直軸の中心がゼロになり正負の波形が見えるようになります。
左上の表示が「AC」に変わっています。ACモードでは電圧の実効値を表示しているため、画面右上の電圧表示の前に rm と表示しています (rmsの略)。
2) Auto50V、5Vを廃止
これまでは、50Vレンジの外側に自動スケール機能がある Auto50Vと Auto5Vレンジがありました。しかし、AC測定でこの機能を実装するのは面倒だったこと。あと、レンジを切り替えていくと突然波形が大きくなって直感的な操作の妨げになっていたこと。これらの問題を回避するため、Autoスケール機能は廃止しました。まあ、ちゃんと直すのが面倒になったということです。
3) ワンタッチゼロ調整機能を追加
ACレンジでは画面の中央がゼロボルトになりますが、いろいろな理由(特に電源電圧の違い)で波形の中心がゼロから外れている場合があります。これを簡単に補正する機能を用意しました。つまりワンタッチのゼロ調機能です。
・波形のオフセットがある状態
入力をGNDにショートさせているのにも関わらず波形がぴったりゼロになっていません。
こういう時は、「HOLD」を押して波形の表示を中断し、その状態から「SELECT」ボタンを押すと自動でゼロ調が行われます。
zero(SELECTボタン)を押すとゼロ調が行われ波形がぴったりゼロの位置に合うようになります。ゼロ調実行後は波形表示モードに戻るので、オセット調整の結果をすぐに確認することが出来ます。なお、内部処理の都合でゼロ調は5V以下と5V以上の二つに別れています。つまりどのレンジでもオフセットが合っている状態にするには感度を変えて2回ゼロ調を行う必要があります。
なお、ゼロ調の結果はEEPROMに保存されるのので、次回電源を入れた時は最後に行った調整が反映されます。
4) 水平レンジの拡大
これまでは水平軸の最高速度は200μsでしたが、今回のアップデートで100μs と50μs レンジを追加しました。これにより、従来は高い周波数の波形が見づらかったのを改善しています。写真は20khzの波形を表示しています。なお、追加した100と50μsレンジは表示する時にi横軸を拡大しているだけなので、情報量としては200μsのままです。また表示のジッタが多くなります。アナログオシロには横軸を拡大するMAG10Xボタンがありましたが、あれと同じ感じです。
5) DVMにAC測定機能を追加
ACレンジを追加したので、デジタル電圧計機能にもAC測定モードを追加しました。
・DC レンジ
これは従来通り。
・AC レンジ
入力の切り替えスイッチをAC にするとこの画面になります。内容は写真のように、交流電圧の実効値(rms) とP-P電圧を表示します。
なお、DVMモードに入るには下記の操作を行います。DC/ACは入力モードスイッチで切り替え
リセット時にUPボタンを押しっぱなし : 5Vレンジ
リセット時にDOWNボタンを押しっぱなし:50Vレンジ
リセット時にSELECTボタンを押しっぱなしにするとバッテリー電圧測定モードが起動します。これはペン型オシロ用の機能で、ソフトの互換性維持のために残しているものなので気にしないでください。
◆仕様
入力モード:DC+, AC (DCの負電圧は観察不能)
垂直感度:0.2 - 50V (1-2-5 step)
水平感度:50us - 200ms (1-2-5 step)
サンプリング周期:8us max (125kHz)
トリガ :50% p-p 自動、スロープ指定可能
その他:波形周波数表示、波形デューティ比表示、ゼロオフセットキャンセル機能、設定状態リジューム機能
◆動画
◆まとめ
Arduino UNO や NANOで出来るオシロとしては限界に近い物が出来たと思います。今回のバージョンではAC測定が可能になったので、トランスの出力波形やオーディオアンプの波形など観察可能範囲が広がりました。
DC電圧のマイナス側の測定が出来れば万全なのですが、そうするためには回路が複雑になり過ぎます。3000円くらい出してDSO-SHELLあたりを買った方が良いと思います。
この回路は写真のように小さなブレッドボード(400穴)に実装しています。これを作るに当たっては多少ノウハウ的な話があります。ということで、そのあたりの話は実装編でもう一度解説したいと思います。
一連のオシロ作りの話は、以下のカテゴリにまとめています。興味のある方はご覧ください。
ペン型オシロスコープのカテゴリ