Hallo,
ich will mir eine Schaltuhr bauen mit der ich auch über lange Zeit, mehrere Wochen, eine Kamera auslösen kann in definierten Abständen. Verwendet wird ein Arduino Pro Mini. Kann mir jemanden einen Tipp geben wie ich beispielsweise mit dem 32khz Ausgang des DS3231 diese Schaltuhr präzise Abstimmen kann?
timtailors:
Hallo,
ich will mir eine Schaltuhr bauen mit der ich auch über lange Zeit, mehrere Wochen, eine Kamera auslösen kann in definierten Abständen. Verwendet wird ein Arduino Pro Mini. Kann mir jemanden einen Tipp geben wie ich beispielsweise mit dem 32khz Ausgang des DS3231 diese Schaltuhr präzise Abstimmen kann?
Zu Deiner eigentlichen Frage habe ich gerade nur ein Fragezeichen zwischen den Ohren.
Aber beim Stichwort „auslösen“ wurde das Neuron mit dem Fragezeichen daran erinnert, dass ich mal einen IR-Auslöser für meine Pentax-Knipse gebastelt habe. Außerdem hat mal jemand, der in der Newsgruppe drf aktiv ist, einen Knipsuino oder so entwickelt. Ich finde nur gerade den Link nicht ...
Gruß
Gregor
Ich habe schon mehrere "Timer" für verschiedene Kameras gebaut. Das längste Projekt ging über etwa ein Monat. Da ging es um Keinem und Wachsen von Pflanzen. Und natürlich entstehen daraus dann Filme.
Ein paar Fragen:
- In welchen Intervallen willst du auslösen: also z.B. alle 5 Sekunden, einmal pro Stunde oder einmal täglich genau um 13:42:59 Uhr?
- Wie genau müssen diese Intervalle sein - reicht "ungefähr alle 5 Minuten" oder muss es auf die Hundertstel Sekunde genau sein?
- Welche Kamera willst du auslösen - gibt es einen Kabelauslöser oder nicht?
- Hast du Stromanschluss oder nicht?
Ein DS3231 ist prinzipiell eine gute Idee, weil eine recht genaue Real Time Clock ist. Ob das allerdings wirklich nötig ist hängt ganz von deinem Vorhaben ab.
Wenn sich dein benötigtes Intervall in Sekunden, Minuten oder Stunden (bzw. einem Vielfachen davon) ausdrücken lässt, dann geht das relativ einfach mit dem DS3231. Es gibt eine programmierbare "Alarmfunktion" und die schaltet den Arlarm-Pin, wenn die eingestellte Zeit erreicht ist (kleinste Einheit: 1 Sekunde). Wenn die erste "Alarmzeit" erreicht wurde, dann stellt der Arduino einfach die nächste ein und so weiter.
Da brauchst du nichts mit den 32kHz zu machen.
Hallo,
ja, es müsste schon auf Hundertstel Sekunde genau sein und die Intervalle sollten dementsprechend von dieser Zeit gehen bis Stundenintervalle.
Ich will verschiedene Kameras Auslösen, alle mit Kabelauslöser. Das ist aber kein Problem, weil das schon funktioniert. Momentan mache ich es über millis() und mir geht es darum das mit der realen Zeit zu kalibrieren. Also das 1000ms auch 1000ms in real sind. Ein Auslösen zu einer bestimmten Uhrzeit soll auch möglich sein. Deshalb dachte ich an die RTC.
Das ist aber kein Problem
Wo ist denn dein Problem?
"Wo ist denn dein Problem?"
Die interne Zeitbasis abzugleichen. Was mir der Arduino ausgibt als 1000ms entspricht nicht unbedingt der Zeit und Takt der von einer RTC oder GPS ausgegeben wird. Mal ist's langsamer, mal schneller. Auch abhängig von der Temperatur.
Mir geht es darum wie ich die interne Zeit des Arduinos präzisieren kann zb mit dem 32kHz Pin der RTC
Hi,
wenn ich Dich richtig verstehe willst Du nicht nur den Interval, sondern auch die Belichtungszeit steuern, möglichst genau?
Die DS3231 gibt ja nicht nur die 32kHz aus, sondern auch 1Hz, 1024Hz, 4096Hz, und 8192Hz, je nach Programmierung
Dann musst Du Dir dort eine passende Zeitbasis nehmen und zählen, wenn Dir millis wirklich zu ungenau sind.
Wie im Einzelnen kann ich Dir nicht sagen, bin da noch Newbie, aber einen Frequenzzähler hatte ich schon mal schnell zusammengestöpselt, und die DS3231 als Quelle in o.g. Frequenzen benutzt, um den Frequenzzähler zu testen.
Gruß André
Die interne Zeitbasis abzugleichen. Was mir der Arduino ausgibt als 1000ms entspricht nicht unbedingt der Zeit und Takt der von einer RTC oder GPS ausgegeben wird. Mal ist's langsamer, mal schneller. Auch abhängig von der Temperatur.
Das wieß ich.
Mir geht es darum wie ich die interne Zeit des Arduinos präzisieren kann zb mit dem 32kHz Pin der RTC
OK, da du deine Frage nicht präzisieren möchtest, muss ich davon ausgehen, dass du bisher noch nicht in Erfahrung gebracht hast wie millis() intern funktioniert.
Mein Tipp:
Schaue dir das an.
Du wirst finden:
Eine Variable, welche den millis() Wert hält, und welche du nach belieben manipulieren kannst.
Vielleicht reicht dir das ja schon.
Auch muss ich davon ausgehen, dass du dir noch nicht das Datenblatt des µC angeschaut hast.
Denn dort würdest du in Erfahrung bringen können, wie man die eingebauten Timer mit einem externen Takt versorgen kann.
Also:
Schaue ins Datenblatt.
Ich hoffe, dass du, wenn du dir das angesehen hast, etwas konkretere Fragen stellen kannst.
Am Rande:
Ein µC läuft mit einem Quarz erheblich genauer, als mit einem Resonator.
Verwende einen Pro Mini mit Quarz.
Oder ersetze den Resonator/Quarz durch einen Uhrenquarz.
Denn Timer2 kann damit umgehen, und du hast dann den RealTimeCounter auf dem Chip selber, ohne weitere externe Bauteile.
timtailors:
"Wo ist denn dein Problem?"Die interne Zeitbasis abzugleichen. Was mir der Arduino ausgibt als 1000ms entspricht nicht unbedingt der Zeit und Takt der von einer RTC oder GPS ausgegeben wird. Mal ist's langsamer, mal schneller. Auch abhängig von der Temperatur.
Mir geht es darum wie ich die interne Zeit des Arduinos präzisieren kann zb mit dem 32kHz Pin der RTC
Dass alle möglichen Komponenten manchmal ziemlich „eigen“ sind, wenn es um Temperaturschwankungen geht, hast Du ja schon bemerkt.
Ich würde wohl empirisch vorgehen:
Miss doch einen Arduino mal „gründlich aus“, Abweichungen korrigierst Du mit Werten, die Du im EEPROM speichern kannst. Übertrage Deine Beobachtungen aber nicht auf andere Arduinos, da die meiner Erfahrung nach schon nach ziemlich kurzer Zeit (wenige Minuten) unterschiedliche Arduinos asynchron laufen. Mit einem Piezo-Pieper kann man die Drift deutlich verfolgen, ohne dass einem langweilig wird.
Wenn Du das Driften kompensieren kannst, sollten genaue Zeitintervalle möglich sein.
Gruß
Gregor
timtailors:
Mir geht es darum wie ich die interne Zeit des Arduinos präzisieren kann zb mit dem 32kHz Pin der RTC
Hab ich mir schon gedacht, wartete erstmal auf die Antwort.
Ja das geht, bei Sekundengenau kann man auch die 32khz auf 1 Sekunde runterteilen und seine eigenen Sekunden zählen.
Man muss hier allerdings unterscheiden zwischen dem Asynczähler, hier wird der interne 8Mhz Takt des Chips als Hauptquelle genutzt und ein 32.768 Quarz an den eigentlich OSC Pins als Sleepzähler.. der zählt auch im Sleep weiter.
Das ist die einzige möglichkeit mit Sleep.
Wie Du das möchtest, also Millisekunden von 32khz Quelle geht auch ziemlich Easy mit T0, leider vorbelegt durch den internen millis() Zähler.
Ich habe da mal ein Workaround geschaffen.
Und ein zweites Workaround:
Allerdings waren das nur funktionierende Beispiele und ist schwerer zu verstehen.. Das ist schon etwas her und habe mitlerweile selber den Überblick verloren
Mit Präzisionsauslösung in dem Sinn, wie sie du benötigst habe ich mich bisher nicht auseinandergesetzt und kann daher nicht konkret weiterhelfen.
Die Kameras, die ich bisher verwendet habe, waren DSLRs und spiegellose Systemkameras. Da gibt es entweder mechanische Teile (Blende, Spiegel, Verschluss) bzw. läuft auf der Kamera ein Betriebssystem. Beides führt dazu, dass ein Auslösezeitpunkt ohnehin nicht "ganz präzise" ist (selbst wenn Autofokus und Belichtungsmessung deaktiviert sind). Ich vermute, die "Drift" liegt wohl im Hundertstel-, wenn nicht sogar Zehntelsekundenbereich.
Nicht umsonst wird bei "Hochgeschwindigkeits-Fotoprojekten" (Stichwort: Gewehrkugel zerschießt Luftballon) der Belichtungszeitpunkt nicht durch die Kamera, sondern durch auslösen eines Blitzgerätes bei schon vorher geöffnetem Kameraverschluss erreicht.
Natürllich ist Zeitmessung am Arduino über millis() für längere Intervalle ziemlich ungenau und zudem temperaturabhängig, ein Abgleich mit einer "besseren" externen Zeitbasis in vielen Fällen also notwendig.
Aufgund der oben beschriebenen Effekte würde ich aber vermuten, dass so ein Abgleich alle "paar" Minuten wahrscheinlich ausreichend ist.
Was ich noch vergessen habe..
Man kann ja auch Timer1 benutzen soweit nicht anders eingeplant..
Lösung1:
man zählt mit dem 1Hz Signal des 32khz Ausganges des DS3231 eigene Sekunden und benutzt die millis oder Micros um zwischen den Sekunden zu zählen.
So hat es sogar eine bessere Zwischengenauigkeit.
Oder man zählt mit Timer1 die 32khz und man ist dann 1/32768 Sekunden genau, hier wäre alles in einem Abwasch.
Ansatz des ganzen ist es das 100 Sekundensignale +1/F_CPU genauso Genau ist wie 32768*100+ 1/32768.
Hallo Schuppeste,
vielen Dank für deine Antworten. Das betrifft das Problem ja genau, werde mir deine Lösungen durch den Kopf gehen lassen, ob ich das so umsetzen kann. Es ist momentan noch eine lib vorhanden, die 2 Encoder ausliest, glaube die verwendet die internen Timer.
timtailors:
Hallo Schuppeste,vielen Dank für deine Antworten. Das betrifft das Problem ja genau, werde mir deine Lösungen durch den Kopf gehen lassen, ob ich das so umsetzen kann. Es ist momentan noch eine lib vorhanden, die 2 Encoder ausliest, glaube die verwendet die internen Timer.
Hier mal ein Beispiel mit Int0, da kann es aber nach einer gewisschen Zeit zum Millisoverflow kommen den man dann auch noch umbuffern muss.
Der Arduino misst ja in sagen wir mal 1 Sekunde schon Mikrosekundengenau, dieser Fehler addiert sich halt leider jede Sekunde.. das können dann in 1 Stunde schon viele Millis werden. So wie im Beispiel lässt man das grobe das 1Hz Signal des DS machen und die letzte Sekunde die millis.
const byte interruptPin = 2;
volatile unsigned long seconds =0;
volatile long lastmillis=0;
unsigned long intervall=100555;
void setup() {
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), myseconds, FALLING);
lastmillis=millis();
Serial.begin(19200);
}
void loop() {
delay(5500);
Serial.println(MyNowmillis());
}
void myseconds() {
seconds++;
lastmillis=millis();
}
unsigned long MyNowmillis(){
return ((seconds*1000)+(millis()-lastmillis));
}