Switcher zum Umschalten zwischen zwei Effekt-Loops

Mikrocontroller-gesteuerter aktiver Switcher mit Boost-Funktion


Idee

Ich war auf der Suche nach einem Switcher zum Umschalten zwischen zwei verschiedenen Verzerrern:

Die Umschaltung sollte dabei möglichst knackfrei erfolgen. Da ich mich gerade mit dem Arduino beschäftigt habe dachte ich mir, dass man diesen ja sicherlich gut zur Steuerung eines solchen Umschalters nutzen könnte.

Top

Vorüberlegungen

Minimale Bedingung für ein geräuschloses Umschalten ist, dass es zwischen den zu schaltenden Wegen keine Gleichspannungsunterschiede gibt. Dann sollte ein Umschalten in Spielpausen knackfrei möglich sein.
Bei vorhandener Modulation schneidet man beim Schalten aber eigentlich immer das Audiosignal an. Die Folge sind Störgeräusche beim Schaltvorgang. Diese Störungen lassen sich nur vermeiden, indem man das Audiosignal beim Umschalten muted. Um das entsprechende Timing hinzubekommen wird eine Steuerung gebraucht.

Beim Anschluss von Instrument, Effekten und Verstärker kommen diverse Kabel zum Einsatz, deren Längen sich je nach Schaltzustand addieren. Zumindest wenn geplant ist, die (passive hochohmige) Gitarre direkt an den Switcher anzuschießen, sollten Eingang und Ausgang des Gerätes über einen Buffer verfügen.

Top

Prinzip

Der Switcher wird von einem "Arduino Nano" Mikrocontroller gesteuert. An diesen sind die drei Taster für Loop-Wahl, Bypass und Boost, die zugehörigen LEDs für die Zustandsanzeige sowie ein 4-Fach Relais-Board angeschlossen. Das Gerät wird mit einem 9V Steckernetzteil betrieben. Ein interner Spannungswandler 9V->5V versorgt den Arduino sowie die Relais.


Prinzipschaltbild Loop-Switcher
Prinzip des Loop-Switchers


Das Eingangssignal gelangt zuerst auf einen Pufferverstärker, der das Eingangssignal auf die nachfolgenden Wege verteilt.
Das erste Relais wählt das Return-Signal von Loop1 oder Loop2 aus.
Das zweite Relais schaltet zwischen dem Ausgang der Loops und dem Bypass-Weg um.
Das dritte Relais aktiviert/deaktiviert den Booster.
Das vierte Relais steuert ein "Potentiometer" bestehend aus zwei LDR/LED-Kombinationen. Dieses sorgt für die Dimmung des Ausgangssignals beim Umschalten. Man könnte das "Poti" auch direkt über den Arduino steuern und hätte dann noch ein Relais für andere Zwecke frei. Dabei muss man aufpassen, dass der maximale Strom an allen Pins 200mA nicht überschreiten soll.
Die Returns der Loops habe ich jeweils über 2M Widerstände an Masse gelegt, um identisches Gleichspannungspotential zu gewährleisten.


Ausführung der Optokoppler
Optokoppler


Die Optokoppler sind mit einer Diode sowie einer roten LED aufgebaut, die in einem Schrumpfschlauch lichtdicht eingekapselt sind. Am besten funktioniert für diesen Zweck Schrumpfschlauch mit integriertem Heißkleber, dessen Enden man im noch heißen Zustand mit einer Flachzange dauerhaft zudrücken kann.


Die Optokoppler im Eingebauten
              Zustand
Optokoppler eingebaut

Top

Buffer / Booster

Buffer und Booster sind mit einem TL072 Dual-Opamp realisiert. Der Booster macht eine Verstärkung von maximal 10dB. Ähnliche Schaltungen findet man im Internet zuhauf und vielleicht findet ihr ja noch eine bessere.

Schaltbils Buffer  Schaltbild Booster
Buffer und Booster


Interessant ist, dass die Wahl des Opamps tatsächlich deutlichen Einfluss auf den Klang und das Rauschverhalten hat. Ein erster Versuch mit einem LM358 war in beiderlei Hinsicht unbefriedigend.


Das Board mit Buffer und Booster
Buffer & Booster; darüber der Spannungswandler


Top

Arduino Nano

Der Umschalter wird -wie gesagt- von einem Arduino Nano gesteuert:


Verdrahtung des Arduino Nano
Verdrahtung des Arduino Nano


Damit man später den Arduino noch über den vorhanden USB-Anschluss programmieren kann, sollte der 5V Anschluss steckbar ausgeführt sein. Zum Programmieren sollte man die Verbindung lösen, damit der vorgeschaltete Spannungswandler in diesem Fall nicht rückwärts an 5V liegt. Der 5V-Pin des Arduino ist nämlich sowohl ein Eingang als auch ein Ausgang! Oder man benutzt eine Diode...

Der Arduino im Gehäuse eingebaut
Der eingebaute Arduino


Meine Programmierung des Arduino sieht so aus:

/*
Steuerung fuer Looper:
- Zwei schaltbare Loops (xxxLo)
- Bypass (xxxBy)
- Schaltbarer Bosster (xxxBo)
- Einstellung der Mute-Zeit beim Schaltvorgang:
Loop druecken: Bypass=UP / Boost=DOWN
Vor jedem Umschaltvorgang wird das Ausgangssignal stumm geschaltet (LED/LDR)
*/

#include <EEPROM.h>

// Funktion der Pins
// LEDs
const int LedLA = A4; // LED Loop A; AN, wenn Ruhekontakt
const int LedLB = A3; // LED Loop B; AN, wenn Arbeitskontakt
const int LedBy = A2; // LED Bypass; AN, wenn Arbeitskontakt
const int LedBo = A1; // LED Boost; AN, wenn Arbeitskontakt

// Relais
const int RelLo = 8; // Relais Loop A/B
const int RelBy = 7; // Relais Bypass On/Off
const int RelBo = 6; // Relais Boost On/Off
const int RelMu = 5; // Relais Mute bei Umschaltung

// Taster
const int TstLo = 2; // Taster Loop A/B
const int TstBy = 3; // Taster Bypass
const int TstBo = 4; // Taster Boost

// Initialwerte Variablen
// Aktueller Zustand Taster
int AktTstLo = 0; // Taster Loop; akt. Zustand
int AktTstBy = 0; // Taster Bypass; akt. Zustand
int AktTstBo = 0; // Taster Boost; akt. Zustand

// Letzter Zustand Taster
int LstTstLo = 0; // Taster Loop; letzter Zustand
int LstTstBy = 0; // Taster Bypass; letzter Zustand
int LstTstBo = 0; // Taster Boost; letzter Zustand

// Status Loop, Bypass, Boost
int StatLo = 1;
int StatBy = 1;
int StatBo = 1;

// Wartezeit Mute in mS (Entprellen)
int OffTime;

void setup() {
Serial.begin(9600);

// LEDs
pinMode(LedLA, OUTPUT);
pinMode(LedLB, OUTPUT);
pinMode(LedBy, OUTPUT);
pinMode(LedBo, OUTPUT);

// LEDs - Initialwerte
digitalWrite(LedLA, HIGH);
digitalWrite(LedLB, LOW);
digitalWrite(LedBy, LOW);
digitalWrite(LedBo, LOW);

// Relais
pinMode(RelLo, OUTPUT);
pinMode(RelBy, OUTPUT);
pinMode(RelBo, OUTPUT);
pinMode(RelMu, OUTPUT);

// Relais - Initialwerte (ACHTUNG! Activ LOW!)
digitalWrite(RelLo, HIGH);
digitalWrite(RelBy, HIGH);
digitalWrite(RelBo, HIGH);
digitalWrite(RelMu, HIGH);

// Taster
pinMode(TstLo, INPUT_PULLUP);
pinMode(TstBy, INPUT_PULLUP);
pinMode(TstBo, INPUT_PULLUP);
}

void loop() {

// Delayzeit ermitteln oder ggf. setzen. 12/13 sind willkuerlich gewaehlt
OffTime = word(EEPROM.read(13), EEPROM.read(12));
Serial.println(OffTime,DEC);
if ((OffTime < 10) or (OffTime > 150)) {
OffTime = 70;
EEPROM.write(13,highByte(OffTime));
EEPROM.write(12,lowByte(OffTime));
}

//Abfragen der Taster
AktTstLo = digitalRead(TstLo);
AktTstBy = digitalRead(TstBy);
AktTstBo = digitalRead(TstBo);

if (AktTstLo != LstTstLo) {
// Tastenzustand aendert sich
if (AktTstLo == HIGH) {
// Taste wurde losgelassen
if (StatLo == 0) {
// Relais war AUS - einschalten und signalisieren
StatLo = 1;
if (StatBy == 1) {
// Nicht Muten bei Bypass
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
}
digitalWrite(RelLo, LOW); // AN = Loop B
digitalWrite(LedLA, LOW);
digitalWrite(LedLB, HIGH);
if (StatBy == 1) {
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
}
} else {
// Relais war AN - auschalten und signalisieren
StatLo = 0;
if (StatBy == 1) {
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
}
digitalWrite(RelLo, HIGH); // AUS = Loop A
digitalWrite(LedLA, HIGH);
digitalWrite(LedLB, LOW);
if (StatBy == 1) {
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
}
}
}
// Zustand Taster merken
LstTstLo = AktTstLo;
}


// Bypass
if (AktTstBy != LstTstBy) {
// Tastenzustand aendert sich
if (AktTstBy == HIGH) {
// Taste wurde losgelassen
if (AktTstLo == HIGH) {
// Taste Loop ist nicht gedrueckt
if (StatBy == 0) {
// Relais war AUS - einschalten und signalisieren
StatBy = 1;
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
digitalWrite(RelBy, LOW); // Bypass AN
digitalWrite(LedBy, HIGH);
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
} else {
// Relais war AN - auschalten und signalisieren
StatBy = 0;
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
digitalWrite(RelBy, HIGH); // Bypass AUS
digitalWrite(LedBy, LOW);
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
}
} else {
// Taste Loop ist zusaetzlich gedrueckt
// Einstellen Mute-Zeit UP
OffTime = word(EEPROM.read(13), EEPROM.read(12));
if (OffTime > 20) {
OffTime = (OffTime - 10);
if (StatBy == 0) {
digitalWrite(LedBy, HIGH);
delay(400);
digitalWrite(LedBy, LOW);
} else {
digitalWrite(LedBy, LOW);
delay(400);
digitalWrite(LedBy, HIGH);
}
EEPROM.write(13,highByte(OffTime));
EEPROM.write(12,lowByte(OffTime));
}
}
}
// Zustand Taster merken
LstTstBy = AktTstBy;
}


// Boost
if (AktTstBo != LstTstBo) {
// Tastenzustand aendert sich
if (AktTstBo == HIGH) {
// Taste wurde losgelassen
if (AktTstLo == HIGH) {
// Taste Loop ist nicht gedrueckt
if (StatBo == 0) {
// Relais war AUS - einschalten und signalisieren
StatBo = 1;
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
digitalWrite(RelBo, LOW); // Boost AN
digitalWrite(LedBo, HIGH);
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
} else {
// Relais war AN - auschalten und signalisieren
StatBo = 0;
digitalWrite(RelMu, LOW); // Mute AN
delay(OffTime);
digitalWrite(RelBo, HIGH); // Boost AUS
digitalWrite(LedBo, LOW);
delay(OffTime);
digitalWrite(RelMu, HIGH); // Mute AUS
}
} else {
// Tast Loop ist zusaetzlich gedrueckt
// Einstellen Mute-Zeit DOWN
OffTime = word(EEPROM.read(13), EEPROM.read(12));
if (OffTime < 150) {
OffTime = (OffTime + 10);
if (StatBo == 0) {
digitalWrite(LedBo, HIGH);
delay(400);
digitalWrite(LedBo, LOW);
} else {
digitalWrite(LedBo, LOW);
delay(400);
digitalWrite(LedBo, HIGH);
}
EEPROM.write(13,highByte(OffTime));
EEPROM.write(12,lowByte(OffTime));
}
}
}
// Zustand Taster merken
LstTstBo = AktTstBo;
}
// Loop auf sinnvolles Tempo bremsen
delay(100);
}



Bei Bedarf kann man in der Software die LEDs, Taster oder Relais hinsichtlich ihrer Reihenfolge umorganisieren.

Die die Zeit für die während des Umschaltvorganges der Ausgang des Lopp-Switchers stumm geschaltet wird, lässt sich im Betrieb direkt am Switcher optimieren. Wenn man den Taster zum Umschalten der Loops drückt und hält, kann man mit den Tastern für Boost/Bypass die Dauer in 10mS Schritten zwischen 20mS und 150mS herauf-/herunter setzen. Der gefundene Wert wird im EEPROM des Arduino gespeichert und bleibt dauerhaft erhalten.

Top

Fertig

Der fertige Looper
Der fertige Loop-Switcher


Taster/LED Links Booster An/Aus
Taster/LED Mitte Loop An/Aus
Taster/LEDs Rechts Vorwahl Loop Rot / Loop Grün

Auf der Stirnseite gibt es die Anschlüsse für Input, Loop1 In/Out, Loop2 In/Out, Ausgang sowie zwei 9V Ausgänge. 

Die verschlossene Bohrung oben/links ist ein Überbleibsel von einem ersten Aufbau mit einem integrierten Netzteil. Dadurch war aber beim Anschluss an den Gitarrenverstärker eine Brummschleife vorprogrammiert. Außerdem ging es dadurch im Inneren sehr gedrängt zu, sodass es wegen des damit einhergehenden Aufbaus zu einer Schwingneigung kam. Beide Probleme konnten durch den Umbau auf den Betrieb mit einem Steckernetzteil beseitigt werden.
 Top

Impressum

[Top | Home]