Bei einer Fotopräsentation sah ich kürzlich einige sehr schöne Bilder von zwei Gläsern, die man an Nylonfäden aufgehängt worden waren und die man mit farbigen Flüssigkeiten gefüllt hatte. Diese Gläser pendelten nun an den Fäden und stießen dabei immer wieder zusammen, wobei die Flüssigkeiten in den Gläsern hin und her schwappten. Das Ganze wurde in einem schwarz verkleideten, dunklen Raum aufgenommen. Die Kamera war auf mehrere Sekunden Belichtungszeit eingestellt. Beim Zusammenstoßen klirrten die Gläser und dieser Ton löste einen Blitz aus.

Natürlich hatte ich sofort die Idee, etwas ähnliches zu versuchen. Geräte, die auf Geräusche hin schalten gibt es bei ebay & Co. für kleines Geld, aber in mir hatte der Gedanke sportlichen Ergeiz entfacht. Ein solches Gerät müsste sich doch relativ einfach mit einem Arduino realisieren lassen.

Die ersten Umsetzungsversuche

Da das geplante Gerät weder hohe Ansprüche an Hardware noch an Speicherplatz stellen wird, fiel meine Wahl auf einen Arduino Nano, den kleinsten Typ aus der Aduino-Familie. Als Peripherie gibt es unterschiedliche Mikrofon-Module, ich wählte das Akozon Mikrofon Modul – weil ich es gerade herumliegen hatte.

Das Modul besitzt je einen analogen und einen digitalen Ausgang. Der digitale Ausgang geht auf HIGH, sowie ein bestimmter Geräuschpegel überschritten wird. Die Schwelle kann man über einen winzigen Trimm-Poti einstellen – hinderlich, wenn man das Modul in ein Gehäuse verbaut hat. Selbst wenn man die Eistellschraube zugänglich macht, ist es nervig, im Dunkeln mit einem winzigen Schraubendreher die winzige Schraube zu verstellen.

Also benutze ich den analogen Ausgang. Dieser liefert je nach Geräuschpegel Signale einer Stärke zwischen 0 und 1023. Um ein Auslösepegel einstellen zu können, schloss ich an den Arduino einen Poti an, der ebenfalls Werte zwischen 0 und 1023 liefert. Die Software vergleicht die gemessenen Werte am Mikro mit den eingestellten am Poti, ist der Mikrofonpegel höher, wird ausgelöst (dazu später). Um einen geeigneten Wert am Poti einstellen zu können, wird mit dem Auslösen auch eine LED ein- und wieder ausgeschaltet. So wird das Einstellen des Potis einfach. Man stellt ihn zunächst so ein, dass die LED leuchtet, also bereits beim Umgebungsrauschen ausgelöst wird. Anschließend wird er so eingestellt, dass die LED eben gerade ausgeht. Nun sollten alle Geräusche, die lauter sind, als das Umgebungsrauschen zur Auslösung führen.

Erweiterungen

Als Nächstes hatte ich die Idee, dass es in bestimmten Situationen hilfreich sein könnte, das Auslösen etwas zu verzögern.

Idee 1: Ein zweiter Poti, zum Einstellen der Zeit:

  • Vorteil: Sehr leicht umzusetzen
  • Nachteil: Man würde zusätzlich ein Display benötigen, das die eingestellte Verzögerungszeit anzeigt. Eine Skala am Poti wäre viel zu ungenau.

Idee 2: Ein Mehrfach-Drehschalter

  • Vorteil: Ebenfalls leicht einzubauen. Zu kalibrieren wäre er über Widerstände, die er zuschaltet, de facto also eine Poti mit festen Schaltstufen.
  • Nachteil: Die im Handel angebotenen Drehschalter haben maximal 12 Schaltstufen, was die Einstellung der Verzögerungen grob und unflexibel macht.

Idee 3: Dip-Schalter. (Diese Idee habe ich ausgewählt)

  • Vorteil: Man kann je nach Anzahl der eingesetzten Dip-Schalter fast beliebige Verzögerungen bis 255ms realisieren, wobei ich davon ausgehe, dass alles, was länger ist als 1/4 Sekunde nicht mehr sinnvoll ist. Wer auf 1/2 Sekunde gehen will, nimmt einfach einen 9-poligen Dipschalter und schließt Pin 10 noch an. Per Software ließen sich aber noch wesentlich längere Zeiten realisieren, denn man muss ja nicht in ms steigern.
  • Nachteil: Man muss ein bisschen mit Binärzahlen umgehen können (vgl. Umsetzung).

Umsetzung der Dip-Schalter-Idee

Ich habe eine Dipschalter-Leiste aus 8 Schaltern gewählt. Jeder einzelne Schalter wird mit zwischen Masse und je einem digitalen Pin des Arduino geschaltet. Die Software wertet dann aus, welche der Schalter gesetzt sind. Jeder Schalter steht für ein Bit eines Bytes, so dass sich Zahlen zwischen 0 (keine Verzögerung) und 255 (maximale Verzögerung) ergeben. Ich stelle die Software so ein, dass das entstandene Byte die Verzögerung in Millisekunden darstellt, so dass sich Zeiten zwischen 0s und ca. 1/4s in Schritten von Mikrosekunden einstellen lassen.

So völlig befriedigt mich das noch nicht, da damit fast alle digitalen Ports des Arduino belegt werden. Ich bin zur Zeit mit einem MCP23017 Portexpander am experimentieren. Wenn ich die Schaltung im Griff habe, werde ich sie hier veröffentlichen…

Der Code:

//Reiner Hornischer
//2019.01.29
int referencePin = A1; //select the input pin for noise reference-voltage
int sensorPin = A2; // select the input pin for the noise sensor
int ledPin = 12; // select the output pin for status LED
int outputPin = 11; // select the pin for the Relais
int sensorValue = 0; // variable to store the value coming from the sensor
int referenceValue = 0; // variable to store the value of the noise reference voltage
int oldReferenceValue = 0; // variable to detect changes in noise reference voltage
int dPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // pins for the dip switch
int delayTime = 0;
void setup(){
pinMode(outputPin, OUTPUT); //set outputPin
pinMode(ledPin, OUTPUT); //set ledPin
digitalWrite(outputPin, LOW); //set the output to off
digitalWrite(ledPin, LOW); //switch off LED
for (int i = 0; i < 8; i++) pinMode(dPin[i], INPUT_PULLUP); // set all dip-pins to HIGH
Serial.begin(9600);
}

void loop() {
sensorValue = analogRead(sensorPin);
setDelayTime();
referenceValue = 1023 - analogRead(referencePin);
if (abs(referenceValue - oldReferenceValue ) > 3) {
Serial.print("Neue Referenz: ");
Serial.println(referenceValue);
oldReferenceValue = referenceValue;
}
if (sensorValue > oldReferenceValue) {
delay(delayTime);
digitalWrite(outputPin, HIGH); // Auslösung wenn Sensor anspricht
digitalWrite(ledPin, HIGH); //... und dann LED einschalten
} else {
digitalWrite(outputPin, LOW); // keine Auslösung
digitalWrite(ledPin, LOW); // LED aus
}
if (sensorValue > oldReferenceValue ) {
Serial.print("Schallauslösung ");
Serial.println(sensorValue, DEC);
digitalWrite(outputPin, LOW);
delay(300);
Serial.println("Warte auf Auslösung ...");
}
}

void setDelayTime() {
delayTime = 0;
for (int i = 7; i >= 0; i--) {
delayTime = delayTime << 1;
byte in = ~digitalRead(dPin[i]) & 1; //invert the bit from dPin[i]
delayTime = delayTime | in;
}
}

Der Output

Um sicher zu stellen, dass nicht irgendeine Spannung vom Blitzlicht plötzlich meinen Arduino zerschießt, habe ich von vornherein einen Optokoppler (Solid-State-Relais) eingesetzt. Meine erste Wahl war ein PC817 DIL 4 von Sharp. Beim Test an meinen Blitzgeräten gab der plötzlich seinen Geist auf. Als ich das verantwortliche Blitzgerät untersuchte (ein altes Toshiba ES-20 von 1980), fand ich heraus, dass an den Kontakten im Blitzschuh 400V lagen. Der PC817 ist aber leider nur für 80V vorgesehen. Daraufhin tauschte ich den PC817 gegen einen PR36MF21NSZH (ebenfalls von Sharp), der auf 600V ausgelegt ist. Bisher habe ich ihn jedoch noch nicht mit dem alten Blitz getestet. (Meine anderen, neueren Blitze liefern Spannungen unter 10V am Blitzschuh).

Der Blitz

Ein weiteres Problem war das Anschließen des Blitzes. Es erweist sich als gar nicht so einfach, einen „Universalschuh“ zu bekommen (wie in der guten alten Zeit). Die meisten Blitzschuhe, die man im Onlinehandel findet, sind auf die Besonderheiten einer Kamera-Familie (Nikon, Pentax, Fuji, …) abgestimmt. Die wenigen „alten“ Blitzschuhe, die man findet, haben einen Anschluss für ein sog. PC-Sync-Kabel. Für diese Anschlussnorm ist es mir jedoch nicht gelungen, eine Einbaubuchse zu finden. Letztendlich wurde ich bei Enjoyyourcamera fündig. Hier bekam ich einen Blitzschuh, der sowohl einen PC-Sync-Anschluss, als auch einen 3,5mm Klinken-Anschluss besitzt.

(Man hätte auch ein PC-Sync-Verbindungskabel zerschneiden können um einen anderen Stecker anzuschließen, das wäre für mich jedoch nur die allerletzte Lösung gewesen, wenn nicht anderes ginge.)

Um den Schuh statt auf einer Kamera auf einem Stativ montieren zu können, kam noch ein Adapter dazu.

Meiner stammt von der Firma Neewer, es lassen sich aber auch andere finden.

Arduino als Geräusch-Auslöser

Beitragsnavigation


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.