Uhrzeit aufgeschrieben - Die Stiftuhr

Wer im Netz nach dem Begriff Plotclock sucht, der findet eine faszinierende Spielerei. Eine Vorrichtung aus Servomotoren und Hebelarmen schreibt, von einem Mikrocomputer gesteuert die Uhrzeit mit einem Whiteboardstift auf, und wischt anschließend alles wieder weg. Wenn man den Ausführungen im Netz Glauben darf, so war diese Uhr ursprünglich dafür gedacht, die Aufmerksamkeit von Zuhörer aufrecht zu erhalten, und die Einhaltung von Vortragszeiten zu unterstützen. Diese Uhr kann man als Bausatz kaufen, und die entsprechende Bauanleitung gibt's im Netz. Ich möchte mich aber ohne vorlage daran versuchen Ich bin nicht sicher, ob der Name plotclock nicht urheberrechtlich geschützt ist. Daher heißt mein Projekt Stiftuhr.

Das Prinzip

Die Uhr ist ziemlich einfach aufgebaut. Als Steuerelement verwende ich einen Atmega8 Mikroprozessor. Die Schaltung wird eine Batteriespeisung erhalten, spannungsstabilisiert und mit einer Spannungsüberwachung versehen. Eine Uhr zu programmieren ist nicht wirklich schwer. Die Uhrzeit muss aber erstmal aus dem Chip heraus. Der Atmega8 verfügt über zwei Ausgänge für Pulsweitenmodulation (PWM) Damit lassen sich 2 Servos ansteuern.


Die Skizze soll den Schreibvorgang des mechanischen Teils erläutern. Durch verschiedene Winkelstellungen der Servos kann der Stift am Ende der Hebel jeden Punkt der geplanten Schrift anfahren. Mathematisch kann der Punkt des Kniegelenks durch das Schneiden beider Kreise errechnet werden. Danach lässt sich die Winkelstellung des Servos mit einer Winkelfunktion errechnen. Das Ganze geht auch mit der Berechnung verschiedener Dreiecke. Aber dazu unten mehr. Der Drehpfeil soll die Funktion des dritten Servos (hier nicht dargestellt) zeigen. Wird die ganze Vorrichtung gekippt, dann hebt sich der Stift.

Um bei diesem Projekt einigermaßen voranzukommen, muss ich das Problem in kleinere Schritte zerlegen. Zu viele Komponenten spielen hier zusammen. Der mechanische Aufbau dürfte keine Schwierigkeiten bieten. Deshalb wird dieser Teil erstmal nach hinten verschoben. Vordringlich ist erstmal die Einarbeitung in die Programmierung, sowie die mathematischen Grundlagen. Erstes Ergebnis der Programmierarbeit ist die in diesem Zusammenhang entstandene Binäruhr. Als nächsten Schritt beschäftigte ich mich mit der Erzeugung von PWM-Signalen (Puls-Weiten-Modulation) zur Steuerung der Modellbauservos. Nach anfänglichen Schwierigkeiten gelingt dies nun auch auf verschiedenste Arten einwandfrei. 

Im Internet gibt es dazu ausführliche Beschreibungen über die Signalauslegung. 

Nun wird es mathematisch. Es gilt ein Verfahren zu entwickeln wie die einzelnen Punkte der Ziffern zu ermittelt sind, deren Koordinaten zu bestimmen um daraus die entsprechenden Winkelstellungen der Servos zu berechnen. 

Danach soll das Verfahren in ein Programm gewandelt werden um die erreichbare Genauigkeit der Winkelwiederholung zu prüfen. Erst dann wird die Uhr aufgebaut und mechanisch komplettiert.

Zwischenbericht

Inzwischen ist der mechanische Aufbau der Stiftuhr fertig. Wenn man im Web nach diesem Modell sucht, hat man den Eindruck dass ein solches Modell ohne 3D-Drucker gar nicht zu bauen ist. Mein Aufbau ist etwas stabiler und schwerer geraten, da ich bekanntlich ein Freund des Stahls bin. Das Ergebnis ist ein sehr stabiler Aufbau, der Platz für die kleine Schaltung und 3 Steuertasten bietet. Als Besonderheit ist zu erwähnen, dass der Drehpunkt in die Stiftachse gelegt wurde. Wie sich bestätigte, wird dadurch eine größere Genauigkeit erreicht.


Abschlussbericht

Das Ding kostete mir so einiges an Nerven. Aber mit der mir angeborenen Sturheit konnte ich die Uhr heute fertigstellen. Die Servosteuerung wollte Anfangs einfach nicht klappen. Nach unzähligen Programmierversuchen und Stunden der Problemlösung (auch mit Netzhilfe) stellte sich heraus, dass bei den Fusebites ein Häkchen falsch gesetzt war. Danach lief alles reibungslos. 

Das Schriftbild ist ziemlich wackelig, aber bei der von mir gewählten Methode konnte ich die Genauigkeit nicht weiter erhöhen. Für mich ist das Schriftbild lesbar und somit ausreichend.

Berechnung der Stellwinkel

Für die Berechnung der Servostellwinkel gibt es mehrere Möglichkeiten. Sicherlich gibt es viele bessere und genauere Methoden um die Servoposition zu ermitteln, aber ich versuche im Modellbau meistens eigene Lösungen zu erarbeiten.

Die oben beschriebene Lösung über den Schnittpunkt zweier Kreise musste ich verwerfen, da der verwendete ATMEGA8 zwar einiges leistet, aber sobald Gleitkommazahlen ins Spiel kommen sehr schnell seine Grenzen erreicht.  

Die nächste von mir erprobte Methode passiert auf der in der Skizze dargestellten Beziehung von Dreiecken und deren Winkeln. Mit dem Satz von Pythagoras und dem COS-Satz lässt sich der Stellwinkel des Servos ermitteln. Auch hier besteht die Notwendigkeit des Wurzelziehens und der Umsetzung der Sinus- und Cosinusfunktion. Wie gesagt, Kommazahlen sind der Tod des ATMEGA8, und so multiplizierte ich die jeweiligen Zahlen mit dem Faktor 100 und erhielt so ganzzahlige Werte.  

Das ziehen der Quadratwurzel löste ich wie folgt. In einem Unterprogramm wird die zu berechnende Zahl durch 100 geteilt. In einer Schleife wird nun dieser Wert (x) mit sich selbst multipliziert (x^2) und mit der Ausgangszahl verglichen. Mit jedem Schleifendurchgang wird x nun um 1 erhöht, bis der Wert x^2 mit der Ausgangszahl übereinstimmt. Die Genauigkeit ist natürlich nicht besonders hoch, aber für die weiteren Berechnungen ausreichend.


Die Berechnung des Winkels bei vorgegebenem Sinus- oder Cosinuswert löste ich in folgender Weise.

Ich erstellte eine Sinustabelle mit 180 Werten (0,5°). Diese Werte wurden mit 100 multipliziert, um ganzzahlige Werte zu erhalten und in einem Array gespeichert. Dem Unterprogramm wird der Sinuswert (oder Cosinuswert) mit einem Index (0 für Sinus, 1 für Cosinus) übergeben.

In einer Schleife wird nun von 0-180 (für Sinuswerte) oder von 180-0 (für Cosinuswerte) gezählt und der jeweilige übergebenen Wert mit der Tabelle verglichen. Stimmt er Wert überein, so ist der jeweilige Zählerstand /2 der gesuchte Winkel. Dieser Winkel wird dann zurückgegeben.


Die Tests ergaben eine brauchbare Genauigkeit, jedoch war ich mit dem Aufwand ziemlich unzufrieden. Ich dachte mir, das muss ja noch einfacher gehen.


Die dritte Methode bedient sich wieder des Satzes von Pythagoras, und verwendet aber nur mehr die Sinusfunktion.

In einer Schleife wird der Wert yH bis zur vollen Hebellänge (40mm) hochgezählt. Aus diesem Wert und der vorgegebenen Hebellänge H kann xH unter Verwendung der Wurzelfunktion berechnet werden. YA lässt sich leicht aus YH und Y-Wert des Punktes P errechnen. Ebenso einfach kann XA aus den Werten XS und XH, sowie XP errechnet werden. In einer abschließenden Abfrage wird geprüft, ob YA^2 + XA^2 = Armlänge (55) ist. Mit diesem YH-Wert lässt sich mit der Sin-Funktion auf den gesuchten Winkel zurückrechnen.


Das Ergebnis ist eine schnelle Berechnung, welche eine zufriedenstellende Genauigkeit liefert.


Zifferndarstellung und Zeitfunktion

Die Ziffern von 0 – 1 wurden in einem Array punktweise (x/y) gespeichert. Das jeweilige Wertepaar wird an die Berechnungsroutine übergeben und dargestellt – also keine Hexerei.

Der Timer0 liefert die Grundlage für ein sec,min,h Zählwerk. Über die 3 Tasten und den 2 Anzeigebausteinen (7-Segmentanzeige) kann die Uhrzeit eingestellt werden.

Bei jeder Änderung des Minutenstandes wird die alte Darstellung gelöscht, und die neue Zeit geschrieben.

Abschlussbemerkung

  • Der Mechanische Aufbau bereitete keinerlei Schwierigkeiten.
  • Der Werkstoff Polystyrol ist zwar leicht zu bearbeiten, versaut aber meine geliebte Fräse doch ziemlich :-)
  • Die Hardware der Elektronik ist einfach herzustellen und mittels Lochrasterplatine aufzubauen
  • Eine zu starre Verbindung der Hebelarme führt zum Rucken und Zittern der Servos. Dies rührt daher, dass ein Servo versucht die angefahrene Position zu halten und auch bei kleinen Änderungen gegensteuert. Das hat zur Folge, dass das zweite Servo in ähnlicher Weise reagiert. Die Folge ist ein gegenseitiges Aufschauckeln. Spiel in den Gelenken schafft Abhilfe, geht natürlich auf Kosten der Genauigkeit.
  • Eine getrennte Versorgung der Servos und der Schaltung mit separater Spannungsquelle wurde nicht vorgesehen, und ist offensichtlich nicht notwendig.
  • Das Programm lässt sich sicher wesentlich eleganter Aufbauen und schreiben, Programmierprofis mögen mir den Laienhaften Stil verzeihen.


Das Projekt hat unheimlich viel Spass gemacht. Herausforderungen annehmen, Problemstellungen bearbeiten und dann Lösungen finden ist für mich die Hauptsache bei diesem Hobby

....und als Abschluss noch der Videobeweis, dass das Maschinchen funktioniert.

Download
C++ Programm
Programm.pdf
Adobe Acrobat Dokument 67.1 KB