DAC-Uhr-Steampunk


Seltsamerweise finden im 21. Jahrhundert die kuriose Kombination von HighTech mit dem Design der viktorianischen Zeit faszinierend. In einer Welt, in der man Geräte weder versteht noch öffnen kann, sehnen wir uns vielleicht nach dieser greifbaren Technik im Jules Verne Stil. Die c't Hacks 1/2014 hat Steampunk sogar zum Titelthema gemacht. Auch wenn ich mich mit Superprofis dieser Disziplin wie dem http://thechocolatist.com nicht messen kann, habe ich mich an ein kleineres Projekt herangewagt, das ich hier für eventuelle Nachbauer dokumentiere.
Meine DAC-Uhr habe ich innerlich mit Mikrocontroller modernisiert und äußerlich gealtert.

Bild "DACUhr-Steam-vorne-small.jpg"  
Wie bei der DAC-Uhr liest man die Uhrzeit auf zwei Zeigerinstrumenten ab. Die Zahnräder auf der Vorderseite haben keine Funktion, lassen sich aber drehen. Sie stammen aus einer uralten Parkuhr. Die Achse unten links lässt sich eindrücken. Damit wird die Uhr auf Schnellvorlauf geschaltet, was man zu Stellen der Uhrzeit braucht.

Bild "DACUhr-Steam-hinten-small.jpg"
Die geschwungenen Blechstreifen auf der Rückseite leiten die analogen Ausgänge der Uhrenelektronik zu den Instrumenten. Man sieht leider auch ein neuzeitliches Netzkabel. Da der verwendete Mikrocontroller nicht sehr stromsparend ist, habe ich ein Netzteil eines Handys verwendet als Stromversorgung.

Messinginstrumente

Steampunk bedeutet im Wesentlichen dunkles Holz (z.B. Mahagoni) in Kombination mit Messing.
Da keine Voltmeter mit Messingrahmen auffindbar waren, habe ich zum Selbstbau gegriffen.

Die Instrumente entstammen einem Kassettendeck der 80er Jahre. Die Aussteuerungsanzeigen sollen eine logarithmische Charakteristik zeigen und somit ist der Zusammenhang von anliegender Spannung und Ausschlag nicht linear. Für die originale DAC-Uhr wäre sie nicht verwendbar. Da hier eine Mikrocontroller verwendet wird, kann das aber leicht kompensiert werden.
Bild "DACUhr-Steam-Drehspu-small.jpg"

Ideal wäre ein massiver Messingflansch als Rand für die Instrumente. Bei mir mussten Halogenstrahler in Messingoptik herhalten. Die bestehen zwar aus Stahl und sind nur messingbeschichtet. Die Optik ist aber für meinen Geschmack immer noch gut.
Die folgenden Bilder zeigen, wie ich die Ringe aus den Lampen gewonnen habe.
Bild "DACUhr-Steam-Lampe-small.jpg"  Bild "DACUhr-Steam-Schraubstock-small.jpg"

Bild "DACUhr-Steam-Dremel.JPG" Bild "DACUhr-Steam-gesaegt-small.jpg"
Zunächst habe ich den vorderen Ring mit Eisensäge und Dremel grob abgesägt.

Bild "DACUhr-Steam-Schlitz.JPG"  Bild "DACUhr-Steam-Ringe-small.jpg"
Um den eigentlichen Frontring zu lösen habe ich das verbleibenden Material geschlitzt und vom Lampenkörper abgezogen.  

Die Instrumente habe ich von ihren Kunstoffgehäusen befreit und die Skalen entfernt. Im Bild unten sieht man, die endgültige runde Form, die ich hier mit grünem Filzstift aufgezeichnet habe. Mit einer Laubsäge ließ sich das Instrument dann zuschneiden.
Bild "DACUhr-Steam-Teardown-small.jpg"
Da der Messingring einen breiten Rand hat brauchte ich beim Sägen nicht sehr genau zu arbeiten. Der ausgefranste Rand des Plastikgehäuses verschwindet unter dem Messingrand.

Bild "DACUhr-Steam-Gold-small.jpg"
Aussteuerungsanzeigen haben rote Zeiger. Da das hier natürlich gar nicht passt, habe ich sie mit Goldbronze aus der Dose vorsichtig ihrer messingfarbenen Umgebung angeglichen.

Bild "DACUhr-Steam-Instrument1-small.jpg"
So sieht dann der Rohbau des Instruments aus.

Mahagonigehäuse

Üblicherweise bestehen Gehäuse aus einer hohlen Kiste. Bei mir ist es aus einer massiven Treppenstufe, die bei einer Hausrenovierung übrig geblieben ist. Das Material ist echtes Mahagoni. Natürlich könnte man auch ein helles Holz verwenden, das man dunkel beizt oder lasiert.
Die Ausschnitte für die Instrumente habe ich mit einer Oberfräse erstellt. Hierzu stellte ich zuerst eine Schablone her, an der ich die Oberfräse mit einer Kopierhülse entlanggeführt habe. Siehe Bild unten.
Bild "DACUhr-Steam-Oberfraese.JPG"

Um das Messwerk komplett unterzubringen musste ich noch eine weitere Vertiefung bohren, was sich gut mit einem Forstnerbohrer machen ließ.
Bild "DACUhr-Gefräst-small.jpg"
Je zwei Bohrungen nehmen Messingschrauben auf, die auf der Rückseite herausstehen. An die Schraubenköpfe habe ich Litzen gelötet, die an die Anschlüsse der Instrumente führen. So kann mit den sichtbaren Messingblechen auf der Rückseite das analoge Signal jeweils zum Instrument geleitet werden.

Stunden- und Minutenskala

Damit das einerseits nicht nach simplem Papier aussieht und andererseits antik, habe ich die Skalen auf Fotopapier gedruckt. Den Hintergrund wählte ich etwas vergilbt. Die Messwerke habe ich durch Messingbleche verdeckt, die sich gut mittels 5-Minuten-Epoxy einkleben ließen. Da ich überall 0.4mm Blechstärke verwendet habe, konnte ich alles mit einer Haushaltsschere zuschneiden. Hier hilft es dem Familienfrieden, wenn man nicht die edle Schneiderschere der Ehefrau verwendet... ;)
Bild "DACUhr-SteamInstr-small.JPG"

Hier die Skalen zum herunterladen in skalierbarer Grafik: Skalen.svg

Elektronik

Wie bereits in anderen Projekten, habe ich einen ATMega168 Mikrocontroller verwendet, dem ich vorher ein Arduino-Bootloader verpasst habe. Wie das geht, sieht man auf Surasto hier: Arduino

Die Schaltung ist minimalistisch und kann daher auf Lochraster aufgebaut werden.
Bild "DACUhrMinimal-Arduino.png"
Bei meinen Instrumenten habe ich 10kOhm Vorwiderstände verwendet. Welche Werte gut passen, sollte man jeweils für die verwendeten Messwerke ausprobieren.

Bild "DACUhr-Steam-Rueckseite.JPG"

Software

Die Standard-Library des Arduino bietet bereits mit der Funktion millis() einen einfachen Timer an, der exakt die Anzahl Millisekunden zurückliefert, die seit dem Einschalten des Controllers vergangen sind. Auf dieser Basis lassen sich Timer und Uhren programmieren.
Noch einfacher geht es mit der Library „Time“, die man auch auf der Homepage des Arduino (http://arduino.cc) im Bereich „Playground“ herunterladen kann.

Für die DAC Uhr werden lediglich vier Funktionen dieser Library gebraucht:
setTime(...) - Zum Setzen der Uhr auf einen definierten Anfangswert nach dem Einschalten
minute() - Auslesen der Minute
hourFormat12() - Auslesen der Stunden im klassischen 12 Stunden Format
adjustTime(60) – Zum schnellen Vorlauf der Uhr bei gedrücktem Stellknopf

Da meine Anzeigeinstrumente aus einem alten Tapedeck stammten, war bei diesen der Zusammenhang zwischen angelegter Spannung und Ausschlagwinkel des Zeigers sehr nicht-linear. Durch Ausprobieren habe ich den Zusammenhang von angelegter Spannung und Zeigerausschlag vermessen.












Durch eine Lookup-Table mit den 12 Stützpunkten und den zugehörigen Werten für die analogen Ausgänge, lassen sich die Stunden und Minuten auf linearen Skalen abbilden. Damit die Uhrzeit auch wirklich analog dargestellt wird, habe ich die Werte zwischen den Stützstellen linear interpoliert. Die Abweichung von der Idealline ist dabei trotz der geraden Kurvenabschnitte minimal.

Wie bei jeder Arduino-Sketch gibt es auch hier einen Initialisierungsteil, der nur einmal nach dem Einschalten der Spannungsversorgung durchlaufen wird:

#include <Time.h>

// Definition der Ports des ATMega168
int MINUTEN = 10;
int STUNDEN = 9;
int TASTER = 8;

//Wertebereich (Muss individuell an die Instrumente angepasst werden)
int H[] = {0,12,29,40,51,62,75,93,116,150,180,230};
int MIN[] = {0,20,30,37,45,54,65,80,97,120,150,190};

// Wird einmal nach dem Einschalten der Betriebsspannung durchlaufen
void setup() {
   pinMode(MINUTEN, OUTPUT);
   pinMode(STUNDEN, OUTPUT);
   pinMode(TASTER, INPUT);
   setTime(1,0,0,1,1,11); //Uhrzeit = 1 Uhr 0 Minuten
}


Der #include Befehl stellt dem Programm die nötigen Header für die Time Library zur Verfügung. Die Konstanten MINUTEN, STUNDEN und TASTER legen die Zuordung der Ein- und Ausgänge des Mikrocontrollers fest und müssen zu der Schaltung passen. Hierbei bitte beachten, dass nur wenige Pins analoge PWM Signale ausgeben können.

Die Arrays H[ ] und MIN[ ] enthalten die Stützpunkte der nicht-linearen Messgeräte-Kennlinien.
Schließlich werden in der zu Beginn ausgeführten setup()-Funktion die Ausgänge und der
Eingang konfiguriert und die Uhrzeit auf 1 Uhr und 0 Minuten gestellt.

void loop() {  
    // Wenn der Taster gedrückt ist, wird die Stellroutine durchlaufen
    if (digitalRead(TASTER)==LOW) {
       adjustTime(60); // Um 60 Sekunden weiter springen
    }

    // Update der Meßgeräte
    writeInstruments(hourFormat12(),minute());

   // 100 Millisekunden Wartezeit zwischen den Updates der Uhrzeit
   // das bedeutet auch, dass beim Stellen alle 100ms um eine Minute weitergestellt wird
   delay(100);
}

Die Standardfunktion loop() wird beim Arduino automatisch endlos wiederholt. Bei der Arduino-DACUhr wird hier lediglich die Funktion zum Schreiben der analogen Ausgänge aufgerufen, 100 Millisekunden gewartet und dann der gleiche Vorgang wiederholt.
Bei gedrücktem Taster (digitalRead(Taster)==LOW), wird alle 100 Millisekunden die Zeit um 60 Sekunden mit dem Befehl adjustTime(60) vorgestellt. Die Uhr läuft also schneller und kann so bis zur gewünschten Uhrzeit gefahren werden. Ein Zwölfstundentag vergeht dabei in 60x12*0.1 Sekunde = 72 Sekunden.

void writeInstruments(int stunden, int minuten) {
   int Std, Min, i,j;
   float wert1, wert2, floatMin, floatStd;

   // Lineare Interpolation der Minuten
   i = minuten/5;
   wert1 = MIN[i];
   if (i<11) {
       wert2 = MIN[i+1];
       j = minuten - i*5; // Rest der Division
       floatMin = wert1 + (wert2-wert1)*j/5; // Interpolation
   }
   else floatMin = wert1;

   // Lineare Interpolation der Stunden
   wert1 = H[stunden-1];
   if (stunden<12) {
      wert2 = H[stunden];
      floatStd = wert1 + (wert2-wert1)*minuten/60; // Interpolation
   } else floatStd = wert1;
   analogWrite(MINUTEN, (int) floatMin);
   analogWrite(STUNDEN, (int) floatStd);

}

Um einen analogen Eindruck zu erhalten, reicht es nicht, bei jeder Stunde auf den nächsten Wert der Lookup-Table zu springen. Die Minuten-Lookup-Table ist im 5 Minuten-Raster quantisiert. Auch hier soll es Zwischenwerte geben.
Für die Minutenanzeige werden daher jeweils zwei benachbarte Werte der Lookup-Table verwendet. Die Stützstellen ergeben sich aus der Division der Minuten durch 5. Die Zwischenwerte lassen sich dann basiert auf dem Rest der Division linear interpolieren (Dreisatz).
Bei den Stunden werden die Zwischenwerte auf Basis der Minuten interpoliert. So dass der Stundenzeiger auch tatsächlich z.B. um 9:30 Uhr in der Mitte zwischen der 9 und der 10 steht. Damit die Formeln funktionieren, muss mit floating-point Zahlen gerechnet werden, die dann als Parameter für analogWrite() per type cast wieder zu integer werden.

Download des Arduino-Sketch: DACUhr.ino

Die Uhr läuft nun seit einiger Zeit fehlerfrei. Die Kombination von Messing, Mahagoni und Mikrocontroller bewährt sich nun im Wohnzimmer als Schmuckstück im viktorianischen hightech Stil.

Der Artikel zur Uhr

Mehr dazu auch in der c't Hacks 4/2014, in der ein Nachbauvorschlag mit einem Real Time Clock Modul gezeigt wird.
Link zur Zeitschrift

Bild "DACUhr-Steam-SurastoTitel-small.jpg"