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

12/2018
Coole Projekte

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Bytes und Beats

    In Sonic Pi können Sie mit wenigen Codezeilen Klänge manipulieren, Beats zusammenstellen und ganze Songs komponieren.

  • Klein, aber fein

  • Trick or treat

    Das traditionelle RPG-Gruselkabinett glänzt dieses Jahr mit einer innovativen Umsetzung mittels Pneumatik und Elektropneumatik sowie ST-Programmierung.

  • Unter Kontrolle

    Traditionell stellen wir alljährlich ein selbst gebautes Halloween-Gespenst vor. Die pneumatischen und elektronischen Grundlagen erklärt dieser Artikel.

  • Go Pi Go!

    Der Bausatz GoPiGo3 liefert Bauteile und Software für ein kleines Roboterauto. Zusammen mit einem RasPi als Gehirn programmieren Sie den Roboter per Mausklick.

  • Handlicher Helfer

    Während die Folien der Präsentation durchlaufen, liefert ein kleiner Dokumentenserver auf Basis des GL-AR300M-ext zusätzliche Informationen aus.

  • Wiederverwertet

    Mithilfe eines einfachen Python-Programms recyceln Sie ein ausgedientes Smartphone als drahtlos angebundenes RasPi-Display.

  • Herzenssache

    Steigt beim Krimi der Herzschlag bedrohlich an? Mit einem Pulsmesser in Eigenbau ermitteln Sie einfach und kostengünstig, ob der Herzschlag noch in verträglichen Bereichen liegt.

  • Fernbedient

    Mit der Fernbedienung den RasPi steuern. In der Theorie möglich, in der Praxis oft beschwerlich. Die Libcec liefert praktische Tools zur Fehlersuche.

  • Musikwürfel

    Mit Musikcube machen Sie Ihre eigene Sammlung fit fürs Streamen. Der terminalbasierte Audioplayer lässt sich Fernsteuern und bietet eine App für Android-Smartphones.