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:
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.
