アナログのオシロは高級な部品と高度な技術を詰め込んだ芸術作品だよね。デジタルはもっと凄いんだろうなと思ったら逆にシンプル、仕組みがぜんぜん違って、いわば手抜きのし放題。そういうの得意なんだよね。てことで、なるべく少数の安価な部品で作ったオシロがこれ。曲がりなりにも信号の波形を表示したから、取り急ぎ雑な説明で公開する。

回路はこんな感じ。概略、マイコン(PIC16F18313)にOLED(製品名不詳)をつないただけ。マイコンにファームを書き込む端子が完成後は電源と信号の入力端子になる。信号はマイコンがAD変換器でスイープする。こんな仕組みなので信号はGND~5Vの範囲で振れなければならない。そうでない信号は、外部に差動増幅とかが必要になる。

回路図のピン配置はたいがい実物と違うもんだが、シンボルを妙に生々しく描いちゃったので、間違える人がいるかもしれない。念のために実体配線図を追加しておこうかな。これは底面図、ハンダ面から見た配線。実物どおり電線と錫メッキ線を描いている。まあそこらへんのわかりにくいところは見る側の努力で補ってほしい。なんちて。

部品を減らすためとはいえファームの書き込み端子を電源と兼用したのはちょっとやりすぎたかもしれない。よく使われる書き込み装置Snapは装置の電源が入っていないと書き込まない仕組みになっているが、電源がつなげない。てことでちょっと改造。PICkit2かPICkit3を持っている人はこちらのPICkitminusと組み合わせて使えば大丈夫。

最少部品オシロの使いかたはこう。電源5Vと信号をつなぐ、以上。電圧軸(Y軸)はDC5V固定。電源3.3Vでも動くがファームで電圧の表示や補助線を変更する必要があって、それはまだやっていない。時間軸(X軸)は自動。その動作は100Hz、1kHz、5kHzで確認した。測定可能な周波数の上限は見る人の寛容さに依存するが10kHzくらいかな。

ファームはGithubのmp_oscilloリポジトリに置いた。あとはよしなに。ちなみにボクはGithubをよく知らないので何かしらのリクエストをいただいてもたぶんお応えできない。バグを修正したり機能を拡張された人は、誠に申し訳ないけれど、ご自身で発表してね。
最少部品オシロ関連ファイル-https://github.com/vintagechips/mp_oscillo
main関数はこんな感じ。機能の追加や変更は、たいがいここをいじれば何とかなると思う。現状、1kHzまでの周波数はサンプリング間隔を自動調整して1波を表示する。それ以上は、成り行きで表示される波の数が増える。
// Minimal parts Oscilloscope // Author: Tetsuya Suzuki #include "system.h" uint8_t us; // サンプリング間隔(単位u秒)を代入する変数 uint8_t pod; // 1周期のサンプリング数が代入される変数 #define TOL 16 // 時間軸自動調整のアソビ(許容誤差) void main() { adc_init(); // AD変換器を起動 i2c_init(); // I2Cを起動 oled_init(); // OLEDを起動 us = 48; // サンプリング間隔の初期値を代入 while(1){ adc_sweep(); // 信号の波形をスイープ adc_analyze(); // 信号の情報を各変数に代入 // サンプリング間隔を自動調整する手順 if(pod == 0){ // 信号の1波を捉えられなかった場合 if(us < 239) us += 16; // サンプリング間隔を大胆に広げる } else if(pod > SCREEN){ // 信号の1波を表示し切れない場合 if(us < 255) us++; // サンプリング間隔を伸ばす } else if(pod < SCREEN - TOL) { // 信号の1波が狭すぎる場合 if(us > 2) us--; // サンプリング間隔を縮める } // Draw screen oled_label(); // 情報領域を表示 oled_draw(); // 波形領域を表示 } }
製作物が完成したらプリント基板を頒布してお祭り騒ぎをするのが恒例だが、これはそういうやつじゃない。いいかげんなボクの設計だからとりあえず再現してテストすることになるだろうが、最終的には何かほかの製作物に組み込んで意味がある。アナログシンセに波形モニタとして組み込みたいと言ってくれた人がいて、なるほどなと思っている。