Entwicklung

Elektronik über den LPT-Port steuern

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Öfters möchte man einen kleinen oder auch größeren Schaltkreis über den PC steuern, wäre da nicht die komplizierte Umsetzung mit einem geeigneten Mikrocontroller und der benötigten Software.

Doch es geht viel einfacher: Der parellele Port, auch LPT-Port genannt, steht auf den meisten PC zur Verfügung und kann Kinderleicht dazu verwendet werden verschiedenen Pins einzeln mit Spannung zu versorgen.

Hardware

Port des parallelen Anschlusses

Dieser Anschluss, der vormals DER Standard für den Anschluss eines Druckers war, lässt sich für die Steuerung eines Schaltkreises verwenden indem man einen Draht in einen der Pins 2-9 und einen Draht in einen Pin von 18 bis 25 steckt.

Die Pins 2 bis 9 können einzeln vom PC mit Spannung geschaltet werden und stellen eine (Steuer-)Spannung von ca. 5 V bereit. Diese Spannung kann sollte mit einem Transistor verwendet werden, um über einen Steuerstromkreis den Arbeitsstromkreis mit (nahezu) beliebiger Spannung zu betreiben.

Außerdem kann über die Pins 10-13 ein Signal enpfangen werden, was in diesem Fall bedeutet, dass der Stromkreis geschlossen ist und Strom von den Pins 18-25 zu den Pins 10-13 fließt.

Ein LPT-Kabel, das in meinem Fall einen alten Drucker mit Daten versorgte, verlegt den Anschluss bequem nach vorne und erspart einem so manchen Schlag mit dem Kopf gegen die Tischplatte.

Software

Beispiel eines TCP-Clients zum Steuern einer LED:

Beispiel GUI

Für das einfache Anlegen einer Spannung auf einem Pin empfehle ich das Programme lptout.exe. Für komplexere Aufgaben ist jedoch die Klasse inpout32.dll bzw. inpout64.dll geeignet. Da ich keine Rechte für die genannten Programme besitze, möchte ich nicht auf einen Download verlinken, doch eine Google-Suche bringt einem schnell ans Ziel.

Ich habe mir für leichtere Handhabung eine kleine C#-Klasse geschrieben:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1{

	public class LPTController{

		[DllImport("inpout32.dll")]
		private static extern UInt32 IsInpOutDriverOpen();

		[DllImport("inpout32.dll")]
		private static extern void Out32(short PortAddress, short Data);

		[DllImport("inpout32.dll")]
		private static extern char Inp32(short PortAddress);

		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUshort(short PortAddress, ushort Data);

		[DllImport("inpout32.dll")]
		private static extern ushort DlPortReadPortUshort(short PortAddress);

		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUlong(int PortAddress, uint Data);

		[DllImport("inpout32.dll")]
		private static extern uint DlPortReadPortUlong(int PortAddress);

		[DllImport("inpoutx64.dll")]
		private static extern bool GetPhysLong(ref int PortAddress, ref uint Data);

		[DllImport("inpoutx64.dll")]
		private static extern bool SetPhysLong(ref int PortAddress, ref uint Data);

		private bool _X64;
		private short _PortAddress;

		public LPTController(short PortAddress){
			_X64 = false;
			_PortAddress = PortAddress;
		
			try{
				uint nResult = 0;
				try{
					nResult = IsInpOutDriverOpen();
				}
				catch (BadImageFormatException){

				}
				if (nResult == 0){
					throw new ArgumentException("Unable to open InpOut32 driver");
				}
			}
			catch (DllNotFoundException){
				throw new ArgumentException("Unable to find InpOut32.dll");
			}
		}
		
		public void Write(short Data){
			Out32(_PortAddress, Data);
		}

		public byte Read(){
			return (byte)Inp32(_PortAddress);
		}
	}
}

Mit dieser Klasse kann man einfach den Zustand Auslesen und ihn ändern:

LPTController lpt = new LPTController(888);

if(lpt.Read() == 255){
	lpt.Write(0);
}
else{
	lpt.Write(255);
}

Hinweis

Natürlich geschieht das alles auf Ihre eigene Gefahr und ich übernehme keine Haftung für jedwede Schäden an Gerät und Gesundheit. 230V haben hier nichts verloren!!!

Update 13.03.2016: Natürlich muss es der parallele und nicht der serielle Port.