Ardueos Projekt
Intervall Aufnahmen und Langzeitbelichtungen
Für Zeitraffer oder Astronomische Aufnahmen von weit entfernten DeepSky Objekten benötigt man einen Intervall Timer und eine Spiegelreflex Kamera.
Intervall Timer kann man für kleines Geld zu kaufen, aber für die Langzeit Fotografie von Deep Sky Objekten nicht gerade ideal. Tasten zu kein, Display bei Nacht schlecht zu lesen, Batterien die man nicht mal so zu Hause hat und meist zu kurze Kabel.
Also warum nicht einfach selber bauen, dabei sind die Bauteile günstig zu bekommen.
Wir brauchen…
- Arduino Mikrocontroller
- Display 16×2
- Joystick
- Lochrasterplatine, Kabel, Werkzeug
- Optokoppler LTV 827
- Widerstände 220 Ohm u. 10K Ohm
- Potenziometer 10K Ohm
- 2,5 mm Stereo Klinken Stecker
- Schalter , 9Volt Batterie mit Stecker
Testaufbau auf dem Steckbrett
Der Joystick Knopf wird über einen 10K Ohm Pullup Widerstand angeschlossen, Display und der LTV827 benötigen jeweils einen 220 Ohm Vorwiderstand, hier an Pin 1 des Optokoppler angeschlossen.
Nachdem die Schaltung auf dem Steckbrett das macht was sie soll, geht’s auf die Lochrasterplatine. Die wurde größer gewählt als eigentlich benötigt, so können noch Erweiterungen dazukommen.
Für den Arduino Joystick gibt es auf der 3D Plattform thingiverse.com einige coole Gehäuse zum ausdrucken, Dann noch ein Gehäuse für Platine und Batterie aus Aluminium.
Für die Canon EOS Kamera benötigt man einen 2.5 mm Stereo – Klinkenstecker. Dabei wird Ring 1 und 3 mit dem Optokoppler verbunden.
Funktion.
Nach dem Einschalten gibt es 5 Menüs die über den Joystick angewählt werden können.
- Vorlaufzeit – Wird einmalig abgearbeitet und soll Schwingungen am Teleskop minimieren.
- Belichtungszeit – Dauer der Belichtung ein. Kamera sollte im Modus „Manuell“ oder „Blub“ stehen.
- Pause – Zeit zwischen den einzelnen Aufnahmen
- Anzahl Bilder – Anzahl der Aufnahmen.
- Start – Durch drücken des Joysticks wird die Reihenaufnahme gestartet, durch wiederholtes drücken wird der Prozess abgebrochen.
Der Sketch
// ---- EOS TIMER ---- // ---- März 2018 ---- // -- Martin Sümnik -- #include <LiquidCrystal.h> LiquidCrystal lcd(8, 7, 6, 5, 4, 3); int ab = 0; long b = 0; long b1 = 0; long b2 = 0; long b3 = 0; long b4 = 0; long ii = 0; long vor = 0; long bel = 0; long pau = 0; byte ausloeser = 0; int brk = 0; int ergx = 0; int ergy = 0; long s1 = 0; long s2 = 0; long s = 0; long min1 = 0; long min2 = 0; long mi = 0; long sec1 = 0; long sec2 = 0; long sec = 0; String leer = (" "); String punkt = (":"); String zeit = ("Time "); int anzahl = 0; int anz_temp = 0; int t = 0; // Taster Joystick int pos = 13; // Position Blink curser int joybut = 0; int joypin = 2; int on = 0; int y = 0; // Analogeingang Y achse int x = 1; // Analogeingang x achse long bel_vor = 0; // Wert für aufnahme in sec long bel_bel = 0; // Wert für aufnahme in sec long bel_pau = 0; // Wert für aufnahme in sec String Array[] = {"VORLAUFZEIT ", "BELICHTUNGSZEIT", "PAUSE ", "ANZAHL BILDER ", "Start Press Down "}; int i = 0; // Counter LCD Display 1te Zeile String RUN = ("STOP Press Down "); String Bilder = (" BILDER"); String von = (" von "); void setup() { lcd.begin(16, 02); pinMode(3, OUTPUT); // Display pinMode(4, OUTPUT); // Display pinMode(5, OUTPUT); // Display pinMode(6, OUTPUT); // Display pinMode(7, OUTPUT); // Display pinMode(8, OUTPUT); // Display pinMode(9, INPUT); // Schalter Joystick pinMode(11, OUTPUT); // Pin 11 Kamera Out attachInterrupt(digitalPinToInterrupt(joypin), break_down, CHANGE); // Joybutten lcd.setCursor(0, 0); lcd.print(" Ardueos V1.0 "); lcd.setCursor(0, 1); lcd.print(" Cabel Timer "); delay (3000); } void loop() { joybut = digitalRead(joypin); // Taster Joystick if (joybut < 1) { (t = 1); // Taster gedrückt } if (joybut > 0) { (t = 2); } ergx = analogRead(x); // Hoch _ Runter ergx = map(ergx, 0, 1022, 1, 8); ergy = analogRead(y); // Rechts _ links ergy = map(ergy, 0, 1022, 1, 8); if (ergx == 8) { (i --); } if (i < 0) { (i = 0); } if (ergx == 1) { (i ++); } if (i > 4) { (i = 4); } delay (185); // VORLAUFZEIT load_display() ; anzahl = anz_temp; if (i < 3 & t == 1) { pos = pos + 3; if (pos > 13) { pos = 7; } lcd.setCursor(pos, 1); lcd.blink(); delay(800); lcd.noBlink(); timer(s1, s2, min1, min2, sec1, sec2); } if (i < 3 & ergy == 8 & pos == 13) { sec ++; } if (sec > 59) { sec = 0; } if (i < 3 & ergy == 1 & pos == 13) { sec --; } if (sec < 0) { sec = 59; } if (i < 3 & ergy == 8 & pos == 10) { mi ++; } if (mi > 59) { mi = 0; } if (i < 3 & ergy == 1 & pos == 10) { mi --; } if (mi < 0) { mi = 59; } if (i < 3 & ergy == 8 & pos == 7) { s ++; } if (s > 59) { s = 0; } if (i < 3 & ergy == 1 & pos == 7) { s --; } if (s < 0) { s = 59; } if (i == 3) { on = 1; } if (i == 3 && ergy == 4) { lcd.setCursor(0, 0); lcd.print(Array[i]); lcd.setCursor(0, 1) ; lcd.print(anz_temp + leer); } if (i == 3 && ergy == 8) { anz_temp ++ ; lcd.setCursor(0, 1) ; lcd.print(anz_temp + leer); anzahl = anz_temp; }; if (anz_temp < 2) { anz_temp = 1; } if (i == 3 && ergy == 1) { anz_temp -- ; lcd.setCursor(0, 1) ; lcd.print(anz_temp + leer); anzahl = anz_temp; } if (anz_temp > 99) { anz_temp = 99; } if (i == 4 & t == 1) { timer_start(); } // Werte Speichern sec1 = sec / 10; sec2 = sec - (sec1 * 10); min1 = mi / 10; min2 = mi - (min1 * 10); s1 = s / 10; s2 = s - (s1 * 10); if (i == 0) { bel_vor = ((s * 3600) + (mi * 60) + sec); } if (i == 1) { bel_bel = ((s * 3600) + (mi * 60) + sec); } if (i == 2) { bel_pau = ((s * 3600) + (mi * 60) + sec); } if (on == 0) { timer(s1, s2, min1, min2, sec1, sec2); } lcd.setCursor(0, 0); lcd.print(Array[i]); } // Ausgabe void timer(long s1, long s2, long min1, long min2, long sec1, long sec2) { lcd.setCursor(0, 1); lcd.print(zeit + s1 + s2 + punkt + min1 + min2 + punkt + sec1 + sec2 ); } // Ausgabe laden void load_display() { if (i == 0) { b = bel_vor; on = 0; } if (i == 1) { b = bel_bel; on = 0; } if (i == 2) { b = bel_pau; on = 0; } b2 = b / 3600; // b2 = Std. b3 = b - (b2 * 3600); // b3 = min b4 = b3; b3 = b3 / 60; b4 = b4 - (b3 * 60); // b4 Sec sec = b4; sec1 = b4 / 10; sec2 = b4 - (sec1 * 10); mi = b3; min1 = b3 / 10; min2 = b3 - (min1 * 10); s = b2; s1 = b2 / 10; s2 = s - (s1 * 10); } // Aufnahme Starten // Anzeige Ändern / Kamera Conecton void timer_start() { vor = (bel_vor * 1000); bel = (bel_bel); pau = (bel_pau); // ii = 0; lcd.setCursor(0, 0); lcd.print(RUN); lcd.setCursor(0, 1); lcd.print(" Running Prog. "); brk = 1; //for (long ii=0; ii < vor; ii++){delay(1000);} delay (vor); // Warte Vorlauf for (int ab = 1; ab <= anzahl; ab++) { if (ausloeser == 0) { digitalWrite(11, HIGH); // Pin 11 High } for (long ii = 0; ii < bel; ii++) { delay(1000); // Warte Beleichtung } if (ausloeser == 0) { digitalWrite(11, LOW); // Pin 11 Low } lcd.setCursor(0, 1); lcd.print(ab + Bilder + von + anzahl); for (long ii = 0; ii < pau; ii++) { delay(1000); } ii = 0; } brk = 0; ausloeser = 0; lcd.setCursor(0, 1); lcd.print("FERTIG "); } void break_down () { if (brk == 1) { bel = 0; pau = 0; vor = 0; ausloeser = 1; anzahl = 0; digitalWrite(11, LOW); // Kamera aus lcd.setCursor(0, 1); lcd.print("Aufnahme Stop "); } }
Viel Spaß beim Nachbau.
Für Schäden wird keine Haftung übernommen.