Wer einen Linux-PC ohne Monitor als Server laufen hat aber trotzdem immer
über den momentanen Zustand des Rechners informiert sein möchte, für
den eignet sich Einsatz eines LCD-Displays.
Es wurde schon viel über den Anschluß eines LC-Displays an Linux-Rechner
geschrieben. Wir wollen dieses Thema nicht zum endlosesten Mal aufgreifen.
Stattdessen präsentieren wir hier eine leicht andere Lösung, indem wir zeigen,
wie manmittels geeignetem Zusammenspiel von LCD und jslaunch nicht nur
eine Statusanzeige anzeigen lassen kann, sondern auch interaktiv den PC
steuern kann.
Wir werden zeigen, wie man mit Hilfe des Programms lcd von Nils Färber
ein LCD am Parallelport ansteuern kann und gleichzeitig
über vier Tasten, die vom Programm jslaunch abgefragt werden,
sich ein eigenes kleines Menü schaffen kann, mit dem man verschiedene Befehle
ausführen kann; und das alles ohne einen nennenswerten Programmieraufwand.
Das Programm lcd ist geeignet, um Displays mit dem Chip vom Typ
Hitachi HD44780 anzusteuern.
Das Display ist z.B. bei Conrad-Elektronik erhältlich und kostet ind der
Asuführung 20 Zeilen und 4 Spalten ca 80,- DM ohne und ca. 120,- DM mit
Hintergrundbeleuchtung (Man sollte allerdings bei dunklen Räumen auf jeden
Fall ein Display mit Hintergrundbeleuchtung nehmen, da das Display ansonsten
nur schlecht lesbar ist).
Das Display wird an den Parallelport angeschlossen und benötigt dafür
folgende Verkabelung:
25 pin LCD
SUB D Panel Pin
---------------------------
1 EN 6
2 DB1 7
3 DB2 8
4 DB3 9
5 DB4 10
6 DB5 11
7 DB6 12
8 DB7 13
9 DB8 14
14 RS 4
18-25 GND -- --+
zusätzlich müssen noch Pin 2 des LCD-Panels an +5V und die Pins 1 und 5 des
Displays und die Pins 18 bis 25 des Parallelports an die Erdung geschlossen
werden.
Eine gute 5-Volt-Quelle im PC ist das 2-Adrige Floppy-Stromkabel
(rotes Kabel für +5V, schwarz für Erdung -- vorher aber nochmal testen!).
Den Kontrast des Displays stellt man mittels eines 100-Ohm-Potentiometers
einstellen. Zumeist reicht es aber, den Pin 3 des Displays direkt an die
Erdung anzuschließen.
+5V ---+
/
\ <--+
/ |
\ |
GND ---+ +--- VL (Pin 3 - driver input)
Die endgültige Verkabeleung sieht dann folgendermaßen aus:
25 pin LCD
SUB D Panel Pin
---------------------------
GND 1 --+--- \ Connect to
+5V 2 --|--- | Gameport
R/W 5 --+ |
1 EN 6 | |
2 DB1 7 | |
3 DB2 8 | |
4 DB3 9 | |
5 DB4 10 | |
6 DB5 11 | |
7 DB6 12 | |
8 DB7 13 | |
9 DB8 14 | |
14 RS 4 | |
18-25 GND --+ |
| +
^^^^^^
VL 3 -----|
Die Erdung der Pins 18-25 des Parallelportkabels ist äußerst wichtig,
ansonsten sieht man auf dem Display nur Flimmernde Zeichen und Kästchen.
Die Treiber zum ansprechen des LCDs liegen momentan in der Verion 0.152 vor.
Allerdings konnte diese Version von uns nicht zum kompilieren gebracht
werden, allerdings funktionierte die Vorgängerversion 0.151, die man auch
auf dem FTP-Server finden kann.
ftp://ftp.unix-ag.uni-siegen.de/pub/os/linux/drivers/
(Bei der auf Server befindliche Version 0.6.0 handelt es sich um ein
gleichnamiges, aber anderes Programm.)
Probieren Sie zuerst, ob die Treiber kompilieren, bevor Sie sich das
LC-Display kaufen. Erst nachdem Sie sicher sind, daß die Treiber auch
kompiliert werden können, lohnt sich der Kauf des Displays!
Erfolg mit dem kompilieren des Treibers hatten wir nur auf einem System mit
2.2.13-Kernel und einem älteren mit 2.0.36.
Beim aktuellen 2.2.16-Kernel brach LCD-0.151 mit fehlermeldungen ab,
aber vielleicht haben Sie ja mehr erfolg.
Vor dem Kompilieren wählt man in der Datei driver/Makefile
den zugehörigen Kerel (2.0.x oder 2.2.x) aus. Außerdem muß man in der Datei
driver/hardware.h noch die Parallelportadresse einstellen:
| driver/hardware.h |
[...]
#define LCD_ADDRESS 0x0378 /* entspricht lpt1: auf den meisten PCs */
/* #define LCD_ADDRESS 0x0278 */ /* entspricht lpt2: auf den meisten PCs */
/* #define LCD_ADDRESS 0x3bc */ /* auch moegliche paralleport-Adresse */
[...]
|
Entfernen Sie dafür die Kommentarzeichen /* und */.
Falls Sie nicht wissen, welche Adresse der Paralleport hat,
schließen sie den Drucker an, laden sie das Druckermodul
>> inmod lp
und schauen Sie sich mittels
>> cat /proc/ioports
die Adresse an.
Falls Sie ein Display mit einer anderen Größe als 20x4 besitzen, können
Sie dies auch unter driver/hardware.h die Anzahl der Spalten
und Zeilen einstellen:
| driver/hardware.h |
[...]
#define LCD_COLS 20
#define LCD_LINES 4
[...]
|
Zum kompilieren der Treiber benötigt lcd die Datei
/usr/src/linux/include/linux/modversions.h und
/usr/src/linux-2.2.13/include/linux/modsetver.h, die
allerdings beide beim 2.0.x-Kernel fehlen.
Es reicht allerdings diese beiden Dateien von einem 2.2.x-Kernel einfach in
das entsprechende Verzeichnis zu kopieren.(modsetver.h
und modversions.h)
Ist alles für das Kompilieren vorbereitet, genügt ein
>> make
im Hauptverzeichnis von lcd.
Danach befindet sich im lcd-Unterverzeichnis driver/ das kompilierte
Modul lcd.o, welches zum Ansteuern des LCDs benötigt wird.
Als letztes muß noch die Pseudo-Datei /dev/lcd angelegt werden, über die
man dann nachher das LCD ansprechen kann. Dafür fürht man das Skript
mkdevice im Unterverzeichnis driver aus (als root).
Als nächstes muß dann die Hardware korrekt angeschlossen werden.
Wir haben bereits in einer früheren Ausgabe über das Jslaunch berichtet
(Jslaunch -- PC per Joystick steuern).
In Verbindung mit einem LCD-Display sind allerdings die Einsatzmöglichkeiten
des Programms noch weitaus umfangreicher.
Das Programm jslaunch überprüft in einstellbaren Zeitintervallen, ob
bei einem Joystick, der am Joystickport einer Soundkarte angeschlossen ist, ein oder
mehrere Knöpfe gedrückt sind, und führt einstellbare Befehle aus.
Das komfortable am Programm ist, daß es zum Einsatz kein Kernelmodul benötigt
um den Joystickport auszulesen, sondern, daß es diese Information direkt
auslesen kann, und somit sehr einfach zu installieren ist.
Wegen der hohen Stabilität des Programms eignet es sich, als eine Art
Notfall-Resety eingesetzt zu werden, falls einige wichtigen
Komponenten des Systems abgestürzt sind (z.B. Tastatur und/oder Netzwerkkarte), um
den PC dann immer noch ohne Hard-Reset neu starten zu können.
Am einfachsten ist es, sich irgendwoher einen defekten Joystick zu beschaffen,
und derart zu zerlegen, daß man nur noch das Kabel und die Taster übrig läßt.
Wenn das Display ein professionelles Aussehen haben sollte, empfiehlt es sich,
die Feuerknöpfe gegen richtige Taster auszutauschen (In jedem
Elektronikfachhandel erhältlich).
Beim Programm jslaunch selbst fällt keinerlei große Arbeitan, außer es zu
kompilieren (>> make).
module laden /sbin/insmod lcd (als root im Unterverzeichnis driver)
->nichtblinkender Coursor in der linken oberen Ecke
Ein Testprogramm starten >>tools/test ??
alles klar? dann prolcd testen /tools/prolcd/... (schon kompiliert)
Treiber entladen mit /sbin/rmmod lcd
jslaunch starten:
>> jslaunch -r 1 'echo "1"' -r 2 'echo "2" ...
-> merken, welchen Knopf welche Nummer
Wenn alles funktioniert einbauen (in PC oder in ein externes Gehäuse)
Kabel wieder zurück ins Gehäuse führen (oder wenn in Blende , dann den Port
abschrauben)
Anlegen von /usr/local/etc/display/
->ablegen von own (Rechte an +x)
| own |
#!/bin/sh
# Just a dumb script copying some nice system information values
# to our LCD device
#
export SLEEP=10
#Bei 1,2,4 Menu -- Bei 3 reboot
echo -n -e "\33c" > /dev/lcd
echo -n -e "\33h" > /dev/lcd
echo -e " " > /dev/lcd
echo -e " Bitte warten ..." > /dev/lcd
echo -e " ==============" > /dev/lcd
killall jslaunch
sleep 4
/usr/local/jslaunch-2.0/jslaunch -r 1 "killall own && /usr/local/etc/display/menu"\
-r 3 "killall own && /usr/local/etc/display/reboot"\
-r 4 "killall own && /usr/local/etc/display/menu"\
-r 2 "killall own && /usr/local/etc/display/menu"&
echo -n -e "\33c" > /dev/lcd
while true; do
echo -n -e "\33c"
echo -n -e "\33h"
export WEB=$(apachectl status | grep reques | cut -d " " -f 4) .
export FTP=$(ftpcount | grep local | cut -d " " -f 22)
export MEM=$(cat /proc/meminfo |fgrep "MemFree"|cut -b 13-24)
export UPT=$(uptime | cut -d "," -f 1)
export USER=$(uptime | cut -d "," -f 2)
export LOAD=$(cat /proc/loadavg | cut -d " " -f 1)
export ZIP=$(df | grep "zip" | cut -d "%" -f 2,2)
export LOCAL=$(df | grep "local" | cut -d "%" -f 2,2)
export CDROM=$(df | grep "cdrom" | cut -d "%" -f 2,2)
export YAMAHA=$(df | grep "yamaha" | cut -d "%" -f 2,2)
export ZIP_P=$(df | grep "zip" | cut -b 50-53)
export LOCAL_P=$(df | grep "local" | cut -b 50-53)
export YAMMAHA_P=$(df | grep "yamaha" | cut -b 50-53)
export CDROM_P=$(df | grep "cdrom" | cut -b 50-53)
echo -e $UPT
echo -e "MEM "$MEM
echo -e "HTTP "$WEB" -- FTP" $FTP" "
echo -e $USER " load:" $LOAD
sleep $SLEEP
echo -n -e "\33c"
echo -n -e "\33h"
echo -e $ZIP_P $ZIP
echo -e $LOCAL_P $LOCAL
echo -e $CDROM_P $CDROM
echo -e $YAMAHA_P $YAMAHA
sleep $SLEEP
#SCREEN 3
echo -n -e "\33c"
echo -n -e "\33h"
export DRUCK=$(lpq | grep bytes | cut -b 8-18 | tail -n 6)
echo -e "Druckaufträge:"
echo -e $DRUCK
sleep $SLEEP
#SCREEN 4
echo -n -e "\33c"
echo -n -e "\33h"
export ETH_R=$(cat /proc/net/dev | grep eth0 | cut -b 8-14)
export ETH_S=$(cat /proc/net/dev | grep eth0 | cut -b 36-43)
export IPP_R=$(cat /proc/net/dev | grep ippp0 | cut -b 8-14)
export IPP_S=$(cat /proc/net/dev | grep ippp0 | cut -b 36-43)
export IPP_E=$(cat /proc/net/dev | grep ippp0 | cut -b 44-48)
export ETH_E=$(cat /proc/net/dev | grep eth0 | cut -b 44-48)
echo -e " eth0 ippp0"
echo -e "rec " $ETH_R" "$IPP_R
echo -e "sen " $ETH_S" "$IPP_S
echo -e "err " $ETH_E" "$IPP_E
sleep $SLEEP
done > /dev/lcd
|
->own als statusanzeige (aber auch procload oder anderes script)
| alternatives own |
alternative
|
Menu 1
| menu1 |
#!/bin/sh
killall jslaunch
killall sleep
echo -n -e "\33c" > /dev/lcd
echo -n -e "\33h" > /dev/lcd
echo -e " " > /dev/lcd
echo -e " Bitte warten ..." >/dev/lcd
echo -e " ==============" > /dev/lcd
sleep 4
export VERZ=/usr/local/etc/display
echo -n -e "\33c" > /dev/lcd
echo -n -e "\33h" > /dev/lcd
echo " --== Menu ==--" > /dev/lcd
echo " 1 Zip-Modul laden" > /dev/lcd
echo " 2 Zip entladen" > /dev/lcd
echo " 3 weiter" > /dev/lcd
/usr/local/jslaunch-2.0/jslaunch\
-r 1 "killall menu && /usr/local/etc/display/zip_on"\
-r 3 "killall menu && /usr/local/etc/display/reboot"\
-r 4 "killall menu && /usr/local/etc/display/cdrom"\
-r 2 "killall menu && /usr/local/etc/display/zip_off" &
#echo "jsl gestartet"
sleep 15
/usr/local/etc/display/own
|
Und beim extre-Knopf (nicht notwendig) Reboot
| reboot |
#!/bin/sh
killall jslaunch
killall sleep
echo -n -e "\33c" > /dev/lcd
echo -n -e "\33h" > /dev/lcd
echo -e " " > /dev/lcd
echo -e " Reboot now ..." >/dev/lcd
echo -e " ==============" > /dev/lcd
echo -e " Bis bald ;-) "> /dev/lcd
sleep 4
reboot
|
noch weitere Menüs einführbar
->Erklärung, warum SLEEP-Zeit
/sbin/init.d boot.local oder rc.d/...
Platz für Kommentare & Fragen:
(selbst eintragen)
|