Cover Image for Arduino でユーロラックモジュールから GATE を受け取りたい

Arduino でユーロラックモジュールから GATE を受け取りたい

 

ユーロラックモジュールから安全に Arduino で GATE を受け取るメモです。ネット上にはいろいろな回路が散見されるので、自分的ベストプラクティスをまとめました。

問題 🧐

ユーロラックモジュールからは -12V から +12V の電圧が出力される可能性があります。一方、Arduino の入力ピンが受け取れる電圧は 0V から +5V なので、良い感じに電圧をクランプする必要があります。

解決方法

エミッタ接地の反転スイッチ回路を使うことで、良い感じに電圧をクランプすることできます。マイクロコントローラとして ATMega328p を使っている Mutable Instruments - Grids が今回やりたいことの構成に近いので、こちらのクロック入力回路を参考にしました。

CLOCK IN

LTspice でシミュレーションもしてみます。-12V から +12V の 200Hz のサイン波を入れて出力を確認してみます。青が入力の電圧、緑がクランプされた電圧です。出力が反転し、0V から 5V の間に収まっていることが確認できました ⚡️

LTspice - Simulation

Arduino で GATE を処理してみる

こんな回路・スケッチを用意して、

  • ユーロラックモジュールから受け取った電圧が HIGH なら LED を光らせる
  • ユーロラックモジュールから受け取った電圧が LOW なら LED を消す

な実験をしてみます。

Schematic

const int clockInPin = 2;
const int ledPin = 13;

bool gateState = LOW;
bool lastGateState = LOW;

void setup() {
  pinMode(clockInPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int readClock = gateRead(clockInPin);

  if (readClock != gateState) {
    gateState = readClock;
    if (gateState) {  // GATE is HIGH
      digitalWrite(ledPin, HIGH);
    } else {  // GATE is LOW
      digitalWrite(ledPin, LOW);
    }
  }

  lastGateState = readClock;
}

int gateRead(int pin) {
  if (!pin) return;
  return !digitalRead(pin);
}

実験の様子

Doepfer A-146 LFO2 から GATE を与えた様子です。パルス幅にもしっかり追従し、良い感じです。