SonyUserforum

SonyUserforum (https://www.sonyuserforum.de/forum/index.php)
-   Zubehör (https://www.sonyuserforum.de/forum/forumdisplay.php?f=11)
-   -   Arduino basieredes Lichtschrankensystem (https://www.sonyuserforum.de/forum/showthread.php?t=102389)

Lachsy 09.04.2011 18:22

Arduino basieredes Lichtschrankensystem
 
Für zb Wassertropfenfotografie mit Magnetventilsteuerung, für diejenigen die das Geld nicht für ein Stopshot ausgeben wollen.

Angefangen hat alles mit dem Thread im DSLR-Forum von Niggoh.

Also musste mein Männe ran und bauen .
Wir bauten alles in ein Gehäuse ein mit Display , LED`s und vorbereitung für Buttons.
Display ist kein muss.

Gebraucht wird auf jedenfall ein Arduino Uno , ein Magnetventil 12 Volt.
Der Rest sollte sich aus dem Schaltplan ergeben.

Vieleicht intressiert es ja jemand

Hier seht ihr den Schaltplan und auch das Fertig Gerät


-> Bild in der Galerie


-> Bild in der Galerie

Den Softwarecode muss ich noch nachreichen ist auf dem anderen PC

mfg Clarissa

BodenseeTroll 09.04.2011 19:25

Zitat:

Zitat von Lachsy (Beitrag 1165897)
Hier seht ihr den Schaltplan und auch das Fertig Gerät

Öhm... Nö!

Beide Fotos laufen unter der image_id 0, deswegen gibt es beim Aufruf einen 404-Fehler.

Viele Grüsse,

Michael

Shooty 09.04.2011 19:28

Wenn die in dem Equipment teil sind bitte mal ne pm an die mpds das die freischalten können ;)

Ich will endlich Bilder sehn :D :top:

Lachsy 09.04.2011 19:32

Markus habe schon eine Pn gesendet mit bitte um Freischaltung.

cdan 09.04.2011 20:07

Und freigeschaltet.

Lachsy 09.04.2011 20:48

Danke Christian :top:

so hier der Quelltext der auf den Arduino aufgespielt wird

Code:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


// KONSTANTEN
const int lichtschranken_pin = A0;
const int ventil_pin = 13;
const int kamera_pin = 8;
const int autofocus_pin = 9;
const int lichtschranken_led =6;
const int ventil_led =7;
// VARIABLEN
// Alle Zeiten in Millisekunden angegeben

// Zeitvariablen initalisieren
// Auslöseverzögerung Kamera
long aktuellezeit_ausloeseverzoegerung = 0;
long startzeit_ausloeseverzoegerung = 0;
// Ventil
long aktuellezeit_ventil = 0;
long startzeit_ventil = 0;

// Ventilöffnungszeiten festlegen
int tropfenzeit_1 = 150;
int verschlusszeit_1_2 = 24;
int tropfenzeit_2 = 170;
int verschlusszeit_2_3 = 18;
int tropfenzeit_3 = 170;
int gesamtzeit_tropfserie = tropfenzeit_1 + verschlusszeit_1_2 + tropfenzeit_2 + verschlusszeit_2_3 + tropfenzeit_3 + 500; // für die Inaktivzeit der Lichtschranke, 500 ms Sicherheitsreserve, damit die Lichtschranke nicht durch den dritten Tropfen doch wieder aktiviert werden kann

// Zeit zwischen den Tropfenserien festlegen
int pausenzeit = 20000;

// Auslöseverzögerung festlegen
int ausloeseverzoegerung = 45;

// Aktivierungszeit für Kameraauslöser festlegen
int ausloeser_aktivzeit = 170;

// Lichtschranken-Schwellenwert festlegen
int lichtschranke_messwert;
int lichtschranke_maximum;
int lichtschranke_minimum;
int lichtschranke_schwellenwert;
float lichtschranke_schwellenwertfaktor = 0.85; // Faktor, mit dem der maximale Messwert der Lichtschranke multipliziert wird, um den Schwellenwert zu errechnen, muss unbedingt kleiner als 1 sein!

// Statusvariable Lichtschranke
boolean lichtschranke_unterbrochen = false;

// Statusvariable Kameraauslöser
boolean kamera_ausloeser_aktiv = false;

// Satusvariable Ventil
boolean ventil_offen = false;

// Statusvariable Tropfserie
boolean tropfserie_laeuft = false;

// Statusvariable Tropfen ausgelöst
boolean tropfen_ausgeloest = false;

// Ventilzeiten in Absolutwerte umrechnen
int endzeit_offen_1 = tropfenzeit_1;
int endzeit_geschlossen_1_2 = endzeit_offen_1 + verschlusszeit_1_2;
int endzeit_offen_2 = endzeit_geschlossen_1_2 + tropfenzeit_2;
int endzeit_geschlossen_2_3 = endzeit_offen_2 + verschlusszeit_2_3;
int endzeit_offen_3 = endzeit_geschlossen_2_3 + tropfenzeit_3;
int endzeit_pause = endzeit_offen_3 + pausenzeit;

// Eingabevariable initialisieren
int eingabe;

void setup() {
  // Ausgangspins initialisieren
  pinMode(ventil_pin, OUTPUT);
  pinMode(kamera_pin, OUTPUT);
  pinMode(autofocus_pin, OUTPUT);
  pinMode(lichtschranken_led, OUTPUT);
  pinMode(ventil_led, OUTPUT);
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4);
  // Begrüßungsbildschirm.
  lcd.setCursor(1,0);
  lcd.print("Hallo, Clarissa!");
  lcd.setCursor(1,1);
  lcd.print("viel Spass beim");
  lcd.setCursor(1,2);
  lcd.print("Wassertropfen");
  lcd.setCursor(1,3);
  lcd.print("fotografieren !!!!");
  // Serielle Verbindung zum Computer initialisieren für Textausgabe
  Serial.begin(9600);
  Serial.println("Lichtschranke wird kalibiert...");
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("Lichtschranke wird");
  lcd.setCursor(1,1);
  lcd.print("kalibriert...");
  // Die ersten zwei Sekunden die Lichtschranke kalibrieren
  while (millis() < 2000) {
    lichtschranke_messwert = analogRead(lichtschranken_pin);
    // Maximalwert speichern
    if (lichtschranke_messwert > lichtschranke_maximum) {
      lichtschranke_maximum = lichtschranke_messwert;
    }
    // Minimalwert speichern, nur fuer den Fall, dass wir den Schwellenwert irgendwann mal anders berechnen wollen
    if (lichtschranke_messwert < lichtschranke_minimum) {
      lichtschranke_minimum = lichtschranke_messwert;
    }
  }
  lichtschranke_schwellenwert = lichtschranke_maximum * lichtschranke_schwellenwertfaktor;
  Serial.print("Leerwert der Lichtschranke: ");
  Serial.println(lichtschranke_maximum);
  Serial.print("Schwellenwert der Lichtschranke: ");
  Serial.println(lichtschranke_schwellenwert);
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("Leerwert der");
  lcd.setCursor(1,1);
  lcd.print("Lichtschranke");
  lcd.setCursor(17,1);
  lcd.print(lichtschranke_maximum);
  lcd.setCursor(1,2);
  lcd.print("Schwellenwert der");
  lcd.setCursor(2,2);
  lcd.print("Lichtschranke");
  lcd.setCursor(17,2);
  lcd.print(lichtschranke_schwellenwert);
}

void loop() {
  tropfen_ausgeloest = true;

  // Tropfserie fallen lassen falls ausgelöst
  if (tropfen_ausgeloest == true) {
    aktuellezeit_ventil = millis();
    if (aktuellezeit_ventil - startzeit_ventil < endzeit_offen_1 && ventil_offen == false) {
      digitalWrite(ventil_pin, HIGH);
      digitalWrite(ventil_led, HIGH);
      ventil_offen = true;
      tropfserie_laeuft = true;
      Serial.println("Tropfen 1 Start, Ventil offen");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Tropfen 1 Start,");
      lcd.setCursor(1,1);
      lcd.print("Ventil offen");
   
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_1 && aktuellezeit_ventil - startzeit_ventil < endzeit_geschlossen_1_2 && ventil_offen == true) {
      digitalWrite(ventil_pin, LOW);
      digitalWrite(ventil_led, LOW);
      ventil_offen = false;
      Serial.println("Tropfen 1 Ende, Ventil geschlossen");
      lcd.setCursor(1,2);
      lcd.print("Tropfen 1 Ende");
      lcd.setCursor(1,3);
      lcd.print("Ventil geschlossen");   
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_geschlossen_1_2 && aktuellezeit_ventil - startzeit_ventil < endzeit_offen_2 && ventil_offen == false) {
      digitalWrite(ventil_pin, HIGH);
      digitalWrite(ventil_led, HIGH);
      ventil_offen = true;
      Serial.println("Tropfen 2 Start, Ventil offen");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Tropfen 2 Start,");
      lcd.setCursor(1,1);
      lcd.print("Ventil offen");
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_2 && aktuellezeit_ventil - startzeit_ventil < endzeit_geschlossen_2_3 && ventil_offen == true) {
      digitalWrite(ventil_pin, LOW);
      digitalWrite(ventil_led, LOW);
      ventil_offen = false;
      Serial.println("Tropfen 2 Ende, Ventil geschlossen");
      lcd.setCursor(1,2);
      lcd.print("Tropfen 2 Ende");
      lcd.setCursor(1,3);
      lcd.print("Ventil geschlossen");
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_geschlossen_2_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_offen_3 && ventil_offen == false) {
      digitalWrite(ventil_pin, HIGH);
      digitalWrite(ventil_led, HIGH);
      ventil_offen = true;
      Serial.println("Tropfen 3 Start, Ventil offen");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Tropfen 3 Start,");
      lcd.setCursor(1,1);
      lcd.print("Ventil offen");
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_pause && ventil_offen == true) {
      digitalWrite(ventil_pin, LOW);
      digitalWrite(ventil_led, LOW);
      ventil_offen = false;
      Serial.println("Tropfen 3 Ende, Ventil geschlossen");
      lcd.setCursor(1,2);
      lcd.print("Tropfen 3 Ende");
      lcd.setCursor(1,3);
      lcd.print("Ventil geschlossen");
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_pause) {
      startzeit_ventil = aktuellezeit_ventil;
      tropfserie_laeuft = false;
      lichtschranke_unterbrochen = false;
      Serial.println("Ende der Pause, Startzeit aktualisiert, Lichtschranke wieder scharf");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Ende der Pause,");
      lcd.setCursor(1,1);
      lcd.print("Startzeit aktualisiert,");
      lcd.setCursor(1,2);
      lcd.print("Lichtschranke wieder");
      lcd.setCursor(1,3);
      lcd.print("scharf !!!!!!");
    }
  }
 
  // Lichtschranke abfragen
    lichtschranke_messwert = analogRead(lichtschranken_pin);
    if (lichtschranke_messwert < lichtschranke_schwellenwert && lichtschranke_unterbrochen == false) {
      Serial.println("Lichtschranke unterbrochen");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Lichtschranke");
      lcd.setCursor(1,1);
      lcd.print("unterbrochen");
      digitalWrite(lichtschranken_led, HIGH);
      lichtschranke_unterbrochen = true;
      startzeit_ausloeseverzoegerung = millis();
    }
    // Verzögerungszeit abwarten, dann Kamera-Auslöser aktivieren
    aktuellezeit_ausloeseverzoegerung = millis();
    if (aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung > ausloeseverzoegerung && aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung < ausloeseverzoegerung + ausloeser_aktivzeit && kamera_ausloeser_aktiv == false && lichtschranke_unterbrochen == true) {
      Serial.println(aktuellezeit_ausloeseverzoegerung);
      digitalWrite(kamera_pin, HIGH);
      digitalWrite(autofocus_pin, HIGH);
      kamera_ausloeser_aktiv = true;
      Serial.println("Kamera-Ausloeser aktiviert");
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Kamera-Ausloeser");
      lcd.setCursor(1,1);
      lcd.print("aktiviert");
    }
    // Aktivzeit des Auslösers abwarten, dann Kamera-Auslöser deaktivieren
    else if (aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung > ausloeseverzoegerung + ausloeser_aktivzeit && aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung < gesamtzeit_tropfserie && kamera_ausloeser_aktiv == true) {
      digitalWrite(kamera_pin, LOW);
      digitalWrite(autofocus_pin, LOW);
      digitalWrite(lichtschranken_led, LOW);
      kamera_ausloeser_aktiv = false;
      Serial.println("Kamera-Ausloeser deaktiviert");
      lcd.setCursor(1,2);
      lcd.print("Kamera-Ausloeser");
      lcd.setCursor(1,3);
      lcd.print("deaktiviert");
    }
}


Lachsy 11.04.2011 19:16

Es hat sich ein Fehler eingeschlichen , die Gelbe Ventil -LED geht nicht nach D6 sondern D7

So hier nochmal der Schaltplan angepasst, was man nicht unbedingt braucht ist grün Schrafiert.


-> Bild in der Galerie


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:22 Uhr.