spacerace.github.io

Elektronik, Mikrocontroller, Linux

SID-Clock


Die "SID-Clock" ist ein Wecker, der fast nur aus Teilen aus Elektroschrott besteht.
Der Name kommt daher, dass ein mos6581 SID-Chip die Wecktöne erzeugt.

CPU-Modul:


Eins der wenigen gekauften Teile hat ca. 2$ gekostet und ist ein STM32-Board, genannt "BluePill". Im Wiki der Seite mikrocontroller.net gibt es einen Artikel darüber, hier eine Zusammenfassung:

Zum Programmieren des Chips nutze ich einen 5$ China ST-LinkV2 Klon. Die funktionierten bisher immer tadellos.

Display:


Das Display stammt aus einer Nokia DBOX und ich habe es hier genauer beschrieben.

SID:


Der SID ist noch nicht fest mit an der Uhr. Ich hatte zum Testen ein "Breakout-Board" gebaut und mit hauchdünnen Kupferlackdrähten verbunden. Das Testprogramm läuft und bringt ihn zum Piepsen. Zur Zeit weckt er gar nicht, da das erstmal in Sandwich-Bauweise fest mit eingebaut werden muss...
Der SID ist ein 6581, den ich aus einem toten C64 habe. Da ich auch noch einen 85xx-SID habe, der mit 9V statt 12V arbeitet, kann die Stromversorgung auf diese beiden Spannungen eingestellt werden. Der Stromversorgung habe ich einen eigenen Abschnitt gewidmet.

Entgegen aller schlechten Erfahrungen mit statischer Elektrizität und dem SID ist meiner unglaublich robust. Ich musste ihn schon mit all seinen Beinchen aus dem Teppich ziehen und diese wieder geradebiegen. Bis dahin lag er immer nur in einer Wühlkiste... Jetzt doch etwas sicherer aufbewahrt ;)

Audio-Verstärker + Lautsprecher:


Der Audio-Verstärker wurde auch noch nicht fest eingebaut. Der Lautsprecher ist ein kleiner 8Ohm 0.25W aus einem alten PC-Gehäuse.
Der Audio Verstärker wird wohl ein einfacher LMxxx Kopfhörerverstärker oder ganz einfach ein OpAmp wie LM358 werden.

RTC:


Der stm32f103 besitzt eine Real-Time-Clock (RTC). Diese zählt die Sekunden seit start in einem 32bit breiten Register.
Fällt der Strom aus und die RTC ist gepuffert, läuft diese weiter. Sobald der Strom wieder da ist, kann das Programm beim
starten, den Wert der RTC wiederherstellen. Ich hatte mehrere 10F/2,7V SuperCaps und 2 in Reihe haben dann genug Spannungsfestigkeit für 3,3V.
Die Diode D1 verhindert, dass der Rest der Schaltung aus den SuperCaps gespeist wird.
Der Widerstand begrenzt den Ladestrom zu Beginn auf ca. (3,3V-0,7V)/22Ohm=118mA.
Der Spannungsregler auf dem BluePill-Board wäre damit fast schon überfordert, will man den dafür verwenden, sollte man R1 auf 75...100Ohm vergrössern.
Die Ladezeit ist kein unerheblicher Faktor dabei.
...
...
...
Der Schaltungsaufwand für die SuperCaps ist auch höher, als der für eine kleine Lithium-Zelle, wie z.B. von einem alten Mainboard inkl. Sockel.
Ich hoffe jedoch, dass die Schaltung so in 10 oder mehr Jahren noch funktioniert und ich nicht irgendwann die Batterie wechseln muss.

Zur Zeit verwende ich die RTC gar nicht, da das Programm noch nicht fertig ist und ich sowieso einen SysTick habe, aus dem ich die Zeit ableite.

Stromversorgung:


Der SID in der älteren Version benötigt 12V und in der neueren Version 9V. Dabei auch ein bisschen Strom, er erwärmt sich stark.
Das Display benötigt 5V und frisst dabei ganz schön was an Strom, wird ebenfalls sehr warm.
Der STM32-Controller arbeitet mit 3,3V, auf dem CPU-Modul sitzt jedoch schon ein 3,3V-Regler, der mit 5V arbeitet.

In meiner Bastelkiste fanden sich einige DC/DC-Module von Traco mit 18-36V in und 5V/0,6A out.
Mit einem 18V Steckernetzteil betreibe ich nun diesen Wandler und einen LM317T, der per Jumper zwischen 9V und 12V umgestellt wird.

Die Verluste im LM317T halten sich in Grenzen und können leicht mit einem kleinen Kühlkörper abgeführt werden.
Maximal gehe ich von einem Verlust von ca. 0.7W-0.9W aus.

Beim Display und der restlichen Elektronik jedoch setzte ich auf den DC/DC-Wandler, da wären mir die Verluste auf Dauer doch zu hoch. Grob überschlagen wären das (18V-5V)*0.35A=4.55W.
Die 5V Versorgung wird von 2x 6F/2.7V-SuperCaps gepuffert. In Reihe ergibt das 3F/5.4V und hält Display+Controller ca. 1,5 Minuten am laufen.

Stromverbrauch:

Gehäuse:




Software:

Für einfachen Uhr-/Weckerbetrieb reicht eine Dauer-Schleife und ein Timer Interrupt.
In meinem Fall habe ich einen SysTick von 1kHz. Dieser SysTick zählt eine Variable (ticks) hoch. Sobald ticks 1000 erreicht, wird es zurückgesetzt auf 0 und der Sekundenzähler geht eins hoch.
Falls das passiert, wird geprüft, ob eine Minute überschritten wurde. Falls ja, Minute hoch, Sekunde=0, ....

Mehr sollte im SysTick aber auch nicht passieren, der Rest passiert in der Hauptschleife.
Diese rennt einfach immer im Kreis und eine State-Machine führt zu bestimmten Zeitpunkten verschiedene Dinge aus:

Hier ist der Code der ersten funktionierenden Uhr, wie ihr sie auf den Fotos seht. Nicht der Prototyp in der Dose!