製作モジュール一覧

ラベル KIK01 の投稿を表示しています。 すべての投稿を表示
ラベル KIK01 の投稿を表示しています。 すべての投稿を表示

2019年2月25日月曜日

KIK01のSyncInをKIKとNOSの2系統に分離

久しぶりにKIK01のファームウェアをいじりました。本体のKick音とゴーストとして使うNoise音を同期して出力していたのを、それぞれ別のGATE信号で出音できるようにしました。


mbed Repository
https://os.mbed.com/users/ryood/code/KIK01/ (Files at revision 41:ac576c48eace)

接続図

MIDI信号をMIDI_CV_CONVでGATE信号に変換してKIK01に入力しています。KIKとNOSは、TR-808/909のBDとOH/CHみたいな感じです。

32kHz付近のピークが気になるので、サンプリングレートを上げたかったのですが不可でした。

操作できるパラメータが多すぎて、自分で作っておきながら使い方がよくわかっていません(^q^;

NOS01はWhite/Pink/Blue Noise(PinkとBlueは疑似)を出力していますが、KIK01の箱の中の配線を変えないといけないのでリアルタイムに変更するのは無理です。

2018年8月17日金曜日

KIK01 サイドパネルの塗装

サイドパネルをニス(透明クリア)で塗装しました。

板材は杉です。ホムセンで100円ぐらいだったと思います。

手順です

とのこ塗り込み後、養生テープで裏面をマスキング


マスキングしましたが、塗装ごとにきっちり養生テープを貼るのはつらいので最初の一回のみにしました。


ニスがたれてしまったりうまく行かなかったのですが、ようすを見ながらニスを刷毛で2回ぐらい塗りました。



フレーム(黒色塗装)は大失敗しましたが、サイドパネルをつけるとそこそこ高級な機材のように見えると思います。

水性塗料の塗装


水性塗料を水で薄めてMDFの端材を塗装テストしました。

下地はとのこ(アサペン)→プラサフ(Soft99)です。


左はAlescoの水性塗料を水で薄めて塗りました。右はさらにダイソーの「補修用アクリルスプレー つや消しクリア」を塗布しました。

つや消しスプレーを近づけすぎて濃いめに塗布すると塗面がバキバキになりました。


メモ:

これぐらいの小さい作品だと、多少コストはかかりますがニスでも塗料はスプレータイプの方がいいんでは?と思いました。

はけを洗ったりニスを薄めたりするのに使うペイントうすめ液のコスト(お金と手間暇)がバカになりません。

2018年7月24日火曜日

KIK01 フレーム塗装(失敗編)

MDFで組んだKIK01のフレームを塗装しました。

今回の手順です。

板材の継ぎ目やはみだした木工用ボンドをなめらかにするために、240番、400番でサンディング。

とのこを塗り込む。

数日乾燥後、400番でサンディング。

プラサフ(Soft99)を塗布(半日程度間をおいて3回)。

400番でサンディング。

プラサフを塗布(数時間あいだをおいて2回)。

数日乾燥後800番でサンディング。


ALESCO水性黒(つやあり)を刷毛で塗装。


ここで、大変な間違いをしていたのに今気づきました。水性塗料なのに油性の「ペイントうすめ液」で希釈していました(^q^;;;

どうりでドロドロして薄まらないし、ペイント薄め液で刷毛をあらっても塗料が落ちなかったわけです。

まあやってしまったのはどうしようもありません(^q^;;;

暑さのせいで判断能力が落ちてたか(@@?

半日程度間をおいて何度か塗装しました。


やはり、塗料が乗らずゴテゴテで、黒塗りのラーメン屋の壁みたいな感じの仕上がりです。

とりあえず基板を入れて組み立て。




Dual OTA VCAはプリント基板バージョンにしています。

さすがに仕上がりに満足できないので、MDFの端材で今度は水で薄めて改めて塗装テストするかもしれません。

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

2017年12月28日木曜日

KIK01 LED基板でけた

回路図

R5の抵抗値を変更。

ここはNucleoのデジタル入力(DigitalIn)でPullUpして使うので、本来はR5は必要ない。ただ、ファームウェアのバグや誤配線とうでNucleoの出力につないでしまった場合、出力ピンがGNDに短絡するのを避けるために入れている。

羹に懲りて膾を吹くかもしれませんが(^q^;

出力電流は絶対定格で25mAなので3.3V / 25mA = 132Ωで、少し大きめに設定した。あんまり大きくしすぎるとR5の電圧降下が大きくなってロジックレベルが問題となる。

基板図

部品面

ハンダ面

KIK01に接続

2017年12月25日月曜日

KIK01 LED基板の設計

Power LED(緑): 通常時:常時点灯 電圧低下:ゆっくり点滅 過電圧:速く点滅
Beat LED(赤): ビートに合わせて点滅
SyncIn LED(黄): SyncIn信号に合わせて点滅
SyncOut LED(青): SyncOut信号に合わせて点滅(トグルスイッチで点滅をON/OFF)

AutoRun SW: 有効化するとSyncIn信号がなくても設定したテンポで再生

mbed repository:
https://os.mbed.com/users/ryood/code/KIK01_Proto08/ Revision:37

LEDの点滅にはmbedのTimeOutクラス(ワンショットタイマー)を利用した。


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

回路図

基板図

部品並べ

2017年12月23日土曜日

KIK01 処理タイミングの計測

mbed Repository:
https://os.mbed.com/users/ryood/code/KIK01_Proto08/ Revision:36

波形更新


ch1:D14(波形更新の間隔) ch2:D15(DCOへのSPI出力)

UART_TRACE、POTx8 PizzaBoxとPOTx16 LunchBoxからのパラメータ読み込みは抑止している。

ch1のD14はファームウェアでDout1と定義している。

void update()
{
#if (PIN_CHECK)
    Dout1 = 1;
#endif

    // Output Sync Signal per steps
    if (ticks % stepLength == 0) {
        SyncOut = 1;
#if (LED_SYNCOUT_BLINK)
        LedSyncOut = 1;
        timeoutLedSyncOut.attach(&ledSyncOutAtTimeout, LED_SYNCOUT_BLINK_CYCLE);        
#endif
    }

    // set envelope parameters
    envelopeAmplitude.setParam(amplitudeParam);
    envelopeFrequency.setParam(frequencyParam);
    envelopeNoiseAmplitude.setParam(noiseAmplitudeParam);

    frequency = envelopeFrequency.getAmplitude(ticks);
    amplitude = envelopeAmplitude.getAmplitude(ticks);
    noiseAmplitude = envelopeNoiseAmplitude.getAmplitude(ticks); 
    
    DcoSetFrequency(frequency);
    DcaSetAmplitude(1, amplitude);  // DCO
    DcaSetAmplitude(2, noiseAmplitude);  // NOS01

    ticks++;
    if (ticks >= envelopeLength) {
        ticks = 0;
        LedBeat = 1;
        timeoutLedBeat.attach(&ledBeatAtTimeout, LED_BEAT_BLINK_CYCLE);
    }

    // Output SyncSignal
    SyncOut = 0;

#if (PIN_CHECK)
    Dout1 = 0;
#endif
}

32kHzで割り込みを発生させてupdate()を呼び出しているので、ch1の矩形波の周波数は32kHzになるが一部処理が引き伸ばされている。この割り込みタイミングの揺れは波形の周波数には関係なく(波形本体はAD8402 WeinBridge DCOとNOS01でアナログ回路で発生させている)、DCOとVCAに送っているエンベロープのサンプリング・ポイントの揺れになるので、実用上はあまり気にしなくていい。

ただ、ちょっと気持ち悪いので原因が何か?できる範囲で調べてみるつもり。

ch2のD15はファームウェアでDout2と定義している。


void AD8402Write(uint8_t address, uint8_t value)
{
#if (PIN_CHECK)
    Dout2 = 1;
#endif    

    AD8402Cs = 0;
    SpiMAD8402.write(address);
    SpiMAD8402.write(value);
    AD8402Cs = 1;
    wait_us(1);

#if (PIN_CHECK)
    Dout2 = 0;
#endif
}

こちらはさらにタイミングが揺れているが、同じくDCOの周波数変調のエンベロープのサンプリング・ポイントの揺れになる。

WeinBridge回路の2個のRを同時に設定しているので2回H/Lされている。

波形更新(拡大)

ch1:D14(波形更新の間隔) ch2:D15(DCOへのSPI出力)

割り込みの周波数は32kHzなので、周期は31.25us。

オシロの波形から大体の処理時間を表にすると

通常時

割り込みが引き伸ばされた場合

前処理は予め読み取っていたパラメータをEnvelopeARクラスのオブジェクトへの代入、エンベロープ波形の生成を行っている。後処理ではエンベロープ波形を内蔵DACから出力している。

以前も「KIK01 SPI制御VCAと演算による振幅変調の比較」でSPI通信の処理時間を測ってみたが、このときはSPI DACのMCP4922へのSPI送信で、今回はAD8402へのSPI送信なので条件が異なる。

POTx8 LunchBoxとPOTx16 PizzaBoxからのパラメータの読み取り


今度は波形更新処理を抑止して、パラメータ読み取りの処理時間を計測した。


ch1:D14(波形更新の間隔) ch2:D2(パラメータの読み取り)

パラメータの読み取りはmain()関数のメインループ内で1msのThread::wait()をかけて呼び出しているので周波数は1kHzになる。

パラメータ読み取りの処理時間は468us。

波形更新処理を有効化すると


ch1:D14(波形更新の間隔) ch2:D2(パラメータの読み取り)

Thread::wait()なので、タイマー割り込み処理によってかなり引き伸ばされて1/166.4Hz≒6msごとの処理になっている。ch2がLの期間がThread::wait()で待ちの状態で1msより少し少ない。

メモ:


純粋にプログラミングだけ考えるとまだまだ追い込めそうですが、一旦保留。

2017年12月20日水曜日

KIK01 Nucreo F446REの信号波形


KIK01 Proto08をNucleo F446REに書き込んで信号波形を測定した。ファームウェアのUART_TRACE、PIN_CHECKは共に有効化。

デバイスはPOTx8 LunchBoxとPOTx16 PizzaBoxのみ接続。

mbed Repository:
https://os.mbed.com/users/ryood/code/KIK01_Proto08/ Revision:34

SPI2: AD8402 WeinBridge DCO


MOSI

ch1:PB_13(SCK) ch2:PB_15(MOSI)

SCK: 5.6267MHz

CS

ch1:PB_13(SCK) ch2:PC_4(CS)

SPI3: POTx8 LunchBox & POTx16 PizzaBox


MOSI

ch1:PB_5(MOSI) ch2:PB_3(SCK)

SPI3はのクロックは

#define MCP3008_SPI_SPEED       (1312500)

と1.3125MHzをしているが、半分程度になっている。MCP3008の最大クロックは1.35MHz@2.7Vとなっているのでもう少し上げてみて動作確認。

MISO

ch1:PB_4(MISO) ch2:PB_3(SCK)

MISOの波形が汚い。PullDownはしていない。(参考:「POTx8 Launch Box 筐体作成」)

CS1 (POTx16 #1)

ch1:PB_10(CS1) ch2:PB_3(SCK)

CS2 (POTx16 #2)

ch1:PA_8(CS2) ch2:PB_3(SCK)

CS3 (POTx8)

ch1:PA_9(CS3) ch2:PB_3(SCK)

DAC: Dual OTA VCAのEnvelope



ch1:A2(DAC1, Kick Envelope) ch2:D13(DAC2, Noise Envelope)

D13の出力はノイズがのっている。

拡大

ch1:A2(DAC1, Kick Envelope) ch2:D13(DAC2, Noise Envelope)

ノイズの周波数は5MHzぐらいか。ということはSPI3のクロックが重畳しているのかなあ。

設定パラメータ (UART出力)
240.0   8000    | 1079  6826    0.58    0.72    0.07    0.86    0.17    | 531   4927    1403.71 165.00  32.84   0.12    0.46    | 719   2275    1.00    0.58    0.00    0.16    0.18    VoltageMonitor: 0.824V   -1

2017年12月19日火曜日

ライブ配信告知 12月30日午後~

今年も年末ライブ配信やってみたいと思います。

ニコ生は金かかるし、fc2はややこしいそうだし、Ustreamは誰も来ないし(もはやない)、Youtubeかふわっちかな

<追記:2018.01.09>

KIK01とリズムマシンとベースマシンをMIXできた時のライブ配信のようすです。



</追記>

2017年12月18日月曜日

KIK01 F446REの温度測定 (ついでに壊れたF446REも)


KIK01のF446RE


KIK01で使っているNucleo F446REのMPUの表面温度を自作の温度計で測定してみた。


900秒経過で、18.5℃から27.15℃に上昇。

壊れたF446RE


実験しているうちに壊してしまったNucloe F446REのMPUの表面温度も測定してみた。

参考:「こんどはNucleo F446REのDACを破壊してしまった(TqT;」

最初は、A2(PA_4)ピンが不良になっただけだったが、その後MPUが発熱して書き込みができなくなってしまった。(USB接続して現れるストレージにFAIL.TXTが出現)


35秒経過で20.2℃から51.8℃に上昇。サーミスタを固定しているカプトンテープがはがれたので測定中止。

お陀仏のようだ。

なかなか壊れないArduino Unoと比較すると、Nucleoは取扱いに注意が必要そうだ。多品種あるMPUを同じ基板で対応させているのでしかたないでしょう。