Elektronik / Uhrenbeweger mit Mikrocontroller wieder flott gemacht


Mein alter Herr hat mir zum Geburtstag neben einer Automatikuhr auch seinen alten, leider defekten Uhrenbeweger geschenkt. Er meinte: "Ich hab' da schon mal reingeschaut. Da ist nur so ein Käfer kaputt. Wenn du den austauscht, dann geht das bestimmt wieder."

Natürlich hat er vorher gefragt, ob ich den überhaupt möchte. Und natürlich habe ich ja gesagt, nachdem klar war, dass das nicht irgendso ein Billig-Ding war und dass ich gute Chancen hatte, das Teil wieder zum Laufen zu bringen. Ein neues Bastelprojekt und eine kleine Herausforderung...


Der "Käfer", um den es ging, sah mitleidserregend aus. Der war förmlich in zwei Teile explodiert. Der ist so ramponiert, dass es einen kleinen Platinenbrand gab, die kompleete Umgebung innerhalb von einem Zentimeter sieht verkohlt aus - als ob eine kleine Bombe eingeschlagen hätte. Das Bauteil selbst nur noch schwer zu entziffern, was das ist. Außerdem hat sich schon die eine Leiterbahn abgelöst.

Mit der Uhrmacherlupe und viel Geduld konnte ich das Bauteil dann als einen D882-NPN-Transistor ausmachen, dass wohl die Spannung für den Mikrocontroller liefert. Der Mikrocontroller allerdings ohne jegliche Beschriftung. Da kann ich natürlich nur raten, welche Spanung der braucht. Vielleicht hat auch der das Zeitliche gesegnet, wenn da eine Überspannung angelegt wurde. Und so sieht es ja aus.


Jetzt hab ich mir überlegt, ein passenden Ersatzbauteil zu bestellen. Der Transistor 2SD822 in nicht SMD-Variante hätte zwar nur 40 Cents gekostet, aber da kommen natürlich wieder ca. 6 Euro Versandkosten oben drauf. Für das Geld konnte ich im Prinzip auch einen der vielen Mikrocontroller, die ich rum rumfliegen habe benutzen und selbst programmieren.

Nach ein wenig Überlegen war das dann auch einzige Wahl, denn der Uhrenbeweger hat zwar ein paar Einstellregler für Geschwindigkeit und Drehrichtung, aber es gab keine Option, nachts ruhig zu sein. Und der einzige Raum, wo ich noch Platz habe, ich mein Schlafzimmer. Und da mag ich nachts nicht von den Geräuschen, die die Motoren des Uhrenbewegers wohl machen werden, gestört werden.

Ist-Analyse


Um den richtigen Mikrocontroller für die Aufgabe zu finden, musste ich erst einmal ein paar Eckwerte ausmessen: Das Netzteil liefert 4.5 Volt mit bis zu 1 Ampere, gemessene Leerlaufspannung ist 4.7 V. Die Motoren bewegen sich schon ab 1.0 Volt, dann aber sehr langsam (dafür geräuscharmer) und ziehen im Bereich bis 5 Volt nur etwa 10 mA.

Es kommt also zur Steuerung ein 5V Arduino oder auch ein 3.3V Mikrocontroller mit 5V Eingang und Spannungswandler (Blue Pill, 8266 Board) in Frage.

Da das Gerät in meinem Schlafzimmer stehen soll, soll es nachts Pause mache, da mich Geräusche stören würden. Darum soll der Mikrocontroller eine Uhr haben, um zu wissen, wann Pause ist.

Die BluePill mit STM32 und integrierter Echtzeituhr (RTC) scheint eine gute Wahl. Ich habe einmal 4.5V an die 5V-Leitung angeschlossen und bekomme damit trotzdem saubere 3.3V für die Versorgung des STM32. Der Drop-Down-Spannungswandler macht also gute Arbeit. Damit kann ich das Original-Netzteil weiterverwenden und die Original-Stromanschlussbuchse so lassen.


Ich habe überlegt, ob ich die Wahlschalter irgendwie integrieren soll, etwa den I ... IV-Schalter zur Wahl der Geschwindigkeit. Aber eigentlich ich das Unsinn. Denn es wird nur einen Betriebsmodus geben, die ich brauche: den genau auf meine Bedürfnisse zugeschnittenen. Und den kann ich ganz individuell in Firmware programmieren.


Löcher möchte ich allerdings auch nicht in der Rückwand haben, also bleiben die Wahlschalter, wo sie sind, aber bleiben unbelegt.

Da die beiden Motoren nur 10 mA benötigen, kann ich das leicht über je einen Pin pro Motor am STM32 handeln. Normalerweise müsste auch PWM mit den Motoren funktionieren, so dass ich die gewünschte Geschwindigkeit bzw. was wichtiger ist, Lautstärke darüber regeln kann. PWM-regulierbare Pins hat die Blue Pill ja genügend.

Test der Motoren

Das sollte mein erster Test sein: Einen Motor über PWM steuern und schauen, ob und wie sich der Motor dabei bewegt. #include <Arduino.h> #include "defines.h" void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN,HIGH); // und erstmal aus pinMode(PinMotor1, PWM); // pinMode(PinMotor2, PWM); } void loop() { analogWrite(PinMotor1, 0); // Motor aus delay (2000); int step = 25; for (int duty=255; duty > 0; duty -= step) { for (int i=0; i < duty/step; i++) { digitalWrite(LED_BUILTIN,LOW); delay(200); digitalWrite(LED_BUILTIN,HIGH); delay(200); } analogWrite(PinMotor1, duty); delay (2000); analogWrite(PinMotor1, 0); delay (1000); } } Und so wirkt sich das aus:



Das Programm fängt mit voller Power (3.3 V, max. Duty Cycle 255) an, den Motor zu drehen. Ein bisschen hört man ihn schon, aber so laut ist er dann auch wieder nicht. ICh weiß jetzt aber auch nicht, wie sich das Gehäuse auswirkt... ist es eher schalldämpfend, weil geschlossen, oder übertragen sich die Vibrationen aus den Kasten und der wirkt dann wie ein Resonanzkörper?

Dann geht er in 25er Schritte runter. Stufe 4 unter darunter sind nicht mehr zu gebrauchen, da dreht sich der Motor nicht mehr oder nicht mehr stabil. Und je geringer die Stufe ist, desto langsamer dreht sich der Teller, was heißt, ich muss länger drehen, damit die Uhren aufgezogen bleiben.

Ich glaube, Stufe 6 oder 7 sind ein guter Kompromiss zwischen Lautstärke und Geschwindigkeit. Damit liegt der ideale Duty Cycle zwischen 155 und 180.

Testen wir das in diesem Bereich noch ein wenig feiner aus: ... int step = 5; for (int duty=180; duty >= 155; duty -= step) { for (int i=0; i < (duty-150)/step; i++) { digitalWrite(LED_BUILTIN,LOW); delay(200); digitalWrite(LED_BUILTIN,HIGH); delay(200); } analogWrite(PinMotor1, duty); delay (2000); analogWrite(PinMotor1, 0); delay (1000); } ...


Am ruhigsten laufen hier Stufe 3 (Duty Cycle 165) und Stufe 2 (Duty Cyle 160).

Und einen letzten, ganz genauen Test können wir machen mit: ... int step = 1; for (int duty=160; duty >= 155; duty -= step) { for (int i=0; i < (duty-155)/step; i++) { digitalWrite(LED_BUILTIN,LOW); delay(200); digitalWrite(LED_BUILTIN,HIGH); delay(200); } analogWrite(PinMotor1, duty); delay (2000); //analogWrite(PinMotor1, 0); //delay (1000); } ...


LEDs anschließen

Erst habe ich überlegt, ob ich die LEDs auch anschließen soll. Ich finde die ja nicht schön. Aber die sind mit Heißkleber festgeklebt und nicht so einfach zu entfernen, und wenn, dann bleibt ein Loch. Und wenn sie schon da sind, kann es auch nicht schaden, dass sie leuchten, wenn der Motor sich bewegt. So könnte ich schnell erkennen, dass was mit dem Motor nicht stimmt, wenn die LED leuchtet und der Motor nicht dreht.

Als Vorwiderstände für die LEDs habe ich 150 Ohm genommen, was gut passt. Dann habe ich den Uhrbeweger noch einmal mit Ladung, also 4 Automatik-Uhren, und die sind ja nicht unbedingt Leichtgewichte, getestet. Und leider stellte sich da heraus, dass hin und wieder einer der Motoren nicht anlief. Also bin ich dann doch auf vollen Duty Cycle, also 3.3 Volt Spannung gegangen. Damit gibt es keine Hängenbleiber. Es dauert so ungefähr 10 Sekunden, bis sich eine Uhr einmal komplett um die eigene Achse gedreht hat.



Ein LCD zur Zeitanzeige

Wenn die Zeit eh schon gesetzt, verwaltet und batterie-gepuffert werden muss, dann kann ich sie ja eigentlich auch gleich anzeigen. Dann habe ich auch gleich was, um meine Uhren zu stellen. Ja, eine Uhrzeit-Anzeige macht Sinn.

Erst hatte ich ein DOGM163-LCD im Sinn, die ich letztens günstig geschossen habe. Die haben 3 Zeilen à 16 Zeichen, also genug zur Anzeige von Datum und Uhrzeit. Nur sind sie a) doch ein bisschen groß, brauchen b) noch Zusatzkondensatoren, damit also noch ein kleines Extraplatinchen und c) würden sie nur unten hinpassen.

Ich habe aber mal den Motorenteil in den Kasten eingebaut und diesen zugeklappt und bemerkt, dass man durch die Scheibe eigentlich besser das sieht, was oben zwischen den beiden Uhrenmotoren ist. Da ist allerdings nicht viel Platz. Aber für ein kleines OLED reicht es. Und mit der richtigen (größeren) Schriftart kann man das auch gut ablesen. Außerdem braucht das dank I2C-Anbindung nur 4 Kabel, die herausgeführt werden müssen. Das ist mit einem kleinen Loch in der Rückwand getan.


Für das OLED hatte ich ja bereits ein fast quadratisches Schutz-Gehäuse mit OpenSCAD designed. Das habe ich nun um eine 1 mm starke Fläche erweitert, aus der ich dann die zwei Zylinder für die Motoren ausgeschnitten habe. Das genaue Abmessen hat sich gelohnt: schon der erste 3D-Druck passte genau zwischen die beiden Motoren.

Ich habe die Einlage mit meinem Anycubic i3 mega mit transparentem PLA gedruckt, so dass der hellgraue Samt durchscheint und man die Einlage so gut wie nicht sieht. Durch die genaue Passform droht die Einlage nicht zu verrutschen oder herauszufallen, den Kleber kann ich mir also sparen.

Allerdings musste ich ein paar Millimeter aus der MDF-Platte schneiden, damit die Pins vom OLED durchpassen. Ein erster Test zeigte dann aber, dass di ePin-Header zu weit hineinragen und die Platte nicht mehr ganz bis nach hinten durchgeht bzw. aufgelegt werden konnte. Also musste ich noch einmal Pin-Header im 90°-Winkel anlöten, damit die Kabel dann um die Kante gehen und hinten auf der Platte plan aufliegen.

Da die sonstigen Designelemente (die beiden Ringe um die Motoren) in schwarz gehalten sind, habe ich noch einen Deckel für das OLED designt und in dieser Farbe gedruckt. Der macht das OLED natürlich nochmal eine Winzigkeit größer, aber welch Zufall passt das OLED ganz genau in die Lücke. Größer hätte es dann auch nicht werden dürfen.

Neu verdrahted



Da die Regler an der Gehäuserückseite ja nicht mehr gebraucht werden, kann ich mir die ganze Kabellage von dort aus sparen und haben den Mikrocontroller, eine Blue Pill direkt auf die Rückseite eines Motorgehäuses geklebt. So konnte ich sogar kurze Kabel für das OLED-Display benutzen.

Ansonsten habe ich die langen Kabel von den beiden Motoren und LEDs einfach mit Jumperkabeln erweitert, die ließen sich ganz gut in die Molex-Buchsen stecken. Natürlich haber ich auch nicht vergessen, Vor-Widerstände für die LEDs einzubauen.

Die einzigen Kabel, die zur Außenwelt gehen bzw. kommen, sind die beiden Kabel vom Neztteil zur Versorgung von Mikrocontroller, Motoren, OLED und LEDs und die Batteriebufferung für die Echtzeituhr, die am Boden des Gehäuses Platz findet. Mit der bleibt die Uhrzeit auch erhalten, wenn ich den Uhrenbeweger vom Strom trenne.

In der Hoffnung, dass der Irrsinn mit der Sommerzeit und Winterzeit-Umstellungs-Kasperei bald ein Ende findet, habe ich keine automatische Zeitumstellung einprogrammiert. Das heißt: zur Zeitumstellung muss der Beweger dann kurz an den PC oder das Smartphone, um die Uhrzeit über die serielle Schnittstelle über USB neu zu stellen.

Mit den ganzen Kabeln und Drumherum passt die Platte gerade so wieder an seinen Platz und schließt schön ab. Die kleine Lücke in der Platte zur Kabelsdurchführung sieht man gar nicht, denn die wird vom OLED überdeckt.

Endergebnis



Den Platz oben für das Display zu nehmen, war eine gute Wahl. So kann man aus einem Meter Entfernung noch die Uhrzeit ablesen und muss nicht direkt von oben rein schauen. Am unteren Rand würde das Display völlig untergehen, stünde man nicht direkt davor und schaute man direkt hinein.



Und aufgeklappt ist es eigentlich egal, ob das Display oben oder unten ist. Das sieht man so oder so gut.

Ich zeige Uhrzeit, Wochentag und Datum an und das in einer großen Schriftart, so dass man es gut ablesen kann. So weiß ich beim etwaigen Stellen einer Uhr gleich, wie spät und welcher Tag es ist.

Ich habe die Uhr derzeit so programmiert, dass sie zwischen 23 und 9 Uhr in den Nachtmodus geht, sich dann also nichts dreht, Ansonsten dreht Sie sich zu jeden voellen 20 Minuten für 3 Minuten und macht dann 17 Minuten Pause. So sollten die Uhren es während des Tages auf etwa 950 Umdrehungen bringen. Normalerweise ist damit die Gangreserve wieder ganz voll und die beträgt in der Regel 24 Stunden. Aber nach 10 Stunden geht das Bewegen ja bereits wieder von vorne los.

Mit der Einstellung sollte ich auf der sicheren Seite sein und meine Uhren nicht mehr jedesmal stellen müssen, wenn ich sie mal wechsle.

Ich habe noch ein kurzes Video vom Endergebnis gemacht:



Um 15:03 stoppen die Motoren. Die laufen so leise, dass man den Unterschied zwischen Motorengeräusch und Mikrofonrauschen der Kamera kaum wahrnimmt.