Aus Raspberry Pi Geek 12/2017

Bau eines Pi-Zero-Lichtweckers mit dem Four-Letter-pHAT (Seite 3)

Firmware

Nachdem die Hardware installiert und verkabelt ist, kommt die Software an die Reihe. Raspbian bildet die solide Basis für unsere Firmware. Darauf aufsetzend laufen mehrere Dienste, die sich um die Hardware kümmern. Als Programmiersprache kommt Python zum Zug, nicht zuletzt, weil Pimoroni zur Hardware auch passende Python-Bibliotheken samt ausführlichen Beispielen liefert.

Den großen Rahmen bildet ein eigener Systemd-Service, der den Wecker kontrolliert (Abbildung 8). Er startet diverse Threads, die jeweils für einzelne Systemteile verantwortlich zeichnen. Dazu gehören ein Keyboard-Thread, der auf Tastatureingaben reagiert, ein Timekeeper-Thread, der über die Änderung der Zeit wacht, und ein Bot-Thread, in dem der Chatbot für die Konfiguration läuft.

Abbildung 8: Die Software-Architektur des Nerd-Weckers sieht einen zentralen Dienst für Systemd vor, der die einzelnen Threads für die Bestandteile unter einem Dach vereint.

Abbildung 8: Die Software-Architektur des Nerd-Weckers sieht einen zentralen Dienst für Systemd vor, der die einzelnen Threads für die Bestandteile unter einem Dach vereint.

Alle Komponenten kommunizieren indirekt über ein zentrales Objekt Settings. Setzt der Timekeeper-Thread dort die neue Uhrzeit, bekommt dies sowohl der Display-Controller mit, der dann die Uhrzeit aktualisiert, als auch der Alarm-Thread, der bei Bedarf einen Alarm aktiviert.

Die komplette Software samt Skript zur Installation für alle Komponenten steht auf Github bereit [6]. Bei Bedarf laden Sie das Gesamtpaket von dort herunter und passen es, wo nötig, an Ihre Bedürfnisse an.

Auf Tastendruck

Bei der Tastatursteuerung geht es darum, den Tastendruck an sich sowie dessen Dauer festzustellen. Für die entsprechende Programmierlogik finden sich im Internet viele Beispiele. Dabei überprüfen Sie in einer Endlosschleife in festgelegten Intervallen den Pegel des zugehörigen GPIO-Pins, bei Änderungen führt das Programm eine passende Funktion aus.

Was bei einer einzelnen Taste noch einigermaßen einfach funktioniert, gerät bei vier Schaltern schnell unübersichtlich. Das liegt zum einen an der ineffizienten Schlafschleife, zum anderen an der engen Verknüpfung der Logik zur Hardware-Überwachung mit jener der Anwendung. Für den Wecker kommt deshalb eine Alternative zum Einsatz, die die Tastenkontrolle in einen eigenen Systemd-Service auslagert und die Ereignisse dann an das Programm des Weckers weiterleitet. Wer bereits per LIRC eine eigene Infrarot-Fernbedienung an einen RasPi angeschlossen hat, kennt dieses Prinzip.

Das generische Paket GPIO-Poll-Service [7] des Autors kapselt das Überwachen der Hardware. Ursprünglich kam es in einem anderen Projekt zum Einsatz und findet seitdem immer wieder Verwendung. Der Service überwacht eine beliebige Anzahl von GPIO-Pins und startet bei einem Wechsel des Pegels ein pro Pin konfigurierbares Programm. Alternativ leitet der Service alle Ereignisse per Pipe an ein einziges Programm weiter.

Den Systemd-Service steuern Sie über eine einfache Konfigurationsdatei namens /etc/gpio-poll.conf. Im Gegensatz zu den üblichen Beispielen verwendet der Service nicht die ineffiziente Endlosschleife, sondern nutzt den Linux-Systemaufruf poll. Hier weckt das Betriebssystem den Prozess beim Wechsel des Pegels auf – solange niemand eine Taste betätigt, verbraucht der Prozess keine CPU-Zyklen.

Listing 2 zeigt ein Beispiel für die Konfiguration. Der Abschnitt [GLOBAL] konfiguriert die überwachten GPIOs (Zeile 9) und setzt für alle davon gültige Vorgabewerte (Zeilen 3 bis 6). Die einzelnen Abschnitte überschreiben dann die zugehörigen Variablen.

Listing 2

 

[GLOBAL]
debug: 0
active_low: 0
edge: rising
ignore_initial: 1
bounce_time: 0.05
#      N1  N2  N3  N4
gpios: 17,  4, 22, 27
[GPIO17]
command: /usr/local/sbin/taste1
[GPIO4]
command: /usr/local/sbin/taste2
[GPIO22]
command: /usr/local/sbin/taste3
[GPIO27]
command: /usr/local/sbin/taste4

Die jeweiligen Kommandos erhalten als Übergabewerte die GPIO-Nummer, den Wert null oder eins sowie zwei Werte für die Zeit. Der erste davon entspricht der Zeitspanne seit dem letzten Aufruf mit gleichem Wert, der zweite der Zeit seit dem letzten Aufruf mit entgegengesetztem Wert. Über diese Informationen vermag das Programm unter anderem einen kurzen von einem langen Tastendruck zu unterscheiden.

Eine Konfiguration wie in Listing 2 eignet sich perfekt für alle Projekte, die mit dem Mini-Keyboard einzelne und logisch getrennte Funktionen steuern wollen, etwa einen Mediaplayer mit seinen Tasten “Vor”, “Zurück”, “Halt/Weiter” und “Stop”. Für den Nerd-Wecker kommt dagegen die oben erwähnte alternative Konfiguration zum Einsatz, die bei einem Tastendruck die Informationen nicht an ein bestimmtes Programm übergibt, sondern die Informationen in eine Pipe schreibt.

Solche Pipes arbeiten nach dem Fifo-Prinzip (“first in, first out”). Im Beispiel schreibt der GPIO-Poll-Service in diese Pseudodatei, der Wecker-Service liest daraus. Damit entfällt der Neustart des Programms zum Verarbeiten bei jedem Tastendruck, und der Wecker ist in der Lage, sich seinen Status zu merken.

Listing 3 zeigt die Konfiguration. Zeile 3 schaltet die Pipe-Verarbeitung ein. Damit entfällt die Definition der einzelnen Kommandos aus Listing 2. Die Zeilen 5 bis 8 enthalten wieder globale Einstellungen. Der Eintrag edge: rising in Zeile 6 bedeutet, dass nur das Drücken einer Taste von Bedeutung ist, nicht aber das Loslassen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben