SonyUserforum
Amazon
Forum für die Fotosysteme von Sony und KonicaMinolta
  SonyUserforum - Forum für die Fotosysteme
von Sony und KonicaMinolta
 
Registrieren Rund ums Bild Galerie Objektiv-Datenbank Kalender Forenregeln Nützliches

Startseite » Forenübersicht » Kamera und Technik » Zubehör » Arduino basieredes Lichtschrankensystem
Antwort
 
Themen-Optionen Ansicht
Alt 09.04.2011, 18:22   #1
Lachsy
 
 
Registriert seit: 13.07.2008
Ort: Essen
Beiträge: 963
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
__________________
gruss Clrissa

Geändert von Lachsy (09.04.2011 um 20:29 Uhr)
Lachsy ist offline   Mit Zitat antworten
Sponsored Links
Alt 09.04.2011, 19:25   #2
BodenseeTroll
 
 
Registriert seit: 24.02.2007
Ort: Konstanz
Beiträge: 1.095
Zitat:
Zitat von Lachsy Beitrag anzeigen
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
__________________
Fotos: seetroll.ipernity.com
BodenseeTroll ist offline   Mit Zitat antworten
Alt 09.04.2011, 19:28   #3
Shooty
 
 
Registriert seit: 11.12.2006
Ort: nähe FFM
Beiträge: 11.249
Wenn die in dem Equipment teil sind bitte mal ne pm an die mpds das die freischalten können

Ich will endlich Bilder sehn
Shooty ist offline   Mit Zitat antworten
Alt 09.04.2011, 19:32   #4
Lachsy

Themenersteller
 
 
Registriert seit: 13.07.2008
Ort: Essen
Beiträge: 963
Markus habe schon eine Pn gesendet mit bitte um Freischaltung.
__________________
gruss Clrissa
Lachsy ist offline   Mit Zitat antworten
Alt 09.04.2011, 20:07   #5
cdan
ehemaliger Moderator
 
 
Registriert seit: 18.01.2008
Ort: Berlin
Beiträge: 12.942
Und freigeschaltet.
__________________
dandyk.de
cdan ist offline   Mit Zitat antworten
Sponsored Links
Alt 09.04.2011, 20:48   #6
Lachsy

Themenersteller
 
 
Registriert seit: 13.07.2008
Ort: Essen
Beiträge: 963
Danke Christian

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");
    }
}
__________________
gruss Clrissa
Lachsy ist offline   Mit Zitat antworten
Alt 11.04.2011, 19:16   #7
Lachsy

Themenersteller
 
 
Registriert seit: 13.07.2008
Ort: Essen
Beiträge: 963
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
__________________
gruss Clrissa
Lachsy ist offline   Mit Zitat antworten
Antwort
Startseite » Forenübersicht » Kamera und Technik » Zubehör » Arduino basieredes Lichtschrankensystem


Forenregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:39 Uhr.