Kein billiges Gerät , die Nikon D50, aber eine Sequenzereinstellmöglichkeit hat sie nicht. Dafür kann man den Auslöser per IR-Fernsteuerung bedienen. Wenn man diesen in regelmäßigen Zeitabschnitten bedient, kann man die Fotos zu einem Zeitrafferfilm zusammensetzen - Wolkenbilder, das Aufblühen von Blumen, ... Nur wer hat schon die Zeit oder Lust sich einen Tag lang hinter die Kamera zu stellen und alle 10 Minuten einmal aus den Auslöser zu drücken.
Den preisgünstigen Drehencoder PANASONIC EVEQDBRL416B aus der Pollinliste irgendwo günstig einzusetzen hatte ich schon immer mal vor. Für 75 Cent bekommt man ein Drehteil, das pro 360 Grad 32 auswertbare Impluse liefert obwohl das Datenblatt nur 16 Impulse angibt. Beim Betrachten der Schaltergebnisse mittels DSO stellte sich heraus, dass die Schalter nicht einmal prellen. Zusätzlich besitzt das Teil einen Taster, den ich in diesem Projekt als Extraauslöser für die Kamera, eine Nikon D50, benutze. Mit Hilfe des Encoders kann man 32 (und beliebig mehr oder weniger) Pausenzeiten einstellen, nach deren Ablauf dann die IR-Diode feuert und den Auslöser bedient.
Die Controllerwahl fiehl auf den ATTiny2313, der von den Anschlüssen her bis auf 2 Pins und vom Flashspeicher her mit ca 85% ausgelastet ist. Neben dem Encoder und zwei Tastern werden eine Duo-LED und die IR-Diode sowie ein LCD bedient. Über eine Klinkenbuchse (3,5mm) kann die interne IR-LED ab- und ein externer IR-Minischeinwerfer aus 8 IR-LEDs zugeschaltet werden. Getaktet wird der Tiny mit 16MHz, was die bequeme Ableitung eines 1kHz-Taktes für das Pollen des Encoders abgibt. Außerdem ergeben sich günstige und exakte Stufen für die Zeitscheibensteuerung der LC-Anzeige sowie ein exakter Sekundentakt.
Etwas knifflig war das Abstimmen der 38,4 Sekundenbursts zur Erzeugung der Signale an die Nikon. Ursprünglich hatte ich den Einsatz eines zweiten Timers vor, was sich aber als nicht praktikabel erwies, weswegen diese Sequenzen mit abgeschaltetem IRQ einfach als Warteschleifen codiert sind. Erst nach dem kompletten Durchlauf der Auslösersequenz setzt der IRQ für die Pausenzeiten und eventuelle Encoderabtastung wieder ein.
Die Auswertung des Signals eines vorhandenen Chinanachbaus der Nikon-RC brachte teilweise recht voneinander abweichende Ergebnisse. Dabei zeigte sich eine starke Abhängigkeit zwischen der Entfernung zwischen Sender und Empfänger und der Impulsdauer. Als Empfänger für diese Messungen diente ein handelsüblicher IR-Decoder vom Typ TSOP1738. Dennoch zeichnete sich folgende Impulsfolge in Zusammenarbeit mit DSO und Impulsfolgemessung mit einem speziellen Messgerät (Eigenbau mit einem AVR-Innenleben) als Mittelwert ab:
Abb1: Impulsfolge der NIKON-IR Fernsteuerung
Abb. 2: Schaltung des Timers
Im Schaltbild weggelassen wurden die Klinkenbuchse für die externe IR-LED und die Rohrbuchse für die 9V-Versorgung (bis 12 V). Eine Batterie (9V-Block) und ein Schalter können an die Platine über Steckstifte angeschlossen werden. Die SPI ist wie bei meinen Schaltungen üblich einreihig und hier ebenfalls über gewinkelte Steckstifte herausgeführt. Die grünen Kabel im Foto führen zum LCD. Dahinter verbirgt sich die Duo-LED, die mit einem roten 1ms-Blitzer im Sekundentakt die Betriebsbereitschaft anzeigt. Die grüne LED leuchtet während der gesamten Auslösesequenz, die etwa 0,2 Sekunden dauert. Über der Klinkenbuchse sitzt die IR-LED. Das dicke Teil am oberen Rand der Platine ist der Drehencoder.
Abb.3: Der Prototyp
Die Platine ist einseitig und unkompliziert in der Herstellung. 0,7mm- und 1mm-Leiterbahnen bringen Kontaktsicherheit auch beim Bügelverfahren. Das Layout kann als PDF-Datei heruntergeladen werden. Es ist bereits gespiegelt, kann also nach dem Ausdruck mit der Druckseite auf die Kupferschicht gelegt und übertragen werden.
Abb. 4: Layout etwas vergrößert
Auch die Bestückung ist nicht schwierig. Bis auf die Blockkondensatoren am 78L05 und am Vcc-Anschluss des Tiny2313 wurden nur bedrahtete Bauteile verwendet. Die Blockkondensatoren mit 0µ1 sind aus der SMD Serie G0603 und müssen wegen ihrer nur 1,6x0,8mm schon mit der Pnzette und einem spitzen Lötgerät eingebaut werden.
Abb. 5: Bestückungsplan
Der Drehencoder als neues Mittel für das Auswählen oder Einstellen von Menüpunkten oder Parametern erforderte das Anlegen einer neuen Bibliothek, weil das Teil auch in anderen neuen Projekten Verwendung finden soll. Die Beschreibung dieses Programmteils erfolgt weitgehend getrennt von der eigentlichen Aufgabe des Sequenzerteils.
Verwendung des Drehencoders
Idealisiert liefern die Anschlüsse A und B des Drehencoders PANASONIC EVEQDBRL416B unter Zugrundelegung der abgebildeten Schaltung folgendes Impulsmuster. Die Frequenz ist natürlich abhängig von der Drehgeschwindigkeit des Knopfs. Einen festen Rhythmus gibt es demnach nicht.
Abb. 6: Testschaltung des Drehencoders
Die Beiden Schalter des Encoders A und B werden über Pullupwiderstände von ca. 10kOhm an Vcc (z.B. 5V+) angeschlossen. Der gemeinsame Schalteranschluss C liegt an Masse (GND). Im offenen Zustand der Schalter führen A und B Highpegel, wird ein Schalter geschlossen, geht der antsprechende Anschluss auf Low. In 16 von den 32 Rasterstellungen der Schalter sind die Kontakte beide abwechselnd offen oder geschlossen. Zwischen den Rasterstellen öffnen und schließen die Schalter leicht zeitversetzt. Abb. 7 zeigt das Zeitverhalten idealisiert.
Abb. 7: Das Impulsdiagramm des Encoders
Wegen der festen Rasterstellungen sind von den möglichen 4 logischen Zuständen (die einen einfachen 2-Bit-Graycode darstellen) leider nur zwei technisch ausnutzbar. Ich habe dabei die Wechsel zu den Rasterpositionen hergenommen.
Der Timer 0 des ATTiny2313 wird mit einem Vorteiler von 64 getaktet und das OCRA erhält den Wert 250 - 1 = 249. Das führt dazu, dass der Systemtakt von 16 MHz zunächst durch 64 geteilt wird, das macht 250kHz. nach 250 Zählvorgängen wird der Wert 249 erreicht, was einen Timer-Compare-IRQ auslöst. Der erfolgt also alle 1000µs = 1ms. In diesem Zeittakt werden die Schalter des Encoders abgetastet. Für das Projekt wurden die internen Pullupwiderstände verwendet. In der ISR - genauer in einem Unterprozess - werden die bisherigen Zustände der Eingangspins PB1(A) und PB0(B) in ein "Schiebe-"Register des Prozessors geschoben und die neuen Werte nehmen die Plätze der vorherigen ein. Auf diese Weise ergeben sich gültige und ungültige Zustände der unteren 4 Bit dieses Schieberegisters. Damit bei den nachfolgenden Vergleichen nur die 4 relevanten Bits untersucht werden, sorgt eine Maske 0x0F für das Ausblenden des Highnibble. Nun wird auf die vier gültigen Werte des Schieberegisters getestet. Nicht auswertbare Wechsel oder Stillstand des Derhknopfs werden dabei einfach übergangen, ebenso Werte, die sich evtl. durch ein Kontaktprellen ergeben würden. Nachdem durch das Drehen sowieso nur ein Zähler erhöht oder erniedrigt wird, wäre es auch egal ob einmal ein Zählvorgang zuviel auftritt.
Listing 1: Timer-Counter 0 Initialisierung
Rechtsdrehungen erhöhen nun einen Pointer (t_ptr), Linksdrehungen verringern ihn. Der Pointer dient dem Auslesen von Zeitwerten aus einer Tabelle von vorgegebenen Pausezeiten für den Sequenzerteil des Programms und wohnt im SRAM. Es wurde hier bewusst bis auf das Flagregister kein Prozessorregister verwendet (obwohl das einfacher vom Handling her gewesen wäre), weil dieser Pointer auch in der Bib definiert wird und nicht in die Registerverwaltung eines Hauptpragramms eingegriffen werden soll. Ebenso verhält es sich mit dem Zustandsspeicher des Encoders, der bei jedem IRQ fortgeschrieben wird.
Listing 2: Abfrage des Drehgebers endet im Setzen von Flags, die im Hauptprogramm
abgefragt und dann zurückgesetzt werden.
Die Drehgeberabfrage ist ganz neutral gehalten und stellt lediglich zwei Flags zur Verfügung, deren Auswertung in einem Hauptprogramm ganz unterschiedlich ausfallen kann. Die Hauptschleife des Sequencers demonstriert das. Die ausgeführten Unterprogramme sind alle in dem Modul "subroutines.asm" zu finden.
Listing 3: Das Hauptprogramm
Damit der Prozessor nicht zu sehr durch das Updaten des Displays aufgehalten wird, wurde ein Zähler (disp_cnt) eingeführt. Der Zähler wird mit einem frei wählbaren Wert vorbelegt und auf Null heruntergezählt
Die Hauptbestimmung des Programms - der Sequenzerteil
Timer 0 steuert, wie bereits angedeutet, nicht nur die Abtastung des Encoders obwohl aus diesem Grund die Konfiguration des Timers und die ISR des Output-Compare-IRQs extra in die Bibliothek des Encoders ausgelagert wurde. Die ISR bedient nach den alle 1000µs wiederkehrenden Abtasungen des Encoders zunächst 10 Zeitscheiben, die alle 10ms zyklisch durchlaufen werden. Zwei der Zeitscheiben werden genutzt, um die Taste an PD5 und die Encodertaste an PD6 abzufragen. Eingebaute Zähler sorgen für das Entprellen der Tasten und speziell bei der Taste an PD5 auch noch zusätzlich für das Decodieren eines Langzeitdrucks (t>1s) zum Ausschalten des Freilaufmodus.
Die nächste Zählstufe erfasst 100stel-Sekunden. Die Wiederholfrequenz dieser Zeitscheiben ist 1 Sekunde. In diesem Zusammenhang wird für eine 100stel-Sekunde die rote LED als Lebenszeichen des Systems eingeschaltet.
Im Sekundenrhythmus wird dann im Freilaufmodus der Sekunden-Countdown realisiert und ferner der Zähler für die Anzeige von temporären Informationen im LCD heruntergezählt.
Das Timing der IR-Diode machte anfangs Probleme, die durch die eingangs bereits erwähnten gemessenen Abweichungen bei den Impulslängen hervorgerufen wurden. Die vorliegende Lösung hat sich als praktikabel erwiesen. Dennoch wird an einer Lösung durch den Einsatz eines zweiten Timers (Timer 1 ist noch ungenutzt) via Interrupt gearbeitet. Dabei soll der Timer eine Frequenz von 38,4 kHz erzeugen, die für die Dauer der Impulse der IR-LED durchgeschaltet und sonst blockiert werden. Hilfreich für das Timing war die Seite von BigMike.it. Allerdings erforderte die höhere Taktfrequenz in meinem Projekt diverse Anpassungen der Routinen. Der Abgleich erfolgte teils mittels DSO und dem AVR-Studio. Letzteres stellt eine "Stoppuhr" zur Verfügung, mit der die Dauer einer Programmsequenz bei einer bestimmten zugrunde liegenden Taktfrequenz bestimmt werden kann.
Das gesamte Programmpaket nebst Bibs kann man hier herunterladen. Eine HEX-Datei zum sofort Brennen gibts auch. Die Fuses haben die Werte:
extended: 0xFF
High: 0xDF
Low: 0xFF
Layout als PDF, HEX-Datei, Programmpaket nebst Bibs