Aus Linux-Magazin 02/2015

Ein schicker Monitor für den Raspberry Pi

© Wolfgang Zwanzger, 123RF

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.

Abbildung 1: Der Mini-Bildschirm kommt gebrauchsfertig – zumindest die Hardware-Seite. Die umfangreiche Anpassung des Betriebssystems erläutert dieser Artikel.

Abbildung 1: Der Mini-Bildschirm kommt gebrauchsfertig – zumindest die Hardware-Seite. Die umfangreiche Anpassung des Betriebssystems erläutert dieser Artikel.

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.

Abbildung 2: Entsprechend konfiguriert landet die Ausgabe des X-Servers automatisch auf dem Mini-Bildschirm des Raspberry Pi.

Abbildung 2: Entsprechend konfiguriert landet die Ausgabe des X-Servers automatisch auf dem Mini-Bildschirm des Raspberry Pi.

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.

Abbildung 3: Mit etwas Scripting-Kenntnissen erhält der Anwender einen Ein/Aus-Schalter für die Hintergrundbeleuchtung des Monitor-Winzlings.

Abbildung 3: Mit etwas Scripting-Kenntnissen erhält der Anwender einen Ein/Aus-Schalter für die Hintergrundbeleuchtung des Monitor-Winzlings.

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

  1. Scart-Adapter:http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectPath=/Shops/64272905/Products/4040849501227
  2. PiTFT: http://www.adafruit.com/products/1601
  3. Display-Alternative: http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectPath=/Shops/64272905/Products/PiLCD2%2C8
  4. Bauanleitung: https://learn.adafruit.com/adafruit-pitft-28-inch-resistive -touchscreen-display-raspberry-pi/assembly
  5. Treiber-Sourcen: http://github.com/notro/fbtft
  6. FBTFT: http://github.com/adafruit/adafruit-rpi-fbtft
  7. Patch: http://adafruit-download.s3.amazonaws.com/adafruit-ts.zip
  8. Kernelquellen: http://github.com/adafruit/adafruit-raspberrypi-linux
  9. Firmware: http://github.com/adafruit/rpi-firmware
  10. Helferskript: http://github.com/notro/rpi-source
  11. Raspbian: http://www.raspbian.org
  12. Framebuffer-Howto: http://www.tldp.org/HOWTO/html_single/Framebuffer-HOWTO/
  13. Pittft.sh: http://adafru.it/pitftsh
  14. Konfiguriertes Raspbian-Image: http://adafruit-download.s3.amazonaws.com/PiTFT28R_raspbian140909_2014_09_18.zip
  15. Kerneldoku zur Konsole: http://www.kernel.org/doc/Documentation/fb/fbcon.txt
  16. FBI: http://www.kraxel.org/blog/linux/fbida/
  17. Mplayer: http://www.mplayerhq.hu/
  18. Fbgrab: http://fbgrab.monells.se
  19. Pinbelegung: http://learn.adafruit.com/system/assets/assets/000/013/040/original/raspberry_pi_pitftschem.png?1387563188
  20. GPIO-Button schaltet Backlight: http://raspberrypi.stackexchange.com/questions/15337/gpio-button-to-control-backlight-on-pitft
  21. GPIO-Button, Variante 2: http://www.averagemanvsraspberrypi.com/2014/07/how-to-set-up-adafruit-pitft-for.html
  22. RPI Power Switch: http://github.com/notro/fbtft_tools/tree/master/rpi_power_switch
  23. Wiki-Eintrag zum RPI Power Switch: http://github.com/notro/rpi-source/wiki/Examples-on-how-to-build-various-modules#rpi_power_switch

Der Autor

Dr. Udo Seidel ist eigentlich Mathe-Physik-Lehrer und seit 1996 Linux-Fan. Nach seiner Promotion hat er als Linux/Unix-Trainer, Systemadministrator und Senior Solution Engineer gearbeitet. Heute ist er Leiter des Linux-Strategie-Teams der Amadeus Data Processing GmbH in Erding.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben