Strona zgodnie z Polityką plików cookies wykorzystuje pojedynczy plik cookie do poprawnego działania licznika odwiedzin.
Możesz określić warunki przechowywania lub dostępu do plików cookies w ustawieniach Twojej przeglądarki.

 Centrum Usług Sieciowych 
 
Komputerowy system sterowania urządzeniami
 
 
Ostatnia aktualizacja: 04.08.2015
Wstęp
Sprzęt
Oprogramowanie
Instalacja
AP i DHCP
ProFTPd
Firewall
Apache z PHP
MySQL
Dźwięk
Obsługa LPT
Moduł 230V
LPT przez WWW
Cron
Muzyka  NEW
Budzik WWW
Termometr
Automatyzacja
Kontrola dostępu
Co dalej?
Obsługa portu LPT

Port LPT daje nam możliwość sterowania ośmioma urządzeniami. Na początek tyle nam wystarczy. Sterowanie będzie się odbywać poprzez zapalanie i gaszenie pinów d0-d7 portu. Jak to zrealizować w konsoli? Najlepiej napisać program, który się tym zajmie. Tu z pomocą przychodzi język C. W pierwszej kolejności tworzymy plik lpt.c w naszym katalogu domowym i wklejamy do niego poniższy kod.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>

#define BASEPORT 0x378

int main(int liczba, char *parametr[]) {
    ioperm(BASEPORT,1,1);
    ioperm(BASEPORT+1,1,1);
    ioperm(BASEPORT+2,1,1);
    int wynik = 2, pos;

    if (liczba==1 || liczba >=4) {
       printf("Blad parametrow\n");
       return 0;
    } else {
       if (liczba==2) {
          wynik = strcmp(parametr[1],"get");
          if (wynik == 0) {
             wynik = inb(BASEPORT);
             printf("%d\n",wynik);
             return 0;
          }
          return 0;
       } else {
          wynik = strcmp(parametr[1],"set");
          if (wynik == 0) {
             wynik = atoi(parametr[2]);
             outb(wynik,BASEPORT);
             return 0;
          }
          wynik = strcmp(parametr[1],"getbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT);
             wynik = wynik&(1<<pos);
             if(wynik != 0) {
                printf("1\n");
             } else {
                printf("0\n");
             };
             return 0;
          }
          wynik = strcmp(parametr[1],"getsbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT+1);
             wynik = wynik&(1<<pos);
             if(wynik != 0) {
                printf("1\n");
             } else {
                printf("0\n");
             };
             return 0;
          }
          wynik = strcmp(parametr[1],"getcbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT+2);
             wynik = wynik&(1<<pos);
             if(wynik != 0) {
                printf("1\n");
             } else {
                printf("0\n");
             };
             return 0;
          }
          wynik = strcmp(parametr[1],"setbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT);
             wynik = wynik | (1<<pos);
             outb(wynik,BASEPORT);
             return 0;
          }
          wynik = strcmp(parametr[1],"clrbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT);
             wynik = wynik & ~(1<<pos);
             outb(wynik,BASEPORT);
             return 0;
          }
          wynik = strcmp(parametr[1],"chgbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT);
             wynik = wynik ^ (1<<pos);
             outb(wynik,BASEPORT);
             return 0;
          }
          wynik = strcmp(parametr[1],"setcbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT+2);
             wynik = wynik | (1<<pos);
             outb(wynik,BASEPORT+2);
             return 0;
          }
          wynik = strcmp(parametr[1],"clrcbit");
          if (wynik == 0) {
             pos = atoi(parametr[2]);
             wynik = inb(BASEPORT+2);
             wynik = wynik & ~(1<<pos);
             outb(wynik,BASEPORT+2);
             return 0;
          }
          return 0;
       }
    }
}

Teraz musimy nasz programik skompilować:

g++ -Wall ./lpt.c -o ./lpt

Powstanie plik lpt. W tym momencie lpt.c nie jest już potrzebny, więc możemy go usunąć, a lpt przenosimy do katalogu /bin. Od tej pory mamy do dyspozycji polecenie sterujące portem LPT. Używamy go tak:

lpt get         - wyświetla port danych
lpt set 127     - ustawia port danych na 127
lpt getbit 3    - podaje stan pinu d3
lpt setbit 5    - zapala pin d5
lpt clrbit 1    - zeruje pin d1
lpt chgbit 7    - zmienia stan pinu d7 na przeciwny
lpt getsbit n   - podaje stan bitu n rejestru stanu
lpt getcbit n   - podaje stan bitu n rejestru kontrolnego
lpt setcbit n   - zapala bit n rejestru kontrolnego
lpt clrcbit n   - zeruje bit n rejestru kontrolnego

Podczas startu systemu port LPT może przyjmować jakąś przypadkową wartość, warto sprawdzić jaką. Po prostu bezpośrednio po uruchomieniu wykonujemy

lpt get

Dobrze jest sprawdzić to wielokrotnie by upewnić się, że za każdym razem ta wartość jest taka sama. U mnie port ustawia się na 4, więc zapala pin d2 portu LPT. W związku z tym na samym końcu sekwencji startowej musimy go wyzerować. Na końcu pliku /etc/rc.d/rc.local dopisujemy:

lpt set 0
touch /tmp/lptready

Druga linia tworzy plik /tmp/lptready, który posłuży nam za flagę w skryptach, które będziemy pisać. Dany skrypt będzie mógł skorzystać z portu LPT tylko i wyłącznie gdy ten plik istnieje, natomiast na czas użytkowania portu plik będzie usuwany przez dany skrypt.

Zamknięcie systemu (init 0) lub jego restart (init 6) musi się wiązać z wyzerowaniem portu LPT, dlatego w pliku /etc/rc.d/rc.6 zaraz pod PATH dodajemy

rm -f /tmp/lptready
lpt set 0

Teraz możemy już spokojnie używać portu pamiętając, by pod "felerne piny" (u mnie d2) podpinać urządzenia, których załączenie na kilkadziesiąt sekund podczas startu systemu nie stworzy większego problemu (np. lampka biurkowa). Ewentualnie można użyć jednego pewnego pinu jako głównego włącznika linii 230V, ale w to nie będę się bawił.

Wyprowadzenie pinów portu LPT

Z gniazda LPT na razie potrzebujemy tylko piny d0 - d7, oraz masę. W szufladzie znalazłem wtyczkę z wlutowanymi kabelkami. Piny d0 - d7 to odpowiednio punkty 2 - 9. Na poniższym zdjęciu pin d0 to kabelek czerwony, pin d1 - brązowy, itd.

image

Kolejne zdjęcie przedstawia sposób podłączenia masy (kabelek czarny). Nie pamiętam skąd taki pomysł bo wtyczkę robiłem jakieś 9 lat temu, ale działa i to jest najważniejsze =).

image

Mamy dziewięć kabelków. Dobrze będzie mieć je pod ręką, stąd mój pomysł z montażem listwy jak na zdjęciu poniżej. Od lewej mamy masę, a dalej piny d0, d1, itd.

image

Teraz pomiędzy masę, a konkretny pin możemy sobie wstawić diodkę i sterować nią używając naszego polecenia lpt =).

Na górę
Autor:

image
int

Kontakt:
facebook.com/int84
int281184@gmail.com
GG 5317390

Licznik:
27000

Valid HTML 4.01 Strict Valid CSS

Strona stworzona przy użyciu PageBreeze, Notepad++, oraz pakietu XAMPP dla sustemu Windows, a także aplikacji KSWEB i DroidEdit Pro dla systemu Android.