2019年02月19日

OLED OscilloScope

Teensy3.6 に対応する OLED OscilloScope のコードを書いた。

WS001679.JPG>

インターフェイスにはLaVoixskiのロータリーエンコーダー周りのコードを転用した機能切り替え機構をなんとか組み込むことが出来たが、肝心のオシロスコープの性能は相変わらずイマイチで凹む。 あと、MCUのアナログ入力はポートを選ばないと性能にバラつきがありそう。

WS001680.JPG

波形表示のオフセット値の設定が滅茶苦茶になるのは何故なのか??? 24MHzまでMCUのクロックをダウンしないと動かないのも謎だ。 DUEで動かしていた時は、クロックのことなど気にしたことはなかったのに、これまた不思議な症状である。

Teemsyにフィッティングを行う一方で、遊んでいるArduinoDueが勿体無いのでOscilloscopeを仕込んでみようと昨晩から頑張っていたのだが、

WS001679.JPG

動作を確認できているOscilloscopeを制御するClickEncoderが規格違いで実装出来ず、試行錯誤をしていたら夜が明けた。

WS001681.JPG

ClickEncoderは便利な機能なので大変気に入っているのだが、これが使えない状況は結構ツライ。

WS001682.JPG

コンパイルを通してはいるものの、エラーを潰すためにAVR系のライブラリーを無理矢理に排除した状態なので、ちゃんと動くかどうかは不明。

WS001683.JPG

いろいろと怪し気なところがあるのでこれからバグを潰していくことになるが、Teensyみたいな他所の子の環境でなんとか動かせるものが本家のDueではアウトというのが情けない

WS001686.JPG

Teensyから単純に載せ替えが出来ないのが歯痒いが、元はDueで開発していたのをTeensyに移植した経過を思い出して、複雑な心境になっている。

DueではClickEncoderを駆動するTimerOneライブラリが使えなかったので、Timer3というのを代わりに使っている。

オリジナルのコードは

  Timer1.initialize(1000);
   Timer1.attachInterrupt(timerIsr);

と記述していたのだが、Timer3には initialize というコマンドは存在せず、代わりにそれらしいコマンドをデッチ上げることにしたのだが、、、。

コンパイルにはやたらと時間が掛かった。 

WS001685.JPG

Teensyの場合も同様で、メモリのキャパを高々10%消費する程度の短いコードの割に、時間を食わせられるのが謎だ。 LCDのデータの取り溢しに関してはDueの方がマシなのは何故なのか? 動作クロックの問題など、解らないことが多い。

書き込み完了時の表示。 なんだかよく解らない文字が羅列されている。 

WS001684.JPG

書き込みのプロセスがバーグラフで表示された以前とは仕様が激変している。

Oscilloscope自体はAD周りがイマイチなTeensyよりも安定して動いている感じなので出来れば完成させたいところなのだが、DueはAVR系のライブラリを一切受け付け無い不親切極まりない仕様で、その余波でTimer系のライブラリの互換性が確保できない等、潤沢なリソース(だけ)が売りのArduinoとは思えない所業である。

この手の使い物にならんハードウエアを、よりにもよって本家筋が作って仕舞ったのは理解不能だが、確かにWebを検索しても製作例を殆ど見かけないのであった。
posted by Yasuski at 08:58| oled

2017年11月04日

OLED簡易オシロスコープの製作@ポートの設定(暫定)

DigoleSerialDisp mydisp(1,5,14); //SPI: Pin 1:data, 5:clock, 14:SS, you can assign 255 to SS, and hard ground SS pin on module

#define buttonPin01 2 // Button Pin on D2
#define button_State1 (CORE_PIN2_PINREG & (1<<0))

#define buttonPin02 3 // Button Pin on D3
#define button_State2 (CORE_PIN3_PINREG & (1<<12))

#define buttonPin03 4 // Button Pin on D4
#define button_State3 (CORE_PIN4_PINREG & (1<<13))

#define LED 6  //Blue LED
#define LED_ON (CORE_PIN6_PORTSET = (1<<4))
#define LED_OFF (CORE_PIN6_PORTCLEAR = (1<<4))

#define LEDgrn 19
#define LEDgrn_ON (CORE_PIN19_PORTSET = (1<<2))
#define LEDgrn_OFF (CORE_PIN19_PORTCLEAR = (1<<2))

#define LEDred 18
#define LEDred_ON (CORE_PIN18_PORTSET = (1<<3))
#define LEDred_OFF (CORE_PIN18_PORTCLEAR = (1<<3))

const int ad_ch0 = 20; // Analog 0 pin for channel 0
const int ad_ch1 = 21; // Analog 1 pin for channel 1

posted by Yasuski at 12:59| oled

OLED簡易オシロスコープの製作@組立工程を進める

OLED簡易オシロスコープを構成する部品の実装を行っている。

まずは、LED(RGB)をトップパネル裏から両面テープ越しに固定する。

IMG_7777.JPG

ボディー側には、左右両端に取り付け穴を空けた後、Hirose/6pinコネクターを取り付ける。 オシロスコープは信号ラインに挿入する形で接続するので、端子間の配線は直結としつつオーディオ信号と電源を分岐させる。

IMG_7778.JPG

オーディオ信号は入力バッファーを介してオシロスコープに入力するので、Quad/Dualタイプのオペアンプを増設する必要がある。

基板との配線は、ブレッドボード用の配線材を流用する。

IMG_7779.JPG

各端子には丸ピンを配置している。

当初は、GFRPの厚板でVR取り付け用のシムを、

IMG_7780.JPG

GFRPの薄板でOLEDの保護パネルを製作していたが、、、

IMG_7783.JPG

クリアランスと視認性の問題が発覚したために、素材を再び吟味することになった。

IMG_7781.JPG

検討の結果、それぞれ素材をGFRPの薄板と透明アクリル板に変更している。

IMG_7784.JPG

GFRP製のシムには、カットシート(紙製)を貼り付けた。

IMG_7785.JPG

Hirose/6pinは取り付け穴の加工が難しい。

IMG_7786.JPG

心配していたプラグとの干渉は発生しなかった。

プログラム側の変更点は、OLEDのドライヴ速度を高速化するためにライブラリのdigitalRead(Write)をdigitalRead(Write)Fastに書き換えている。

残るは、タッチスイッチとオペアンプの実装だが、タッチスイッチの製作には欠品している部品の調達が必要。
posted by Yasuski at 07:04| oled

2017年10月28日

OLED簡易オシロスコープの製作@部品の組み込みを開始する

ケースはID-292。 トップパネルはテルミン用に作ったものを流用する。

IMG_7771.JPG

OLEDパネルは制御基板のクリアランスが確保できなかったので、表示素子を分離した後、ケースとの干渉を避けるためのオフセットを加味して実装を行う。 補強にはL型アングルを使用しているが、取り付け位置を若干ズラすことで、制御基板を20°ほどスラントさせている。

IMG_7772.JPG

固定には両面テープを使用した。 強度は十分そうだが、若干の補強を行う必要があるかもしれない。

IMG_7773.JPG

定電圧電源回路とオペアンプを実装する予定だった青基板だが、OLED制御基板とのクリアランスが予想通りに確保できず、右半分を全面的に切り落とすことになった。 トップパネルへの固定は基板に取り付けたVRポットで行っている。

IMG_7774.JPG

MCUは青基板の裏側に取り付ける。 青基板は失敗版のRev.1なので、電源周りの配線に注意すること。
青基板上に予定していたOp-Ampの実装が出来ないので、アングルの裏面に新たな入力回路を増設する。

IMG_7775.JPG

仮組みしてケースとのクリアランスを確かめたところ。 トップパネルのタッチスイッチは運用モードの切替に使用する予定。 中央の孔にドールアイを使ったモード判定用のRGBイルミネーションを追加する。 入出力端子はHiroseの6pで、ケースの左右に設置する。

ID-292の蓋を活用する場合クリアランスの確保が難しく、VRポットのツマミの選定が問題になる。 OLEDパネルにフードを付けて視認性をアップしたいところだが、これをアルミ板の板金工作で作るか3Dプリンタで製作するかが悩みどころだ。
posted by Yasuski at 05:03| oled

2017年10月27日

OLED簡易オシロスコープの製作

製作中のOLED簡易オシロスコープにモード切替スイッチのプログラムを実装中。

WS001174.JPG

追加したのは稼働実績のあるコードだが、全体が相変わらずのスパゲッティーなので、実働するかは判らない。
posted by Yasuski at 17:46| oled

2017年10月08日

OLEDオシロスコープの製作を再開する

OLEDを使った簡易オシロをTeensyに移植する計画の準備として、調子の悪いArduinoDueを引っ張りだしてダメ元でMacに繋いだところ、何故かこれが認識された。 その後、LEDチカをやって書き込みの確認をしてみたが、肝心のオシロのスケッチにコンパイルエラーが出て再書込が行えない状態になってしまった。 どうも、OLEDディスプレイのドライバファイルに速度アップのためにいろいろと仕込みをしたのがArduino側の仕様変更で無効になった可能性が高い。

仕方がないので、コンパイルが通るまで怪しげなポイントをすこしずつ取っ払った結果、基本的な機能は再現できた。



で、波形を観測したのだが、なんとなく思っていたトランジション・コントロールを行っている音源の音量がショボいことを再確認することになった。

対策として、Valueがフルスケールになる辺りの挙動を考えて、トランジションを操作するWavetableのダイナミックレンジ設定をイロイロとイジってみたのだが、6波あるコントローラーValueの合算が実質的に12bit範囲に収まりそうな値を探るのに一苦労させられた。 荒っぽい計算だが、1350段階程度に変化量を抑えると、6波加算時のオーバーフローの頻発を軽減できるようだ。

実際の運用を考えた場合、6波を合成するのだから「音が荒れないように」ダイナミックレンジを抑めにミックスを行っていく手法が常道ではあるものの、レベル管理のためのインジケーターが存在しない情況で編集の操作性をカヴァーするにはソフト側をインテリジェント化しなければならない。 単純に合算を行う現状ではトータルの出力バランスが最適化されたセッティングを得るのは難しい。

そのオシロの機能選択のパートをプログラミングしている過程で、処理をサブルーチンに飛ばした結果生じる遅延の大きさに気付いた。 特にロータリーエンコーダーのセンシングを行っている部分のスイッチ→サブルーチンに飛ぶ構造で一様に処理の遅れが発生していると判断し、OpenThereminのプログラム内に設定しているサブルーチン処理をスイッチ内部に内包する方向に改善を行った。 その結果、ヴォリュームコントロール時に、聴感上生じていた不連続な息づき現象が軽減されたことから改良にはそれなりのご利益があったものと思われる。

本体の改良を終え、波形表示を行う計画に戻る。 当初開発を行っていたArduino/Dueはフットプリントが大き過ぎてID-292に実装できない。 そこでサイズがコンパクトなTeensy3.2にプログラムの移植を進めていたのだが、去年の時点ではコンパイルが通らず全く刃が立たなかった。 その後、OLEDのインターフェイス設定を行う部分をプログラムの先頭に移動してみた結果、すんなりとドライヴが可能になった。  



波形を上書きすべきところを取り零しているが、原因はおそらくOLEDユニットの通信スピードの限界で、そこがボトルネックとなっているようだ。

当初はそれに気づかずにTeensyのクロックを72MHzで運用しようと試みていたが描画が全く安定しない。 どうもOLED側でデータの取り零している雰囲気になってきたので、試しに24MHzまでクロックを落としたところ、なんとか正常に近い形で描画が行われるようになった。 が、まだグリッドの描画が負担に見えたため、表示を外して実験を再開している。

ハードウエア的には、バイアス電圧の追加と、オーヴァーレベル対策を行う必要がある。 オーヴァーレベル対策は、LEDによるダイオードクリッパーの採用を考えている。 波形表示を優先すべきところをオシロとして多機能を盛り込もうとしたのが間違いと考えを改め、波形表示に専念する内容にプログラムを書き換えていく。 



その後、表示オフセット設定等の細工を施した結果、なんとなく行けそうな雰囲気になってきた。

ACカップリングを行っていない白入力にDC成分が見える。信号入力回路にはヘッドアンプとリミッターの追加が必須。 ケースは例のID-292になる予定だ。 回路の構成は、波形観測を行いつつ信号の分岐が出来るようにしたい。 エフェクターを内装すれば更に便利だが、スペースの余裕に難がある。

設定は固定しても問題なさそうだが、設定変更用のIFとしてトップパネルに準備されたタッチスイッチを流用することが可能だ。 起動時の判定で簡易周波数カウンタの機能を持たせても良いが、入力の設計が難しいかもしれない。 何れにしても筐体に基本回路をまとめさえすれば後々機能を追加できるので、まずはプラットフォームの構築に専念しなければならない。

オシロ機能の初期設定はプログラムのこの部分で行っている。

WS001147.JPG

プログラムの開発に目処が付いてきたので、トップパネルを切削してオシロの基台を作ることにした。 調子に乗って覗き窓を切り出していたが、OLEDのベース基板の寸法を計算に入れるのを忘れた結果、このままでは実装が不可能なことに気付いた。

IMG_7678.JPG

穴位置を右に寄せすぎて、OLED基板の装着が不可能になってしまったが、OLED基盤自体を分解することで問題を解決できそうだ。 例え窓の位置を左に寄せるにしてもスペースがギリなことは変わらない。 残念ながらID_292に組み込むスタイルは試作だけで終わりそうだ。


トップパネルにはカットした青基板を取り付けて基台にするつもりだったが、青基盤にスリットを入れてOLEDの制御パネルを挿入してアングルで固定すれば構造がスッキリする。 初代の基盤はトップパネルと取り付け位置がズレているので、オシレーター側を5ミリほどカットした後、真ん中のTOSLINK用の切り欠きから右側をバッサリと落とせば丁度良い基台になるだろう。 オペアンプはステレオ仕様になっているが、バイアスポイントの追加とACカップリングを行う必要がある。 

MCUにはTeensy3.2を取り付けて、余ったロータリーエンコーダー用の端子を可変抵抗のポートに転用する。 第一世代の青基板はTOSLINKを配置するために空けたスリットが既に入っているので、加工が楽だ。

IMG_7686.JPG

入出力コネクタは例によってHiroseの6pinを使用するが、これをトップパネルの左端上下にマウントして、トップパネルにすべての回路を集約する。 プログラム書き換え時のトラブルはこれでほぼ防止できるはずだ。

IMG_7687.JPG

中央の孔には、電池駆動を前提にして電源スイッチを配置する事を考えたが、RGB LEDを装着してパラメーターの状態を表示させるのが一番スマートな方法かもしれない。 ちなみに、基板上にUSB端子のランドが存在するが今回は使わないことにした。

posted by Yasuski at 15:25| oled

2015年12月28日

OledOscilloscope@RotaryEncoderの実装



RotaryEncoderのテストは未了だが、デフォルト設定下の動作は安定している模様。
posted by Yasuski at 09:42| oled

2015年12月27日

Oscilloscope@text表示の調整

IMG_5974.JPG

Oscilloscopeに表示するTextの位置がやっと決まった。

mydisp.setTextPosAbs(x,y);
mydisp.print(strings);
mydisp.nextTextLine();

の組み合わせで、表示位置が決まる。

nextTextLine(); で一旦区切らないと、y軸の設定が無視されることに注意。

あと、コード内のGLED関数は無効なので、これをOLED用に置き換える必要がある。

残るは、アナログ端子1ch分にまとめられている設定関連の端子を、複数のVRでコントロールを分担させるという手間の掛かりそうな作業だか、年内の貫徹は無理か、、、。
posted by Yasuski at 05:49| oled

2015年12月21日

ArduinoDue@Oscilloscopeの製作

Loop内で発生するエラーを回避しつつ、限定された機能を実装しているところだが、Triggerが効かない現状では波形の描画が上書きされ続けてしまう。



これを避けるために、暫定的に全画面のリセットをLoopの周期毎に掛けているが、このままでは見苦しくて使い物にはならない。

波形は2ch分を描画できる仕様なので、原音と加工後の音を比較することが可能だ。



その後、Sketchのコピーミスによる不具合を発見してLoop内に機能を実装出来たが、依然としてTEXTの表示がおかしい。

また、表示設定の方法が抵抗ラダーによるスイッチ方式のために、これの動作確認を行うには対応するハードウエアを製作しなければならない。

現状では2ch入力のうち、1chのADがデータを受け付けられない状態で、これはオリジナルのスケッチ上で行われた機能制限の結果と思われるが、今ひとつ使い勝手が悪い。

その後、機能制限を解除して2ch化を行い、波形表示にオフセットを掛けてみた。



明日は、グリッドの表示に発生している不具合の原因を探っていく。
posted by Yasuski at 16:09| oled

2015年12月20日

ArduinoDue@Digole製OLEDのドライヴ



Kathminに搭載する予定のオシロスコープ製作の一貫で、OLEDのドライヴを実験している。

Adafruite製のOLEDとは仕様が違って、カラーの設定は8bit。しかも、色の指定は別途、指令の直前に行う必要がある。
posted by Yasuski at 23:48| oled