Light Emitting Hard Disk

Ein Display aus einer sich drehenden Festplatte? Die Inspiration zu diesem Projekt entstand aus einem Video aus dem Netz, wo jemand ein solches Display baute, um darauf eine (analoge) Uhr anzuzeigen. Ich finde das Original-Video leider nicht mehr, aber es gibt inzwischen ein Paar ähnliche Videos auf Youtube.

Das Display funktioniert so: Alle Platter (so heißen die einzelnen rotierend gelagerten Scheiben einer Festplatte), bis auf eines, werden entfernt. In die verbleibende Scheibe wird ein Schlitz gesägt. Unter der Scheibe werden lichtstarke LEDs angebracht. Da die Scheibe undurchsichtig ist, scheint das Licht der LEDs ausschließlich durch den ausgesägten Schlitz. Wenn sich die Scheibe dreht,und die LEDs schnell unter der Scheibe je nach aktueller Position des Schlitzes auf eine bestimmte Farbe geschaltet werden, ergibt sich durch die Trägheit des Auges auf der Plattenoberfläche das zusammenhängende Bild.

Der Aufbau

Wie sich herausstellte, eignet sich nicht jede Festplatte für den Umbau. Man braucht eine Platte mit relativ hohem Gehäuse (d.h. vielen Plattern), sodass die LED-Beleuchtung noch unter die Scheibe passt. In meinem Fall musste ich zusätzlich den Motor etwas höher legen. Das wiederum führte dazu, dass das Kabel vom Festplattencontroller zum Motor etwas zu kurz wurde. Ich baute deshalb einen Controller einer anderen Festplatte ein.

Apropos Controller: Eigentlich benötige ich den Controller "nur", um den Motor der Platte anzusteuern. Der Motor ist ein sog. Brushless 3-Phasen-Motor, der durch ein sich drehendes Sinusfeld beschleunigt und reguliert wird. Diese Motoren sind nicht leicht zu steuern, und insbesondere nicht leicht zu starten. Als zusätzliche Schwierigkeit besaß mein Motor keinen Sensor zur Bestimmung seiner aktuellen Position. Was die Festplattenelektronik nun macht, ist, die Platte mit einem kurzen Stromstoß in Bewegung zu setzen, und anschließend das induzierte Sinusfeld zu messen, um initial die Position zu bestimmen und dann die Platte gezielt auf die Endgeschwindigkeit zu beschleunigen. Beim Messen der Frequenz mit dem Oszilloskop ist mir ausserdem aufgefallen, dass die Platte auch während des Betriebs nur jede zweite Umdrehung aktiv beschleunigt. Vermutlich misst sie dazwischen jeweils das aktuelle Feld und die Position.

Wenn man den Controller der Platte für die Motordrehung verwendet, muss der Controller die Platte auch anfahren, wenn der Datenbus nicht verbunden ist. Das klappte nicht bei jedem Controller, den ich getestet hatte. Letztendlich bin ich bei einem Controller aus einer IBM-Platte gelandet, die ursprünglich in einem Server steckte. Der Nachteil: Er fährt die Platte sehr schnell an mit 10.000 RPM. Das macht es schwieriger, die Platte vibrationsarm zu bekommen, bzw. erhöht die Gefahr, dass es die angesägte Scheibe während des Betriebs einfach zerreisst.

Obwohl der Festplattencontroller die Position der Platte eigentlich jederzeit kennt, komme ich an diese Information leider nicht ran und muss meinen eigenen Sensor einbauen. Ich nehme dafür eine kleine Infrarotlichtschranke, die bei jeder Umdrehung von einem Stück Klebeband, das auf der Scheibe klebt, unterbrochen wird.

Die Elektronik

Die Elektronik habe ich on the fly (und ohne Plan) auf eine Lochrasterplatine gebaut.


Die Elektronik: Ein ATMEGA 168-20PU, 16 Mhz Quarz, ein paar BUZ11, ein überdimensioniertes Relais, und eine unterdimensionierte Stromversorgung mit einem 7805, den ich später gegen einen Step-Down Regler ersetze, weil dieser Regler hier glühend heiß werden wird.

In der Mitte sitzt der Mikrocontroller, ein ATMEGA168-20. Daneben ein Sockel für den Quarz, der sich für Experimente leicht austauschen lassen soll. Programmiert wird er über die SPI-Schnittstelle rechts. Links neben dem Controller sind drei MOSFETs, die das in der Platte eingebaute LED-Band schalten, jeweils einer für Rot, Grün und Blau. Oben links ist ein überdimensioniertes Relais, mit dem ich die Stromversorgung zur Festplatte (12V für den Motor, 5V für den Controller) schalte. Dieses Relais ist für zwei Dinge gut: a) Es sieht toll aus! b) Es macht laut "KLACK", bevor die Platte anfährt. Das sind seine Aufgaben, und sie sind wichtig!

Und zwar so wichtig, dass ich inzwischen den durch den Stromverbrauch des riesigen Relais sich völlig überhitzenden 7805 Spannungsregler rechts oben durch einen integrierten Step-Down Regler ausgetauscht hab, statt das Relais gegen eines zu tauschen, das keine 350mA frisst. Weil das Relais nämlich rockt. So.

Generell war der Spannungsregler nötig, weil ich für das ganze Gerät insgesamt nur ein (Stecker-) Netzteil als Stromversorgung verwenden wollte, und weil der Motor der Platte 12 V braucht, regle ich die 5 V für den Festplattencontroller, meinen Controller und das Relais eben herunter.

Um das Gerät trotz der unvermeidlichen Unwucht halbwegs sicher zu bekommen, habe ich ein Splitterschutz-Gehäuse drum herum gebaut. Erst improvisiert aus einer alten Verpackung, später aus Holz und Plexiglas.

Ein paar Worte zur Software

Die Aufgabe ist zeitkritisch. Eine fallende Flanke an der Lichtschranke löst einen Interrupt aus, der ein internes 16-Bit Zählregister (TCNT1), das direkt an den Takt gekoppelt ist, zurücksetzt. In der Mainloop wird am Ende der Schleife dieses Zählregister gesichert (old_tcnt1), und zu Beginn der Schleife geprüft, ob der aktuelle Wert des Registers kleiner geworden ist als dieser gesicherte Wert. In diesem Fall wird ein Interrupt ausgelöst. old_tcnt1 enthält immer die Dauer der vorhergehenden Runde. tcnt1 / old_tcnt1 ist also die approximierte aktuelle Position. Ein Ausschnitt:

while (1) {
    cli();
    tcnt1 = TCNT1;
    sei();

    if (old_tcnt1 > tcnt1) {
        // Overflow / Interrupt / Round complete
        // calculate positions for next round (aprox. by last round)
    }

    // display according to counter tcnt1

    old_tcnt1 = tcnt1;
}

ISR(INT0_vect) {
    if (TCNT1 > 100) { // debounce
        TCNT1 = 0;
    }
}

Bei 10.000 RPM - also ca. 160 Umdrehungen pro Sekunde - ist alles zeitkritisch. Im Interruptvector steht deshalb kaum Code, und alles andere ist darauf ausgelegt, möglichst wenig Overhead zu erzeugen. Der Prescaler, der den Systemtakt auf TCNT1 abbildet, sollte so gewählt werden, dass er für eine Umdrehung möglichst hoch zählt, aber nicht überläuft. Je höher er zählt, desto weniger fransen die Kanten im entstehenden Bild aus. Hier war clk / 8 bei einem Systemtakt von 16Mhz eine geeignete Wahl.

Fazit

Das Display sieht toll aus, macht Spaß, hat darüber hinaus aber keinen wirklichen Nutzen.

Mir ging es bei diesem Projekt hauptsächlich darum herauszufinden, ob ich das hinbekomme. Mein ursprüngliches Vorhaben, daraus letztendlich eine Uhr zu bauen, die man tatsächlich verwenden kann, habe ich verworfen. Zum Einen wegen der Vibrationen, durch die sich das Gerät im Dauerbetrieb womöglich selbstständig zerlegen würde, zum Anderen ist es aufgrund der hohen Ströme und schnellen Schaltzyklen unmöglich, einen DCF77 Empfänger in unmittelbarer Nähe des Geräts zu betreiben - jedenfalls nicht ohne aufwendige Abschirmung.

Tags: LEDs, HDD-Clock