2018年1月21日日曜日

Arduino LFOの構想

KIK01ベースマシンのパラメータ設定用のPOTのかわりにLFOやエンベロープ・ジェネレーターをつないで変調することを考えてみました。

アナログLFOもおもしろそうですが、ぴゅんぴゅん2号をベースに、Arduinoでやってみることにしました。

仕様
波形: サイン波、三角波、ノコギリ波(上昇)、ノコギリ波(下降)、矩形波(パルス幅設定)
周波数: 0Hz~100Hz程度
振幅: 3.3Vp-p(単電源波形)

KIK01やリズムマシンのPOT入力用のADCは3.3V系なので、0V~3.3Vの単電源波形とします。←できれば振幅を調節できるようにする。

受け側のADCは10~12bit精度、サンプリング周期1kHz程度ですが、アナログ回路でも使えるようにできるだけきれいな波形を出力することを目標とします。

今回はArduinoしばりをかけます(^q^;

ブロック図

波形選択はタクトスイッチ1個の順送りで行い、LEDで選択中の波形を表示します。LFOのRateはPOTで設定、矩形波のパルス幅もPOTで設定。

出力はMCP4922を使い、デジタル歪を除去するためにLPFをかけます。

Arduinoのテスト・スケッチ


Github:
https://github.com/ryood/ArduinoLFO/tree/a904798e7fd8e1f79e818c88adfa5c5905da3cc4

波形生成はDDSで行いました。DDSは波形の周期性が出たりデメリットもあるのですが、少ない演算量の整数演算で済むのでArduinoで任意波形を出すならこれ一択だと思います。

テスト用ブレッドボード配線図


出力波形


100Hzのサイン波を出力して測定しました。


拡大

相当ガタガタしています。ガタガタの幅は60us程度で、サンプリングレート15625Hz(64us)と合致します。

高さは40mV程度。 3.3V / 40mV = 82.5 step でかなり荒くなっています。

FFT


WaveSpectraでFFTしました。(窓関数:FlatTop)


上側のウィンドウの波形でもガタガタが確認できます。スペクトラムを見ると100Hzの整数倍の高調波歪は大きくないですが、その他の歪が猛烈に出ています。サンプリングレートの15kHz付近にピークが出ています。

処理時間


Pinの出力のH/Lで処理時間を計測しました。

割り込みとSPI処理

ch1:LDAC ch2:A4

ch1:LDACはMCP4922とのSPI通信の最初と最後でH/Lして、20usかかっています。ch2:A4はサンプリング周期ごとのTimer2の割り込みの最初と最後でH/Lしていて38.4usかかっています。

結構ギリギリですね(^q^;

割り込みとメインループ

ch1:A5 ch2:A4

ch1:A5はメインループのloop()の最初と最後でH/Lしています。現状ではパラメータ読み取り用のanalogRead()を無効化しています。Timer2の割り込み中はloop()内の処理は引き伸ばされているようです。

割り込み処理の時間がかかりすぎると、loop()に処理が戻ってこず、パラメータ読み取りが出来ない可能性があります。

SPI通信



ch1:MOSI ch2:SCK

SPIクロック(SCK)は、スケッチで指定している通り8MHzになっています。MCP4922は20MHzまでなので多少波形が汚くても大丈夫だと思います。←憶測(^q^;

メモ:


ぴゅんぴゅん2号の波形テーブルは、8bit長、要素数256にしている。これをMCP4922の12bit長にし、要素数も増やして出力波形が改善されるか見てみる。

ノコギリ波、三角波はDDSではなく線形補間でやってみる?

矩形波は一番簡単なH/Lで(^q^?

ノイズ(S&H)もできそう?

アナログLPFで必要な帯域外を削るにしても、かけすぎるとサイン波以外は波形がなまってしまってよくない。

割り込みの周期が揺れていないかオシロのトリガ(パルス幅)で確認できる?

2018年1月19日金曜日

LCRメーターDE-5000でヘッドホンやブレッドボードのインピーダンスを測ってみる。

秋月で売られているLCRメーターのDER EE DE-5000で、ヘッドホンのSony CD900STとブレッドボードのインピーダンスを測ってみました。

まずはDE-5000が出力している信号を測定しました。

DE-5000の出力(@1kHz)

振幅は1.84Vp-pで意外ときれいなサイン波を出力しています。

この時、逆にDE-5000でオシロの特性も測定しました。

抵抗(Rp) 9.912MΩ
容量(Cp) 17.9pF Tanδ 0.897

オシロのプローブはx10で公称10MΩなので正しく測れているようです。入力容量もプローブをx10で使う場合は15pF~20pF程度になっているようです。

1.84Vp-pならオーディオ・インターフェイスに直接つっこんでも平気なのでWaveSpectraでFFTしてみました。

Audio I/F: TASCAM US-144MKII
窓関数: FlatTop


2次高調波歪が-73dB程度、THDが0.026%となかなかきれいなサイン波形です(^q^/

同時にDE-5000でUS-144MKIIの入力インピーダンスも測定しました。(@1kHz)

MIC/LINE入力
抵抗(Rs) 9.177kΩ
容量(Cs) 841.2nF Tanδ 48.4

Guitar入力
抵抗(Rp) 90.60kΩ
容量(Cp) 256.3pF Tanδ 6.65

公称ではMIC/LINEで15kΩ、Guitarで1MΩとなっているので、特にGuitar入力はかなり低い値になっています。

MIC/LINE入力は1uF近くあるということになるのですが、でかすぎ(@@?

ブレッドボードの寄生インピーダンス



最近、100kHzを越えるアナログ信号を扱うようになってきたので、ブレッドボードの寄生容量・抵抗を測定しました。

ブレッドボードは2016年11月に秋月で購入したものです。←これでも手持ちの中では新しい方。

容量は、ブレッドボード普通の穴の隣り合った列で測定、抵抗は電源ラインの両端で測定しました。(@1kHz)

容量(Cp) 3.2pF Tanδ 0.008
抵抗(Rs) 0.155Ω
抵抗(DCR) 0.10Ω

3.2pFというと高周波になるとそこそこ問題になってきそうな値です。←ブレッドボード上のいたるところにこの容量がある。

0.15Ωとすると100mA流せば15mVの電圧降下。これも低電圧で電流を多く流す場合は注意が必要そうです。

CD900STのインピーダンス



抵抗とインダクタンスを周波数を変えて測定しました。ヘッドホンを装着した場合とヘッドホンをその辺に置いて測定した場合、インダクタンスの値が変わるので両方測定しました。

1.84Vp-pを直接ヘッドホンに入れると音がでかすぎるので耳栓をして測定(^q^; ヘッドホンにも悪いので、リスニング用のヘッドホンでこういうことはしないほうがいいと思います。

抵抗

インダクタンス

※OFFはヘッドホンを外して測定、ONはヘッドホンを装着して測定

ヘッドホンを装着して、耳に押し付けるようにするとインダクタンスはさらに変化します。振動板が動きにくくなるためだと思います。

測定データ

L(mH)
F(Hz) OFF ON
100 1.498 2.485
120 6.86 6.904
1000 274.5 86.5
10000 183.99 183.76
100000 140.79 141.13

Q
F(Hz) OFF ON
100 0.01 0.017
120 0.059 0.061
1000 0.024 0.007
10000 0.163 0.162
100000 0.88 0.881

R(Ω)
F(Hz) OFF ON
100 89.21 87.47
120 86.56 85.09
1000 69.95 70.16
10000 70.67 71.2
100000 100.41 100.68

2018年1月17日水曜日

KIK01 まとめ

Sonic AcademyのKICK 2にインスパイアされて作り始めたKIK01ですが、思っていたことはまずまず実現できたので、かんたんにまとめたいと思います。

本体

パラメータ入力用 POT Box

去年の年末、自作のリズムマシンベースマシンとMIXするテストをしているようすのライブ配信しました。前半はリズムマシンとMIXするためのケーブルを作ってるだけです(^q^;

リズムマシン+ベースマシン+KIK01のMIXは2:30:00~ぐらいです。


XSplitで動画合成をしてライブ配信していて、(たぶん)音声が96kbsになっているのでKIK01だけ録音してSoundCloudにアップロードしました。

シーケンサーにリズムマシンを使っていますが、エフェクトはかけずにKIK01のみの出音です。PCに取り込んでノーマライズとフェイドアウトだけかけています。

Normal出音

https://soundcloud.com/od-ryo/kik01-trial/s-MhuJf

VCAのOver Drive
https://soundcloud.com/od-ryo/kik01-od-trial/s-XHIjz

最初に構想したときNucleoF446マイコンの内部演算でシンセサイズして、内蔵12bit DACを使って出力してプロトタイプとしました。

チップ・チューン的な使い方ならマイコンの内部演算で完結しても使えそうなのですが、アナログ回路で同等の機能を実現できないか、主に技術的な興味でKIK01と名前をつけてシステムとして作り始めました。

現状のKIK01のハードウェアは最初のプロトタイプと機能的にはほとんど変わりませんが、VCAをオーバードライブした時のひずみ感など往年のリズムマシンに近い出音ができるようになったと思います。

スピーカーはYAMAHAのMSP3なのにうるさいと言って怒られるレベルになりました(^q^;;;

コンピューター演算によるデジタル・シンセサイズはデジタルならではの過激な出音が魅力ですが、アナログとデジタルをまぜこぜにするとさらに面白くなります。

ソフトウェアでアナログ回路をシミュレートするか実際にアナログ回路を作るかはその時の気分次第(^q^/

構成


KIK01のブロック図
KIK01の内部構成

Nucleo F446


システムを司るシーケンサーの働きをします。Nucleo F446のメリットは、12bit DACが2ch内蔵されていて、動作クロックが180MHzと高速でmbedで楽ちんプログラミングできて、さらにfloat型のFPUが付いていてめんどくさい固定小数点演算をしなくてすむことです。

今回のシステムにはあまり関係ないのですが、ほとんどのPinが5Vトレラントで(参考:「Nucleo F446REとNucleo F303K8の一部ピンは5Vトレラントではない模様」)、ハードウェアの試行錯誤もしやすいのです。やけどは何度かしましたが、1からハードウェアを組むことを考えると、とんでもなく便利なボードだと思います。

値段も2000円以下なのでおすすめです。

ファームウェア


基本的にUIの制御とエンベロープ生成を行っています。ハードウェアによるUI制御はマイコンが得意とする分野ですが、エンベロープ生成はFPUとDAC内蔵のNucleo F446のパワーを活かしています。

マイコン自体にDACが内蔵されていなくても、外付けのもの(例えばSPI接続のMCP4922)を使えば実現できるのですが、IC間通信のコストが意外と高く、たとえエンベロープ波形と言えども処理時間が間に合わなくなりがちです。内蔵DACだと速度的に有利です。参考:「Nucleo F446RE(mbed)の内蔵DACとSPI DACのMCP4922の速度を比較する

現状のファームウェアでは32kHzのサンプリングレートで振幅変調用のエンベロープ波形を2系統出力できています。

また、エンベロープ波形は単純な線形補間ではなく指数カーブを付けてアナログチックな波形にして出力しています。FPUが内蔵されているお陰であまり悩まずに算術演算できました。

まだ改善の余地がありそうなので、少しずつ(ハードウェアいじりに疲れた時?)実験してみたいと思っています。

mbed Repository:
https://os.mbed.com/users/ryood/code/KIK01/ Revision:39

AD8402 Wienbidge DCO


http://dad8893.blogspot.jp/2017/09/ad8402-wein-bridge-dco_16.html

ウイーン・ブリッジ正弦波発生回路をデジタル・ポテンショメータのAD8402で周波数可変にする回路です。正弦波発生回路をかんたんに電圧コントロールする作例が見つからず難しそうだったので、デジタル・ポテンショメータで周波数を可変するようにしました。

R値2個で周波数は変えられますが、AD8402の抵抗値のステップが256なので周波数が高くなると値がトビトビになってしまうので、ファームウェアの工夫で落とし所を探りたいと思っています。

NOS01


http://dad8893.blogspot.jp/2017/10/nos01_10.html

ノイズ発生器です。ホワイトノイズを出すのも難しかったのですが、正しい意味でのピンクノイズやブルーノイズは、はしょりました(TqT;

ピンクノイズやブルーノイズは3db/octなので、ホワイトノイズにフィルターをかけてかんたんに実現することは難しく、6dB/octの1次フィルターで削りました。なので、Red Noise/Purple Noiseというべきかもしれません。

音源としては、これはこれでおもしろいと思います。

Dual OTA VCA


http://dad8893.blogspot.jp/2017/08/dual-ota-vca_30.html

KIK01の製作のキモではないかと思っています。過大入力を入れると程よく歪みます。オーディオ的には歪は大敵ですが、楽器としては歪むとかっちょよくなることがあります。

OTA(トランスコンダクタンスアンプ)のNJM13600/NJM13700の入力は100mV程度までなので半固定抵抗器で入力信号を減衰させていますが、減衰率をいじればOver Drive的に使えます。

他にもいろいろ使えそうなので量産したいところですが、回路規模がそこそこあるのでユニバーサル基板を使ってはんだ付けすると、がんばっても実働2~3日ぐらいはかかります。プリント基板を焼くことも検討中です。

MAU106 ±5V PSU


http://dad8893.blogspot.jp/2017/11/mau106-5v_18.html

電源部です。5V出力の低損失レギュレータのNJM2396F05と、+5Vから±5Vを作り出すDC-DCコンバーターのMAU106を使って、±5Vの電源としています。

コモン・モード・チョークを入れてACアダプタのノイズを低減しています。

MAU106由来の125kHz付近のスパイクノイズが乗っているのでピュア・オーディオ用途(特にハイレゾ)には不向きかと思いますが、ACアダプタ1個で両電源を作ることが出来、実装面積もあまり大きくならずに済みます。

出力は+5Vが500mA、±5Vが±50mA程度で使うのが安全だと思います。

POTx16 PizzaBox、POTx8 LunchBox


http://dad8893.blogspot.jp/2017/12/potx16-pizzabox.html


http://dad8893.blogspot.jp/2017/12/potx8-lunch-box.html

パラメータいじり用に、POTを使いやすいように筐体に収めました。合わせて24個のPOTを使えます。

いくら多ピンのマイコンと言っても内蔵A/Dコンバーターの数には限りがあるので、SPI接続のA/DコンバーターのMCP3008を使って線数を減らしました。

12bit精度のMCP3208ではなく10bit精度のMCP3008を使った理由は、MCP3008はMCP3208より定格の最大SPIクロック数が高いのと、普通のPOTの分解能は10bitもあれば十分だからです。

SPIは基本的には3線(SCK、MOSI、MISO)ですが、スレーブごとにCS線を割り当てなければなりません。スレーブとして計3個のMCP3008を使っているのでそこそこ多線のケーブルが必要となってしまいました(^q^;

KIK01筐体

http://dad8893.blogspot.jp/2017/12/kik01_14.html

MDFを使って外枠を組み、ダイソーで売っているクリップボードを加工して底板と背板を作り、天板は透明アクリル板で内部を確認できるようにしています。

内部の配線をいじれるように天板は蝶番を使って開閉できるようにしています。

見栄えのために、MDFの外枠を塗装してみたいと思っています。

Github:
https://github.com/ryood/KIK01