Einfache Steuerung der parallelen Schnittstelle: Unterschied zwischen den Versionen

Aus Technik-fan.de Wiki
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
<source lang="c">
 
while(1){
 
  i++;
 
}
 
</source>
 
 
 
 
Ziel dieser Beschreibung ist es, die parallele Schnittstelle über ein Webinterface steuern zu können.  
 
Ziel dieser Beschreibung ist es, die parallele Schnittstelle über ein Webinterface steuern zu können.  
 
Ich verwende eine Schaltung aus 4 Leds, die auf eine Rochlasterplatine gelötet wurden. Damit kann man sich sehr leicht den Zustand der einzelnen Ports anzeigen lassen. Ich verwende dabei keine Vorwiderstände da ich ultra helle LED's genommen habe. Zur Sicherheit empfiehlt es sich aber 100 Ohm Vorwiderstände zu verwenden.  
 
Ich verwende eine Schaltung aus 4 Leds, die auf eine Rochlasterplatine gelötet wurden. Damit kann man sich sehr leicht den Zustand der einzelnen Ports anzeigen lassen. Ich verwende dabei keine Vorwiderstände da ich ultra helle LED's genommen habe. Zur Sicherheit empfiehlt es sich aber 100 Ohm Vorwiderstände zu verwenden.  
Zeile 28: Zeile 21:
 
  vim blink.c
 
  vim blink.c
 
Inhalt, das Programm stammt übrigens aus diesem Forumbeitrag:  
 
Inhalt, das Programm stammt übrigens aus diesem Forumbeitrag:  
<source lang="c">
+
<source>
 
  /*Dieser Code laesst LEDs die an Pins 2...9 (Datenregister)
 
  /*Dieser Code laesst LEDs die an Pins 2...9 (Datenregister)
 
  angeschlossen sind blinken. */
 
  angeschlossen sind blinken. */

Version vom 29. Januar 2011, 12:15 Uhr

Ziel dieser Beschreibung ist es, die parallele Schnittstelle über ein Webinterface steuern zu können. Ich verwende eine Schaltung aus 4 Leds, die auf eine Rochlasterplatine gelötet wurden. Damit kann man sich sehr leicht den Zustand der einzelnen Ports anzeigen lassen. Ich verwende dabei keine Vorwiderstände da ich ultra helle LED's genommen habe. Zur Sicherheit empfiehlt es sich aber 100 Ohm Vorwiderstände zu verwenden. Im wesentlichen gibt es zwei Möglichkeiten den parallelen Port unter Debian zu steuern. Zum einen lässt sich der Port direkt per Speicher Adresse aus einem C Programm heraus schreiben und lesen. Nachteil dabei: Speicher Adressen darf nur Root schreiben. Es ist also nicht möglich das ganze per www-data User aus einer Website heraus zu starten. Die andere Möglichkeit besteht darin den Hardware Zugriff über ein C Programm das ein paar Linux Kernel Module benötigt vorzunehmen. Die Module können wiederum einem bestimmten Linux User oder einer Gruppe angehören. So kann der parallele Port dann auch über ein Webfrontend (PHP, Ajax etc.) gesteuert werden. Auf diese Möglichkeit möchte ich hier genauer eingehen.

Als erstes sollten die benötigten Module geladen werden:

modprobe parport
modprobe ppdev
lsmod|grep parport

sollte dann folgende Ausgaben produzieren:

parport_pc             32132  0
parport                33256  2 ppdev,parport_pc

nun benötigen wir den gcc und alle Programme die zum kompilieren nötig sind:

apt-get install build-essential

nun legen wir uns einen Ordner zum kompilieren an. Für alle die wenig Erfahrung im kompilieren von Linux Software haben biete ich hier meine kompilierte ausführbare Datei zum Download an. (Debian etch 2.6.18-6-686):

mkdir /usr/src/blink
cd /usr/src/blink

Darin speichern wir unsere C Quellcode Datei mit folgendem Inhalt:

vim blink.c

Inhalt, das Programm stammt übrigens aus diesem Forumbeitrag:

 /*Dieser Code laesst LEDs die an Pins 2...9 (Datenregister)
 angeschlossen sind blinken. */
 
 
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/ppdev.h>
#include <linux/parport.h>
#include <sys/ioctl.h>
 
int main()
{
    int fd,loop=0;
    unsigned char datareg=0xFF;
    unsigned char controlreg=0x00;
    struct ppdev_frob_struct frob;
 
/*parallele Schnittstelle öen*/
    if((fd = open ("/dev/parport0", O_RDWR))!=-1)
    {
        ioctl (fd, PPCLAIM);
    }
    else
    {
        printf("Konnte Schnittstelle nicht oeffnen\n");
        return 1;
    }  
 
/*Pins 2..9 als Ausgang konfigurieren*/
    frob.mask = 0x20;
    frob.val =0x00;
    ioctl (fd, PPFCONTROL, &frob); 
 
 
/*10 mal LEDs ein- und ausschalten*/
   while ((loop++)<1)
   {
       datareg=0xFF;
       ioctl(fd,PPWDATA ,&datareg);
       sleep(1);
       datareg=0x00;
       ioctl(fd,PPWDATA ,&datareg);
       sleep(1);
   }
 
/*parallele Schnittstelle schliessen*/
   ioctl(fd,PPRELEASE);
   close(fd);
 
   return 0;
}

Dann wird ein kleines Makefile erstellt: vim Makefile Inhalt: CC = gcc PROG = blink

all:

      $(CC) -c $(PROG).c
      $(CC) -o $(PROG) $(PROG).o

clean:

      rm -f $(PROG) $(PROG).o *~

Nun kompilieren wir das ganze mit: make und schon erscheint eine ausführbare Datei mit dem Namen blink. Wir starten die Datei mit:

./blink

Jetzt sollten die LED's an der parallelen Schnittstelle aufblinken...Um zu testen ob das Programm auch als www-data User läuft, könnnen wir das Programm als www-data ausführen:

su www-data
./blink

Wenn alles bis dahin klappt können wir uns ein PHP Skript schreiben das dieses Programm über ein Webfrontend aufrufen kann. Ich verwende hier ein einfaches Beispiel um die Funktion darzustellen. Achtung: Wegen Sicherheitslücken sollte das Programm nur zu Testzwecken benützt werden.

apt-get install apache php5
cd /var/www
mkdir blink
chown www-data www-data ../*
vim index.php 

Inhalt der Datei index.php: <HTML>

 <TITLE>Parallele Schnittstelle per Webfrontend steuern...</TITLE>
  </HEAD>
<BODY>

Öffnet beim Neu Laden den Parallelport...

<body bgcolor=ffffe9>
</BODY>

</HEAD>

<html> <?php shell_exec('/usr/src/blink'); echo exec('whoami'); ?>

Nun sollte beim Aufrufen oder Aktualisieren der Seite ein blinken der LED's sichtbar sein. Es sind nun diverse Funktionen möglich. Z.B. können über Optokoppler Relais geschaltet werden. Über diese Relais können so Verbraucher übers Internet geschaltet werden. Zudem kann das ganze mit einem Netzwerkkabel an den S0 Bus der Telefonanlage angeschlossen werden (siehe: CAPI, Asterisk etc.).