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