PiMenu: Bedienoberfläche für LCD-Touchscreens

© Sarah Holmlund, 123RF

Neues Gesicht

Mit PiMenu erstellen Sie im Handumdrehen eine menügeführte Benutzeroberfläche, die sich ideal für kleinformatige LCD-Touchscreens eignet.

README

Wenn Sie einen RasPi mit Touchscreen ihr Eigen nennen, kann Ihnen PiMenu in vieler Hinsicht das Leben leichter machen. Damit erstellen Sie mit wenigen Handgriffen eine schicke, auf Kacheln basierende Menüführung für beliebige Einsatzzwecke.

Den Raspberry Pi mit einem kleinen Touchscreen zu kombinieren drängt sich auf den ersten Blick geradezu auf – bis man dann in der Praxis feststellt, dass die Desktops der typischen RasPi-Distributionen sich nur sehr bedingt für solch kleine Bildschirme eignen. Aufruf und Bedienung der Programme und insbesondere Eingaben geraten auf den zwergenhaften Displays zum Geduldsspiel. Andererseits erscheint es als Overkill, ein eigenes maßgeschneidertes grafisches Interface für den Touch-Bildschirm aufzusetzen.

Hier kommt PiMenu [1] ins Spiel: Die in Python und TkInter geschriebene Lösung erlaubt, mit minimalem Aufwand kachelbasierte Bildschirmmenüs zu definieren. Sie stammt aus der Feder des deutschen Programmierers Andreas Gohr, der auch das bekannte DokuWiki entwickelt hat. Ursprünglich für Gohrs Projekt Paper Backup [2] konzipiert, lässt sich die vielseitige Software recht einfach auch für andere Projekte adaptieren, die eine einfach zu bedienende grafische Benutzerschnittstelle benötigen.

Noch besser: PiMenu basiert auf Komponenten, die Raspbian großteils bereits vorinstalliert mitbringt. Sie müssen lediglich mit den ersten beiden Zeilen aus Listing 1 noch das Paket python-yaml nachziehen, um PiMenu auf dem RasPi zum Laufen zu bringen. Dann laden Sie die aktuelle Version von PiMenu aus dem Github-Repository des Projekts herunter, entweder als ZIP-Archiv oder – sofern Git auf dem RasPi eingerichtet ist – über das Kommando aus der letzten Zeile von Listing 1.

Listing 1

 

$ sudo apt-get update
$ sudo apt-get install python-yaml
$ git clone https://github.com/splitbrain/pimenu.git

Touchscreens für den Raspberry Pi

Der Zubehörmarkt offeriert eine ganze Reihe von LCD-Touchscreens, die sich für den Raspberry Pi eignen. Zu den speziell für den RasPi entwickelten Modellen zählt beispielsweise das PiTFT-Panel [3] von Adafruit, für das in Form des PiTFT Pibow [4] auch ein schickes Gehäuse zur Verfügung steht. Eine umfangreiche (allerdings englischsprachige) Dokumentation dazu findet sich auf der Hersteller-Webseite [5].

Einen guten Kandidaten gibt außerdem das RPI-Display von Watterott [6] ab, für das der Hersteller auch ein Tek-Berry-Gehäuse mit passendem Ausschnitt offeriert [7]. Für die Software zum RPi-Display – dazu zählt auch ein vorbereitetes SD-Card-Images – gibt es ein eigenes GitHub-Repository [8].

Alternativ können Sie auch auf Ebay nach entsprechenden Displays Ausschau halten – achten Sie aber darauf, dass für diese eine geeignete Software zur Verfügung steht.

PiMenu umfasst drei Schlüsselkomponenten: Das Python-Skript pimenu.py zeichnet das grafische Interface, die Konfigurationsdatei pimenu.yaml definiert die Menüpunkte dazu. Das Bash-Skript pimenu.sh schließlich setzt die vom Python-Skript zurückgegebenen Benutzereingaben in Aktionen um.

Für jeden in der Konfigurationsdatei vorgegebenen Menüpunkt zeichnet PiMenu eine Kachel, die das Hauptskript dann in das Anzeigefenster einpasst. Das Ergebnis sieht zwar ein wenig nach Windows 8 aus, funktioniert dafür aber auf einem RasPi-Touchscreen bestens, selbst für Benutzer mit Wurstfingern. Hinsichtlich der Komplexität der Benutzerführung setzt Ihnen PiMenu kaum Grenzen, denn in pimenu.yaml dürfen Sie mehrere Ebenen von Menüpunkten und damit recht komplexe Strukturen definieren.

PiMenu im Einsatz

Der Autor ist des Öfteren unterwegs und fotografiert auf Reisen viel. So entstand die Idee zu einer RasPi-basierten Backup-Box für die entstandenen Schnappschüsse. Hier erwies sich PiMenu als idealer Baustein, um das Gedankenspiel in die Praxis umzusetzen. Die Pi-Backup-Box soll Fotos direkt von der Kamera oder von einem Kartenleser holen und sie dann auf ein USB-Speichermedium übertragen.

Als ersten Schritt zur Umsetzung gilt es, zunächst einmal die benötigten Menüpunkte in die Konfigurationsdatei pimenu.yaml zu integrieren (Listing 2). Jeder Menüpunkt darin hat vier Eigenschaften: eine Bezeichnung (name) und ein Label (label) sowie optional eine Kachelfarbe (color) und ein Icon (icon). Der Name des Letzteren verweist auf ein gleichnamiges GIF im Verzeichnis ico, in unserem Beispiel also ico: "menu", also auf das Bild ico/menu.gif.

Über die zusätzliche Eigenschaft items verweisen Sie gegebenenfalls auf Punkte in Untermenüs. In unserem Beispiel enthält Menu die drei Unterpunkte Camera, USB und Backup. Achten Sie darauf, die Punkte in den Menüs und Untermenüs sorgfältig über Leerzeichen einzurücken – Tabulatoren funktionieren hier nicht – und durch ein Minuszeichen als Separator zu trennen.

Listing 2

 

# Menu configuration
---
-
    name: "Menu"
    label: "Menu"
    color: "#FF851B"
    icon: "menu"
    items:
    -
        name : "Camera"
        label: "Camera"
        color: "#3D9970"
        icon : "camera"
    -
        name : "USB"
        label: "USB"
        color: "#39CCCC"
        icon : "usb"
    -
        name : "Backup"
        label: "Backup"
        color: "#7FDBFF"
        icon : "backup"
-
    name: "Exit"
    label: "Exit"
    color: "#85144B"
    icon: "exit"

Das Python-Skript pimenu.py bringt zum einen anhand der Strukturinformationen aus pimenu.yaml die Menükacheln auf den Bildschirm. Zum anderen registriert es das Antippen der Kacheln und ruft dann das Shell-Skript pimenu.sh auf, in dem Sie anhand des Namens der gewählten Kachel die zugehörigen Aktionen festlegen. Dazu richten Sie das Shell-Skript so ein, dass es diesen Namen über eine Case-Anweisung auswertet.

Dazu lesen Sie den Namen mittels des Befehls echo "$*" ein. Der liefert allerdings den kompletten Menüpfad als Zeichenkette zurück, wenn die angetippte Kachel am Ende einer Menüstruktur steht. Drücken Sie beispielsweise in unserem Fall die Kachel Backup, erhalten Sie als Ergebnis die Zeichenkette Menu Backup. Da Sie zur Auswertung nur den Namen der Kachel benötigen, extrahieren Sie diesen mithilfe des Tools Awk aus dem Rückgabestring und weisen ihn dann der Variablen key zu:

key=$(echo "$*" | awk 'NF>1{print $NF}')

Anschließend werten Sie dann mit der Case-Anweisung den Inhalt dieser Variablen aus, wie Listing 3 es für unser Beispiel zeigt.

Listing 3

 

#!/bin/bash
key=$(echo "$*" | awk 'NF>1{print $NF}')
case $key in
  Camera)
    ps aux | grep -ie gphoto2 | awk '{print $2}' | xargs kill -9
    cd
    if [ ! -d "FOTOS" ]; then
      mkdir FOTOS
    fi
    cd FOTOS
    gphoto2 --get-all-files --new --filename "%Y%m%d-%H%M%S.%C"
    ;;
  USB)
    cd
    if [ ! -d "FOTOS" ]; then
      mkdir FOTOS
    fi
    USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -not -empty -type d | sed 's/ /\\ /g')
    exiftool -r -d /home/pi/FOTOS/%Y%m%d-%H%M%S.%%e '-FileName<DateTimeOriginal' $USB_MOUNT_POINT >> /home/pi/transfer.log
    ;;
  Backup)
    cd
    if [ ! -d "FOTOS" ]; then
      exit 1
    fi
    USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -type d | sed 's/ /\\ /g')
    eval rsync -avhz /home/pi/FOTOS/ $USB_MOUNT_POINT/ --log-file=/home/pi/backup.log
    ;;
  '')
    ps aux | grep -ie pimenu | awk '{print $2}' | xargs kill -9
    ;;
esac
sleep 3

Backup-Box im Detail

Im Folgenden sehen wir uns nun einmal genauer an, was in den einzelnen Abschnitten der Case-Anweisung eigentlich genau passiert. Sobald Sie die Kachel Camera antippen, beendet das Skript zunächst einmal alle noch laufenden Prozesse von Gphoto2:

ps aux | grep -ie gphoto2 | awk '{print $2}' | xargs kill -9

Dies stellt sicher, dass keine noch laufenden Gphoto2-Prozesse die Kamera blockieren und dadurch möglicherweise den Transfer der Fotos verhindern (Listing 3, Zeile 5). Der Ordnung halber speichert das Skript alle von der Kamera heruntergeladenen Bilder im Ordner FOTOS im Home-Verzeichnis ab. Falls dieses noch nicht existiert, legt das Skript es dazu an (Zeilen 7 bis 9). Schließlich lädt es mit dem folgenden Befehl die Bilder von der Kamera herunter, wobei es sie gemäß Datum und Uhrzeit umbenennt:

gphoto2 --get-all-files --new --filename "%Y%m%d-%H%M%S.%C"

Der Abschnitt, der Bilder vom angeschlossenen USB-Gerät zurück auf den RasPi holt (Zeilen 13 bis 20), geht davon aus, dass lediglich ein solches Gerät oder ein einzelner Card-Reader am Mini-Rechner hängt. Zunächst ermittelt folgendes Kommando den Einhängepunkt des USB-Massenspeichers:

USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -not-empty -type d | sed 's/ /\\ /g')

Dazu durchsucht find das Verzeichnis /media nach Ordnern, die nicht leer sind. Mittels des Stream-Editors Sed sorgt der zweite Teil des Kommandos für ein sauberes Escaping von eventuellen Leerzeichen im Verzeichnisnamen. So wird aus /media/NIKON D90/DCIM/100NCD90/ beispielsweise /media/NIKON\ D90/DCIM/100NCD90/.

Auch für das Sichern der von der Kamera übertragenen Fotos (Zeilen 21 bis 28) ermittelt das Skript zunächst einmal den Einhängepunkt des fraglichen Massenspeichers. Anschließend kopiert es die Dateien mithilfe des Befehls rsync auf den USB-Datenträger.

Tippen Sie eine Kachel an, für die es keine Untermenüpunkte gibt, wie in unserem Beispiel Exit, bleiben der an pimenu.sh zurückgelieferte String und damit auch $key leer. Daher schließt die entsprechende Case-Verzweigung in diesem Fall alle noch laufenden PiMenu-Prozesse (Zeilen 29 bis 31).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

08/2019
Smarte Hacks

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Immer der Reihe nach

    Mit einer einfachen Schaltung testen Sie Bausteine, die über den SPI-Bus miteinander kommunizieren.

  • Einzigartig

    Eine MAC-Adresse ermöglicht die Kommunikation im Netzwerk. Der 24AA02E48 liefert sie für Setups, die aus grundlegenden Komponenten bestehen.

  • Steinkuchen

    Der Raspberry Pi hat viele Fans, doch nicht ohne Grund sehnen sich viele Anwender nach einem RasPi 4. Der Rock Pi 4 übertrumpft den RasPi 3 in Sachen Leistung um Längen und schlägt sich auch in der Praxis gut.

  • Kerngeschäft

    Der Einstieg in die Welt der Mikrocontroller fällt nicht ganz leicht. Mit dem Nucleo F401RE haben Sie jedoch ein Entwicklerboard samt abgestimmter Entwicklungsumgebung an der Hand.

  • Himbeer-Geräte

    Mit Maus und Tastatur im weiß-roten Raspberry-Look macht die Raspberry Pi Foundation das eigene Angebot an Peripheriegeräten für den Mini-Rechner komplett.

  • Unter Kontrolle

    PiCockpit ist eine speziell auf den RasPi zugeschnittene Online-Monitoring-Lösung. Wir werfen einen ersten Blick auf den brandneuen und in Ausbau befindlichen kostenlosen Dienst.

  • Ins rechte Licht gesetzt

    Selbst ohne eigenen Garten holen Sie sich Pflanzen mithilfe von LEDs in jeden Raum und sehen ihnen mit dem RasPi beim Wachsen zu.

  • Helligkeit nach Maß

    Wer bei wechselnden Lichtverhältnissen nicht ständig die Beleuchtung manuell nachregeln möchte, der spannt dafür einen PiXtend ein.

  • Geschrumpft

    Kleine Bildschirme gibt es zwar viele, aber der Support von Raspbian ist überraschend schlecht. Mit ein paar Tricks erzielen Sie trotzdem ein optimales Ergebnis.

  • Brüllwürfel

    Kompakt-Stereoanlagen mit CD-Spieler und Kassettendeck sind inzwischen oft ein Fall für den Recyclinghof – oder für die digitale Wiederbelebung mit einem RasPi und etwas Geschick.