Mit Gesten und einem Raspberry Pi im Rezeptbuch blättern

Aus LinuxUser 06/2023

Mit Gesten und einem Raspberry Pi im Rezeptbuch blättern

© Ra2studio | 123RF.com

Hände frei

Eine typische Szene in der Küche: in einer Hand der Kochlöffel, die andere Hand verschmiert. Wer jetzt umblättern muss, freut sich, wenn das der RasPi übernimmt.

Die Hardwareanforderungen für unser Projekt fallen moderat aus: ein Raspberry Pi, ein Bildschirm und ein Gestensensor. Die Wahl fiel bei Letzterem auf den APDS9960 (Abbildung 1). Breakouts mit diesem Modul und I2C-Anschluss erhalten Sie für wenig Geld bei den üblichen Händlern (3,70 Euro etwa bei BerryBase). Einen Fallstrick sollten Sie bei diesen Sensoren jedoch auf dem Radar haben: Es gibt sie mit und ohne gelötete Jumper. Der linke Jumper mit dem Label “PS” steuert die Stromversorgung der Infrarotlampe über den Pin für positive Versorgungsspannung (VCC) und sollte unbedingt geschlossen sein. Der rechte Jumper (“12C PU”) aktiviert die Pullups an der Taktleitung (SCL) und der Datenleitung (SDA). Beim RaspPi ist das zwar überflüssig, schadet aber auch nicht.

Abbildung 1: Den Gestensensor APDS9960 beziehen Sie bei den üblichen Händlern für etwa 4 Euro.

Abbildung 1: Den Gestensensor APDS9960 beziehen Sie bei den üblichen Händlern für etwa 4 Euro.

In modernen Küchen finden sich mitunter fest installierte Bildschirme. Wer keinen besitzt, greift zu einem mittelgroßen TFT-Bildschirm wie dem 7-Zoll-Pi-Bildschirm oder einer Variante von Waveshare (Abbildung 2). Stehen Sie derzeit wie vermutlich viele andere Menschen vor dem Problem, dass ein Pi kaum lieferbar ist, können Sie auf einen Laptop ausweichen. Dazu unten später mehr.

Abbildung 2: Im Beispielprojekt sitzt der Gestensensor oberhalb des TFT-Bildschirms von Waveshare.

Abbildung 2: Im Beispielprojekt sitzt der Gestensensor oberhalb des TFT-Bildschirms von Waveshare.

Software installieren …

Das Programm Pi-Image-Viewer ist in Python implementiert und gibt sich sehr minimalistisch. Dahinter steckt ein Bildbetrachter, der genau eine Funktion übernimmt: per Gesten in einem Bild zu scrollen. Dementsprechend würde die Software ebenfalls mit einem kleinen 4-Zoll-Bildschirm mit dahintergeklemmtenm RasPi funktionieren. Besonders anwenderfreundlich fiele das jedoch nicht aus.

Die erforderliche Software für Ihr gestengesteuertes Rezeptbuch erhalten Sie von Github [1]. Das Klonen des Repositorys und die Installation der Software erledigen Sie mithilfe der Befehle aus Listing 1. Zusätzliche Informationen liefert die Installationsanleitung im Readme auf Github.

Listing 1

Pi-Image-Viewer installieren

git clone https://github.com/bablokb/pi-image-viewer.git
cd pi-image-viewer
sudo tools/install

… und implementieren

Als Basis dienen Blinka [2] für den Sensor und PyGame [3] für die Oberfläche. Hinter Letzterem steckt eigentlich eine Spieleengine, die aber auch für andere Anwendungen taugt. Das Verschieben von Objekten ist für PyGame verständlicherweise ein Heimspiel. Statt Spielfiguren verschiebt die Software das Bild und zeigt so jeweils einen anderen Ausschnitt an (Abbildung 3).

Abbildung 3: Bild und Bildschirm stellt PyGame als Rechtecke dar.

Abbildung 3: Bild und Bildschirm stellt PyGame als Rechtecke dar.

Innerhalb von PyGame verkörpern Rechtecke sowohl das Bildschirmfenster, als auch das Bild. Das Fenster gibt das globale Koordinatensystem vor, dessen linke obere Ecke markiert den Nullpunkt. Dieser, genauer dessen Koordinaten 0 und 0, bestimmt den Ort relativ zum Bildschirm. Sind die Koordinaten also 0/0, sehen Nutzer den linken oberen Teil des Bilds (Abbildung 3, links).

Sind die Koordinaten dagegen negativ, etwa -50/-50, liegt die Ecke links oben außerhalb des Fensters, und Sie bekommen den Bildbereich rechts unten angezeigt (Abbildung 3, rechts). Das mag zuerst verwirrend klingen, aber ein Verschieben des Bilds nach links oben (negative Koordinaten) macht den Bildteil rechts unten sichtbar.

Das Steuern von PyGame funktioniert über Events. Das Programm verarbeitet Key-Events für die vier Cursor-Tasten (Listing 2, Zeilen 12 bis 17). Hinter jeder Taste verbirgt sich eine Methode, die für das Verschieben in die vier Richtungen zuständig ist. Damit der Code nicht ausufert, gibt es dafür jeweils ein vorher angelegtes Schlüsselwertpaar (Zeilen 2 bis 8).

Listing 2

Tastatursteuerung

...
self._MAP = {
    K_RIGHT:  self._right,
    K_LEFT:   self._left,
    K_UP:     self._up,
    K_DOWN:   self._down,
    K_ESCAPE: self._close
  }
...
...
for event in pygame.event.get():
    if event.type == QUIT:
      self._close()
    elif event.type == KEYDOWN:
      if event.key in self._MAP:
        self._MAP[event.key]()
...

Gesten verarbeiten

Das Verarbeiten der Gesten erfolgt in einem zweiten Thread. Dieser pollt den Sensor (Listing 3, Zeile 4) und synthetisiert anhand der festgestellten Gesten einfach passende Key-Events für das PyGame-Hauptprogramm (Zeile 16), womit sich der Kreis schließt.

Listing 3

Gestensteuerung

  evnt = {}
  while not self._stop.is_set():
    time.sleep(0.1)
    gesture = self._apds.gesture()
    if not gesture:
      continue
    elif gesture == 0x01:
      evnt['key'] = pygame.K_UP
    elif gesture == 0x02:
      evnt['key'] = pygame.K_DOWN
    elif gesture == 0x03:
      evnt['key'] = pygame.K_LEFT
    elif gesture == 0x04:
      evnt['key'] = pygame.K_RIGHT
    event = pygame.event.Event(pygame.KEYDOWN,evnt)
    pygame.event.post(event)

Das beschriebene Programm mit Gestensteuerung alleine löst das Problem noch nicht komplett. Zunächst müssen Sie Ihr gedrucktes Rezept in ein (JPG-)Bild umwandeln. Mittels Scan oder Foto aus einem Rezeptbuch beziehungsweise Screenshot gelangen Sie hier denkbar einfach und schnell ans Ziel. Für den Anwendungszweck genügen moderate Auflösungen völlig.

Liegt das Rezept als PDF vor, hilft Ihnen folgender Einzeiler.

convert -density 150 in.pdf -append out.jpg

Er verwendet den Befehl convert aus dem ImageMagick-Paket, das üblicherweise schon installiert ist. Falls nicht, beziehen Sie es kurzerhand über den Paketmanager Ihrer Distribution. Mit -density steuern Sie die Auflösung des Bilds. Wenn das PDF mehrere Seiten besitzt, ordnet der Befehl die Seiten untereinander an. Bevorzugen Sie das horizontale Blättern, ersetzen Sie -append durch +append. Daneben existieren noch zwei weitere Parameter für das Feintuning: -trim entfernt weißen Rand, -sharpen 0x1.0 schärft das Ergebnis nach.

Um den Bildbetrachter per Doppelklick zu starten, benötigen Sie noch zweierlei: Zum einen eine Datei pi-image-viewer.desktop, die den Bildbetrachter als Verarbeitungsprogramm für JPGs registriert. Zum anderen brauchen Sie eine Datei, die ihn als Standardanzeigeprogramm hinterlegt. Beide Punkte beschreibt das Readme des Github-Projekts.

Laptop statt Pi

Bildbetrachter und Gestensteuerung funktionieren auch ohne Pi zum Beispiel auf einem normalen Laptop (Abbildung 4). Das liegt daran, dass Blinka und PyGame genauso auf gängigen Desktop-Betriebssystemen laufen. Da denen aber meist ein frei zugänglicher I2C-Anschluss fehlt, müssen Sie diesen via USB-I2C-Bridge nachrüsten. Einfach und kostengünstig geht das per MCP2221 für etwa 7,75 Euro [4][5] oder noch etwas günstiger mithilfe eines Raspberry Pi Pico [6].

Abbildung 4: Laptop, MCP2221, Gestensensor

Abbildung 4: Laptop, MCP2221, Gestensensor

Fazit

Ein paar Zeilen PyGame-Code, ein paar Zeilen APDS9960-Code, großteils aus Beispielcode im Internet zusammenkopiert – mehr braucht es für diese Anwendung nicht. Dank der Simulation von Tastenevents können Sie auf eine Tastatur verzichten. Das Prinzip lässt sich darüber hinaus auf andere Hardware übertragen. Beispielsweise gibt es kostengünstige Displays ohne Toucheingabe. Statt vollwertiger Tastatur tut es womöglich auch ein einfaches per I2C angeschlossenes MPR121-Tastenfeld [7]. Genauso wie der Code im Bildbetrachter Gesten in Anschläge übersetzt, wären es mit dem Tastensensor dann Touchevents.

Noch einen Schritt weiter gehen Sie mithilfe der Bibliothek python3-evdev. Dank ihr generieren Sie beliebige (System-)Tastenevents. Auf diese Weise steuern Sie anschließend jedes Programm per Gesten oder Touch, nicht nur solche, die wie der Pi-Image-Viewer darauf ausgelegt sind.

Als Alternative zur Gestensteuerung kommt die Sprachsteuerung infrage. Sie lässt sich inzwischen praxistauglich auf einem Raspberry Pi nutzen. Details dazu lesen Sie in einem früher erschienen Artikel [8]csi

Infos

  1. Pi-Image-Viewer: https://github.com/bablokb/pi-image-viewer
  2. CircuitPython: Bernhard Bablok, “Einer für alle(s)”, RPG 04/2020, S. 80, https://www.raspi-geek.de/43118
  3. PyGame-Homepage: https://www.pygame.org
  4. MCP2221: Bernhard Bablok, “GPIOs für alle”, RPG 12/2020, S. 68, https://www.raspi-geek.de/45414
  5. Adafruit-Guide zum MCP2221: https://learn.adafruit.com/circuitpython-libraries-on-any-computer-with-mcp2221
  6. Adafruit-Guide zum Pico als I2C-USB-Bridge: https://learn.adafruit.com/circuitpython-libraries-on-any-computer-with-raspberry-pi-pico
  7. Strommesser-Eigenbau: Bernhard Bablok, “Verbrauchskontrolle”, RPG 10/2022, S. 44, https://www.raspi-geek.de/47528
  8. Seeed ReSpeaker : Bernhard Bablok, “Hört, hört!”, RPG 04/2022, S. 36, https://www.raspi-geek.de/46786
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 06/2023 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben