Unser System kennt zwei Zustände (Abbildung 3): Im Zustand Z1 ist der RasPi heruntergefahren, der PIC überwacht mit dem IR-Sensor den Raum; im Zustand Z2 läuft der RasPi und übernimmt die Überwachung. Bei einer Bewegung setzt der Sensor den Ausgabepegel auf High. Der PIC reagiert auf den Interrupt, schaltet über seinen Ausgang via Mosfet den Strom für den RasPi an und geht danach in den Standby-Modus. Damit ist der Zustand Z2 erreicht.

Abbildung 3: Das Diagramm verdeutlicht die verschiedenen Systemzustände und Übergänge des Konstrukts.
Direkt nach dem Booten übernimmt der RasPi im Zustand Z2 die Kontrolle über den Bewegungsmelder. Angeschlossen an einem GPIO-Pin lauscht er auf Interrupts. Bleiben diese für eine definierte Zeitspanne aus, beispielsweise für 30 Minuten, fährt er herunter. Jede erfasste Bewegung setzt diesen Shutdown-Timer wieder zurück.
Der Bildschirm bleibt also an und aktiv, solange der PIR zumindest hin und wieder eine Bewegung im Raum feststellt. Andernfalls fährt der RasPi endgültig herunter. Damit jetzt wieder der PIC die Kontrolle übernimmt, signalisiert der RasPi den Shutdown zurück an den PIC, der daraufhin über seinen Ausgang den Strom abschaltet – das System erreicht erneut den Zustand Z1.
Software-Kontrolle
Damit das alles funktioniert, braucht es die passende Logik sowohl auf RasPi-Seite als auch auf dem Mikrocontroller. Diese lässt sich auf dem RasPi einfach implementieren, da es alle Bausteine schon fertig aus anderen Projekten gibt. Die PIR-Überwachung erledigt der gpio-poll-service, den Sie zusammen mit einer detaillierten Installationsbeschreibung auf Github [3] finden. Listing 2 zeigt die Konfiguration.
Listing 2
[GLOBAL] gpios: 17 [GPIO17] edge: rising ignore_initial: 0 bounce_time: 60 command: '/usr/local/sbin/shutdown-timer'
Der PIR ist über GPIO17 angeschlossen. Wechselt der Pegel auf High (Zeile 4), führt der Dienst das Skript in Zeile 7 aus. Eine Besonderheit stellt die Bounce-Time in Zeile 6 dar: Sie dient eigentlich der Software-Entprellung von Schaltern und hat normalerweise einen sehr kleinen Wert. In unserem Fall wählen wir einen großen Wert von 60 Sekunden, damit das System nicht kurz hintereinander viele Bewegungsereignisse verarbeiten muss.
Das simple Shutdown-Timer-Skript aus Listing 3 besteht im Wesentlichen aus zwei Befehlen. Der in Zeile 3 löscht einen früher gesetzten Shutdown und jener in der folgenden Zeile aktiviert ihn wieder. Als letztes Argument für das Shutdown-Kommando fungiert die Zeit in Minuten bis zum Herunterfahren.
Listing 3
#!/bin/bash SHUTDOWN_DELAY=30 /sbin/shutdown -c /sbin/shutdown --no-wall +$SHUTDOWN_DELAY
Damit der PIC mitbekommt, dass der RasPi heruntergefahren ist, aktivieren Sie noch in der /boot/config.txt ein entsprechendes Overlay (Listing 4) und verbinden GPIO4 (Pin 7) mit dem zweiten Eingang des PIC sowie mit einem Pulldown (4,7k) nach Masse. Direkt nach dem Shutdown setzt der RasPi den Pegel auf High, was dem PIC signalisiert, wieder in den Zustand Z1 zu wechseln.
Listing 4
dtoverlay=gpio-poweroff,gpiopin=4
Der Mikrocontroller
Der Mikrocontroller überwacht die Eingänge von PIR und RasPi und steuert den Gate des Mosfets, der den Strom für den Pi schaltet. Neben dem Mikrocontroller und dem Mosfet sitzen auf der Platine (Abbildung 4 und Abbildung 5) noch eine Hohlbuchse für ein per 5,5/2,1-mm-Buchse angeschlossenes 12-Volt-Netzteil, ein DC-DC-Konverter sowie ein Klemmanschluss für ein Micro-USB-Kabel, das als Stromzuführung für den RasPi dient.

Abbildung 4: Schaltplan für die Steuerplatine, über die der Mikrocontroller die Stromzufuhr zum RasPi unterbricht.

Abbildung 5: Das Bild zeigt links die Oberseite und rechts die Unterseite der Mikrocontroller-Platine, die Sie mit der GPIO-Buchse auf den RasPi stecken.
Die Betriebsspannung von 5 Volt aus den 12 Volt des Eingangs per Stepdown-Konverter zu erzeugen bringt sowohl Vor- als auch Nachteile mit sich. Zum einen schlägt der Leistungsverlust des Konverters zu Buche. Da der Infoscreen aber nicht im Dauerbetrieb läuft, lässt sich dieser Effekt verkraften. Der große Vorteil der Schaltung: Die 5 Volt stehen stabil bereit. Bei einem Prototyp mit normalem 5-Volt-Netzteil zeigte sich, dass die Kombination aus Bewegungssensor und RasPi sehr empfindlich auf Unterspannung reagiert und dann Phantom-Interrupts auslöst.
Die Logik des Aufbaus fasst Abbildung 6 zusammen – der Ablauf ließe sich problemlos auch auf andere Controllertypen übertragen. Die Wahl fiel bei uns auf den kostengünstigen und stromsparenden PIC12F675, für den die komplette Programmentwicklung auch auf dem RasPi selbst abläuft.
Das Hauptprogramm im PIC12F675 [1] besteht aus einer Endlosschleife mit zwei Zuständen. Der erste Programmteil, Zustand 1 (Z1), überwacht den PIR auf erkannte Bewegungen, also das Erkennen einer steigenden Flanke von Low auf High an OUT. Dazu verwenden wir den flankengetriggerten Interrupt GP2/INT.






