2018年7月28日土曜日

Arduino EG はんだ付け完了

回路図

基板図

部品面(部品挿入なし)

部品面(部品挿入)

ハンダ面

ケース内配線

動作確認中

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

基板設計でミスってArduinoのピン(D2、D4~D6)を1つずらしてしまいました。

幸いArduinoのスケッチを変更することで対応できました。

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

2018年7月27日金曜日

ESP WROOM 02でLチカ(メモ)

配線


ESP-WROOM-02には、FT232モジュールから電源を供給せず、安定化電源で3.3Vを供給しています。

書き込みモード

実行モード

Arduino 1.8.5


Arduinoのバージョンは、以前やったときは1.6.4でしたが、今は1.8.5です。

OSもWindows10で再インストールしているので、さらの状態からインストールしたメモです。

ボードの追加


[ファイル]-[環境設定]で開くダイアログの[設定]タブの[追加のボードマネージャのURL]に「http://arduino.esp8266.com/stable/package_esp8266com_index.json」を入力。

[ツール]-[ボード]-[ボードマネージャ]で[esp8266 by ESP8266 Community]を選択し、[インストール] (2.4.1)

スケッチの準備


[ツール]-[ボード]-[Generic ESP8266 Module]

[ツール]


設定値は不明。「シリアルポート: <環境に合わせる>」

スケッチ例


[ファイル]-[スケッチ例]-[ESP8266]-[Blink]

[ツール]-[Builtin LED:]を配線に合わせて[4]に変更。

再度書き込むときは本体側の電源をOFF/ONすれば良い。

IO0を3.3Vに接続して電源を再投入すれば実行モードになる。

実行モード時:80mA程度
書き込みモード時:30mA程度

2018年7月24日火曜日

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

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

今回の手順です。

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

とのこを塗り込む。

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

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

400番でサンディング。

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

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


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


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

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

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

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

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


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

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




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

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

2018年7月21日土曜日

Arduino EGの設計

Arduino Pro Mini(5V / 16MHz版)でエンベロープ・ジェネレーターを設計しました。

回路図

メモ:

出力レベルの監視用のArduinoのA0をIC1Aのバッファの後段から取るようにして試してみましたが、出力波形のGND付近に発振かクロック・ノイズのような波形が乗ってしまったので、バッファの前から取るようにしました。

理由はわかりませんが、もう少し調べてみるつもりです。

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


C基板で収まるかどうかというところですが、POTが多いので無理しないでB基板でもいいような。

POTの値でエンベロープの時定数が決まるので、使いながら交換できるようにしておこうと思います。

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

<追記:2018.07.23>


ArduinoのA0に接続する点を出力バッファの後段(上図の(A)点)にした場合とバッファの前段(ブレッドボード配線図の通り)で比較しました。

出力バッファの前段

ch1:SyncIn ch2:Out

出力バッファの後段

ch1:SyncIn ch2:Out

Outの波形のGND側の線が太くなっています。拡大してみます。

出力バッファの前段(拡大)

ch1:SyncIn ch2:Out

出力バッファの後段(拡大)

ch1:SyncIn ch2:Out

単なるノイズではなく4kHz程度の周期性を持っています。MHz帯ならクロックノイズだとおもいますが、4KHz程度と低い周波数です。かと言って発振波形でもないと思います。

Gate信号(SyncIn)を無入力にしてもこのノイズは乗っていました。

出力バッファの後段(Gate信号なし、さらに拡大)

ch1:SyncIn ch2:Out

Arduinoで定期的に呼び出しているanalogRead()が原因のような気もします(@@?

バッファの前段をArduinoのA0につなぐとC1によってノイズが吸収される(@@???

</追記>

2018年7月14日土曜日

アンチログ回路 AntiLog-MM はんだ付け完了

部品面

ハンダ面

単体テスト


テスト回路図

テスト配線図

AntiLog-MMは吸い込み型の電流源のため、VCCとOUTの間に負荷抵抗RLを挿入しOUTの点の電位を測定しました。

入力は1kHz/1Vp-pの正弦波(単電源波形)です。

出力電流I(R2)はRLの抵抗値を変えても変化しません。

過渡解析

測定


電源: +/-9V安定化電源 (+8.95V / -9.05V)
信号源: AD9833 FG

RL=4.7kΩ

ch1:IN ch2:OUT

RL=10kΩ

ch1:IN ch2:OUT

RL=22kΩ

ch1:IN ch2:OUT

GitHub:
https://github.com/ryood/TLF01/tree/master/TLF01_Antilog

2018年7月12日木曜日

アンチログ回路 AntiLog-MMの設計

TLF01のアンチログ電圧電流変換部として使うNPN/PNP型のアンチログ回路をAntilog-MMとして製作します。

回路図

入力はモジュレーション(LFO、EGなど)2系統、POTによる設定1系統です。

ピンソケットで実装するRは入力レベルをまだ決めていないので保険の意味です。

Arduino LFOはMAX 3.3Vなのでできればこれで揃えたいと思っています。

デカップリングコンデンサC1、C2を22uFにしているのは手持ちの関係です。

基板図

部品並べ

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

2018年7月10日火曜日

Arduino EGの構想

Arduinoとアナログ処理部の組み合わせでエンベロープ・ジェネレーターを製作することにしました。

シミュレーション回路図

前回のシミュレーションでは「InvAttack」のスイッチング動作をAVRの3-State Bufferで行いましたが、一応MOS-FETでスイッチングしておくことにしました。

「Attack」信号がHになる時間は、AVRのADCで出力レベルを監視して制御しますが、シミュレーションでは固定しています。

過渡解析

Gate信号V(gate)からADSRエンベロープV(out)を作り出しています。

ブレッドボード配線図


ArduinoはAruduino Pro Mini(5V/16MHz版)を使用しました。

MOS-FET M1はシミュレーション回路図では2N7002になっていますが、2N7000を使いました。パッケージが違うだけで特性はほとんど同じです。

出力バッファ用のOPAMPは単電源OPAMPのNJM13404を使用しました。

A、R、Dとラベルを貼ってあるところの抵抗は10kΩ程度のPOTを使いますが、手持ちがないので固定抵抗で代用しました。Rsustainは10kΩ/Aです。

「GateIn」信号はSQR FG から出力しました。

Rattack=4.7kΩ
Rdecay=2.2kΩ
Rrelease=2.2kΩ


ch1:GateIn(D2) ch2:OUT

細かいパラメータは少々異なりますが、だいたいシミュレーションと同じような波形が出力されました。

Rattack=10kΩ
Rdecay=10kΩ
Rrelease=2.2kΩ


ch1:GateIn(D2) ch2:OUT

Rattack=1kΩ
Rdecay=1kΩ
Rrelease=1kΩ


ch1:GateIn(D2) ch2:OUT

Arduinoのスケッチ <Arduino_EG.ino>

/*
 * Arduino EG
 *
 * 2018.07.10
 *
 */

#define UART_TRACE  (0)
#define PIN_CHECK   (0)

#define TITLE_STR1  ("Arduino EG")
#define TITLE_STR2  ("20180710")

const int ThresholdPin = 0;

const int GateInPin = 2;

const int AttackPin = 4;
const int InvAttackPin = 5;
const int GateOutPin = 6;

const int LedPin = 13;

#if (PIN_CHECK)
const int CheckPin = 10;
#endif

enum EG_STATE {
  ST_ATTACK,
  ST_DECAY,
  ST_RELEASE
};

volatile enum EG_STATE state = ST_RELEASE;

void GateIn()
{
  bool isGateOn = digitalRead(GateInPin);
  
#if (UART_TRACE)
  Serial.println(isGateOn);
#endif

  if (isGateOn) {
    state = ST_ATTACK;
    digitalWrite(LedPin, HIGH);
  }
  else {
    state = ST_RELEASE;
    digitalWrite(LedPin, LOW);
  }
}

void setup()
{
  pinMode(AttackPin, OUTPUT);
  pinMode(InvAttackPin, OUTPUT);
  pinMode(GateOutPin, OUTPUT);
  pinMode(LedPin, OUTPUT);

  pinMode(GateInPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(GateInPin), GateIn, CHANGE);

#if (PIN_CHECK)
  pinMode(CheckPin, OUTPUT);
#endif

#if (UART_TRACE)
  Serial.begin(115200);
  Serial.println(TITLE_STR1);
  Serial.println(TITLE_STR2);
  delay(1000);
#endif
}

void loop()
{
  int th = analogRead(ThresholdPin);

  if (state == ST_ATTACK && th > 683) {
    state = ST_DECAY;
  }
  
#if (UART_TRACE)
  Serial.print(th);
  Serial.print("\t");
  Serial.println(state);
#endif

  switch (state) {
  case ST_ATTACK:
    digitalWrite(GateOutPin, HIGH);
    digitalWrite(InvAttackPin, LOW);
    digitalWrite(AttackPin, HIGH);
    break;
  case ST_DECAY:
    digitalWrite(AttackPin, LOW);
    digitalWrite(InvAttackPin, HIGH);
    break;
  case ST_RELEASE:
    digitalWrite(AttackPin, LOW);
    digitalWrite(GateOutPin, LOW);
    break;
  }
}


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

メモ:


Arduinoの処理能力と配線次第ですが、2系統エンベロープを出力できるかも?

エンベロープ・ジェネレーターの構想 その4 ステップ波形をLPFに通す。

NucleoでADSRの設定値を線形補間してDACから出力し、LPFを通したときはダメダメな波形になってしまいましたが、ステップ波形をLPFに通すとアナログADSR波形になりました。

シミュレーション回路図

過渡応答

この場合、1つのLPFを通しているので、Attack、Decay、Releaseの時定数が同じものになっています。(Susutain Levelは元のステップ波形で設定できています。)

これをADSRエンベロープ・ジェネレーターとして使うためには、A、D、Rでステートを分けて、それぞれ別のLPFを通してやる必要があります。

よくよく考えてみると、これは今実験中の「アナログ処理部」とほとんど同じ仕組みに帰着します。

簡易型のエンベロープ・ジェネレーターなら同じLPFを使ってもいいかもしれません。VST Plug-inでよくあるOne Knobみたいな(^q^;

2018年7月7日土曜日

エンベロープ・ジェネレーターの構想 その3 コンデンサの充電でAttack Timeを決める。

マイコン+Analog回路で検討しました。

Gate信号からADSRエンベロープを作り出すには、なんとかしてAttack Timeを決める必要があります。555タイマーを使ったエンベロープ・ジェネレーターはコンデンサの充放電でAttack Timeを決めています。

555タイマーのワン・ショットタイマー

555タイマーのブロック図

555の6ピンのTHRESに充電されるコンデンサをつなぎ、3本の抵抗で分圧された電位(2/3 * VCC)に達した時フリップ・フロップにリセットがかかり、7ピンのDISCHを通してコンデンサが放電されます。

Arduino Unoで実験


マイコン+Analog回路でこれと同じことができるかテストしました。

シミュレーション回路図

過渡解析

「Gate」にはGate信号を入力します。「GATE」からC1に充電され「OUT」の電圧が徐々に上がります。充電の速度は「Rattack」の抵抗値で決まります。

配線図


OUT(コンデンサの充電電圧)をArduinoのADC(A0)に接続して監視します。

Gate信号はプッシュスイッチで手動で発生させました。

10k/AのPOTを調節するとコンデンサの充電速度が変わり、Attack Timeを可変できます。

Arduinoのスケッチ <Arduino_EG_Charge_Test.ino>

/*
 * Arduino EG Charge Test
 *
 * 2018.07.05
 *
 */

#define TITLE_STR1  ("Arduino EG Charge Test")
#define TITLE_STR2  ("20180705")

const int ThresholdPin = 0;

const int GateInPin = 2;

const int GateOutPin = 4;
const int DischargePin = 5;

const int CheckPin = 7;

volatile bool isGateOn = false;

void GateIn()
{
  isGateOn = !digitalRead(GateInPin);
  //Serial.println(isGateOn);

  if (isGateOn) {
    // GateOutPin
    digitalWrite(GateOutPin, HIGH);

    // DischaregePin
    pinMode(DischargePin, INPUT); // Hi-Z
  }
  else {
    // GateOutPin
    digitalWrite(GateOutPin, LOW);

    // DischaregePin
    pinMode(DischargePin, OUTPUT);
    digitalWrite(DischargePin, LOW);  // Sink
  }
}

void setup()
{
  pinMode(GateOutPin, OUTPUT);
  pinMode(DischargePin, INPUT); // Hi-Z

  pinMode(GateInPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(GateInPin), GateIn, CHANGE);
  
  pinMode(CheckPin, OUTPUT);

  Serial.begin(115200);
  Serial.println(TITLE_STR1);
  Serial.println(TITLE_STR2);
  delay(1000);
}

void loop()
{
  int th = analogRead(ThresholdPin);
  Serial.println(th);

  if (isGateOn && th < 683) {
    digitalWrite(CheckPin, HIGH);
  }
  else {
    digitalWrite(CheckPin, LOW);
  }
}

AVRのI/Oピンのバッファは3-State Bufferで、ArduinoだとpinModeをINPUTにするとHi-Z(スイッチOFF)になります。

loop()内でanalogRead()でOUT(コンデンサの充電電圧)を監視して、(2 / 3) * 1024 = 683に達したことが識別できているかどうかをCheckPinのH/Lで測定できるようにしました。

オシロで測定


ch1:CheckPin(D7) ch2:OUT

Gate信号がHになった時にコンデンサへの充電が開始され、ch2の電圧が徐々に上がります。このときch1:CheckPin(D7)がHになります。

ch2が3.5V付近になったときにch1がLに切り替わり、Gate信号からAttack Timeを作ることができました。

この実験ではGate信号がLになった時に放電していますが、これを前回のシミュレーションのように、Attack Timeの終了時に放電を開始し、Sustain Levelに向かって放電してやればADSRエンベロープを作ることができそうです。

Arduino Pro Miniなどを使えば、555タイマーを使うよりも(自作する)回路規模は小さくて済みそうです。