Manchmal wäre es gut, wenn der Raspberry über einen ständig angeschlossenen Bildschirm verfügte und trotzdem portabel bliebe. Ein seit einiger Zeit erhältlicher 2,8 Zoll großer Touchscreen passt perfekt zu diesem Anwendungsfall. Das Linux-Magazin hat sich dieses Modell genauer angesehen.
Ist der Raspberry nicht als Multimedia-Steuerzentrale oder als traditioneller Server unterwegs, dann ist eine herkömmliche Bildschirmausgabe kein purer Luxus. Anschlussoptionen dafür offeriert der Pi viele: Das beginnt mit HDMI-fähigen Monitoren und HDMI-zu-DVI-Konvertern, geht weiter über Pendants auf der VGA-Seite und endet mit Scart-Adaptern. Mit diesen [1] war es dem Autor sogar möglich, die Ausgabe auf einen 17 Jahre alten Röhrenfernseher umzuleiten.
Handlich oder gar transportabel sind diese Lösungen jedoch nicht. Seit einiger Zeit gibt es aber ein kleines 2,8 Zoll großes Display, das sich einfach an den ARM-Zwerg anschließen lässt (Abbildung 1). Es verschafft dem Raspberry Pi ein Ausgabegerät mit einer Größe von 320 mal 240 Pixeln und 16 Bit Farbtiefe. Als Markenprodukt ist es für gut 30 Euro bei Adafruit [2] zu finden – zumindest im deutschen Markt gibt es auch preiswertere Varianten [3]. Dabei ist es egal, ob der Raspberry Pi in Version A, B oder B+ vorliegt. Der schicke Mini-Bildschirm passt für alle.
Erste Schritte
Das hier vorgestellte Setup benötigt keine Kenntnisse im Umgang mit dem Lötkolben. Wenn gewünscht, kommt das Board mit dem Touchscreen nahezu gebrauchsfertig ins Haus. Notorische Bastler finden eine Bauanleitung unter [4].
Ist der Raspberry mit dem Bildschirm-Board verbunden, beginnt die eigentliche Arbeit. Zum Ansteuern des Mini-Monitors ist der Framebuffer-Treiber für kleine TFTs und LCDs ([5], [6]) nötig. In den meisten Linux-Distributionen für den ARM-Zwerg ist der aber nicht enthalten. Wer seinen Kernel selbst übersetzten will, hat zwei Möglichkeiten. Entweder patcht er den schon vorhandenen Quelltext [7] oder lädt die Kernelquellen ([8], [9]) herunter. Hier hat sich das kleine Skript »rpi-source« [10] bewährt.
Wem das zu mühsam ist, der kann auch auf einen bereits vorgefertigten Kernel zurückgreifen (Listing 1). Dieser ist allerdings nur mit Raspbian [11] getestet und verträglich. Der Einfachheit halber diente deshalb diese Linux-Distribution als Grundlage für den Artikel.
Listing 1
Kerneltreiber installieren
01 cd && mkdir setup && cd setup 02 wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-bin-adafruit.deb 03 wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-dev-adafruit.deb 04 wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-doc-adafruit.deb 05 wget http://adafruit-download.s3.amazonaws.com/libraspberrypi0-adafruit.deb 06 wget http://adafruit-download.s3.amazonaws.com/raspberrypi-bootloader-adafruit-20140917-1.deb 07 08 sudo dpkg -i -B *.deb 09 [...] 10 $ sudo shutdown -r now 11 [...] 12 sudo modprobe spi-bcm2708 13 sudo modprobe fbtft_device name=adafruitts rotate=90 14 export FRAMEBUFFER=/dev/fb1 15 startx
Die Installation des TFT-Kernels ist aber nur die halbe Miete. Die Ansteuerung des Monitors erfolgt über den SPI-Bus (Serial Peripheral Interface). Daher muss das Kernelmodul »spi-bcm2708« geladen sein. Danach gilt es, den Framebuffer-Treiber »fbtft_device« mit geeigneter Konfiguration (ebenfalls Listing 1) zu laden. Das eben genannte Kernelmodul bietet nicht weniger als 20 Parameter an. Für die ersten Schritte genügen aber »name« und »rotate« .
Der Parameter »name« gibt an, um welches TFT-Gerät es sich handelt, damit der Treiber intern die richtigen Schalter umlegt. Der Parameter »rotate« dreht die Ausgabe um den angegebenen Winkel im Uhrzeigersinn. Etwas Feintuning erledigt die Option »frequency« . Sie steuert die Bildwiederholrate. 32000000 ist hier empfohlen, das entspricht 20 FPS (Frames per Second). Macht das Display hier Probleme, probiert man es einfach eine Stufe kleiner mit 16000000. Der letzte Schritt weist der Shellvariablen »FRAMEBUFFER« [12] das richtige Gerät zu – hier ist es »/dev/fb1« .
Startet der Raspberry-Besitzer nun den X-Server aus dieser Shell, erscheint die Ausgabe auf dem Mini-TFT. Funktioniert das, wie es soll, kann der Anwender diese Konfiguration Reboot-fest machen. Er muss Raspbian dazu anweisen, die Module inklusive Konfiguration zu laden und die Shellumgebung des Benutzers anzupassen. Das bedarf weniger Zeilen in den Dateien »/etc/modules« , »/etc/modprobe.d« und »$HOME/.profile« (Abbildung 2). Ein erneuter Reboot zeigt, ob man alles richtig gemacht hat. Wer genauer hinschauen möchte, kann ja die Bootmeldungen im Kernel-Ringpuffer inspizieren.
Wer das Paketeherunterladen und das Installieren sowie die Anpassung der genannten Dateien zu anstrengend findet, der solle sich das Skript »pitft.sh« [13] anschauen. Laut Dokumentation gibt es außerdem ein fertig konfiguriertes Raspbian-Abbild [14], das der Anwender nur noch auf eine SD-Karte kopieren muss. Als diese Zeilen geschrieben wurden, war die Datei jedoch beschädigt und ließ sich nicht verwenden.
Gib mir mehr
Die Ausgabe von X11 auf den TFT-Winzling ist schon mal ganz nett. Es wäre aber ausgesprochen praktisch, wenn das Gleiche auch für die normale Konsole funktionieren würde. Wenn das sogar den Bootprozess einschlösse, wäre sogar ein weiterer Bildschirm überflüssig. Und tatsächlich erfüllt der kleine Monitor beide Anforderungen.
Die notwendigen Arbeitsschritte beschränken sich auf eine entsprechende Anweisung an den Kernel. Das Setup ist nicht mal spezifisch für den Raspberry Pi und in der Kerneldokumentation unter “The Framebuffer Console” hinterlegt [15]. Für frühe Anweisungen an den Linux-Kernel ist unter Raspbian die Datei »boot/cmdline.txt« zuständig. Die Instruktion »fbcon=map:10 fbcon=font:VGA8x8« bewirkt dann das gewünschte Verhalten. Wer sich für weitere Optionen interessiert, sei auf die bereits erwähnte Dokumentation [15] verwiesen.
Das oben angesprochene Skript »pitft.sh« greift dem Benutzer auch hier unter die Arme. Auf Wunsch nimmt es die geforderten Änderungen zur Aktivierung der Konsole auf dem Mini-Bildschirm vor. Wer mag, kann nun »/etc/rc.local« aufbohren, um beispielsweise Statusmeldungen nach dem Booten anzeigen zu lassen. Die bei Raspbian vorkonfigurierte Ausgabe der IP-Adresse ist eine gute Vorlage (Listing 2).
Listing 2
Konsolen-Setup
01 $ cat /etc/rc.local 02 [...] 03 _IP=$(hostname -I) || true 04 if [ "$_IP" ]; then 05 printf "My IP address is %s\n" "$_IP" 06 fi 07 [...] 08 $
Übrigens: Wer auf den vorgefertigten Kernel zurückgreift, sieht die Bootmeldungen erst zu einem recht späten Zeitpunkt. Grund ist, dass der Gerätetreiber ein Modul ist. Erst wenn der Kernel es geladen hat, kann er seine Meldungen auf dem Monitor-Zwerg ausgeben. Wer den Kernel selbst übersetzt, sollte den Treiber fest einbinden. Dann sieht er auch die früheren Bootnachrichten.
Bilder oder Videos anzuzeigen bereitet nun keine Bauchschmerzen mehr. Für Ersteres empfiehlt sich der Framebuffer Image Viewer »fbi« [16]. Für Videos kann der Anwender auf das Multitalent Mplayer [17] zurückgreifen. Als Ausgabegerät muss er »/dev/fb1« angeben – und damit ist alles erledigt. Sind Screenshots notwendig, so lohnt ein Blick auf das Werkzeug »fbgrab« [18]. Ein paar kleine Kommandozeilen-Beispiele finden sich weiter unten.
Bitte hier drücken
Vielen stechen sicherlich die vier Knöpfe unterhalb des Bildschirms ins Auge. Die Entwickler haben vier GPIOs auf diese Knöpfe gelegt. Unter [19] findet sich ein Layout-Diagramm, das die Zuordnung Knopf zur GPIO-Nummer darstellt (siehe Tabelle 1). Leider ist das Pinlayout für verschiedene Revisionen des ARM-Zwergs nicht komplett identisch. Auf älteren Boards ist der dritte Knopf von links GPIO-Pin 21 zugeordnet, auf neueren jedoch 27.
Tabelle 1
Zuordnung der PiTFT-Taster zu den GPIOs
|
Knopf-Position |
Nummer des GPIO-Pin |
|---|---|
|
1. von links |
23 |
|
2. von links |
22 |
|
3. von links |
21 (27) |
|
4. von links |
18 |
Dass man mit einfachen Python-Skripten den Zustand der GPIOs auslesen kann, haben schon andere Artikel demonstriert. Im vorliegenden Fall lässt sich so ermitteln, ob der Benutzer einen bestimmten Knopf betätigt hat. Ein simples Testskript zeigt Listing 3.
Listing 3
Knöpfe abfragen
01 #!/usr/bin/python
02 import RPi.GPIO as GPIO
03
04 GPIO.setmode(GPIO.BCM)
05
06 GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
07 GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
08 GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
09 GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
10 while True:
11 if not(GPIO.input(23)):
12 print("23 gedrueckt!")
13 if not(GPIO.input(22)):
14 print("22 gedrueckt!")
15 if not(GPIO.input(27)):
16 print("21 gedrueckt!")
17 if not(GPIO.input(18)):
18 print("18 gedrueckt!")
Unter [20] und [21] finden sich zwei alternative Implementierungen von Python-Skripten, die den zweiten Knopf in einen Ein/Aus-Schalter für den Bildschirm – und nur diesen – verwandeln. Die erste Implementierung benutzt ein externes Shellskript, die zweite bringt alles im Python-Code unter. Beide greifen aber auf die gleiche Funktion des TFT-Boards zurück, das mit einem zusätzlichen GPIO zur Steuerung der Hintergrundbeleuchtung ausgestattet ist. Diesen GPIO Nummer 252 muss der Benutzer erst mit »echo 252 > /sys/class/gpio/export« freischalten.
Danach gibt es im Pseudo-Dateisystem »sysfs« einen neuen Eintrag »/sys/class/gpio/gpio252« . Über ihn steuert der Anwender die Hintergrundbeleuchtung durch einfache »echo« -Befehle. In Abbildung 3 sind die notwendigen Schritte in einem Shellskript hinterlegt. Wer dies nun mit dem Auslesen des Zustands von einem der Knöpfe verdrahtet, erhält einen prima Ein/Aus-Schalter für die Hintergrundbeleuchtung.
Analog könnten die Knöpfe auch die Wiedergabe von Filme starten oder Bilder anzeigen. Beispiele stellt Listing 4 vor. So könnte der Raspberry Pi als echte Mini-Multimediazentrale dienen.
Listing 4
Filme abspielen oder Bilder anzeigen
01 $ cat test.mpeg.play.sh 02 #!/bin/sh 03 # 04 PATH=/bin:/usr/bin:/usr/local/bin 05 export PATH 06 ps -ef|grep [m]player > /dev/null 2>&1 07 if [ "$?" -eq 0 ]; then 08 pkill mpayer || pkill -9 mplayer 09 else 10 nohup mplayer -nolirc -vo fbdev2:/dev/fb1 -vf scale=320:-3 test.mpg > 11 /dev/null 2>&1 & 12 fi 13 $ 14 $ 15 $ cat show.test.jpg.sh 16 #!/bin/sh 17 # 18 PATH=/bin:/usr/bin:/usr/local/bin 19 export PATH 20 ps -ef|grep [f]bi > /dev/null 2>&1 21 if [ "$?" -eq 0 ]; then 22 pkill fbi || pkill -9 fbi 23 else 24 nohup fbi -T 2 -d /dev/fb1 -noverbose -a test.jpg > /dev/null 2>&1 & 25 fi
Vom Skript zum Kernel
Analog zu den eben besprochenen Beispielen kann man einen weiteren Knopf als Aus-Schalter für den Raspberry Pi konfigurieren. Schicker wäre allerdings, wenn das Einschalten analog funktionieren würde. Prinzipbedingt geht das mit dem Python-Skript natürlich nicht: Ist das Betriebssystem erst mal heruntergefahren, gibt es keine Skripte, die irgendwo lauschen könnten.
Die Entwickler des Framebuffer-Treibers haben mit »rpi_power_switch« [22] ein Kernelmodul geschaffen, das hier ganz nützlich ist. Wer den vorgefertigten Linux-Kern benutzt, kann direkt loslegen. Im Wiki [23] steht, wie man dieses Kernelmodul separat übersetzt. Das ist etwas hakelig. In den meisten Fällen ist die Überprüfung der Version des GNU-C-Compilers zu deaktivieren. Außerdem sind mindestens 900 MByte freier Speicher auf der SD-Karte nötig.
Die im Wiki hinterlegten Anweisungen verschweigen, dass der Anwender das Kommando »make scripts« ausführen muss. Das ist aber nötig, um die notwendigen Hilfsprogramme, etwa »scripts/mod/modpost« , für die Modulgenerierung zu erzeugen.
Die wichtigsten Parameter von »rpi_power_switch« sind »gpio_pin« und »mode« . Der erste legt fest, welchen GPIO-Pin das Kernelmodul überwacht. Der zweite Parameter entscheidet, ob der Knopf als Taster oder als Schalter dient. Das schon mehrmals erwähnte Helferlein »pitft.sh« aktiviert auf Wunsch »rpi_power_switch« , ordnet ihm GPIO-Pin 23 zu und konfiguriert ihn als Taster.
Zum Schluss
Mit dem PiTFT erübrigt sich ein externer Monitor in vielen Fällen. Die am Board angebrachten Knöpfe tragen sogar zu einer nützlichen Erweiterung bei. Dieser Artikel gibt nur einen ersten Einblick in die Möglichkeiten des Bildschirms. Darüber hinaus besitzt er etwa noch die Touchscreen-Funktion, die einem späteren Artikel vorbehalten bleibt.
Infos
- Scart-Adapter:http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectPath=/Shops/64272905/Products/4040849501227
- PiTFT: http://www.adafruit.com/products/1601
- Display-Alternative: http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectPath=/Shops/64272905/Products/PiLCD2%2C8
- Bauanleitung: https://learn.adafruit.com/adafruit-pitft-28-inch-resistive -touchscreen-display-raspberry-pi/assembly
- Treiber-Sourcen: http://github.com/notro/fbtft
- FBTFT: http://github.com/adafruit/adafruit-rpi-fbtft
- Patch: http://adafruit-download.s3.amazonaws.com/adafruit-ts.zip
- Kernelquellen: http://github.com/adafruit/adafruit-raspberrypi-linux
- Firmware: http://github.com/adafruit/rpi-firmware
- Helferskript: http://github.com/notro/rpi-source
- Raspbian: http://www.raspbian.org
- Framebuffer-Howto: http://www.tldp.org/HOWTO/html_single/Framebuffer-HOWTO/
- Pittft.sh: http://adafru.it/pitftsh
- Konfiguriertes Raspbian-Image: http://adafruit-download.s3.amazonaws.com/PiTFT28R_raspbian140909_2014_09_18.zip
- Kerneldoku zur Konsole: http://www.kernel.org/doc/Documentation/fb/fbcon.txt
- FBI: http://www.kraxel.org/blog/linux/fbida/
- Mplayer: http://www.mplayerhq.hu/
- Fbgrab: http://fbgrab.monells.se
- Pinbelegung: http://learn.adafruit.com/system/assets/assets/000/013/040/original/raspberry_pi_pitftschem.png?1387563188
- GPIO-Button schaltet Backlight: http://raspberrypi.stackexchange.com/questions/15337/gpio-button-to-control-backlight-on-pitft
- GPIO-Button, Variante 2: http://www.averagemanvsraspberrypi.com/2014/07/how-to-set-up-adafruit-pitft-for.html
- RPI Power Switch: http://github.com/notro/fbtft_tools/tree/master/rpi_power_switch
- Wiki-Eintrag zum RPI Power Switch: http://github.com/notro/rpi-source/wiki/Examples-on-how-to-build-various-modules#rpi_power_switch








