2017年11月22日

Open.Theremin@緑基板の製作

Frequency側のオシレーターの定数を周波数が低くなる方向にLを倍量にして変更している。 撮影後、adatEncoder/DACの実装を完了済み。

IMG_7798.JPG

今回は、オシレーターのLにリードタイプのものを使用している。 VariCapを直接調整するためのVR接続端子の追加を忘れないこと。

IMG_7801.JPG

こちらは、V3基板/Teensy3.6用の基板。

IMG_7795.JPG



IMG_7789.JPG

これは、ベーシック仕様の基板。 緑基板から、Teensy3.5/3.6が共用できるようになった。 DCインレットとミニフォン端子の実装を忘れないこと。 

IMG_7790.JPG

この基盤には、基本形となる12bit出力限定のプログラムを準備している。 出力は、MCUからの2chと、V3基板側からの1chの合計3chとなる。

クロックソースをV3基板から受けた場合、オーディオクロックは8MHzを分周した31.25kHz。 それに合わせて、LPFの定数は低めに設定した。 テルミンの楽器としての性格を考えると、LPFは今よりも更に低めに周波数を設定したほうが良いかもしれない。

以上がオプション無しの素の状態。

IMG_7796.JPG

Teensy3.6にID-292版の修正済のファームウエアを書き込んだところ、機能切り替えスイッチの極性が逆に設定されていることが発覚、コレをさらに修正することになった。

IMG_7808.JPG

ID-292ではTeensyを損壊する事故(既に3基潰した)が多発しているので、実装前に保護対策を練る必要がある。

V3基板対応ボードに通電したところ、端子の設定ミスなどが発覚して修正を行った。 また、起動時のピポパ音は出力されるものの、アンテナのセンシングが全く行われない。

IMG_7809.JPG

最初に発覚した失敗は、BUT端子がプログラムのミスで別のポートに割り振られていたことで、これはソフトウエア側の改修で難なく修正することが出来た。 

次に、発振の確認と端子の電圧を測定してみたところ、DACにデータを送れずチューニングが行えない情況が判明した。 原因はSwitch機構内で条件分岐が上手く働かず、ロータリーエンコーダのデータが更新されないことにあったが、これはTeensy3.5では問題なく動いていた部分で、機種依存のバグが発生している可能性がある。

その後、この不具合をプログラムのキャリブレーションモードにロータリーエンコーダを実装することで解決しているが、ノーマルモードとの切り替えの可否は未確認。

IMG_7804.JPG

エンコーダーの稼働確認後にDACを駆動して発振周波数の調整を行ったが、再起動後にセットアップ時にデータを送っているにも係わらず、何故か起動時のセットアップルーチン内でDACにデータが伝送されない問題が発覚する。 MCUの機種依存で不具合が出ているところが怪しく、IDEのバグが疑われるが「サブルーチン化せず、関連する処理は全部ローカルに記述」することで、問題を回避できるかもしれない。

Screen Shot 2017-11-21 at 11.35.08 PM.png
posted by Yasuski at 04:32| open.Theremin

2017年11月15日

pinConfigurations/ID-292

#define LATCH01 27
#define LATCH01_ON (CORE_PIN27_PORTSET = (1<<15))
#define LATCH01_OFF (CORE_PIN27_PORTCLEAR = (1<<15))

#define LATCH02 20
#define LATCH02_ON (CORE_PIN20_PORTSET = (1<<5))
#define LATCH02_OFF (CORE_PIN20_PORTCLEAR = (1<<5))

#define LATCH03 21
#define LATCH03_ON (CORE_PIN21_PORTSET = (1<<6))
#define LATCH03_OFF (CORE_PIN21_PORTCLEAR = (1<<6))

#define LATCH04 18
#define LATCH04_ON (CORE_PIN18_PORTSET = (1<<3))
#define LATCH04_OFF (CORE_PIN18_PORTCLEAR = (1<<3))

#define LATCH05 16
#define LATCH05_ON (CORE_PIN16_PORTSET = (1<<0))
#define LATCH05_OFF (CORE_PIN16_PORTCLEAR = (1<<0))

#define LATCH06 15
#define LATCH06_ON (CORE_PIN15_PORTSET = (1<<0))
#define LATCH06_OFF (CORE_PIN15_PORTCLEAR = (1<<0))

#define LATCH07 17
#define LATCH07_ON (CORE_PIN17_PORTSET = (1<<1))
#define LATCH07_OFF (CORE_PIN17_PORTCLEAR = (1<<1))

#define CLOCK01 25
#define CLOCK01_ON (CORE_PIN25_PORTSET = (1<<5))
#define CLOCK01_OFF (CORE_PIN25_PORTCLEAR = (1<<5))

#define DATA01 26
#define DATA01_ON (CORE_PIN26_PORTSET = (1<<14))
#define DATA01_OFF (CORE_PIN26_PORTCLEAR = (1<<14))

#define LEDred 7 // LED on D7
#define LEDred_ON (CORE_PIN7_PORTSET = (1<<2))
#define LEDred_OFF (CORE_PIN7_PORTCLEAR = (1<<2))

#define LEDgrn 8 // LED on D8
#define LEDgrn_ON (CORE_PIN8_PORTSET = (1<<3))
#define LEDgrn_OFF (CORE_PIN8_PORTCLEAR = (1<<3))

#define LED 9 // LED on D9
#define LED_ON (CORE_PIN9_PORTSET = (1<<3))
#define LED_OFF (CORE_PIN9_PORTCLEAR = (1<<3))

#define LED2red 38 // LED on D38
#define LED2red_OFF (CORE_PIN38_PORTSET = (1<<11)) //inverted
#define LED2red_ON (CORE_PIN38_PORTCLEAR = (1<<11))

#define LED2grn 37 // LED on D38
#define LED2grn_OFF (CORE_PIN37_PORTSET = (1<<10))
#define LED2grn_ON (CORE_PIN37_PORTCLEAR = (1<<10))

#define LED2 39 // LED on D39
#define LED2_OFF (CORE_PIN39_PORTSET = (1<<17))
#define LED2_ON (CORE_PIN39_PORTCLEAR = (1<<17))

#define buttonPin01 11 // Button Pin on D11
#define button_State1 (CORE_PIN11_PINREG & (1<<6))

#define buttonPin02 36 // Button Pin on D36
#define button_State2 (CORE_PIN36_PINREG & (1<<9))

#define buttonPin03 3 // Button Pin on D3
#define button_State3 (CORE_PIN3_PINREG & (1<<12))

#define buttonPin04 4 // Button Pin on D4
#define button_State4 (CORE_PIN4_PINREG & (1<<13))

#define buttonPin05 5 // Button Pin on D5
#define button_State5 (CORE_PIN5_PINREG & (1<<7))

#define buttonPin06 6 // Button Pin on D6
#define button_State6 (CORE_PIN6_PINREG & (1<<4))

#define LEDvol 28 // LED on D28
#define LEDvol_ON (CORE_PIN28_PORTSET = (1<<16))
#define LEDvol_OFF (CORE_PIN28_PORTCLEAR = (1<<16))

#define LEDvol2 13
#define LEDvol2_ON (CORE_PIN13_PORTSET = (1<<5))
#define LEDvol2_OFF (CORE_PIN13_PORTCLEAR = (1<<5))

#define SAMPCLK_STATE (CORE_PIN19_PINREG & (1<<2)) //sampling clock in
#define SAMPCLK_MASK (CORE_PIN19_CONFIG = PORT_PCR_IRQC(0)) //masking sampling clock in
#define SAMPCLK_ACTV (CORE_PIN19_CONFIG = PORT_PCR_IRQC(9)) //activate sampling clock in

#define CS01 29
#define CS01_ON (CORE_PIN29_PORTSET = (1<<18))
#define CS01_OFF (CORE_PIN29_PORTCLEAR = (1<<18))

#define LDAC01 33
#define LDAC01_ON (CORE_PIN33_PORTSET = (1<<24))
#define LDAC01_OFF (CORE_PIN33_PORTCLEAR = (1<<24))

#define SCK01 30
#define SCK01_ON (CORE_PIN30_PORTSET = (1<<19))
#define SCK01_OFF (CORE_PIN30_PORTCLEAR = (1<<19))

#define DAC16 40
#define DAC16_ON (CORE_PIN40_PORTSET = (1<<28))
#define DAC16_OFF (CORE_PIN40_PORTCLEAR = (1<<28))

#define DAC16_2 31
#define DAC16_2_ON (CORE_PIN31_PORTSET = (1<<10))
#define DAC16_2_OFF (CORE_PIN31_PORTCLEAR = (1<<10))

#define SD01 32
#define SD01_ON (CORE_PIN32_PORTSET = (1<<11))
#define SD01_OFF (CORE_PIN32_PORTCLEAR = (1<<11))


#define PC_STATE1 (CORE_PIN22_PINREG & (1<<1)) // pitch osc in
#define PC_STATE2 (CORE_PIN23_PINREG & (1<<2)) // volume osc in
posted by Yasuski at 01:05| open.Theremin

2017年11月10日

目玉スイッチの作り方@直径6mm編

目玉スイッチに仕込んだLEDが不良だったので、アクリル製のガワを破壊して、再組立てを行った。

その際、製作のステップを考えなおしたので、その備忘録。

1)まず、直径6mmの透明アクリルパイプを5mm長に切断する。 サーキュラーソウで切断を行う場合は、ピックアップが難しい(ノコ刃の隙間に切り出した部材が入り込む)ので、材の厚みギリギリに刃の深さを調整すること。

2)表面実装LEDは0805サイズのものを使用する。 耐熱両面テープでLEDを固定した後、水平に極細の配線材をハンダで接合する。

3)切り出したアクリルパイプの切断面を研磨した後、側面に配線を通すため1mm径の穴を貫通させる。

4)タクタイルスイッチのシャフトには予めOリングをはめ込んで、アクリルパイプ取付け時のクリアランスを確保しておく。

5)瞬間接着剤を使って、タクタイルスイッチの上面にLEDを固定する。

6)固定したLEDの配線材をアクリルパイプの配線用の穴に通す。 線材は、LEDの上面を交差する形でまとまる。 座りの良い所で、パイプを固定して、瞬間接着剤を滴下する。

7)パイプの固定を確認した後、LEDの通電テストを行う。 問題がなければ、アクリルパイプの上面に薄く瞬間接着剤を塗布し、目玉を取り付ける。

以上、作業時間は慣れれば15分程度。 予めアクリルパイプを切り分けておくと、作業時間は更に短縮できる。

タクタイルスイッチは、シャフト長が異なる製品をまとめたサンプル用のパッケージをebay等で調達するのがお得。
posted by Yasuski at 00:22| AudioElectronics

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| Arduino

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| AudioElectronics

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| AudioElectronics

2017年10月27日

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

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

WS001174.JPG

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

Open.Theremin@生存確認作業の記録

廃棄した基盤から引き剥がし、緑基板に再実装したFPGAとPLLオーディオクロックジェネレータIC/27MHzX'talの生存を、FPGA書き込み端子に直接3.3V電源を供給した後、波形の観測を行って確認した。

IMG_7632.JPG

動作確認用に特化した電源ラインを分岐させる端子を作る必要があるが、基板側にコネクタを設置せず信号を取り出せる端末の形状を工夫しなければならない。

IMG_7731.JPG

再実装を行ったパーツのうち特にV3ボード対応基板に実装した"P601-27"は、基板から邪魔なICコネクタを引っぺがす時の事故で4番ピンが根本からモゲたために動作が心配だったが、無事稼働している模様。

IMG_7732.JPG

この実験で、使用している半導体が予想以上に頑丈なことが判った。 まあ、リフローによる実装が当たり前になった世の中なので、低出力のハンダ鏝で行う30秒程度の加熱はヘッチャラなのであろう。

WS001173.JPG

WCKの発振を確認する際に、FPGAのCLR端子をロジックレベル”H”に固定しなければならないのが手間。 ファームウエア設計の段階でプルアップしておけば良かったのだが、今更ここに手を加えると最悪の場合FPGAの端子配置が変わるので、不便でも我慢することに。

IMG_7749.JPG

WCKの出力波形は、オシロスコープの5usのスパンで観測している。 信号が丁度2マスちょいで周期しているので、96kHzのオーディオクロックが供給されていることが確認できる。 その後、周波数の設定端子S1/S2をそれぞれグランドに落とし、44.1/48kHzの発振も確認済みだ。
posted by Yasuski at 02:09| open.Theremin

2017年10月25日

Open.Theremin@出力波形の観測

Open.Thereminの出力波形を観測した。

Screen Shot 2017-10-25 at 12.13.37 AM.png

上から、ミックス・1番オシレーター・2番オシレーターの出力。 

2番オシレーターの波形には問題があって、下側/グランドよりが潰れ気味に見える。 ハードウエアに何か問題があるのだろうか。

3系統の独立した出力のテルミンなんてのはかなりレアだと思うのだけど、思ったよりも世間的な訴求力は無いような雰囲気。

Screen Shot 2017-10-25 at 12.12.12 AM.png

別のコンビネーションのオシレーターをミックスした波形。

Screen Shot 2017-10-25 at 12.11.24 AM.png

一度ミュートしてから発音する過程の波形。 よく見ると、DC成分がドリフトしていることが判る。

ピアニッシモ時の立ち上がりに小さなスパイクが見られる。

Screen Shot 2017-10-25 at 12.10.37 AM.png

こちらは、デクレッシェンド時の波形。

コンデンサの放電が終了するまで、ドリフトが継続している。

Screen Shot 2017-10-25 at 12.10.08 AM.png

これも、デクレッシェンド→クレッシェンド時の波形だが、ここでも弱音時にスパイクが見られる。

Screen Shot 2017-10-25 at 12.09.28 AM.png

スパイク波形の拡大図。

スパイクが全ての出力で同時に発生していることから、プログラム側に問題がある可能性が高い。

Screen Shot 2017-10-25 at 12.05.22 AM.png

発音の情況を俯瞰した図。

複数の波形が合成されていることが良く判る。

Screen Shot 2017-10-25 at 12.04.16 AM.png

こちらは波形の解像度を上げたもの。

位相のズレが反映されて複雑な波形を作り出している。

トランジションモードでは、このような倍音関係がシームレスに変化していく。

Screen Shot 2017-10-25 at 12.03.58 AM.png

Screen Shot 2017-10-25 at 12.03.08 AM.png
posted by Yasuski at 08:37| open.Theremin

2017年10月24日

Open.Theremin@Volumeデータの出力更新レートの変更を試みる

ヴォリュームコントロール時にノイズが出る不具合の原因が、コントロールヴァリューのリップル成分ではないか?という疑念から、データの更新サイクルを変更することを思いついた。

通常は、FTMからのフラッグをトリガーにしていたところを、サンプリングクロックが立ち上がるタイミングでカウントを行う専用タイマーを追加し、

WS001167.JPG

これの積算数によって、、、

WS001169.JPG

出力の更新を決定する機構を仮に設定、評価を行った。

WS001168.JPG

試しに、音量を更新する周期を遅らせると、それにともなってビートの周波数が下がっていく。 更新のタイミングを更に遅らせていくと、最終的には階段状のクリック音として音量変化が認識されるレベルになった。

ザラザラしたノイズは消滅したものの、結局はノイズが可聴域に下がってくることに拠る弊害のほうが大きいことが判明したため、この仕組はお蔵入りとなった。

以上の実験から、ノイズはデータの不連続面が影響して発生したスプリアスと思われるが、発生の原因を確定するにはヴォリュームの値をDACから出力し、この電圧をオシロスコープで監視するのが速道かもしれない。 電圧が推移する過程で変なスパイクが認められた場合は、これまた想定外の問題が発生していることになる。

改良の過程で、出力をマッピングして最大音量に至るラスト12bitほどの変化量を圧縮する機構を追加している。 この処置に因ってレベルオーヴァー由来の歪は皆無になった。 

WS001170.JPG

依然としてbitノイズっぽいザラザラ感は解消されていないものの、選択した出力波形がSawToothの場合は殆ど気にならないレベルになったことから、トランジションコントロールに設定していた最大数値の制限を解除した。 いきなりガッツリと歪まなくなったので、ソフトにディストーションが掛かるこちらの方が使い易い感触だ。

他の不具合としては、左手でTransitionをコントロールする際にデータがゼロになる閾値が出来、この不連続面に由来するノイズが発生するケースがあった。 これに対応するため、出力に以下の処理を加えてノイズの発生を回避している。

WS001171.JPG

以前は、閾値に至らないようにオシレーターのチューニングを続けることで調整していたが、この方法ではVolume側に過大なドリフトが生じた時は対処しきれなかった。 出力されるデータに制限を掛けることによってノイズの発生は回避されることになった。
posted by Yasuski at 19:07| open.Theremin