ATX Wakeup

WakeupProto1_small.jpg

Problem

Oft möchte man den Rechner zu einer bestimmten Zeit automatisch einschalten, sei es um Mail abzuholen oder über eine Videokarte eine Aufnahme durchzuführen. Ich hatte diese Problem speziell mit dem Multitainer von Siemens-Fujitsu (Ein PC im Formfaktor eines Videorekorders). Man kann diesen mit apmsleep (Linux) zwar in den Suspend Modus schicken, was aber in diesem Fall leider nicht viel bringt, weil die Stromaufnahme immer noch ~50W beträgt und der Netzteillüfter weiterhin läuft.

Anforderungen

Idee

Man benötigt also eine Art Timermodul, welches vom Rechner aus programmiert werden kann. Es war naheliegend hierfür einen Mikrocontroller zu verwenden. Dieser soll mit den 5VSB (5V Standby) aus dem ATX Netzteil versorgt werden. Die Kommandos zum Setzen und Löschen des Timers sollen über die serielle Schnittstelle übermittelt werden. Um schließlich den Rechner aufzuwecken wird der Micrcontroller noch mit dem ATX Power Switch verbunden. Die Lösung war ursprünglich nur für den Multitainer gedacht, sollte aber auch für andere ATX Rechner nutzbar sein.


Implementation

Schematics small

Microcontroller

Auf der Suche nach einem geeigneten Microcontroller fiel die Wahl auf den ATmega8 aus der Atmel AVR Serie. Die Hauptkriterien waren das vorhandensein eines UARTs, eine interne Taktgenerierung, sowie die Anschlußmöglichkeit eines Uhrenquarzes (32768Hz). Somit konnten Software- und Hardwareaufwand minimal gehalten werden. Grundsätzlich hätte man auch einen einfacheren Mikrocontroller (ATtiny) verwenden können, jedoch hätte man den fehlenden UART in Software nachbilden müssen (Entsprechende Application Notes gibt es aber bei Atmel).

RS232

Nicht wirklich ein Problem ist die benötigte Pegelwandlung des RS232 Signals nach TTL Niveau. Da nur eine Richtung nötig ist wurde hier eine einfache Lösung mit einem Transistor umgesetzt (Im Schaltplan steht ein BC517, aber jeder NPN sollte hier gehen). Will man eine bidirektionale Kommunikation mit dem Microcontroller, so kann man einen MAX232 Pegelwandler verwenden.

Stromversorgung

Die Stromversorgung kommt aus dem ATX Netzteil. Die 5VSB, die auch bei "abgeschalteten" Rechner verfügbar bleibt ist (meist) das lila Kabel.

Power Switch

Der Multitainer hat hier einen Jumper (PWR-SW) der einfach nur kurzgeschlossen werden muss. Nun könnte man ein Relais an den Microcontroller anschliessen, aber das wäre zu aufwändig. Zum Aufwecken reicht es den Pin auf Masse zu ziehen, der sonst auf 5V ist (mit dem Multimeter nachmessen). Beim Multitainer ist das der hintere Pin (wenn man von Vorne in den MT reinschaut). Man kann diesen Pin direkt mit dem Microcontroller verbinden, da beim Kurzschliessen des PWR-SW nur 1.12mA fliessen. Wer auf Nummer sicher gehen will kann einen 1k Widerstand zwischen Microcontroller und PWR-SW schalten.

LED

Ist nicht zwingend erforderlich, aber hilfreich zum debuggen. Blinkt langsam, wenn der Timer nicht aktiv ist. Blinkt sekündlich, wenn der Timer aktiv ist. Flackert bei Aktivität auf der Seriellen Schnittstelle (beim Multitainer wird dieselbe serielle Schnittstelle auch zur Ansteuerung des LCD Displays verwendet).

Software

Die Software für den Microcontroller wurde mit dem WinAVR GCC und dem AVR Studio erstellt. Ausserdem wurde auf eine Library von Chris Efstathiou für die serielle Schnittstelle zurückgegriffen (siehe auch Avrfreaks). Der Microcontroller reagiert auf folgende Kommandos:

ATS
Mit ATS1234 teilt man dem Microcontroller mit in 1234 Sekunden den Rechner aufzuwecken.
ATC
Mit ATC wird ein laufender Timer gelöscht.

Vom Rechner aus kann nun unter Linux ganz einfach mit echo ATS3600 >/dev/ttyS1 der Timer auf eine Stunde eingestellt werden. Gegebenenfalls muss die Schnittstelle vorher noch richtig konfiguriert werden: 9600 Baud 8N1.

Intern generiert der Microcontroller mit Hilfe des 32768Hz Quarzes pro Sekunde ein Interrupt (8Bit Timer Overflow + Teiler von 128).

Der Multitainer hat noch die Besonderheit, dass die interne Serielle Schnittstelle (COM2, /dev/ttyS1) gleichzeitig für die Ansteuerung des LCD Displays verwendet wird. Die Ansteuerung unterscheidet sich jedoch so stark, dass in der Praxis nie der ASCII String ATS oder ATC dort auftreten werden. Der Microcontroller hingegen ignoriert einfach alles was nicht diesen beiden Kommandos entspricht.

Ergänzung

Mittlerweile habe ich doch noch etwas Zeit gefunden und habe eine Platine entworfen, die auch ein minimales Programmierinterface integriert. Der Mikrocontroller kann somit direkt vom PC über die parallele Schnittstelle programmiert werden (z.B. uisp -v -dprog=dapa -dlpt=0x378 --upload --verify if=main.hex).

WakeupDevboard

Ein kleines Update betrifft auch die Software. Bis jetzt wäre das System anfällig gegenüber einem Stromausfall. Denn dann würde auch der Microcontroller keine Versorgungspannung mehr bekommen und das Aufwecken vergessen. Eine sehr einfache Abhilfe funktioniert im Zusammenspiel mit der VDR software: Wir starten den Rechner einfach nach einem Power Up des Microcontrollers, da wir ja nicht wissen, ob ein Timer gesetzt war. VDR entscheidet dann wie weiter verfahren wird. In den meisten Fällen würde VDR nach 2 Stunden Inaktivität den Rechner wieder herunterfahren und über ein Script unseren Microcontroller mit einem neuen Timerwert setzen. So ist auch bei längerer Abwesenheit sichergestellt, daß ein Stromausfall nicht zum Vergessen der gesetzten Aufnahme-Timer führen kann.


Download

Hardware WakeupMT.sch Wakeup_150.png
ATXWakeup_HW-1.1.zip (aktuell) ATXWakeup-1.1_150.png (aktuell)
Software WakeupMT-1.0.zip
ATXWakeup_SW-1.1.zip (aktuell)

Verbesserungen/Ideen


(C) 2004 Guido Müsch (odiug@gmx.net)