• Herzlich willkommen im "neuen" DSLR-Forum!

    Wir hoffen, dass Euch das neue Design und die neuen Features gefallen und Ihr Euch schnell zurechtfindet.
    Wir werden wohl alle etwas Zeit brauchen, um uns in die neue Umgebung einzuleben. Auch für uns ist das alles neu.

    Euer DSLR-Forum-Team

  • In eigener Sache!

    Liebe Mitglieder, liebe Besucher und Gäste
    ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
    Bitte hier weiterlesen ...

  • DSLR-Forum Fotowettbewerb neu erfunden!
    Nach wochenlanger intensiver Arbeit an der Erneuerung des Formates unseres internen Fotowettbewerbes ist es Frosty als Moderator
    und au lait als Programmierer gelungen, unseren Wettbewerb auf ein völlig neues Level zu heben!
    Lest hier alle Infos zum DSLR-Forum Fotowettbewerb 2.0
    Einen voll funktionsfähigen Demowettbewerb kannst du dir hier ansehen.
  • Neuer Partner: AkkuShop.de
    Akkus, Ladegeräte und mehr (nicht nur) für Digitalkameras und Drohnen
  • Neuer Gutscheincode unseres Partners Schutzfolien24:
    DSLR-Forum2024
    Dauerhaft 10% Rabatt auf alle Displayschutzfolien der Eigenmarken "Upscreen", "Brotec", "Savvies".
    Der Code ist für alle Geräteklassen gültig.
  • Stimmt ab über die Sieger des DSLR-Forum Fotowettbewerbs März 2024.
    Thema: "Arbeitsmittel"

    Nur noch bis zum 31.03.2024 23:59!
    Jeder darf abstimmen!
    Zur Abstimmung und Bewertung hier lang
  • Frohe Ostern!

    Wir wünschen allen DSLR-Forum Nutzern, ihren Familien und Freunden sowie unseren Sponsoren und Partnern und deren Familien und Freunden ein frohes Osterfest.

    Euer DSLR-Forum Team!
WERBUNG

Bastelanleitung: Arduino-basierter Lichtschranken-Trigger

Hat sich erledigt, habe eine Lösung gefunden und das Problem gelöst. (y)

Und wie hast du es geschafft wenn man fragen darg
 
Kleines Update für die Software-Version mit Magnetventil. Dieses behebt das Problem, dass die Tropfenfolge nicht oder nicht vollständig ausgelöst wird, wenn die Öffnungs- und Pausenzeiten sehr kurz sind. Auch mit der neuen Version sind die Probleme nicht vollständig behoben, zumindest aber deutlich verringert.
Das Problem tritt durch Serial.println() auf, welches eine Verzögerung ähnlich delay() auslöst, die wiederum dazu führen kann, dass ein Tropfintervall verpasst wird. Im Grunde genommen kann man einfach alle Zeilen mit Serial.println() löschen oder über // auskommentieren. Hab mich für das Auskommentieren entschieden, weil das Debugging durch die Rückmeldungen etwas erleichtert wird und man so ggf. einfach die beiden Schrägstriche wieder entfernen kann.

Code:
// KONSTANTEN
const int lichtschranken_pin = A0;
const int ventil_pin = 12;
const int kamera_pin = 13;

// 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 = 70;
int tropfenzeit_2 = 150;
int verschlusszeit_2_3 = 70;
int tropfenzeit_3 = 150;
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 = 10000;

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

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

// 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);
  // Serielle Verbindung zum Computer initialisieren für Textausgabe
//  Serial.begin(9600);
//  Serial.println("Lichtschranke wird kalibiert...");
  // 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);
}

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);
      ventil_offen = true;
      tropfserie_laeuft = true;
//      Serial.println("Tropfen 1 Start, 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);
      ventil_offen = false;
//      Serial.println("Tropfen 1 Ende, 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);
      ventil_offen = true;
//      Serial.println("Tropfen 2 Start, 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);
      ventil_offen = false;
//      Serial.println("Tropfen 2 Ende, 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);
      ventil_offen = true;
//      Serial.println("Tropfen 3 Start, Ventil offen");
    }
    else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_pause && ventil_offen == true) {
      digitalWrite(ventil_pin, LOW);
      ventil_offen = false;
//      Serial.println("Tropfen 3 Ende, 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");
    }
  }
  
  // Lichtschranke abfragen
    lichtschranke_messwert = analogRead(lichtschranken_pin);
    if (lichtschranke_messwert < lichtschranke_schwellenwert && lichtschranke_unterbrochen == false) {
//      Serial.println("Lichtschranke unterbrochen");
      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) {
      digitalWrite(kamera_pin, HIGH);
      kamera_ausloeser_aktiv = true; 
//      Serial.println("Kamera-Ausloeser 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);
      kamera_ausloeser_aktiv = false;
//      Serial.println("Kamera-Ausloeser deaktiviert");
    }
}
 
Guten Abend zusammen,

vielen Dank an Niggoh und die anderen für die ausführliche Beschreibung.

Gerade hab ich die Lichtschranke mit dem Arduino Mega 2560 fertig, das mit dem Magnetventil kommt in der nächsten Woche noch.

Nach anfänglichen, kleinen Schwierigkeiten läuft sie jetzt fehlerfrei.

Was mich nur wundert ist die geringe Reichweite. Größer als 20 mm darf der Abstand zwischen Sender und Empfänger nicht sein sonst löst sie ständig aus. Ist das normal?

Gruß aus Emden

Norbi
 
Ne das ist glaub ich nicht normal ...
meine schafft locker 10-15 cm..
kann natürlich sein dass das von sender zu sender unterschiedlich ist:rolleyes:
 
Wie hoch ist denn die Spannung an Deiner LED? Ggf. kannst Du die noch ein bisschen erhöhen. Bei mir gehen auch wesentlich größere Abstände. Die Empfindlichkeit ist frei wählbar, alternativ kannst Du auch die selbstkalibrierende Version benutzen. Allerdings musst Du dann das Programm neu starten, wenn Du den Abstand veränderst, weil sich dann logischerweise die Werte verändern.

Ich betreibe meine Lichtschranke momentan mit 3 Volt. Sender und Empfänger sind in ca. 2 cm Abstand. Dabei erhalte ich dann Leerwerte um die 170. Was bekommst Du da für Werte angezeigt?
 
Der Sender wird mit 3 V betrieben. Die gezeigten Werte liegen zwichen 39 und 49. Aber könnte es vielleicht auch an dem Fototransistor im Empfänger liegen?
Dort habe ich einen BP 103 eingesetzt (den hatte ich noch) wobei nur die Anschlüsse Emitter/Collektor verwendet werden. Die Basis vom Transistor wird hier nicht genutzt.

Als Programmcode verwende ich das was Niggoh auf der ersten Seite hier zeigt.

Ich hab jetzt mal verschiedene Werte ausprobiert, komme aber nicht weiter als 20 mm Abstand. Ok, das reicht ja eigendlich für die Tropfenfotografie, aber man könnte die LS ja z.B. auch für das Futterhaus auf dem Balkon einsetzen.

Gruß aus Emden
Norbi
 
Kleines Update für die Software-Version mit Magnetventil. Dieses behebt das Problem, dass die Tropfenfolge nicht oder nicht vollständig ausgelöst wird, wenn die Öffnungs- und Pausenzeiten sehr kurz sind. Auch mit der neuen Version sind die Probleme nicht vollständig behoben, zumindest aber deutlich verringert.
Das Problem tritt durch Serial.println() auf, welches eine Verzögerung ähnlich delay() auslöst, die wiederum dazu führen kann, dass ein Tropfintervall verpasst wird. Im Grunde genommen kann man einfach alle Zeilen mit Serial.println() löschen oder über // auskommentieren. Hab mich für das Auskommentieren entschieden, weil das Debugging durch die Rückmeldungen etwas erleichtert wird und man so ggf. einfach die beiden Schrägstriche wieder entfernen kann.

Danke ich hab mir schon immer überlegt warum das passiert (y)(y)(y)
 
@Norbi:
Versuch mal 5V an der IR-LED anzulegen, das müsste die eigentlich auch abkönnen. Ich hatte meine auch schon an einer 9V Blockbatterie und das hat sie auch überlebt. Die Dinger sind ja zum Glück auch nicht so furchtbar teuer :)
Evtl. kommst Du dann auf etwas größere Abstände, die fürs Futterhaus reichen, wobei das Tageslicht evtl. stören könnte. Für ernsthafte Distanzen wird es aber eher auf eine Laserlichtschranke hinauslaufen, da hab ich allerdings bisher noch keine Erfahrungen mit gemacht und mich auch nie ernsthaft damit beschäftigt. Es gibt aber reichlich Infos zum Thema im Internet, mit ein bisschen Geduld sollte da sicherlich etwas zu finden sein.

@fernbedienung712:
Kein Problem. Auf die Lösung bin ich zufällig bei der Recherche nach anderen Dingen gestoßen.

Ich werde mittelfristig die Schaltung noch dahingehend erweitern, dass man die Zeiten unabhängig vom Computer verändern kann. Dann wird man dann allerdings um ein LCD und ein paar Knöpfe nicht mehr umherkommen. Das ist aber bisher nur eine Idee, ich habe mir noch keine großen Gedanken zur Umsetzung gemacht und momentan auch andere Prioritäten. Könnte also eine ganze Weile dauern.
 
Guten Abend Niggoh,
endlich finde ich mal Zeit, mich weiter mit der Materie zu beschäftigen.

Ich hoffe das morgen das Magnetventil kommt und noch ein paar andere eletronische Bauteile, damit ich weitermachen kann.

Das "Gestell" ist schon soweit fertig, ich habe einfach meinen selbstgebauten Fototisch etwas erweitert und kann ihn jetzt für die TaT´s verwenden. Nur ein geeignetes Becken fehlt mir noch, aber da bin ich auch schon dran.

Was die Reichweite der LS betrifft, baue ich diese nochmal neu auf mit den richtigen Bauteilen. Mal sehen was dabeirauskommt.

Gut ist, dass ich für meine Foto-Experimente einen zum Fotostudio hergerichteten Kellerraum von ca 4 x 9 m mit einer Deckenhöhe von über 3 m zur Verfügung habe in dem ich alles so stehen und liegen lassen kann wenns mal knapp wird. Zum Aufräumen fehlt mir dann meist die Zeit.

Ich melde mich in den nächsten Tagen wieder.

Gruß aus Emden

Norbi
 
Hallo Bastelgemeinde!

Habe jetzt nach Anleitung von Niggoh meine erste Schaltung zusammengesteckt (die von Seite eins :) ) und habe das Problem, das die Kamera alle zehn Sekunden auslöst, egal ob irgendwas bewegt wird, oder alle im Raum den toten Mann machen. Ich kann mir nicht erklären, woran das liegen könnte. :confused:
Hat jemand `ne gute Idee für den Elektroniklaien?

Danke vorab!
 
Vermutlich wird der Schwellenwert immer unterschritten, weil Du die Werte nicht angepasst hast. Was zeigt denn das Arduino-Fenster für Werte an? Der Schwellenwert muss darunter liegen.

Kannst ja mal alternativ mal folgenden Programmcode probieren, damit wird die Lichtschranke automatisch kalibriert. Kann es gerade nicht testen, weil ich nicht zu Hause bin, aber es sollte eigentlich funktionieren. Hab nur die Kalibrierungsfunktion aus der zweiten Programmversion in die erste Version integriert.

Code:
#define ausloeser 7
#define led 13
#define lichtschranke A0

// Lichtschranken-Schwellenwert festlegen
int lichtschranke_messwert;
int lichtschranke_maximum;
int schwelle;
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!

void setup() {
  pinMode(led, OUTPUT);
  pinMode(ausloeser, OUTPUT);
  digitalWrite(ausloeser, LOW);
  Serial.begin(9600);
  //  Serial.println("Lichtschranke wird kalibiert...");
  // Die ersten zwei Sekunden die Lichtschranke kalibrieren
  while (millis() < 2000) {
    lichtschranke_messwert = analogRead(lichtschranke);
    // Maximalwert speichern
    if (lichtschranke_messwert > lichtschranke_maximum) {
      lichtschranke_maximum = lichtschranke_messwert;
    }
  }
  schwelle = lichtschranke_maximum * lichtschranke_schwellenwertfaktor;  
}

void loop() {
  int verzoegerung = 120; // Auslöseverzögerung in ms festlegen
  int sensorValue = analogRead(lichtschranke);
  Serial.println(sensorValue, DEC); // Daten der Lichtschranke auf dem Computer ausgeben => darüber Schwellenwert festlegen
  if (sensorValue < schwelle)
   { 
     delay(verzoegerung); // Kameraauslösung verzögern
     digitalWrite(ausloeser, HIGH); // Kameraauslöser betätigen
     digitalWrite(led, HIGH); // LED anmachen zur Bestätigung, dass die Kamera ausgelöst hat
     delay(500); // Kameraauslöser loslassen verzögern
     digitalWrite(ausloeser, LOW); // Kameraauslöser wieder loslassen
     delay(10000); // 10 Sekunden warten, bevor der Trigger wieder "scharf" ist
     digitalWrite(led, LOW); // nach 10 Sekunden auch die LED wieder abschalten
   }
}
 
Zuletzt bearbeitet:
Oh man, ich könnt verzweifeln! :( Hab deinen Code aufgespielt und es funktioniert immernoch nicht! Die Kamera löst einfach nach der Scharfschaltung sofort aus.
Der Serial Monitor zeigt mir bei jeder Auslösung `ne Null an. Kann ich irgendwie testen, ob die Lichtschranke funktioniert? :confused:

Hab grad festgestellt, das die Kamera weiterhin auslöst, wenn ich den A0 rausziehe. Dort wird doch eigentlich die Spannungsänderung der Lichtschranke gemessen, oder?
 
Zuletzt bearbeitet:
Hm, dann kommt offensichtlich nichts am Sensor an. Sprich die Lichtschranke funktioniert nicht. Hast Du evtl. die LED oder den Sensor verpolt eingebaut (also falschrum)? Ansonsten kannst Du auch mal mit einer Fernbedienung draufhalten und schauen, ob da dann Werte > 0 angezeigt werden. Wenn ja, arbeitet zumindest der Sensor korrekt, dann liegts an der LED. Wenn nein, müsstest Du den Fehler am Sensor vermuten.
 
Also kompliziert wäre wohl zu einfach für mich! :ugly:
Trotz mehrer Fernbedienungen zeigt der Arduino immer null an. Nun wollte ich im Ausschlußverfahren den Widerstand am Fototransistor wechseln. Und als ich den
rausnahm, zeigte der Arduino plötzlich Werte zwischen 960 und 1200 an, ohne das ich ihn mit irgendeiner IR-LED anstrahlte. Wenn ich sie zuhielt, ging der Wert runter auf ca 600. Als ich dann den Widerstand wieder ins Spiel bracht, löste die Kamera aus und das Arduino zeigte wieder null an ...
Ich bin kopflos ... :confused:
 
220 Ohm, wie in der Anleitung beschrieben. Artikelnummer 418170 beim großen C.


Ich habs !!!! Es war die IR-LED. Hab noch eine von nem anderen Hersteller in der Kramkiste gefunden. Und die an nem 105Ohm Widerstand bringt Werte um 400 am Arduino und die Kamera löst bei Unterbrechung aus! Boar, ich bin glücklich! Danke an alle, die versucht haben, mir zu helfen !!
 
Zuletzt bearbeitet:
Nene, die Polung war i.O. Die IR-LED wollte nicht so recht. Hatte mir bei C 5 Stück ( Anfängerangst! ;) ) gekauft. Da wollte keine. Hab hinundhergepolt ...
Erst ein anderes Fabrikat brachte die Erlösung! :)
 
Guten Abend zusammen,

hab endlich mal wieder Zeit zum Bastel gehabt. Nach anfänglichen Schwierigkeiten (LED verpolt)... die Lichtschranke funktioniert jetzt mit den neuen Bauteilen und 9 V an der LED. Die Reichweite ist durch die erhöhte Voltzahl allerdings nicht viel größer geworden, dafür heizt die LED jetzt still vor sich hin ;-)

@Niggoh hab den Programmcode "automatische Kalibrierung" grad laufen. Hab in der Zeile "lichtschranke_messwert = analogRead(lichtschranken_pin)" in "lichtschranke_messwert = analogRead(lichtschranke)" geändert. Es werden kontinurierliche Werte angezeigt, je nach Abstand Sender/Empfänger zwischen 450 und 470.

In den nächsten Tagen werde ich das Magnetventil noch zuschalten und dann das ganze ein wenig testen.

Vielen Dank für die ganze Tips usw. an alle die sich hier viel Arbeit machen.

Gruß aus Emden

Norbi
 
Zuletzt bearbeitet:
WERBUNG
Zurück
Oben Unten