Pages: 1 ... 11 12 [13] 14   Go Down
Author Topic: Steuerung von Ventilen und Kamera für TaT-Aufnahmen  (Read 13015 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 38
Posts: 1164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hoffe ich habe das so "richtig" umgesetzt?

Hast du es denn probiert? Das ist immer noch die einfachste Methode um es zu testen...

die vielen  "timestamp = millis();"  machen keinen Sinn, oder?

Gunther
Logged

Grüße
Gunther

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast du es denn probiert?

Ich muss doch erst noch meine Platine "belöten" - das ist für einen Anfänger doch ziemlich fummelig und ich bin noch am Üben...

die vielen  "timestamp = millis();"  machen keinen Sinn, oder?

?? Die habe ich doch von dir übernommen:

ich habe dir unten mal einen Beispielcode eingefügt ...
...
void loop()
{
...
   
  if (RunAction && !DoneAction1 && startzeit + Action1time < millis()){   
    timestamp = millis();
    Serial.print("                          Ausfuehren Aktion1 nach ");
    Serial.print(timestamp-startzeit);Serial.println("ms");
    DoneAction1 = true;
  }
  if (RunAction && !DoneAction2 && startzeit + Action2time < millis()){   
    timestamp = millis(); 
    Serial.print("                          Ausfuehren Aktion2 nach ");
    Serial.print(timestamp-startzeit);Serial.println("ms");
    DoneAction2 = true;
  }
  if (RunAction && !DoneAction3 && startzeit + Action3time < millis()){     
    timestamp = millis();
    Serial.print("                          Ausfuehren Aktion3 nach ");
    Serial.print(timestamp-startzeit);Serial.println("ms");
    DoneAction3 = true;
  ...


Ach so, das war nur um das am Bildschirm auszugeben - ich kann das natürlich weglassen... smiley-red
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier nochmal der angepasste Sketch:

Code:
// Sketch zur Steuerung von drei Ventilen und einer Kamera

const int VENTIL1 = 8;   // Pin 8  = Ventil 1
const int VENTIL2 = 9;   // Pin 9  = Ventil 2
const int VENTIL3 = 10;  // Pin 10 = Ventil 3
const int FOCUS = 11;    // Pin 11 = fucus
const int SHUTTER = 12;  // Pin 12 = shutter
const int TRIP = 13;     // Pin 13 = Starttaste

// Steuerungszeiten Veintile

unsigned long ven1_on = 1000;
unsigned long ven1_of = 1050;
unsigned long ven2_on = 1100;
unsigned long ven2_of = 1180;
unsigned long ven3_on = 1150;
unsigned long ven3_of = 1200;

// Steuerungszeiten Kamera

unsigned long focus_on = 1000;
unsigned long shutter_on = 1060;

// Steuerungszeiten sonstige

unsigned long endzeit = 2000;
unsigned long startzeit = 0;

// Boolsche Variablen zum starten/anhalten der einzelnen Aktionen

boolean ven1on = false;
boolean ven1of = false;
boolean ven2on = false;
boolean ven2of = false;
boolean ven3on = false;
boolean ven3of = false;
boolean focuson = false;
boolean shutteron = false;
boolean action = false;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(FOCUS, OUTPUT);
   pinMode(SHUTTER, OUTPUT);
   pinMode(TRIP, INPUT_PULLUP);
}

void loop()
{
   if (digitalRead(TRIP) == LOW && !action)
   {
      delay(100);
      action = true;
      startzeit = millis();
   }
   if (action && !ven1on && startzeit + ven1_on < millis())
   {
   digitalWrite(VENTIL1, HIGH);
   ven1on = true;
   }
   if (action && !ven1of && startzeit + ven1_of < millis())
   {
   digitalWrite(VENTIL1, LOW);
   ven1of = true;
   }
   if (action && !ven2on && startzeit + ven2_on < millis())
   {
   digitalWrite(VENTIL2, HIGH);
   ven2on = true;
   }
   if (action && !ven2of && startzeit + ven2_of < millis())
   {
   digitalWrite(VENTIL2, LOW);
   ven2of = true;
   }
   if (action && !ven3on && startzeit + ven3_on < millis())
   {
   digitalWrite(VENTIL3, HIGH);
   ven3on = true;
   }
   if (action && !ven3of && startzeit + ven3_of < millis())
   {
   digitalWrite(VENTIL3, LOW);
   ven3of = true;
   }
   if (action && !focuson && startzeit + focus_on < millis())
   {
   digitalWrite(FOCUS, HIGH);
   focuson = true;
   }
   if (action && !shutteron && startzeit + shutter_on < millis())
   {
   timestamp = millis();
   digitalWrite(SHUTTER, HIGH);
   delay(10);
   digitelWrite(SHUTTER, LOW);
   shutteron = true;
   }
   if (action && startzeit + endzeit < millis())
   {
   action = false;
   ven1on = false;
   ven1of = false;
   ven2on = false;
   ven2of = false;
   ven3on = false;
   ven3of = false;
   fucuson = false;
   shutteron = false;
   }
}
Logged

Offline Offline
Edison Member
*
Karma: 38
Posts: 1164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sieht erstmal gut aus, aber ich bin kein Compiler....

ich würde auf dem Steckbrett das Ganze aufbauen, mit LED + 1k als Last an den Pins, dann kannst du am einfachsten prüfen, ob dein Sketch funktioniert.

Denn, wenn du dann die neue Schaltung testest, solltest du wissen, dass dein Sketch funktioniert, sonst suchst du dir den Wolf, wenn du nicht weißt, ob der Fehler in der Software oder in der Hardware liegt.
Logged

Grüße
Gunther

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da hast du natürlich Recht, werde ich machen, danke dafür.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da ja 10ms nach dem focus der shutter auslösen kann/soll, kann ich doch das ganze zusammenfassen und den Sketch so gestalten:

Code:
// Sketch zur Steuerung von drei Ventilen und einer Kamera

const int VENTIL1 = 8;   // Pin 8  = Ventil 1
const int VENTIL2 = 9;   // Pin 9  = Ventil 2
const int VENTIL3 = 10;  // Pin 10 = Ventil 3
const int FOCUS = 11;    // Pin 11 = fucus
const int SHUTTER = 12;  // Pin 12 = shutter
const int TRIP = 13;     // Pin 13 = Starttaste

// Steuerungszeiten Veintile

unsigned long ven1_on = 1000;
unsigned long ven1_of = 1050;
unsigned long ven2_on = 1100;
unsigned long ven2_of = 1180;
unsigned long ven3_on = 1150;
unsigned long ven3_of = 1200;

// Steuerungszeit Kamera

unsigned long cam_on = 1050;   // hier 10ms für den focus berücksichtigen

// Steuerungszeiten sonstige

unsigned long endzeit = 1500;
unsigned long startzeit = 0;

// Boolsche Variablen zum starten/anhalten der einzelnen Aktionen

boolean ven1on = false;
boolean ven1of = false;
boolean ven2on = false;
boolean ven2of = false;
boolean ven3on = false;
boolean ven3of = false;
boolean camon = false;
boolean action = false;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(FOCUS, OUTPUT);
   pinMode(SHUTTER, OUTPUT);
   pinMode(TRIP, INPUT_PULLUP);
}

void loop()
{
   if (digitalRead(TRIP) == LOW && !action)
   {
      delay(100);
      action = true;
      startzeit = millis();
   }
   if (action && !ven1on && startzeit + ven1_on < millis())
   {
   digitalWrite(VENTIL1, HIGH);
   ven1on = true;
   }
   if (action && !ven1of && startzeit + ven1_of < millis())
   {
   digitalWrite(VENTIL1, LOW);
   ven1of = true;
   }
   if (action && !ven2on && startzeit + ven2_on < millis())
   {
   digitalWrite(VENTIL2, HIGH);
   ven2on = true;
   }
   if (action && !ven2of && startzeit + ven2_of < millis())
   {
   digitalWrite(VENTIL2, LOW);
   ven2of = true;
   }
   if (action && !ven3on && startzeit + ven3_on < millis())
   {
   digitalWrite(VENTIL3, HIGH);
   ven3on = true;
   }
   if (action && !ven3of && startzeit + ven3_of < millis())
   {
   digitalWrite(VENTIL3, LOW);
   ven3of = true;
   }
   if (action && !camon && startzeit + cam_on < millis())
   {
   digitalWrite(FOCUS, HIGH);
   delay(10);
   digitalWrite(SHUTTER, HIGH);
   delay(10);
   digitalWrite(FOCUS, LOW);
   digitalWrite(SHUTTER, LOW);
   camon = true;
   }
   if (action && startzeit + endzeit < millis())
   {
   action = false;
   ven1on = false;
   ven1of = false;
   ven2on = false;
   ven2of = false;
   ven3on = false;
   ven3of = false;
   camon = false;
   }
}


Oder sollte ich wie bei den Ventilen beim öffnen/schließen auch jeweils 2 if-Abfragen und 2-boolsche-Variable für focus und shutter einrichten???

Wenn in dem Abschnitt für das Auslösen der Kamera "delay(10);" steht, "wartet" das Programm dann dort an der Stelle oder führt es parallel die anderen if-Abfragen kontinuierlich aus?

Beispiel: der focus soll nach 1100, und der shutter nach 1110 (wegen delay(10)) auslösen.
Wenn ich jetzt in einer anderen if-Abfrage bei 1105 ein Ventile öffnen möchte, würde das dann auch zu 1105 ausgeführt werden oder würde das Programm von 1100 bis 1110 "warten" und erst danach (also bei 1111) das Ventil öffnen (oder ggf das Ventil gar nicht mehr öffnen, da die Zeit schon abgelaufen ist?)).
« Last Edit: May 07, 2013, 05:08:53 am by obiwan » Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bei delay() wartet der Prozessor, er kann schließlich kein Multitasking.
Lass das mit dem zusammenfassen und vor allem mit den delays.
Logged

_______
Manfred

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann soll ich also aus:

   if (action && !camon && startzeit + cam_on < millis())
   {
   digitalWrite(FOCUS, HIGH);
   delay(10);
   digitalWrite(SHUTTER, HIGH);
   delay(10);
   digitalWrite(FOCUS, LOW);
   digitalWrite(SHUTTER, LOW);
   camon = true;

Das hier machen:

   if (action && !focuson && startzeit + focus_on < millis())   // z.B. bei 1050
   {
   digitalWrite(FOCUS, HIGH);
   focuson = true;
   }
   if (action && !focusof && startzeit + focus_of < millis())   // z.B. bei 1070
   {
   digitalWrite(FOCUS, LOW);
   focusof = true;
   }
   if (action && !shutteron && startzeit + shutter_on < millis())   // z.B. bei 1060
   {
   digitalWrite(SHUTTER, HIGH);
   shutteron = true;
   }
   if (action && !shutterof && startzeit + shutter_of < millis())   // z.B. bei 1070
   {
   digitalWrite(SHUTTER, LOW);
   shutterof = true;

???
Logged

Offline Offline
Edison Member
*
Karma: 38
Posts: 1164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stimmt folgende Aussage:

Shutter EIN kommt IMMER nach Focus EIN
und beides kommt IMMER nach der letzten Venilaktion.

Wenn du das uneingeschränkt bejahen kannst, dann kannst du das mit den delays lassen.
Aber dir muß bewußt sein: während delay steht der Prozessor still und zählt die millissekunden.

Besser ist es, das mit millis()  zu machen.
Logged

Grüße
Gunther

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Shutter EIN kommt IMMER nach Focus EIN

Jein

und beides kommt IMMER nach der letzten Venilaktion.

Nein

Also shutter (Auslöser) kommt (zwangsläufig) immer 10ms nach focus (bei Nikon muss zuerst der Fokus akitviert werden - auch wenn man manuell fokussiert!), wobei dazwischen eine Ventilöffnung/-schließung stattfinden könnte:

Mal folgendes Beispiel (mit 2 Ventilen):

Ventil 1 auf bei 1000
Ventil 1 zu bei 1065
Ventil 2 auf bei 1050
Ventil 2 zu bei 1100
Kamera auslösen bei 1070 (also focus bei 1060 + 10ms = bei 1070 der shutter)

Also währe der Zeitablauf so:

1000 Ventil 1 auf
1050 Ventil 2 auf
1060 focus aktivieren
1065 Ventil 1 zu
1070 shutter aktivieren (= Aufnahme machen)
1100 Ventil 2 zu

In diesem Fall müsste zwischen dem focus (1060) und dem shutter (1070) bei 1065 das Ventil 1 schließen.

Also dann doch alles per if-Abfragen...

Habe ich denn den code in #187 mit den if-Abfragen so richtig aufgebaut bzw. würde das dann so wie im Beispiel auch funktionieren?
« Last Edit: May 07, 2013, 08:18:38 am by obiwan » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3006
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Also dann doch alles per if-Abfragen...
Vielleicht langsam doch mal ein richtiges Programm draus machen

Code:
// Devices and Pins
#define TRIGGER 13

Ventil V1(8);
Ventil V2(9);
Ventil V3(10);

Kamera K1(11,12);

boolean run;
unsigned long starttime;

void setup() {
   pinMode (TRIGGER, INPUT_PULLUP);
   // other pins are set in the constructors
}
 
void loop() {
   if ( (digitalRead(TRIGGER) == LOW) && (run == false) )  {
      run = true;
      starttime = millis();
   }
   if (run) {
     V1.open ( starttime, 1000, 1065 );
     V2.open ( starttime, 1050, 1100 );
     K1.take ( starttime, 1070 );  // focus comes 10 ms earlier

     if ( millis() - starttime > 2000 ) run = false;  // wieder bereit für den nächsten Trigger
   }
}
fertig! Edit: jetzt sogar mit setup()

Da sind zwar ein paar ifs drin, das Ganze ist aber recht übersichtlich und leicht änderbar,
zumal die Reihenfolge der Steuerzeilen innerhalb if (run) {   }   egal ist !

Jetzt noch separat eine class Ventil definiert, mit der Methode open( unsigned long basetime, int from, int to);
Und eine class Kamera , mit der Methode take( unsigned long basetime, int shutter);

Alles wird einfach, wenn man ohne delay() arbeitet.
« Last Edit: May 07, 2013, 09:12:23 am by michael_x » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3006
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Und da ich nicht weiss, ob jurs hier mitliest:

Code:
public class Kamera {
byte f;
byte s;
const byte focusVorlauf = 10;
const byte Nachlauf = 10;

public:
   Kamera ( byte focusPin, byte shutterPin ) {
       f = focusPin;
       s = shutterPin;
       pinMode(f, OUTPUT);     
       pinMode(s, OUTPUT);       
   }
   take ( unsigend long basetime, int shutter ) {
      int reltime = millis() - basetime;
      if (reltime > (shutter - focusVorlauf)  && reltime < shutter + Nachlauf) {
         digitalWrite(f, HIGH);
         if ( reltime > shutter) ; digitalWrite(s, HIGH);
      }  else {
         digitalWrite(f, LOW);
         digitalWrite(s, LOW);
     }
   }

};

Probier mal, das als Vorlage für eine class Ventil zu nehmen.
Und finde zuerst raus, warum es noch nicht ganz geht ... (na, weil es nicht getestet ist )
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja ne, die Öffnungs- und Verschluss-Zeiten sollten schon oben als Variable deklariert sein (so wie ich das in #182 angegeben habe - nur eben abgeändert um dei if-Abfragen für die Kamera aus #187), da ich diese ja ständig ändern muss, bis ich den "richtigen" Zeitpunkt gefunden habe (wo Tropfen 1 schon wieder aus dem Wasser kommt und Tropfen 2 auf Tropfen 1 trifft).

Der "aktuelle" Code (basierend auf dem Sketch von guntherb aus #144) mit Beispielzeiten sähe jetzt so aus:

Code:
// Sketch zur Steuerung von drei Ventilen und einer Kamera

const int VENTIL1 = 8;   // Pin 8  = Ventil 1
const int VENTIL2 = 9;   // Pin 9  = Ventil 2
const int VENTIL3 = 10;  // Pin 10 = Ventil 3
const int FOCUS = 11;    // Pin 11 = fucus
const int SHUTTER = 12;  // Pin 12 = shutter
const int TRIP = 13;     // Pin 13 = Starttaste

// Steuerungszeiten Veintile

unsigned long ven1_on = 1000;
unsigned long ven1_of = 1065;
unsigned long ven2_on = 1075;
unsigned long ven2_of = 1130;
unsigned long ven3_on = 1150;
unsigned long ven3_of = 1200;

// Steuerungszeit Kamera

unsigned long focus_on = 1060;
unsigned long shutter_on = 1070;
unsigned long focus_of = 1080;
unsigned long shutter_of = 1080;

// Steuerungszeiten sonstige

unsigned long endzeit = 1500;
unsigned long startzeit = 0;

// Boolsche Variablen zum starten/anhalten der einzelnen Aktionen

boolean ven1on = false;
boolean ven1of = false;
boolean ven2on = false;
boolean ven2of = false;
boolean ven3on = false;
boolean ven3of = false;
boolean focuson = false;
boolean focusoff = false;
boolean shutteron = false;
boolena shutterof = false;
boolean action = false;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(FOCUS, OUTPUT);
   pinMode(SHUTTER, OUTPUT);
   pinMode(TRIP, INPUT_PULLUP);
}

void loop()
{
   if (digitalRead(TRIP) == LOW && !action)
   {
      delay(100);
      action = true;
      startzeit = millis();
   }
   if (action && !ven1on && startzeit + ven1_on < millis())
   {
   digitalWrite(VENTIL1, HIGH);
   ven1on = true;
   }
   if (action && !ven1of && startzeit + ven1_of < millis())
   {
   digitalWrite(VENTIL1, LOW);
   ven1of = true;
   }
   if (action && !ven2on && startzeit + ven2_on < millis())
   {
   digitalWrite(VENTIL2, HIGH);
   ven2on = true;
   }
   if (action && !ven2of && startzeit + ven2_of < millis())
   {
   digitalWrite(VENTIL2, LOW);
   ven2of = true;
   }
   if (action && !ven3on && startzeit + ven3_on < millis())
   {
   digitalWrite(VENTIL3, HIGH);
   ven3on = true;
   }
   if (action && !ven3of && startzeit + ven3_of < millis())
   {
   digitalWrite(VENTIL3, LOW);
   ven3of = true;
   }
   if (action && !focuson && startzeit + focus_on < millis())
   {
   digitalWrite(FOCUS, HIGH);
   focuson = true;
   }
   if (action && !focusof && startzeit + focus_of < millis())
   {
   digitalWrite(FOCUS, LOW);
   focusof = true;
   }
   if (action && !shutteron && startzeit + shutter_on < millis())
   {
   digitalWrite(SHUTTER, HIGH);
   shutteron = true;
   }
   if (action && !shutterof && startzeit + shutter_of < millis())
   {
   digitalWrite(SHUTTER, LOW);
   shutterof = true;
   if (action && startzeit + endzeit < millis())
   {
   action = false;
   ven1on = false;
   ven1of = false;
   ven2on = false;
   ven2of = false;
   ven3on = false;
   ven3of = false;
   focuson = false;
   focusof = false;
   shutteron = false;
   shutterof = false;
   }
}


Würde das so "richtig" durchlaufen (mal losgelöst von der Sinnhaftigkeit der einzelnen Zeiten) ? Also bei:

1000 Ventil 1 öffnen
1060 focus aktivieren
1065 Ventil 1 schließen
1070 shutter aktivieren
1075 Ventil 2 öffnen
1080 focus und shutter deaktivieren
1130 Ventil 2 schließen
1150 Ventil 3 öffnen
1200 Ventil 3 schließen
« Last Edit: May 07, 2013, 09:32:35 am by obiwan » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich würde auf dem Steckbrett das Ganze aufbauen, mit LED + 1k als Last an den Pins, dann kannst du am einfachsten prüfen, ob dein Sketch funktioniert.
Ok, ein "vereinfachter Aufbau" mit LEDs sollte möglich sein  smiley-red
« Last Edit: May 08, 2013, 05:40:22 am by obiwan » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ach ja:

statt

     // Steuerungszeit Kamera

     unsigned long focus_on = 1060;
     unsigned long shutter_on = 1070;
     unsigned long focus_of = 1080;
     unsigned long shutter_of = 1080;

könnte ich doch auch

     // Steuerungszeit Kamera

     unsigned long shutter_on = 1070;
     unsigned long focus_on = shutter_on - 10;
     unsigned long focus_of = shutter_on + 10;
     unsigned long shutter_of = shutter_on + 10;

verwenden - oder?
Logged

Pages: 1 ... 11 12 [13] 14   Go Up
Jump to: