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タイマーを使うよりも(自作する)回路規模は小さくて済みそうです。