Bernd-Ludwigs Homepage

Valid HTML 4.01 Strict Valid CSS!

Hardware >> Relaisschaltung

Relaisschaltung an der seriellen Schnittstelle

Die Schaltung, die im folgenden beschrieben wird, ermöglicht das Schalten eines Relais über die serielle Schnittstelle. Zum Schalten wird hier das Steuersignal DTR verwendet, das bei einer 9-poligen seriellen Schnittstelle an Pin 4 anliegt. Man könnte aber genauso gut das RTS-Signal von Pin 7 verwenden.

Hier der Schaltplan:

Schaltplan Relaisschaltung

Wie man an dem Schaltplan sieht, ist das Relais nicht direkt an der seriellen Schnittstelle angeschlossen, sondern über eine Transistorstufe mit einem Darlington-Transistor. Zum besseren Schutz der PC-Hardware kann statt des Transistors auch ein entsprechend ausgelegter Optokoppler eingesetzt werden (IC ≥ 100 mA).In dem Fall muss natürlich der Widerstand R2 an die Spezifikation des Optokopplers angepasst werden.
Der Grund für die Verwendung des Transistors bzw. des Optokopplers ist, dass die serielle Schnittstelle nicht genügend Strom liefern kann. Entsprechend dieser Schaltung bekommt das Relais den notwendigen Strom anstatt aus der seriellen Schnittstelle aus einer zusätzlichen Spannungsversorgung. Es reicht hier eine Spannung von 5V aus, die man z.B. aus dem Gameport beziehen kann, der ausreichend Strom liefern kann. Andere mögliche Spannungsquellen wären ein Laufwerksstromkabel oder ein eigenes Netzteil. Den USB als Spannungsquelle zu verwenden, kann ich nicht empfehlen. Er ist zwar prinzipiell bis zu 500 mA spezifiziert, aber zum Einen gibt es auch low-power-USB-Anschlüsse für nur bis zu 100 mA, zum Anderen basiert das Power Management des USB darauf, dass die Verbraucher bei ihrer Registrierung am Bus mitteilen, was sie verbrauchen. Eine Relaisschaltung, die nur ihre Betriebsspannung aus dem USB bezieht, kann dies natürlich nicht. Im schlechtesten Fall kann man damit den USB überlasten.

Ein Hinweis für die Verwendung der Schaltung an Windows-Rechnern: Während des Bootvorgangs führt die Hardwaredetektion von Windows dazu, dass einige Male das Relais geschaltet wird. Wie oft genau, hängt von der jeweiligen Windows-Version ab. Meiner persönlichen Erfahrung nach ist es bei Windows 98 einmal Ein und Aus, bei Windows XP sieben mal.

Hat man diese Schaltung aufgebaut, möchte man sie natürlich auch nutzen. Das führt zu der Frage: Wie kann man die Pins der Schnittstelle programmtechnisch ansteuern?

Unter DOS (wie auch unter 16-bit-Windows, d.h. Windows 3.x) kann man direkt auf die Register der Schnittstelle zugreifen. Genauere Informationen hierzu (welche Bits in welchen Registeradressen gesetzt werden müssen) kann man z.B. bei www.franksteinberg.de finden.

Bei 32-bit-Windows (Win95 oder neuer) verweigert das Betriebssystem den direkten Zugriff auf die Statusregister (bei Win95 funktioniert das manchmal noch, aber man sollte nicht davon ausgehen). Hier muss der Zugriff auf die Schnittstelle also anders erfolgen. In C++ kann man dafür die Modemsteuerfunktionen der Windows API verwenden. Um zu verdeutlichen, wie das aussieht, folgen hier die entsprechenden Programmzeilen.

// Deklarierung der benötigten Variablen
HANDLE hcom;
DCB dcb; // Der Typ "DCB" ist eine Struktur, die die Statusinformationen der Schnittstelle beinhaltet
char *portname;
portname="COM1";

// Öffnen eines Handles auf die Schnittstelle
hcom=CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

// Lesen des Schnittstellenstatus
GetCommState(hcom, &dcb);

// DTR auf "HIGH" setzen
dcb.fDtrControl=DTR_CONTROL_ENABLE;

// Schreiben des Schnittstellenstatus
SetCommState(hcom, &dcb);

// Schliessen des Handles (Dabei wird DTR wieder auf "LOW" gesetzt!)
CloseHandle(hcom);

Das ganze ist auch im Quellcode der Programme in meinem Downloadbereich zu finden.

Unter Linux werden ebenfalls Modemsteuerfunktionen verwendet, es sieht aber etwas anders aus als unter Windows:

// Benötigte Includes
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

// Öffnen der Schnittstelle (hier die erste serielle Schnittstelle ttyS0)
int fd = open("/dev/ttyS0", O_RDWR);

// DTR auf "HIGH" setzen (wird evtl. schon beim Öffnen der Schnittstelle gemacht)
int state = TIOCM_DTR;
ioctl(fd, TIOCMSET, &state);

// DTR auf "LOW" setzen
state = ~TIOCM_DTR;
ioctl(fd, TIOCMSET, &state);

// Schliessen der Schnittstelle
close(fd);

Ein fertiges Linux-Programm (mit Quellcode) kann im Downloadbereich gefunden werden.