Arduino でユーロラックモジュールから GATE を受け取りたい
ユーロラックモジュールから安全に Arduino で GATE を受け取るメモです。ネット上にはいろいろな回路が散見されるので、自分的ベストプラクティスをまとめました。
問題 🧐
ユーロラックモジュールからは -12V から +12V の電圧が出力される可能性があります。一方、Arduino の入力ピンが受け取れる電圧は 0V から +5V なので、良い感じに電圧をクランプする必要があります。
解決方法
エミッタ接地の反転スイッチ回路を使うことで、良い感じに電圧をクランプすることできます。マイクロコントローラとして ATMega328p を使っている Mutable Instruments - Grids が今回やりたいことの構成に近いので、こちらのクロック入力回路を参考にしました。
LTspice でシミュレーションもしてみます。-12V から +12V の 200Hz のサイン波を入れて出力を確認してみます。青が入力の電圧、緑がクランプされた電圧です。出力が反転し、0V から 5V の間に収まっていることが確認できました ⚡️
Arduino で GATE を処理してみる
こんな回路・スケッチを用意して、
- ユーロラックモジュールから受け取った電圧が HIGH なら LED を光らせる
- ユーロラックモジュールから受け取った電圧が LOW なら LED を消す
な実験をしてみます。
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 を与えた様子です。パルス幅にもしっかり追従し、良い感じです。