Projekt: Steuerung für Highspeed Fotografie (Blutiger Anfänger)

Hallo zusammen!

Dank der Hilfe hier im Forum habe ich einen Ein-Taster aktiv/deaktiv Sketch erhalten.
Das war ein allererster Schritt.
Wie der Titel schon zeigt bin ich absoluter Neuling, habe noch nie programmiert.
Da ich, ausser diesem einen Projekt, auch keine weiteren Anwendungen für einen Arduino sehe ist für mich der Aufwand relativ hoch aber auch wenn es schon fertig zu beziehende Produkte für z.B. die Tropfenfotografie gibt, die sehr ähnlich funktionieren, genau meine Bedürfnisse erfüllen diese Produkte nicht.
Sollte es hier jemanden geben, der gegen Entgelt oder aus Enthusiasmus, bereit wäre mir den Sketch zu programmieren, gerne melden. :grin:

Ansonsten hoffe ich auf Hilfe/Tipps um das Projekt selber umzusetzen.

Eine Prinzipzeichnung, die die “Verkabelung” deutlich machen soll, habe ich beigefügt. (Wie fügt man Bilder direkt ein?)

Grundlegende Punkte:

Es soll mit dieser Schaltung eine Kamera, ein Blitz und ein separater Highspeed Verschluss gesteuert werden.
Grundsätzlich funktioniert meine Anlage auch ohne elektronische Steuerung, mein Ziel ist es jedoch durch das Zusammenspiel des internen Kameraverschlusses, des Blitzes und des externen Verschlusses die reine Belichtungszeit des Verschlusses bei einer Auslösung zu verkürzen.
Da ich Highspeed Bilder im hellen Sonnenlicht mache ist dieses Licht ein Problem. Idealerweise wird die Belichtung somit ausschließlich vom Blitz bestimmt.

Meine Idee dazu:

Bei einer Auslösung durch die LS soll der externe Verschluss geöffnet werden (Ansteuerung ist vorhanden)
Bevor dieser ganz offen ist, soll der Blitz über einen Timer gezündet werden

Direkt nach dem Zünden des Blitzes soll der interne Kameraverschluss sich schließen.

Durch das Zusammenspiel beider Verschlüsse hoffe ich die Belichtungszeit verkürzen zu können.
Ob das wirklich funktioniert können nur Tests zeigen.

Nun zum Aufbau wie ich ihn mir vorstelle:

12V Stromversorgung für Lichtschranke (LS) und Arduino (UNO)
Ein Piezolautsprecher ist direkt, parallel zum UNO am PNP Ausgang der LS angeschlossen.
Somit piepst dieser IMMER wenn die LS durchbrochen wird. Dies dient der Justage der Fokussierung.

Solange der Taster nicht gedrückt wurde passiert weiter nichts.

Wird nun der Taster gedrückt wird die Anlage aktiv.
Damit wird der Kameraverschluss ohne vorgeschalteten Timer, geöffnet
Wird der Taster erneut gedrückt fällt die Steuerung wieder in den Ausgangszustand zurück
Die Kamera schließt den Verschluss (und speichert ein schwarzes Bild)
Ist die Steuerung durch den Taster aktiv und der Kameraverschluss ist offen, soll beim Durchbrechen der Lichtschranke folgendes passieren:

  1. Ausgang für externen Verschluss soll möglichst verzögerungsfrei aktiv werden
  2. Über einen in 0,25ms Schritten einstellbaren Timer soll der Blitzausgang aktiviert werden
  3. Über einen in 0,25ms Schritten einstellbaren Timer soll der Kameraausgang desaktiviert werden
  4. Als letzte Aktion soll über ein Delay der Kameraverschluss wieder geöffnet werden.
  5. Wird der Taster nicht erneut gedrückt wird bei jedem Durchbrechen der LS dieser Ablauf wiederholt

Ich denke das war es.
Einige haben mir in meinem Thread zum Taster geraten eine Nachtwächterschaltung oder einen endlichen Automaten zu erstellen.
Ob das bei der Aufgabenstellung wirklich nötig ist kann ich nicht beurteilen.
Für mein Verständnis sollte der Programmablauf so aussehen:

Zustand 1 Taster nicht aktiv, alle Ausgänge sind deakiv, der LS Eingang am UNO reagiert nicht auf Impulse
Zustand 2 Taster ist aktiv, der Kameraausgang wird aktiviert
Impuls am LS Eingang aktiviert der Reihe nach zwei Ausgänge (Verschluss und Blitz) und deaktiviert den Kameraausgang.
Nach einem Delay wird der Kameraausgang erneut aktiviert und die Routine läuft erneut ab wenn ein LS Signal kommt.
Bei erneutem Tastendruck wird Zustand 1 wiederhergestellt.

Das sollte es gewesen sein.
Entgegen irgendwelchen Roboteransteuerungen o.ä. sollte das für einen “Profi” wohl vermutlich keine große Hereusforderung sein, für mich leider schon…

Viele Grüße und mit der Hoffnung auf Hilfe

Jürgen

Hier noch der vorhandene Sketch, der bislang nur eine LED per Tastendruck schaltet.

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
const byte ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // den kannst Du auch rausnehmen! // counter for the number of button presses
bool buttonState = 0;         // current state of the button
bool lastButtonState = 0;     // previous state of the button

bool buttonPress;

void setup() {
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);            // initialize serial communication:
}


void loop() {
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
    if (buttonState == HIGH)              // if the state has changed, increment the counter
    {
      //buttonPress != buttonPress;  // LED wird beim drücken eingeschaltet
      buttonPress = false; // erst beim loslassen, siehe unten
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      //buttonPressed != buttonPress; // 
      buttonPress = true; // so wird beim loslassen die LED eingeschaltet
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(50);                          // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPress) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

arduino_highspeed_steuerung.gif

jojolino:
(Wie fügt man Bilder direkt ein?)

Link des Bildes in die Zwischenablage kopieren und dann den 11. Button von links im Editor nutzen.

arduino_highspeed_steuerung.gif

Danke!

IMO solltest Du einen Automaten programmieren, die Zustände 1-5 hast Du ja schon beschrieben.

Bis dahin kannst Du es auch mit delay() versuchen, aber viel einfacher wird das nicht.

Hallo,

Ich hab mal was zusammengeschrieben, dient wohl mehr der Übersicht aber so könnte das Ganze ausschauen. Ist zumindest mal ein Anfang.
Ich hab gerade meinen Laptop nicht bei mir und deshalb auch keinen Zugriff auf meine Codes, deshalb ist die Funktion: Taster() nur schnell runtergetippt. Werde ich morgen noch ersetzen.

byte buttonPin = 2;
byte lichtschranke = 3;
byte blitzZuendung = 4;
byte kameraausgang = 5;
byte extVerschluss = 6;
byte zustand = 0;

bool buttonState;
bool mode;

int delayBlitz = 250;
int verzoegerung = 50; // Wird zu delayBlitz dazu addiert.

int kameraausgangDelay = 30;

void setup() {
  //Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);

}
bool Taster() {
  // Die eigentliche Funktion kommt noch, hab den Code auf meinem Laptop der gerade nicht bei mir ist.
  byte currentState;
  currentState = digitalRead(buttonPin);
  if(currentState) { delay(50); return true; }
  else { return false; }
}
void loop() {

  buttonState = Taster(); // Taster wurde gedrückt

  switch (zustand) {
    case 1:
      if (buttonState) zustand = 2;
      break;
    case 2:
      // Zustand 2 Taster ist aktiv, der Kameraausgang wird aktiviert
      digitalWrite(kameraausgang, HIGH);
      zustand = 3;
    case 3:
      // Impuls am LS Eingang aktiviert der Reihe nach zwei Ausgänge (Verschluss und Blitz) <- passiert in case: 4
      if(digitalRead(lichtschranke)) zustand = 4;
      break;
    case 4:
      //1. Ausgang für externen Verschluss soll möglichst verzögerungsfrei aktiv werden
      //2. Über einen in 0,25ms Schritten einstellbaren Timer soll der Blitzausgang aktiviert werden
      digitalWrite(extVerschluss, HIGH);
      delayMicroseconds(delayBlitz); // 0,25ms vergehen
      digitalWrite(blitzZuendung, HIGH); // Blitz
      delayMicroseconds(1);
      digitalWrite(blitzZuendung, LOW); // Blitz aus
      delayMicroseconds(verzoegerung); // bis hier her sind ca. 0,26ms bereits vergangen
      // Deshalb wäre es besser mit micros() zu arbeiten.
      digitalWrite(extVerschluss, LOW); // 3. Über einen in 0,25ms Schritten einstellbaren Timer soll der Kameraausgang desaktiviert werden
      
      //4. Als letzte Aktion soll über ein Delay der Kameraverschluss wieder geöffnet werden.
      //5. Wird der Taster nicht erneut gedrückt wird bei jedem Durchbrechen der LS dieser Ablauf wiederholt
      
      digitalWrite(kameraausgang, LOW);
      delay(kameraausgangDelay);
      // Hier sollte man wahrscheinlich eher mit micros() arbeiten 
      
      zustand = 2; // Wieder auf 
      break;
    default:
      if (buttonState) {zustand = 1; mode = 1;}
      break;
  } // switch Ende
  if (buttonState && mode) {zustand = 0; mode = 0;}   
}

Grüße,
Donny

ich würde das ganze auf einen Wemos D1/NodeMCU geben, damit man die einzelnen Zeiten bequem auf einem Smartphone ändern kann.

Ansonsten brauchst noch 4 weitere Taster für deine Verschlusszeiten und evtl. ein Display zum Anzeigen.

Hallo,

jojolino:

  1. Ausgang für externen Verschluss soll möglichst verzögerungsfrei aktiv werden
  2. Über einen in 0,25ms Schritten einstellbaren Timer soll der Blitzausgang aktiviert werden
  3. Über einen in 0,25ms Schritten einstellbaren Timer soll der Kameraausgang desaktiviert werden
  4. Als letzte Aktion soll über ein Delay der Kameraverschluss wieder geöffnet werden.
  5. Wird der Taster nicht erneut gedrückt wird bei jedem Durchbrechen der LS dieser Ablauf wiederholt

0,25ms (250µs) Raster ist für einen üblichen AVR-Arduino mit 16MHz Takt schon eine Hausnummer.
Wenn die Zeiten auch noch recht genau eingejhalten werden sollen, dürfte es aus der ArduinoIDE nahezu unmöglich sein.

Ein ESP hätte zwar etwas mehr Reserve, vor allem wenn man ihn mit 160MHz laufen läßt. Allerdings teilt man sich da die CPU mit dem WLAN-Kram usw. und das erzeugt vermutlich uberechenbare Schwankungen.

Vielleicht wäre hier ein Teensy mit seinem ARM-Core und dem höheren Takt usw. sinnvoll?
Die habe ich allerdings noch nie genutzt.

Gruß aus Berlin
Michael

Vielen Dank Donny,

damit werde ich es zunächst versuchen.

@noiasca und Michael
Ein Display ist nicht nötig, die Zeiten sollen einmal ermittelt werden und bleiben dann fix.
Ist während der Testphase, ich werde immer wieder Bilder machen müssen um das Timing herauszufinden, aufwändig immer wieder den Code zu ändern und zum Arduino zu senden aber das geht schon.
Da Mechanik mit im Spiel ist, könnte es sein, dass ich die irgendwann mal anpassen muss aber das geht dann auch im Code.
Displays und alles was sonst noch Strom braucht möchte ich soweit wie möglich vermeiden, da das alles mobil ist und ich ungerne viele Akkus mitschleppen möchte.

Gruß
Jürgen

Hallo Jürgen,

Du musst nicht jedesmal den Code anpassen, Du kannst auch Dreh-Encoder für das verstellen der Zeit(en) verwenden.
Über den Tellerrand geschaut gibt es auch noch Timer wie z.Bsp. den NE555 oder den CD4536 den man als Monoflop beschalten kann, und genau reproduzierbare Zeiten bringt, auch verstellbar über Poti, falls nötig. Eine Kombination geht auch, also Arduino + Timer, aber ich denke, daß sich das auch nur mit dem Arduino programmieren lässt!

Gruß André

@TO, ok wenn die Zeiten fix sind und du das programmieren/flashen wirklich nur am Anfang machst dann auch ohne GUI.

Was mir noch einfällt, du könntest die Ports auch direkt schalten (nicht mit DigitalWrite), da wäre sicher auch noch etwas drinnen.

Generell würde ich mir von dir noch ein Zeitdiagramm wünschen, in dem man die einzelnen Kanäle parallel sieht, was in welcher Abfolge geschaltet werden soll. Irgendwie steig ich da bei deiner Text-Beschreibung noch immer nicht durch. Kariertes Papier reicht vollkommen.

noiasca:
Generell würde ich mir von dir noch ein Zeitdiagramm wünschen, in dem man die einzelnen Kanäle parallel sieht, was in welcher Abfolge geschaltet werden soll. Irgendwie steig ich da bei deiner Text-Beschreibung noch immer nicht durch. Kariertes Papier reicht vollkommen.

Diesen Wunsch kann ich nur unterstützen, da die wohl notwendige Mischung aus Schrittkette und delayMicroseconds, wie in #4 gezeigt, dies besonders für sich überlappende Zeiten notwendig macht.

Für die Zeiteinstellung, zumindest in der Testphase, würde ich Potis vorsehen. Auch ein LCD könnte man vorsehen und bei Bedarf an- oder abstöpseln.

... denn wenn man so ein Zeitdiagramm hat könnte man agmues code mal an einen Analyzer anschließen und sehen, von welchen Zeiten man wirklich spricht.

Definitiv interessant (aber ich will erst die Anforderung auf dem Tisch haben und nicht aus dem Text erraten).

Hallo zusammen!
Toll erstmal das Interesse und die Hilfe hier!
Dabei lerne ich auch gleich was denke ich...

Mit einem Zeitdiagramm tue ich mich allerdings schwer, da ich die Zeiten gar nicht kenne und erst in Versuchen ermitteln muss.
Ich weiß nur, dass sich das alles innerhalb von ca. 4ms abspielen muss.
Letztlich ist es so, dass bei kommendem Eingangssignal (hier das der LS) drei Ausgänge gleichzeitig geschaltet werden müssen, wobei jeder seinen eigenes Delay hat.
Ich füge mal eine Zeichnung des Aufbaus sowie in Logik ausgedrückt das Schalten der Ausgänge an, vielleicht wird das dann deutlicher.

X= Pin8 HIGH (Signal der LS)
|
|--(Pin1 HIGH) Signal zu externem Verschluss
|-----(Pin2 LOW) Signal zu internem Verschluss------> (Pin2 HIGH)
|-------(Pin3 HIGH) Signal zum Blitz

Die Pinadressen sind willkürlich und dienen nur der Anschauung.

Im Bild ist noch ein Fehler :frowning:
K ist mit V1 gleichzusetzen!!!

Was ich noch nicht verstehe:

Wie schnell schalten die Verschlüsse überhaupt?
Wieso 2 Verschlüsse? Es sollte doch reichen, nur 1 Verschluß zu steuern, der andere kann beliebig lang offen bleiben.

Versuche auch mal, Ausdrücke wie "V1 mit Timer wird low" in verständliches Deutsch zu übersetzen.

also unter Zeitdiagramm habe ich mir in ewta so etwas vorgestellt - hab nur kein kariertes Papier momentan.

SP01880000018110213070_0001.jpg

Bitte schau an, ob die Abfolge richtig ist, gegebenenfalls stell es richtig. und du kannst mit farben ja auch anzeichnen, was wovon abhängig sein sollte. Im Anhang ist das Bild wesentlich größer, dann kannst auch darauf rummalen (oder schön selber machen).

Genau, der Buzzer fehlt auch noch … dafür kannst auch eine eigene Swimlane verwenden.

noiasca:

  • hab nur kein kariertes Papier momentan.

Da kann ich aushelfen :grin:

Hallo,

agmue:
Da kann ich aushelfen :grin:

Danke! Und sogar die richtige Lochung.
Mein Faxrolle ist auch alle, kannst Du mir da auch ein paar leere Seiten zufaxen?

Gruß aus Berlin
Michael

kariert.jpg
Sogar einen ganzen Stapel A4-Blätter!

Sehr großzügig von dir.

kariert.jpg

:grinning: :grinning: :grinning:

Wenn ich das karierte mit dem gestrichenen zusammenbringe sehe ich nur noch Sterne...

ne, im Ernst!

Also bevor ich hier weiter viele nette, hilfsbereite Menschen beschäftige, ich habe Kontakt per PM mit einem User hier, der sich bereit erklärt hat mir aktiv zu helfen, also den Sketch zu schreiben und mich bei meinem Projekt zu begleiten.

Außer es ist von Interesse für die anderen, würde ich an dieser Stelle zunächst abwarten wie sich das "intern" entwickelt und falls es klappt und der Helfende einverstanden ist, dann den fertigen Sketch präsentieren.
Ist das OK oder besteht für jemanden noch weitergehendes Interesse?

Viele Grüße
Jürgen

Dann war mein kariertes Papier ja ganz umsonst :cry:

Wenn es der für Dich bessere Weg ist, dann wünsche ich Dir viel Erfolg und immer schöne Fotos!

Eine Projektvorstellung ist aus meiner Sicht immer willkommen, passiert leider viel zu selten.