ESP32-basierte Steuerung von Nebenuhren mit dem L293D H-Brücken-Treiber
Vor ein paar Wochen habe ich recht günstig eine wunderschöne Nebenuhr der Firma Siemens erworben. Mit ihrem Durchmesser von 42 cm, sowie dem schlichten und zeitlosen Design, hat diese Uhr auch nach all den Jahren nichts von ihrem Charme verloren und begeistert mich jedes Mal, wenn ich sie ansehe.
Mittlerweile habe ich ein passendes Steuerungssystem entwickelt und erfolgreich umgesetzt, sodass die Uhr nun wieder voll funktionsfähig ist. In diesem Artikel möchte ich die entwickelte Steuerung vorstellen, die es ermöglicht, die Uhr auch ohne teure Hauptuhr zu betreiben.
Nebenuhren
Nebenuhren waren früher ein wesentlicher Bestandteil von Gebäuden wie Bahnhöfen, Fabriken oder Schulen. Sie wurden zentral über eine Hauptuhr gesteuert, die ein Signal an die Nebenuhren sendete, um sie synchron zu halten. Dadurch zeigten alle Uhren im Gebäude stets die gleiche Zeit an.
Technisch zeichnen sich viele Nebenuhren durch ihre einfache, aber robuste Mechanik aus. Ein zentraler Bestandteil ist häufig der Lavet-Schrittmotor, der elektrische Impulse in rotierende Bewegungen umwandelt. Das Steuerungssignal für die Nebenuhr wechselt dazu bei jedem Impuls die Polarität. Diese Umkehrung der Polarität sorgt dafür, dass die Spule im Lavet-Schrittmotor abwechselnd magnetisiert wird und der Rotor in eine neue Position gezogen wird. Auf diese Weise dreht sich der Rotor in gleichmäßigen Schritten, was die Uhrzeiger schrittweise vorwärts bewegt – üblicherweise in Minutenschritten.
Die Siemens Uhr
Wie oben schon erwähnt hat die Nebenuhr einen Durchmesser von 42 cm, was sie für mich gerade noch wohnzimmertauglich macht. Wahrscheinlich würde sie in größeren bzw. höheren Räumen eines Altbaus noch besser wirken. Leider habe ich keine genauen Informationen darüber, wie alt die Uhr ist. Anhand des Designs und der Bauweise könnte sie jedoch aus den 1950er- oder 1960er-Jahren stammen.
Die meisten Nebenuhren sind für Betriebsspannungen von 12, 24 oder 60 Volt ausgelegt, wobei 24 Volt besonders häufig verwendet werden. Die Siemens Uhr ist ursprünglich für 60 Volt ausgelegt, jedoch kann durch Überbrücken der Vorwiderstände auch eine Spannung von 12, 24 oder 48 Volt verwendet werden.
Die Steuerung
Um eine Nebenuhr zu betreiben, muss man lediglich jede Minute die Polarität einer geeigneten Spannung umschalten. Nach kurzer Recherche stößt man dabei schnell auf die Verwendung einer H-Brücke, da sie ideal dafür geeignet ist, die Polarität einfach zu wechseln. Diese H-Brücke kann man entweder aus einzelnen Bauelementen aufbauen, oder einfach einen fertigen Brückentreiber verwenden. Ich habe mich für den L293D Motortreiber entschieden, da es günstige Module gibt, die neben dem Motortreiber auch gleich einen Spannungsregler mitbringen. Dieser Spannungsregler ist für die zweite Komponente sehr nützlich, dem Mikrocontroller. Der Mikrocontroller kümmert sich um die Zeitsynchronisierung und sendet die nötigen Steuersignale an den L293D. Für meine Steuerung verwende ich noch eine dritte Komponente, und zwar ein Batterie-Ladegerät mit Step-Up Konverter. Dadurch läuft die Uhr auch bei Stromausfall weiter und kann mit einem gewöhnlichen USB-C Netzteil betrieben werden. Hier nun die einzelnen Komponenten im Detail:
Der L293D Motortreiber
Der L293D ist ein 4-fach Halb-H-Brückentreiber, der für die Ansteuerung von induktiven Lasten wie Motoren, Relais und Solenoiden entwickelt wurde. Er bietet bidirektionale Ansteuerung für bis zu 600 mA pro Kanal. Das bedeutet, dass zwei Motoren gleichzeitig in beide Richtungen (vorwärts und rückwärts) oder vier Motoren in eine Richtung gesteuert werden können.
Jedes Ausgangs-Pinpaar (1Y/2Y und 3Y/4Y) entspricht einem kompletten H-Brückentreiber. Für jeden dieser Treiber gibt es einen Enable-Pin (1,2EN und 3,4EN). Um einen Motor in beide Richtungen anzusteuern, werden zwei der Halb-H-Treiber zu einer H-Brücke kombiniert.
Der L293D zeichnet sich durch folgende Eigenschaften aus:
- Breiter Versorgungsspannungsbereich: Der L293D kann mit einer Versorgungsspannung von 4,5 V bis 36 V betrieben werden. Es gibt separate Anschlüsse für die Logikversorgung (VCC1) und die Motorversorgung (VCC2). Durch die Obergrenze von 36 Volt können somit auch nur Nebenuhren mit 12 oder 24 Volt betrieben werden.
- Integrierte Freilaufdioden: Der L293D verfügt über integrierte Freilaufdioden, die die Treiber vor Spannungsspitzen schützen, die beim Abschalten induktiver Lasten entstehen.
- TTL-kompatible Eingänge: Die Eingänge des L293D sind kompatibel mit Transistor-Transistor-Logik (TTL) und können bis zu 7 V tolerieren, und funktionieren auch mit den 3,3 V des ESP32.
- Hoher Spitzenstrom: Jeder Treiber kann kurzzeitig Spitzenströme von bis zu 1,2 A verarbeiten.
- Thermischer Schutz: Der L293D verfügt über einen integrierten thermischen Schutz, der den Chip bei Überhitzung abschaltet.
Auf dem Modul befindet sich noch zusätzlich ein linearer Spannungsregler vom Typ 78M05, der maximal 500 mA liefern kann. Damit wird sowohl der L293D als auch der Mikrocontroller mit den nötigen 5 Volt versorgt, was die ganze Steuerung etwas vereinfacht, da nur eine Stromversorgung für Motor und Elektronik benötigt wird.
Im Datenblatt des L293D steht natürlich nichts von Nebenuhren. Dennoch ist er für die Steuerung einer Nebenuhr ideal geeignet, da er die nötige H-Brücke bereitstellt und mit nur wenigen Steuersignalen vom Mikrocontroller angesteuert werden kann.
Der ESP32 Mikrocontroller
Die Anforderungen an den Mikrocontroller sind für dieses Projekt nicht sonderlich hoch. Folgende Punkte habe ich mir überlegt:
- WLAN zur Synchronisierung der Zeit
- Zwei Tasten zum Einstellen der Uhr auf eine Startposition und zum Starten des Normalbetriebs
- Display, um die aktuelle Uhrzeit und den WLAN-Status anzuzeigen
Nach kurzer Suche bin ich auf das LILYGO T-Display gestoßen. Dieses Board erfüllt restlos alle meine Anforderungen:
- ESP32, somit ist WLAN vorhanden
- 1.14 Zoll Display mit ST7789 Treiber
- Auflösung: 135 x 240 Pixel
- Spannungsregler für 5 Volt ist auf der Platine
- Zwei frei verwendbare Tasten
- Die TFT_eSPI Grafikbibliothek unterstützt dieses Board
Auf AliExpress gibt es auch Clone dieses Boards. Ich habe dort mein Board für unter 7 Euro bekommen, das sogar 16 MB QSPI-Flash hat.
Prinzipiell würde auch jedes andere ESP32 Board gehen. Statt dem Display könnte man zum Beispiel eine RGB-LED verwenden und die Uhrzeit auf dem Display ist sowieso nur eine Spielerei. Alternativ wäre es auch möglich, auf dem ESP32 einen kleinen HTTP Server laufen zu lassen und mit einem Webinterface die Steuerung zu implementieren.
Optional: Batterieversorgung bei Stromausfall
Grundsätzlich wäre die Steuerung damit fertig. Mit einem 12 oder 24 Volt Netzteil, das mit dem L293D-Board verbunden wird, würde die Uhr so laufen. Bei einem Stromausfall müsste die Uhr dann aber wieder neu eingestellt werden. Daher habe ich noch ein zusätzliches Modul eingebaut, das gleich mehrere nützliche Features hat:
- Der Stromanschluss ist ein gewöhnlicher USB-C Stecker. Damit kann jedes beliebige USB-C Netzteil verwendet werden.
- Ein Step-Up Konverter wandelt die 5 Volt in 12 Volt um. Daher betreibe ich meine Nebenuhr mit 12 Volt. Leider habe ich keine entsprechende Platine für 24 Volt finden können.
- Ein Laderegler lädt zwei 18650 Li-Ion Akkus. Bei Stromausfall versorgen diese Batterien den Step-Up Konverter.
Die Leistung dieser Platine ist für den Betrieb der Uhr zwar etwas überdimensioniert (sie liefert bis zu 15 Watt), aber da man das Teil bei AliExpress für unter 3 Euro bekommt, ist mir das egal. Die Batteriehalterungen habe ich ausgelötet, weil die Platine sonst nicht hinter die Uhr passen würde. Stattdessen habe ich eine andere Halterung für einen 18650 Li-Ion Akku angeschlossen.
Die komplette Steuerung
Da nicht sehr viele Verbindungen zwischen den einzelnen Platinen nötig sind, wirkt der Aufbau recht aufgeräumt. Der erste Prototyp der Steuerung schaut dann folgendermaßen aus:
Die Pins des ESP32 Boards und des L293D liegen zufälligerweise beinahe genau gegenüber und können somit einfach mit einem kurzen Stück Flachbandkabel verbunden werden. Die Steckerleiste habe ich dazu auf dieser ausgelötet. Der Jumper für den Enable-Eingang (1,2E) muss entfernt werden, da ja der Mikrocontroller steuern soll, wann der Motor Strom bekommt.
Um die Komponenten in die Uhr zu bauen, habe ich mir eine einfache Halterung konstruiert und mit dem 3D-Drucker ausgedruckt.
Ich hätte die Teile auf der Halterung vielleicht noch etwas dichter packen können. Aber sie passt auch so problemlos in die Uhr. Die Halterung habe ich einfach mit ein paar Tropfen UHU an die Uhr angeklebt.
Damit wäre die Hardware fertig. Hier noch ein Bild, wie die drei Platinen verdrahtet sind:
Die Steuerungs-Software
Die Software der Steuerung ist in Visual Studio Code mit der PlatformIO Erweiterung entwickelt. Die TFT_eSPI Grafikbibliothek setzt das Arduino Framework voraus, daher habe ich dieses Framework verwendet. Möglichweise könnte man auch LVGL verwenden, aber das erscheint mir hier etwas überdimensioniert.
Ich beginne zunächst mit dem platform.ini File, mit dem das Projekt konfiguriert und die benötigte Grafikbibliothek eingebunden wird. Scheinbar gibt es hier immer wieder Probleme, wie die TFT_eSPI Bibliothek mit diesem Board verwendet wird. Das folgende File konfiguriert die Abhängigkeit zu TFT_eSPI in der aktuellen Version 2.5.43 und definiert alle nötigen Parameter. In der TFT_eSPI selbst müssen keinerlei Veränderungen durchgeführt werden.
[env:lilygo-t-display] platform = espressif32@6.9.0 board = lilygo-t-display framework = arduino monitor_speed = 115200 monitor_raw = yes ;upload_speed = 921600 build_unflags = -std=gnu++11 build_flags = -std=gnu++17 -DCORE_DEBUG_LEVEL=3 -DUSER_SETUP_LOADED=1 -DST7789_DRIVER=1 -DTFT_SDA_READ -DCGRAM_OFFSET -DTFT_WIDTH=135 -DTFT_HEIGHT=240 -DTFT_MISO=-1 -DTFT_MOSI=19 -DTFT_SCLK=18 -DTFT_CS=5 -DTFT_DC=16 -DTFT_RST=23 -DTFT_BL=4 -DTFT_BACKLIGHT_ON=HIGH -DLOAD_GLCD -DLOAD_FONT2 -DLOAD_FONT4 -DLOAD_FONT6 -DLOAD_FONT7 -DLOAD_FONT8 -DLOAD_GFXFF -DSMOOTH_FONT -DSPI_FREQUENCY=40000000 -DSPI_READ_FREQUENCY=6000000 -DCONFIG_IDF_TARGET_ESP32 board_build.flash_size = 16MB lib_deps = bodmer/TFT_eSPI@^2.5.43
Die Software gliedert sich in grob in zwei Teile. Zunächst befindet sich die Steuerung im Setup-Modus. Hier wird mit der einen Taste der Zeiger minutenweise vorwärtsbewegt. Ein kurzer Klick schaltet eine Minute weiter, längeres Drücken dreht die Zeiger schneller weiter. Die Zeiger müssen bis auf die 0:00 Position gedreht werden. Dann wird auf den zweiten Button gedrückt. Damit beginnt der normale Uhrzeit-Modus. Zunächst verbindet sich der ESP32 mit dem WLAN und wartet dann, bis die Zeit mit dem SNTP-Server synchronisiert wurde. Danach werden zwei Threads gestartet. Der erste Thread vergleicht kontinuierlich die Ist- mit der Soll-Position der Zeiger und berechnet die Differenz. Um diese Differenz werden dann die Zeiger weitergedreht. Der zweite Thread zeigt die aktuelle Uhrzeit des ESP32 und den derzeitigen Verbindungsstatus auf dem Display an:
- Rot: Keine WLAN-Verbindung
- Orange: WLAN-Verbindung vorhanden, aber noch keine Zeit-Synchronisierung
- Grün: Die Uhrzeit konnte per SNTP gesetzt werden
Im Moment sind die WLAN-Zugangsdaten und die Zeitzone noch als Variablen im Code gespeichert. Vielleicht probiere ich später noch, die Zugangsdaten per SmartConfig auszulesen.
Das folgende Diagramm zeigt den zeitlichen Ablauf der Signale, die an den L293D geschickt werden.
Die Länge des Enable Signals 1,2E habe ich durch Ausprobieren ermittelt. Ab einem Wert von 350 Millisekunden drehen sich die Zeiger zuverlässig weiter. Bei kleineren Werten kam es gelegentlich zu Aussetzern. 1A und 2A sind immer invers zueinander und bestimmen die Drehrichtung des Lavet-Schrittmotors. Bei jedem Schritt muss die Drehrichtung geändert werden, damit sich die Zeiger weiterbewegen. Das heißt, obwohl sich der Schrittmotor in der Uhr in beide Richtungen bewegt, drehen sich die Zeiger immer nur in eine Richtung. Folglich kann die Uhr auch nicht rückwärts verstellt werden, wenn man die richtige Zeit einstellen will. Das folgende Video zeigt diesen Ablauf:
Die Software der Nebenuhr-Steuerung ist auf GitHub verfügbar.
Fazit
Ich bin wirklich total von dieser Uhr begeistert. Sie ist ein absolutes Schmuckstück in meiner Wohnung! Und ich habe wieder sehr viel gelernt. Jetzt weiß ich, wie Nebenuhren funktionieren oder was eine H-Brücke ist. Natürlich hätte ich es mir einfacher machen können, indem ich einfach ein neues Uhrwerk gekauft hätte. Aber ich habe Zweifel, ob so ein Uhrwerk das nötige Drehmoment für die großen Zeiger aus Metall hat. Außerdem passen diese Zeiger ohne einen Umbau auch nicht auf ein neues Uhrwerk.
Bei Fragen oder Tipps hinterlasst mir gerne eine Nachricht – ich freue mich auf eure Rückmeldungen! Habt ihr vielleicht selbst schon einmal eine Nebenuhr umgebaut oder ein ähnliches Projekt umgesetzt?