google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

0.96インチOLEDを使ったオシロ、機能確認版の製作 (Arduino)

 0.96インチOLEDとArduinoを使ったミニオシロの試作版を作ってみたら具合が良さそうでした。それなら、ということで改良版を作っていたのですが、ほぼ一段落したので現在の状態を公開します。

▼外観
Arduinoで作るオシロ
 まだArduino UNO とブレッドボードで動かしています。

▼OLED画面と操作ボタン
オシロ画面んと操作ボタン
 操作スイッチはとりあえずタクトスイッチを使っていて、左から、Hold, DOWN, UP, SELECTです。

▼回路図 (図をクリックで別窓に拡大)
Arduinoで作るオシロの回路図
 出来るだけ少ない部品で作ることを目指しています。というか、オペアンプをきちんと使いこなすのは大変なので思いっきり手抜きしています。

 R3の反対側をポートにつなぎ、LOWとHi-Zに切り替えることで入力アッテネーターの切り替えをやっています。ちなみにハードのアッテネーターは R3無しで1/5、R3有りの1/50 の2段切り替えだけで、それより細かいステップはソフトで刻んでいます。

 スイッチの読み取りはピンチェンジ割り込みでやりたかったのですが、たまに取りこぼしがあったので、ダイオードで合成してPin2にも入力し、Arduinoの普通の割り込みの、attachInterrupt で検出する方式に変更しました。ちなみに、最初にやったピンチェンジ割り込みは、こういうやり方です→ピンチェンジ割り込みについての私の記事

 なお、R51はタクトスイッチの接点にコンデンサ (C51) から大きな電流が流れ込むのを防止するために入れたものですが、ダイオードが入っているので不要だったかも知れません。ただ、スイッチ操作から割込み発生までのタイミングを少し遅らせる効果はあるはずです。

 ちなみに、この抵抗が必要な理由については、以下に解説があります。
・居酒屋ガレージ日記さん:スイッチに並列に入るコンデンサ
・ikkeiさん:スイッチに並列コンデンサはダメ回路

 アンチエイリアシングのために、ADCの前にローパスフィルタを入れた方が良いのですが、入力インピーダンスが高いので、単純なCRのフィルターを入れのは無理がある感じです。一方で、入力のR1に並列に小さな容量のコンデンサを入れて、立ち上がり速度を改善したいところです。これ、よく考えると両者の効果は相反するので、間を取って何もしないことにしました。(本当にそれでいいのか?)

◆スケッチ
 スケッチはこちら→オシロのスケッチ_20190213OledOsillo (Shift JIS エンコードです)
 機能を無計画に追加していったので、構造がおかしなところがあります。また、レンジ操作を switch case文で書いたので、見易くなった半面、ソースが長くなちゃってます。

 OLEDの画面に1kB、波形メモリーに400バイトのRAMを消費するので、RAM容量が苦しいです。対策として、PROGMEMを使って文字データーをフラッシュ領域に置くようにしているのですが、ここのプログラムの書き方が判り難かったです。そのあたりは別途記事で紹介する予定です。

▼オシロの画面
オシロの画面
 垂直感度、スイープ速度、トリガスロープをスイッチ操作で選択可能。SELECTボタンで項目移動、UP/DOWNで内容選択するスタイルにしました。選択されている項目の下には、上向きの浅いコの字を表示します。Holdボタンを押すとその状態で画面を保持。再度押すと元に戻ります。なおHold中は画面に Hold と表示します。

 細かい点は下記の動画が判り易いと思います。

▼動画


◆主な仕様
・垂直感度(フルスケール当たりの値)
 固定レンジ:50V, 20V, 10V, 5V, 2V, 1V, 0.5V, 0.2V
 Autoレンジ:50V, 5V (波形が出来るだけ大きく表示されるように上/下限の値を自動調整)

・水平レンジ(div当たりの値、4div=フルスケール)
 50ms, 20ms, 10ms, 5ms, 2ms, 1ms, 500us, 200us

・トリガ
 波形PPの1/2レベルで自動トリガ。トリガスロープUP/DOWNの指定が可能。
 トリガ非検出でも波形は表示し、トリガ検出失敗表示する (unsync と表示)。

・電圧計機能
 波形メモリーの値の平均値を画面に表示。簡易電圧計として使えるはず。

・画面ホールド
 ホールドスイッチを押すと画面をホールド、再度スイッチを押すとホールド解除。なお、ホールド中はholdと画面に表示。

・設定状態のリジューム機能
 ボタン操作の5秒後に設定内容をEEPROMに保存。保存した内容は次回パワーON時に反映。

◆まとめ
 とりあえず現在やってみたいことをプログラムに書いてみました。欲を言えばキリが無いので、このあたりで手を打つのが良いかなと思います。

 最高サンプリング周期が8μsなので10kHz程度の波形までしか観察出来ません。それくらいだったら音にして耳で聴いたのと変わらないじゃん、という声も聞こえて来そうです。まあ波形を見た方が情報量は多いかと。

 ADCで読んでバッファメモリーに書くまでの処理をアセンブラで書けば、たぶんあと何倍かは早くなるはずです。どこかにヒントが書かれていないか、注意していたいと思います。

◆妄想をスケッチ
ペン型オシロ
 ペン型オシロです。最終的にはこれを作ってみたいんですよね。相手が負の電圧だったら、先端を逆に繋げばいいんです。

【2019/02/14追記】
▼ピン割り込みで取りこぼしが出た回路
ピン割り込み
 最初に試したのがこの回路です。CPUのレジスタを操作してPin 8,9,10からピン割り込(状態変化検出割り込み)みでスイッチの状態を読んだのですが、たまに取りこぼしが出ちゃいました。記事内にも書きましたが、こういう方法の割込みです→ピンチェンジ割り込みについての私の記事
 あと、この回路ではコンデンサの電荷をスイッチで一瞬で抜いているので、接点の寿命の問題があってあまりよろしくありません。理由は記事の中のリンク先をご覧ください。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

先日の回路図を元に、少し実験をしてみました。こちらのブログで、図をアップロードする方法がわからなかったので、私のブログの方に、その図と内容をアップしております。

https://brown.ap.teacup.com/nekosan0/3827.html

スイッチ入力側のデジタル入力ピンが、スイッチのチャタリングを拾っている可能性があるのかな、という気がしています。
もしそうだとすると、CRフィルタの時定数をもう少し長めにしておけば、チャタリングが十分収まってから割り込み発生となって、安定して読めるんでしょうかね?

わざとスイッチ周りでひどいチャタリングが起きるようにした環境下ですので、実際はこういうチャタリングが悪さしていない可能性もあります。
とりあえず、考えられる可能性のひとつではあるかなと思うのですが。

nekosanおはようございます

実験していただいてありがとうございます。

うちには高速信号に対応したオシロはアナログのものしか無いので、低頻度の単発現象の波形観察は難しいんですよね。助かります。

ただ、記事の説明不足があったようです。
この記事の回路図とスケッチでは割り込みの取りこぼしは、今のところ発生していません。
取りこぼしがあった回路図をこの記事の末尾に追記しておきました。この場合は、CPUのレジスタを操作してピン割り込み(ピンの状態変化割込み)でピンを読みました。

No title

新しい回路とスケッチでは、取りこぼしなしで動いているんですね。よかったです。

100Ωの抵抗は、CRフィルタ用なのかと思っていました。スイッチの大電流防止用なんですね。工業製品レベルのものは作ったこと無いので、こういう知識がありません。
何万回もスイッチを使ってると、接点が死んでしまうんですね。

re:nekosanさん

心配していただいてありがとうございます。

そちらの記事に刺激されて、こちらでも割込み処理の様子をオシロ(DSO-SHELL)で見てみました。割り込み処理ルーチンの間にPin13を点灯させるようにしておいて観察した訳です。ちなみに割り込みルーチンの通過時間は10μsでした。

すると、スイッチONの時は狙い通り1発だけ割込みが入るのですが、問題はスイッチを離した時です。この時まれに数発まとめて割込みが入ることがありました。
たぶんPin2の電圧がゆっくり上がるのでスレッショルドレベルあたりでもたもたしている時に、ノイズの影響で割り込みが入るのだと思います。シュミットトリガ入力だから大丈夫だと思っていたのですが、現実は甘くありませんね。ブレッドボードではなくきちんと基板を作ればたぶん大丈夫になると思いますが、あまりよろしくないです。
まあ、この時はスイッチはとっくにHighレベルになっているので、割り込み原因ピンを探しても何も見つからないので、実害は出ないということみたいです。

ともかくいろいろやって、実際に動作を確認するのは大切ということですね。

No title

そんなことが起こるんですね。

スイッチオンは、100Ω抵抗で電流が抜けるので、結構速く抜けていくと思うんですが、スイッチオンは、プルアップ抵抗からチャージされるので、時定数が2桁前後遅くなると思うんですが、その分、CRフィルタとシュミットトリガの効果で、チャタリングによる波形への上下動は小さくなって大丈夫かな、と思ったんですが…

よく考えてみると、バタバタしている最中の波形は、チャージは20kΩ前後で遅く、ディスチャージは100Ωで2桁くらい速いので、もしかしたらその関係で波形がシュミットトリガで吸収できないくらいにギザギザになるのかもしれませんね。
特に、一旦オンレベル側に上がってからの電圧の落ち込み幅が大きくなるわけなので、弁別閾をまたいで…というなのかも。

re:そんなことが起こるんですね。

そうなんですよね。

attachInterrupt(0, pin2IRQ, FALLING); と書いて立下りエッジで割り込みを掛けているのですが、

CPUクロックの前のサイクルでHIGH、今回LOWだったら割込みがかかるでしょうから、パルス幅で50nsくらいのノイズが乗ったら危ないということなんでしょうね。
カレンダー
09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード