Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino basieredes Lichtschrankensystem


Lachsy
09.04.2011, 18:22
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 (http://www.dslr-forum.de/showthread.php?t=768444) 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

590/winniduino.jpg
-> Bild in der Galerie (http://www.sonyuserforum.de/galerie/details.php?image_id=123774)

590/Winniduino.jpg
-> Bild in der Galerie (http://www.sonyuserforum.de/galerie/details.php?image_id=123773)

Den Softwarecode muss ich noch nachreichen ist auf dem anderen PC

mfg Clarissa

BodenseeTroll
09.04.2011, 19:25
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

// 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.

6/Schaltplan_Winniduino.JPG
-> Bild in der Galerie (http://www.sonyuserforum.de/galerie/details.php?image_id=123892)