製作モジュール一覧

ラベル シーケンサー の投稿を表示しています。 すべての投稿を表示
ラベル シーケンサー の投稿を表示しています。 すべての投稿を表示

2021年5月24日月曜日

Korg SQ-1のGate信号を拡張 GateEXの製作

Korg SQ-1のGate出力は2系統しかありません。自作のリズムマシンのKIK01と同期するためにGate信号を増やすモジュールを作りました。

ブロック図

SQ-1はSync信号が出ていますので、これを間引いてKIK01に入力するGate信号とします。シーケンスパターンの設定は簡単に8PのDIPスイッチで行います。ボタンを並べたりちゃんとしたユーザーインターフェースを作るのは骨の折れる仕事ですし、自作するよりもう1台SQ-1を購入して同期させたほうが安く済むかもしれません。

コントローラーとしてArduino Pro Miniを2個使用しました。

SQ-1のSync信号は5Vですが、Gate信号は10Vですので、間違ってSQ-1のGate出力をつないでも大丈夫なように入力に保護回路を入れています。

電源はArduino Pro Miniにもリニアレギュレータが載っていますが、あまり性能が良くないので別途7805を使った5V電源を載せています

回路図

外観

ケースはタカチPB-2です。最近このケースのサイズのバリエーションが増えたようですね。

背面の穴あけを左右逆に間違えてしまって、背面のパーツの配置は間に合わせです。

Korg SQ-1と接続

9V電源で、電源電流は35mA~38mA程度です。

Arduinoのスケッチ GateSequncer_01


//
// Gate Sequencer
//   Sync-in -> Gate sequence
//
// 2021.04.27
//

#include <MsTimer2.h>

#define PIN_SYNC_IN      (2)
#define PIN_GATE_OUT     (12)
#define PIN_GATE_LED     (11)
#define PIN_PULSE_WIDTH  (A0)

#define CNT_N            (8)

byte sequence[CNT_N] = {0};
int cnt = 0;
int pulseWidth = 20;

void gateOff()
{
  digitalWrite(PIN_GATE_OUT, LOW);
  digitalWrite(PIN_GATE_LED, LOW);
}

void step()
{
  digitalWrite(PIN_GATE_OUT, sequence[cnt]);
  digitalWrite(PIN_GATE_LED, sequence[cnt]);

  cnt++;
  if (cnt >= CNT_N) {
    cnt = 0;
  }

  MsTimer2::set(pulseWidth, gateOff);
  MsTimer2::start();
}

void setup() {
  pinMode(PIN_SYNC_IN, INPUT);
  pinMode(PIN_GATE_OUT, OUTPUT);
  pinMode(PIN_GATE_LED, OUTPUT);

  // DIP switch
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(PIN_SYNC_IN), step, RISING);
}

void loop() {
  // Read DIP switch
  sequence[0] = !digitalRead(3);
  sequence[1] = !digitalRead(4);
  sequence[2] = !digitalRead(5);
  sequence[3] = !digitalRead(6);
  sequence[4] = !digitalRead(7);
  sequence[5] = !digitalRead(8);
  sequence[6] = !digitalRead(9);
  sequence[7] = !digitalRead(10);

  // Read pulse width
  pulseWidth = analogRead(PIN_PULSE_WIDTH) / 10;  // 0~102 ms
}

Sync信号の受信はハードウェア割り込みで行っています。出力Gate信号をオフにするタイミングを取るためにMsTimer2を利用しています。

Arduinoには2枚とも同じスケッチを書き込みます。

出力例

C1:Gate1 C2:Gate2

メモ:


電源の入れ方によって、2枚のArduinoのシーケンスの開始がずれる場合があります。RSTボタンを押して同時にリセットをかけると同期します。起動時に同期させる仕組みを入れたほうが良いと思います。

2021年4月21日水曜日

Korg SQ-1 ファーストインプレッション

ステップシーケンサーのKORG SQ-1を購入しました。アナログシンセを使っている人にはコスパが良く、そうでない人にはほとんど使いみちが無い機械です。

今まではDAWのMIDI機能とMIDI-CVコンバーターを使ってシーケンサーとして使っていました。変わった点は、マウス操作ではなくつまみをひねって音を操作出来るようになり、PCも特に必要ではなくなりました。つまみをひねれば音色が変化するアナログシンセとの親和性は非常に高いと言えます。


同梱物は、マニュアル、MIDI-OUT端子変換ケーブル、単3電池×2でした。電源は電池の他USBから供給可能です。

出力信号の観測



出力信号 CV & GATE

CVは5V設定です。設定により、1V、2V、5V、8V(Hz/V)に変更可能です。

GATE信号はH=13V程度出ています。

出力信号 SYNC

SYNC信号はH=5V出力です。パルス幅は13.5msです(仕様では15ms)。正負の極性は設定により変更可能です。

GATE信号の取り扱い


GATE信号は仕様では10Vとなっていますが、無負荷で測定すると13V程度出ています。

自作のEGはGATE信号をArduinoのGPIOに入力する仕様となっているため、H=5Vに制限するようにアダプタを製作しました。


単に10kΩの抵抗をかましただけですが、EG側の入力インピーダンスと合わせてH=5Vとなりました。

またSQ-1のGATE信号の出力インピーダンス(内部抵抗)を計測しようと100Ωの負荷抵抗をつないで出力電圧を計測しましたが、無負荷時と比較してほとんど電圧降下が見られませんでした。出力インピーダンスは無視してかまわないと思います。負荷抵抗100Ωの場合
IO = VO / RL = 13V / 100Ω = 130mA
となり、これ以上流すと危険なので深追いはしていません。おそらく短絡しても保護がかかるようになっているとは思いますが。

SLIDE機能


ステップ間の音程をなめらかにつなぐ機能です。SLIDEをONにしたステップと次のステップが補間されます。


SLIDEをONにしたステップから次のステップにかけてCVがなだらかに補間されています。また、SLIDEをONにしたステップのGATE信号はLに戻らず、次のステップまでHのままになっています。少し凸凹していますが、GATE信号は論理値なので問題ないでしょう。

またSEQUENCE MODE (ロータリースイッチ)でCV SLIDEモードを選択するとBチャンネルのプッシュボタンでSLIDE ON/OFF、ノブでカーブのゆるさを変更できます。

Bチャネルのノブ最大→カーブがゆるい

Bチャネルのノブ中間→カーブがシュッとする

音程やフィルターの開閉など、ちょっとしたニュアンスの表現に使えると思います。

メモ


マイコンなどデジタル回路を使ったモジュールを使う場合、GATE信号の13Vに耐えられる仕様にする必要があります。今まで私が作ったものは5V仕様なのでちょっとまずいですね。間違えてCVやAudio用のジャックにGATE信号を入れてしまうことも普通にありそうです。

何らかの保護回路を入れたり、ロジックICなら高耐圧の4000シリーズを使ったりでしょうか。今後の製作物の要件とします。

EGの電源をオフにした場合、入力電圧が低下。AVRは電源OFFの場合GPIOの入力インピーダンスが低くなる?

2016年10月23日日曜日

ベースマシン SequencerのSPI出力にバッファ(TC74HC541)を入れてみる。


UI Controller <-> SequncerのSPI通信でハマっているが、SequencerからDCO、DCF、DCAをコントロールするのにもSPIを使っている。こちらはMISOはなく、Master->Slaveの一方通行なので多少気が楽だ。

以前かんたんにテストしたTC74HC541を使ってバッファリングしてみた(参考:「高速バッファICのTC74HC541の出力波形を見てみる。」)


配線図


波形が細かいSCKとMOSIにだけ、ダンピング抵抗を入れてみた。各Slave用のCSやDCAで使っているMCP4922のLDACは波形荒いし配線がめんどくさいので今回は端折った。

SPI信号波形


バッファからの出力付近(ブレッドボード上)で測定。

バッファなし

ch1: MOSI ch2:SOK

74HC541(ダンピング抵抗なし)

74HC541(ダンピング抵抗33Ω)

Slave(PSoC4 DCO)付近で測定。

74HC541(ダンピング抵抗33Ω)

メモ:

バッファリングの効果絶大。

74HC541が強力なのか33Ω程度のダンピング抵抗は入れても入れなくてあまり変わらないようだ。


2016年9月4日日曜日

ベースマシンのシーケンサ基板 その2

1枚目の基板に載せられなかったのを2枚目の基板にまとめた。


音源系もつないで音出しもしてみたが見難いのでUI系のみの配線です。

回路図

基板図

配線図(UI系のみ)


<追記:2016.09.7>Sequencer UI 2の紫と青の配線が逆だったので修正</追記>

配線しやすいようにNucleoのピン接続を変更した。

Nucleo F401REピン接続表

Nucleoにシールドを載せるとResetボタンが押せなくなるので、UI2基板にResetボタンをつけた。電源は不要でGNDだけで構わなかったが、スペースが余っているので分電盤?として+3.3VとGNDのピンを並べておいた。

mbed repository:
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer/ (revision 31)

メモ:


アルミ板で作る前に、写真に写っているような百均で売っている書類ばさみを加工して台座にしてみる。

Nucleoに5Vの安定化電源が載っているので、DCA基板には±9Vを入れて、Nucleoの「VIN」ピン+9Vを入れてやれば5V系の電源として使えそうだ。PSoC 4 Pioneer Kitにも5V安定化電源が載っているが、電源なしのPSoC 4 Prototyping Kitに差し替え予定なのでこちらは使わない。

<追記>DATASHEETの回路図を確認しましたが、PSoC 4 Pioneer Kitには5V系の電源回路は載っていないようです。 </追記>

PSoC 4 Prototyping Kit利用のDCO基板はシールドで作ってみる?

休符時にブツブツいうのはDCOの出力をストップしてみる?アナログ・シンセとして異端かもしれないが…

ピンソケット/ピンヘッダでSPI接続用のケーブルを作る。

LCDのバックライトはNucleoからPWMで出力して明るさを調整できるようにする?


2016年9月2日金曜日

ベースマシンのシーケンサ基板を作ってみた。


回路図

基板図

接続図

簡単そうな回路だったのでテスト表を作ってテストしなかった。Eagleの部品でaitendoの「CH12864F-SPI」の部品を自分で作って使ってみたが、ピンの順番(左が16番、右が1番)を間違えていて、はんだ付けしてから気づいた。

1、2か所はんだ付けし直して何とかなったが、あとから動作不良でチェックする場合にも役に立つのでやはりテスト表は作っておいた方がいい(←いましめ)

タクトスイッチはAlpsの12mm平方のものを使ってみた。足をまっすぐにする感じで整形すれば、ユニバーサル基板(秋月のC基板)にも挿して固定できた。ちょっと高いけど押し心地はいいと思う。

BPM設定用等にもう一つ基板を作る予定。

2016年8月30日火曜日

ベースマシンのシーケンサー シーケンス再生中にLCDを表示する(SPIの調査)

SPIクロックの指定


シーケンサーのSPI信号を測定してみたところ、LCD表示に使っているSPI2のSCLが500kHz程度だったので、st7567用のライブラリにSPIのクロックを設定するメンバ関数を追加した。(ライブラリのデフォルトではSPIクロックは1MHzの指定)

st7567LCD:
https://developer.mbed.org/users/ryood/code/st7567LCD/#0e21d2f2155a

SPI1はシーケンス送信、SPI2はLCD表示に使用していてともにSPI::frequency()でクロックを16MHzを設定するようにした。

SPI1

ch2:SPI1のSCK

オシロのカーソルで測定するとクロックは約10.5Mhz。

SPI2

ch1:SPI2のSCK

SPI1とは横軸の縮尺が違い、オシロのカーソルで測定するとクロックは約5.25Mhz。

プログラムで同じ16MHzを指定してもSPI1とSPI2で実際のクロック数が異なっている。

SPI信号のタイミング


SPIのクロックを上げて、簡単な文字列を表示するようにすると、シーケンス再生中にLCDに描画することができた。

mbad repository:
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer/ (revision 29)

SPI信号

ch1:SPI2(LCD) ch2:SPI1(Sequence)

拡大

さらに拡大

ch2:SPI1(Sequence)はRtosTimerを使って1msごとにSPIコマンドを発行している。ch1:SPI2(LCD)はmain関数のメイン・ループ内でLCDへのSPIコマンドを発行している。"rtos.h"をインクルードしているのでmain関数は最初のスレッドで動作し、優先順位の高いRtosTimerの割込み時間外でSPI信号を出力しているようだ。

シーケンス打ち込み用のグリッド画面のSPI信号



ch1:SPI2(LCD)

拡大

SPIコマンドの発行時間は約3.3ms。これを1ms以下にすればシーケンス再生中にシーケンス打ち込みのLCD表示ができるかな??st7565ライブラリの中身を見ると1バイトずつSPI信号を送っているの様なので、RtosTimerの割込みは効きそうなものだけど。

簡単な文字列表示も一旦画面をclearしているので(?)、同じ3.3msかかっているようだが。

シーケンス打ち込み用のハードウェアを作りながらもう少し調べる予定。

メモ:


SPIのCSのタイミング調整にwait_us()を使っているのでもう一度タイミングを見計らってちゃんとする。

ついでに消費電流をテスタで測ってみた。Nucleoは今回はUSBで給電しているので除外。プラス側が約120mA、マイナス側は約7mAとかなり差がある。電池電源にするとプラス側の電池の減りが速そうだ。

2016年8月17日水曜日

ベースマシンのUI POT(AverageAnalogInクラスを利用)


POTを並べたコントロール・パネルもつなげてみた。入力にはAnalogInの読み取り値を移動平均する自作のAverageInクラス(「mbedのAnalogInでPotentiometerの読み取り値のふらつきを抑える。」)を使った。

配線図

BaseMachine_Sequencer(mbed):
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer_Test/

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

これでつなぐ予定のユーザー・インターフェイス用のデバイスは全部つなげた(^q^/

メモ:

順番に機能を追加して行ったら、実行時に
mbed assertation failed: _ptr == (T *)&_data, file: C:/Jenkins/workspace/mbed-2-build-library/.build/mbed/SingletonPtr.h, line 84
というエラーが出るようになってしまった。

プロジェクト内でいろいろやったが、RTOSを使いつつAnalogInとst7567を同時使用するとこのエラーが出る。シンプルな状態にしてもこのエラーが出る。(プロジェクト内から不要なライブラリも削除)

#include "mbed.h"
#include "rtos.h"
#include "st7565LCD.h"

//ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);

AnalogIn Ain(A4);

int main()
{
    printf("\r\n*** st7567 & AnalogIn Test ***\r\n");
    gLCD.begin(0x10);    
    
    while (true) {
        char buff[32];
        sprintf(buff, "Ain: %6u", Ain.read_u16()); 
        gLCD.drawstring(0, 0, buff);
        gLCD.display();
        wait(0.1);
    }
}

プロジェクトを一から作りなおしたら動作した(@@;

2016年8月15日月曜日

ベースマシンのUI タクト・スイッチ(PinDetectクラスを利用)

先ほど、PinDetectクラスが動かないと書いたばかりだが、いろいろやっていたら動作した。原因は不明だが、配線の接触不良やPinDetectクラスの割り込みハンドラ内でprintfを呼び出したりしていたせいかもしれない。混乱していたのでよくわからない。InterruptInの内部PullUpが効かなのはまだ未確認なので、前回の記事はそのまままにしておきます。


ピンアサイン

配線図

ロータリーエンコーダーとSPI Graphic LCDで組んだ回路にタクトスイッチを追加した。現状のパラメータをTextでLCDに表示。

BaseMachine_Sequencer(mbed):
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer/

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

メモ:

mbedのRTOSでThreadのコンストラクタがdeprecatedのWarningを吐く。新しいRTOSについてもう一回調べないとダメかも。(いらないところで混乱する)
Introducing mbed OS 5 https://developer.mbed.org/blog/entry/Introducing-mbed-OS-5/

POTによるアナログ入力を追加して動作確認

シーケンス打ち込みのプログラミング

2016年8月13日土曜日

ベースマシンのUI LCDとロータリーエンコーダー

LCDはaitendoの「CH12864F-SPI」を使うことにした。今さっき、aitendoのWebページを見たら在庫切れやん(^q^;


この間Nucleo F401REのSPI2で実験したら半分ずれていたが、mbedのst7565ライブラリはjun imamuraさんのhttps://developer.mbed.org/users/imachooon/code/st7565LCD/ではなく、
Masato YAMANISHIさんがst7567用に改変されたhttps://developer.mbed.org/users/masato/code/st7565LCD/でないとダメだったかもしれない。

とりあえずst7565LCD.cppのpagemapという変数の要素の並びを変えてやればちゃんと表示された。

ピンアサイン(途中)

配線図

ファームウェア
BaseMachine_Sequencer(mbed)
https://developer.mbed.org/users/ryood/code/BaseMachine_Sequencer/

mbed OS 5になってRTOSの仕様がちょっと変わったのかも。ThreadのコンストラクタでWarningが出た。

Thread thUI(pollingUI, NULL, osPriorityNormal, DEFAULT_STACK_SIZE);

Warning: Function "rtos::Thread::Thread(void (*)(const void *), void *, osPriority, std::uint32_t, unsigned char *)" (declared at <a href="#" onmousedown="mbed_doc_goto('/BaseMachine_Sequencer/mbed-rtos/rtos/Thread.h', '140'); return false;">mbed-rtos/rtos/Thread.h:140</a>) was declared deprecated ("Thread-spawning constructors hide errors and may lead to complex program state when a thread is declared") in "main.cpp", Line: 101, Col: 18

LCDの表示はまとめてクラス化することにした。

単体テスト(途中)
SpiSequencerDisplay_Test
https://developer.mbed.org/users/ryood/code/SpiSequencerDisplay_Test/

メモ:

D0、D1をDigitalInなどで使うと、printf()でUART出力できなくなる。そのくせD0、D1にはそれらしい波形は出ていないようだ(@@;

参考:「ArduinoとNucleoでPCとのSerial(UART)通信の最高速度を調べてみる。

Nucleo64でもピン数がカツカツになってきた。一部使えないMorpho Headerのピンがあるのではまらないように再度メモ。

参考:「NucleoF401REのMorpho Headerは一部未接続(メモ)

2016年7月19日火曜日

NucleoシーケンサーとDCO、DCF、DCAの結合テスト(UIなし)

やっと音が出た(^q^/


配線図

Nucleoシーケンサー
https://developer.mbed.org/users/ryood/code/SpiSequenceSender_Test/rev/c248781608af

PSoC4 DCO
https://github.com/ryood/PSoC4_DCO/tree/c9a644f7217aabb522c75d070f4e08a5680e7dde

VCVS DCFとDCAを組み合わせると結構不安定になり、フィルターのcutoff/resonaceのツマミの位置でブツブツ言ったり、発振してしまったりする。

製品のように安定して使えるわけではないが、ギリギリのパラメーターを狙っていくのも面白いかもしれない。(←言い訳半分)

ブレッドボードでの実験もそろそろ限界っぽいので、シーケンス打ち込み用のUIをつなぐ前に、ユニバーサル基板で組んでしまう予定。

出力波形

ch1:VCVS DCFの出力をACカップリングした後の波形 ch2:DCAの出力

メモ:


DCOの出力はGND~VDDの波形なのでACカップリングした。→GNDを中心に振れる波形になった。

DCOの出力にデジタル歪が乗っているのでLPFを入れる。(単体である程度テスト)

VCVS DCFはいきなりシールドで組んだが基本アナログ回路なので無謀だったかもしれない(^q^;

VCVS DCFがうまく動かなかった原因はOPAMPのICソケットの接触不良のようだ。丸ピンのICソケットを一段かませたら安定しているようだ。

VCVS DCFの後段でACカップリングしたが、DCOとDCFの間に入れた方がいいか。

DCAのコントロール用に6連POT BOXを作成。


あ~早くリズムマシンとミックスしたい(^q^/

2016年7月16日土曜日

NucleoシーケンサーとPSoC4 DCOとVCVS DCFの結合テスト(UIなし)

VCVS LPFシールドがなかなかうまく動いてくれなくて手こずったが音が出たのでメモ。

配線図


出音をYoutubeに上げた。(発振させているので音量に注意)


cutoffをスイープ→resonanceを上げて(127->170)再びcutoffをスイープ。

mbed repository
https://developer.mbed.org/users/ryood/code/SpiSequenceSender_Test/

main.cpp

#include "mbed.h"
#include "rtos.h"

#define UART_TRACE  (0)
#include "SpiSequenceSender.h"
#include "EnvelopeGenerator.h"
#include "SpiAmpController.h"
#include "SpiFilterController.h"

#define SEQUENCE_N  (16)
#define SPI_RATE    (8000000)

const int samplingPeriod = 1;   // ms
const int bpm = 120;
const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;

AnalogIn levelIn(A0);
AnalogIn durationIn(A1);
AnalogIn decayIn(A2);
AnalogIn sustainIn(A3);
AnalogIn cutoffIn(PC_0);
AnalogIn resonanceIn(PC_2);

SPI spiMaster(SPI_MOSI, SPI_MISO, SPI_SCK);

Sequence sequence[SEQUENCE_N];
SpiSequenceSender sequenceSender(&spiMaster, D9, sequence, SEQUENCE_N, samplingPeriod, bpm);

Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
EnvelopeGenerator envelopeGenerator;
SpiAmpController ampController(&spiMaster, D8, D7);

SpiFilterController filterController(&spiMaster, D10);

void callbackFunction(int ticks)
{
    if (ticks == 0) {
        envelopeGenerator.init(envelope);
    }
    uint16_t level = envelopeGenerator.getModLevel();
    //printf("g,%d\r\n", level);
    ampController.outDca(level);
    envelopeGenerator.update();
   
    filterController.outDCF();
}

int main()
{
    spiMaster.format(8, 0);
    spiMaster.frequency(SPI_RATE);
   
    // Test SequencerSender Run
    //
    sequenceSender.setBpm(bpm);
    for (int i = 0; i < SEQUENCE_N; i++) {
        Sequence& seq = sequenceSender.getSequences()[i];
        seq.setPitch(i);
        seq.setOctave(-1);
        seq.tie = true;
    }

    sequence[3].setOctave(0);
    sequence[7].setOctave(0);
    sequence[11].setOctave(0);
    sequence[15].setOctave(0);
   
    envelopeGenerator.init(envelope);

    sequenceSender.attachUpdate(&callbackFunction);
    sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SAW);
    sequenceSender.run(0);
   
    for (;;) {
        /*
        sequenceSender.setPulseWidth(sequenceSender.getPulseWidth() + 4);
        Thread::wait(500);
        sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SAW);
        Thread::wait(500);
        sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SQUARE);
        */
        envelope.setLevel(levelIn * 4095);
        envelope.setDuration(durationIn * envelopeLength);
        envelope.setDecay(decayIn * envelopeLength);
        envelope.setSustain(sustainIn * 4095);
       
        filterController.setCutoff(cutoffIn * 255);
        filterController.setResonance(resonanceIn * 255);
       
        printf("%d\t%d\t%d\t%d\t%d\t%d\r\n",
            filterController.getCutoff(),
            filterController.getResonance(),
            envelope.getLevel(),
            envelope.getDuration(),
            envelope.getDecay(),
            envelope.getSustain()
        );
    }
}

メモ:

VCVS DCFシールドが動かない条件は不明。Arduinoでテストしなおしているうちに動作した。

DCAと結合テストして、シーケンス入力系をテスト。

あともう少し(^q^/

2016年6月21日火曜日

NucleoシーケンサーとPSoC4 DCOとVCVS DCFの結合テスト

NucleoシーケンサーとPSoC4 DCO(「NucleoシーケンサーとPSoC4 DCOのテスト(その4)」)にVCVS DCFシールドを追加してテストしてみた。

配線図


<追記:2016.06.23> Nucleo→PSoC4へのSPI:CSのピンが違っていたので修正(D10→D9) </追記>


ぴゅんぴゅんコントローラー2号のジョイスティックでVCVS DCFのcutoffとresonanceをコントロールする。ジョイスティックの値はNucleoシーケンサーで受けて、Nucleoに載せたVCVS DCFシールドにSPIで値を送っている。

PSoC4 Pioneer KitとVCVS DCFシールドは同一のSPIバス(SPI1)を使用。グラフィックLCD(Nokia 5110)は別のSPIバス(SPI2)を使用。

Nucleoシーケンサー
https://developer.mbed.org/users/ryood/code/Nucleo_SPI_Sequencer/

PSoC4 DCO
https://github.com/ryood/PSoC4_DCO/tree/master/PSoC/PSoC4_DCO_for_NucleoF401RE_Interrupt_Test.cydsn

入出力波形


ch1:PSoC4 DCOからの出力 ch2:VCVS DCFからの出力

ジョイスティックがニュートラルの状態。cutoff:124、resonance:130


cutoff、resonanceを上げて発振させた状態。cutoff:255、resonance:232


cutoffだけ上げて発振させた状態。cutoff:255、resonance:140

PSoC4 DCOからの出力はIDACの出力を1kΩの抵抗で電流電圧変換していて、振幅は0V~612mV。

VCVS DCFからの出力は発振させると電源電圧の5V(p-p)付近になるが、AC結合しているのでパルス幅によっては0Vからの振幅になる。

->OTAはの信号入力は差動で100mV以内にしないといけないので1/50~1/5程度に減衰。もともと歪んでいる場合は除外して値を決める?