Projekte rund um Hard- und Software
 

Hardware für die USB-Steckdosenleiste

skizze.jpg Im wesentlichen besteht die gesamte Schaltung aus einer Steuerplatine, den Relais zum Schalten der einzelnen Steckdosen, Leuchtdioden zur Anzeige des aktuellen Status, Tastern zum manuellen schalten sowie einem Trafo zur Versorgung der Elektronik und der Relais. Da Sicherheit beim Umgang mit Netzstrom besonders wichtig ist, wurden gleich zwei Stellen mit galvanischer Trennung zwischen Steckdosen und dem PC eingebaut. Zum einen natürlich durch die Relais, die die gesamte Steuerung vom geschalteten Netzstrom trennen. Dies ist ausreichend solange keine mechanischen Schäden auftreten. Daher ist zusätzlich noch der USB-Teil der Steuerplatine durch zwei Optokoppler vom Rest getrennt. Selbst wenn also eine Steuerleitung sich von einem Taster, einer LED oder einem Relais löst und an Netzspannung gerät, steht die USB Buchse also nicht unter Spannung, der PC sowie in der Nähe befindliche Personen bleiben unversehrt.

Die Steuerplatine

Die Platine zur Steuerung der Steckdosenleiste gliedert sich in zwei Hauptbereiche, einen USB-RS232 Wandler und einen AVR-Mikroprozessor. Die beiden Teile sind über zwei Optokoppler in der RS232-Leitung verbunden.

Als RS232-Wandler wird der FT232BM von FTDI eingesetzt. Er wird über den USB-Anschluss mit Strom versorgt und wird in der Standardbeschaltung verwendet, die der Hersteller im Datenblatt empfiehlt.
Der AVR-Controller ATtiny2313 überträgt durch seine RS232-Schnittstelle die Daten des USB-Anschluss und hat außerdem sechs Eingänge für Taster, über die der Benutzer auch ohne PC schalten kann. An den Ausgängen befinden sich Leuchtdioden und Transistorverstärker um die Relais zu schalten.


Achtung: Die 10pol Stecker im Layout haben die falsche Größe, das wird noch korrigiert ! An U25 ist eine Leiterbahn sehr eng durchgeführt.

Schaltplan
Platinenlayout (gespiegelt)
Bauteilliste
Bestückungsdruck oben
Bestückungsdruck unten
Drahtbrücken

Firmware

Die Firmware die in den AVR geladen wird sorgt für die eigentliche Funktionalität der Steckdosenleiste.

Für jeden Ausgang, also jede einzelne Steckdose können diverse Einstellungen getrennt vorgenommen werden. Wird die Steckdosenleiste komplett vom Strom getrennt und später wieder eingeschaltet, sind grundsätzlich drei Zustände möglich. Entweder der Ausgang ist abgeschaltet, er ist eingeschaltet oder der Zustand vor der Trennung vom Stromnetz wird wiederhergestellt. Weiterhin kann festgelegt werden ob ein manuelles Schalten über die Taster am Gehäuse möglich sein soll oder nicht. Wird die Steckdosenleiste zum Beispiel in einer unzugänglichen Ecke hinter Möbeln plaziert, will man diese Funktion vermutlich deaktivieren, um versehentliches schalten durch Berührung mit Kabeln oder Möbeln zu verhindern.

Nach dem Einschalten wird zunächst eine Initialisierungsfunktion durchlaufen. Diese nimmt grundlegende Einstellungen am Mikrocontroller vor, und schaltet alle AUsgänge auf die vorgesehenen Startwerte.
Das Hauptprogramm durchläuft im wesentlichen ständig eine Schleife, die prüft, ob eine Taste gedrückt wurde und ob Daten über die USB-Schnittstelle angekommen sind.

Wurde eine Taste gedrückt wird eine Funktion gestartet, die prüft, ob für diese Taste überhaupt Eingaben entgegengenommen werden sollen und falls ja invertiert sie den aktuellen Status des Ausgangs.

Werden Daten am USB-Anschluss, also aus Sicht des AVR am Eingang des UART, erkannt, gibt es etwas mehr zu tun:
Grundsätzlich läuft die Kommunikation mit 9600 Baud bei 8 Bit Wortlänge mit einem Startbit, einem Stopbit, keine Paritätsinformation und ohne Handshaking ab.
Die empfangenen Bytes werden unterschieden nach Befehls- und Datenbytes. Kennzeichen ist das höchstwertige Bit, das bei Befehlen 1 ist und bei Daten 0. Als Nutzinhalt bleiben daher noch 7 Bit bzw. 128 Werte übrig, was aber locker ausreicht. Diese Kennzeichnung der Bytes verhindert effektiv, dass die Kommunikation ihre Synchronisation verliert, und z.B. das Befehlsbyte des nächsten Befehls fälschlicherweise als Daten für den vorhergehenden interpretiert werden, weil dessen Datenbyte verloren gegangen ist.
Wird nun vom Hauptprogramm ein Befehlsbyte empfangen, wird die zugehörige Funktion aufgerufen, die den Befehl verarbeitet. Wird im Hauptprogramm ein Datenbyte empfangen, wird es verworfen. Benötigt ein Befehl weitere Daten, muss er zunächst in seiner Funktion auf ein entsprechendes Datenbyte warten. Empfängt er unerwarteter Weise ein Befehlsbyte soll die Funktion sofort zum Hauptprogramm zurückkehren, da irgendetwas nicht stimmt. Auf diese Weise sollten innerhalb kürzester Zeit wieder alle Befehle korrekt erkannt werden, wenn mal etwas schief gelaufen ist.
Möchte ein Befehl dem PC antworten tut er dies auch innerhalb seiner Funktion.

Per USB ausführbare Befehle

  • int ReadState ( void ):
    liefert den aktuellen Schaltzustand der Ausgänge zurück
  • void WriteState ( int ):
    schaltet die Ausgänge entsprechend des empfangenen Datenbytes um
  • void AndState (int):
    führt eine bitweise UND-Verknüpfung des Datenbytes mit den Ausgängen durch
  • void OrState ( int ):
    führt eine bitweise ODER-Verknüpfung des Datenbytes mit den Ausgängen durch
  • int ReadDefaultState ( void ):
    liefert den eingestellten Startwert der Ausgänge zurück, der nach Anlegen der Versorgungsspannung aktiv wird
  • void WriteDefaultState ( int ):
    setzt den Anfangszustand für die Ausgänge
  • int ReadUseLastState ( void ):
    gibt zurück, welche Ausgänge beim Einschalten auf den Zustand beim Abschalten der Stromversorgung zurückgesetzt werden
  • void WriteUseLastState ( int ):
    definiert welche Ausgänge beim Einschalten auf den Zustand beim Abschalten der Stromversorgung zurückgesetzt werden
  • int ReadEnableButtons ( void ):
    gibt zurück, welche Tasten zum manuellen schalten aktiviert sind
  • void WriteEnableButtons ( int ):
    definiert welche Tasten zum manuellen schalten aktiviert sind
 
steckdose/hardware.txt · Zuletzt geändert: 2009/03/01 20:04 (Externe Bearbeitung)
 
Recent changes RSS feed Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki