PiiP
Raspberry Pi in a Pocket
Eigenschaften
PiiP („Pi in a Pocket“), der Raspberry Pi für die Westentasche, ist ein kreditkartengroßer, batteriebetriebener Linux-Computer auf Basis des Einplatinencomputers Raspberry Pi. Er verfügt über Schalter für die Umstellung von Batterie- auf Netzteilbetrieb und über einen Taster, mit dem dafür definierte Funktionen ausgelöst sowie ein Shutdown angestoßen werden können. Die grüne Status-LED wird für die Signalisierung diverser Betriebszustände genutzt. Optional kann man via WLAN auf einen Webserver zugreifen, eine einfache Web-App zeigt dann einen Betriebsstundenzähler und diverse Buttons – darunter einen für den Shutdown. Auch der administrative Zugang mit SSH erfolgt über WLAN.
Anwendung
Aufgrund der geringen Akkulaufzeit von wenigen Stunden ist dieser Computer für ernsthafte Anwendungen freilich weniger geeignet – ich betrachte ihn auch eher als Machbarkeitsstudie. Vorrangiges Entwicklungsziel war, die Außenmaße des Raspberry Pi (Kreditkarte) einzuhalten und insbesondere mit der Bauhöhe einschließlich Akku die Höhe des GPIO-Pfostensteckers nicht zu überschreiten. Nach Demontage der nicht benötigten Audio- und Videobuchsen (s. u.) ist das Resultat damit sogar flacher als der urprüngliche Raspberry Pi.
Allerdings spiele ich mit dem Gedanken, das Platinchen gelegentlich mit Rädern, kleinen Motörchen und Sensoren auszustatten und damit ein Braitenberg-Vehikel zu realisieren; die eingeschränkte Batterielaufzeit wäre für ein solches Vorhaben von untergeordneter Bedeutung.
Stromversorgung
Für die Stromversorgung wollte ich die sehr flachen Lithium-Ionen-Akkus vom Typ „NB-4L“ verwenden, die ich von einer defekten Digitalkamera übrig hatte. Diese Akkus liefern eine Spannung von 3,7 Volt; normalerweise wird der Raspberry Pi über den Mikro-USB-Anschluss mit 5 Volt aus einem Steckernetzteil versorgt. In den Diskussionsforen zum Thema Batteriebetrieb des Raspberry Pi findet man Vorschläge, sich auf eine Einspeisung von 3,3 Volt zu beschränken und auf 5 Volt zu verzichten. Auch werden verschiedene Varianten für den Ort der Einspeisung diskutiert. Ich habe mich entschieden, 5 Volt bereitzustellen. Der von mir verwendete Gleichspannungswandler (S7V8F5 von Pololu) ist ein Step-Up/Step-Down-Typ und kann aus Eingangsspannungen zwischen 2,7 und 11,8 Volt eine Ausgangsspannung von 5 Volt erzeugen. Bei der Wahl der Akkus hat man so größtmögliche Freiheit.
Als Einspeisungspunkte wählte ich die 5 Volt- und Masse-Anschlüsse der USB-Buchse. Diese sind über hinreichend große Lötaugen auf den Platine (s. o.) zugänglich, sodass ich ein kurzes Stück Litze mit integrierter Steckbuchse anlöten konnte. Ich umgehe damit zwar die unmittelbar hinter dem „offiziellen“ 5-Volt-Anschluss (der Mikro-USB-Buchse) eingebaute Polyfuse-Sicherung, erwarte dadurch aber keine Nachteile.
Akkulaufzeit
Mit den von mir verwendeten Lithium-Ionen-Akkus (3,7 Volt, 760 mAh) läuft der Raspberry Pi ohne WLAN knapp 3 Stunden, mit WLAN etwas mehr als 2 Stunden. NB-4L-Akkus mit vorgeblich doppelter Kapazität (1400 mAh) erbrachten keine längere Laufzeit.
Tests mit AAA-Batterien oder einer 9-Volt-Blockbatterie stehen noch aus.
Schaltung
Um ohne Ausbau des Akkus von Batteriebetrieb auf Betrieb mit Steckernetzteil umschalten zu können, habe ich zwei Schiebeschalter vorgesehen. Mit dem einen (S1) trenne ich den Akku vom Eingang des Spannungswandlers, mit dem anderen (S2) dessen Ausgang von der 5-Volt-Schiene des Raspberry Pi. Dies bedeutet, dass bei Netzteilbetrieb der Schalter S2 offen sein muss, der Raspberry Pi wird durch Stecken bzw. Abziehen des Netzteils ein- bzw. ausgeschaltet. Bei Akkubetrieb bleibt der Schalter S2 dauerhaft geschlossen (ein Steckernetzteil darf dann nicht angeschlossen sein), und der Raspberry Pi wird mit Schalter S1 ein- und ausgeschaltet.
Somit ergeben sich folgende Schalterstellungen:
Betrieb mit Akku | Betrieb mit Netzteil | ||||||||||||||||||||||||
|
|
Eingabe-Taster
Als mir durch leidvolle Erfahrung klar wurde, dass auch beim Raspberry Pi auf einen Shutdown vor dem Ausschalten nicht verzichtet werden darf, habe ich einen zusätzlichen Taster (B1 im Schaltplan oben) eingebaut und mit Pin 26 des GPIO-Pfostensteckers (GPIO 7) verdrahtet. Dieser wird als Eingang konfiguriert und durch einen per Software aktivierbaren Pull-Up-Widerstand auf High gehalten; bei Betätigung des Tasters wird der Pin über einen 1-KΩ-Widerstand auf Masse gelegt.
Dieser Taster dient primär dem Auslösen eines Shutdown, er ist aber auch für das Ein- und Ausschalten etwaiger Anwendungen geeignet und ermöglicht so eine eingeschränkte Interaktion mit dem Gerät auch ohne WLAN-Zugang. Mit kurzer Betätigung kann eine Anwendung ein- und ausgeschaltet werden, hält man den Taster dagegen länger als zwei Sekunden gedrückt, wird das System heruntergefahren.
Status-LED
Die auf dem Raspberry Pi bereits vorhandene grüne Status-LED (die normalerweise bei Zugriffen auf die SD-Karte flackert) kann auf einfache Weise für eigene Zwecke genutzt werden. Hier dient sie dazu, unterschiedliche Betriebszustände anzuzeigen:
LED-Anzeige | Bedeutung |
---|---|
1-Hertz-Blinken | Kontakt zu WLAN-Router hergestellt |
2-Hertz-Blinken | Betrieb als WLAN-Access-Point |
an (alle 2 Sekunden kurz aus) | Anwendung „ein“ |
aus (alle 2 Sekunden kurz an) | Anwendung „aus“ |
10-Hertz-Flackern | Shutdown im Gange |
10 mal Blinken | Fertig zum Ausschalten |
(Das zehnmalige Blinken nach dem Shutdown ist das normale Verhalten.)
Aufbau
Raspberry Pi Model A
Da weder ein LAN-Anschluss noch ein zweiter USB-Port benötigt werden, ist das abgespeckte Modell A des Raspberry Pi eine geeignete Basis. Es verbraucht weniger Strom als das Modell B, und an der Stelle, an der beim Modell B die LAN-Buchse sitzt, ist hier nicht nur Platz für eine kleine Zusatzplatine, sondern es gibt dort praktischerweise auch zwei Bohrlöcher für deren Befestigung.
Um die Außenmaße einhalten zu können, setze ich einen Micro-SD-Card-Adapter von Quilix ein. Dieser ragt – anders als andere Modelle – nur etwa einen halben Millimeter über die Platine hinaus.
Platz für den Akku
Um PLatz für den Akku zu schaffen, habe ich die nicht benötigten Audio- und Video-Buchsen „ausgebaut“. (Da es mir nicht gelang, sie auszulöten, habe ich sie mit roher Gewalt und einer Zange zertrümmert und die Anschlussbleche mit einem Seitenschneider abgekniffen. Ich bin aber sicher, das geht besser ;-)
Nach Entfernung der Buchsen ist ausreichend Platz für typische Digitalkamera-Akkus. Die CPU wird dann zwar vom Akku überdeckt, thermische Probleme habe ich bisher aber nicht feststellen können. Würde man den DSI-Display-Konnektor entfernen, wäre es auch möglich, zwei AAA-Batterien im Halter oder eine 9-Volt-Blockbatterie unterzubringen – bei dann allerdings deutlich größerer Bauhöhe.
Akkukabel
Die Akkus haben an einer ihrer Stirnseiten elektrische Kontakte, die in der Kamera und im Ladegerät gegen Kontaktfedern gedrückt werden. Eine Möglichkeit, die Akkus im Raspberry Pi zu laden, habe ich nicht vorgesehen. Da ich das vorhandene Ladegerät weiternutzen wollte, kam nicht in Frage, Anschlusslitzen an diese Kontaktflächen zu löten. Ich habe daher ein abnehmbares Akkukabel selbst gebastelt. Dazu habe ich um einen Zahnstocher zwei Ösen aus Kupferdraht (Seele einer 220-Volt-Stegleitung) gebogen und Litzen mit integrierter Steckbuchse angelötet. Die Lötstellen habe ich mit Schrumpfschlauch fixiert. Ein zwischen den Ösen am Zahnstocher anliegendes Gummiband wird nun um den Akku gelegt und drückt über den Zahnstocher die Ösen gegen die Kontaktflächen. (Dass das Gummiband vor dem Anlöten der zweiten Litze eingelegt werden muss, habe ich beim ersten Versuch gemerkt, als es zu spät war ;-)
Zusatzplatine
Den Spannungswandler und die beiden Schiebeschalter habe ich auf einer kleinen Zusatzplatine aufgebaut, die ich an der Stelle platziert habe, an der beim Modell B die LAN-Buchse sitzt. Nachdem ich auf der Unterseite des Platinchens zwei Schrauben angeklebt hatte, konnte ich diese dort dank der bereits vorhandenen Bohrlöcher auch festschrauben. Der Anschluss des Akkus und die Verbindung zur 5-Volt-Schiene des Raspberry Pi erfolgt mit Pfostensteckern. (Einen fünften Pfostenstecker, an dem die geschaltete Akkuspannung anliegt, habe ich für spätere Erweiterungen vorgesehen.)
Zusätzlich habe ich einen Mikro-Drucktaster unterhalb der Schiebeschalter angeklebt und auf der Unterseite des Raspberry Pi mit GPIO 7 (P1-Header Pin 26) verdrahtet. So bleibt der Pfostenstecker für Erweiterungen frei.
WLAN
Der Zugang zum Raspberry Pi (SSH oder Web-Server) erfolgt via WLAN. Dazu wird der WLAN-Adapter im USB-Port des Raspberry Pi im Access-Point-Modus betrieben, sofern er sich nicht in Reichweite des heimatlichen WLAN-Routers befindet. Ein einfaches Skript prüft nach dem Booten mit Ping, ob der Router erreichbar ist. Ist dies nicht der Fall, wird der WLAN-Adapter in den Access-Point-Modus umkonfiguriert. Dazu wird die Datei /etc/network/interfaces modifiziert, anschließend werden der Access-Point-Daemon hostapd und der DHCP-Server udhcpd gestartet. Eine Anleitung für den Betrieb eines Access-Points auf dem Raspberry Pi gibt es bei elinux.org.
Der von mir wegen seiner Performance und seiner geringen Maße präferierte Edimax-WLAN-Adapter EW-7811Un eignet sich – entgegen landläufiger Meinung – bestens für den Betrieb als Access-Point, allerdings nur mit einem speziellen Ersatz für das hostapd-Binary, den Dave Conroy freundlicherweise zum Download anbietet.
Software
Ansteuerung der Status-LED
Die Steuerung der im Raspberry Pi bereits vorhandenen grünen Status-LED (die normalerweise beim Zugriff auf die SD-Karte flackert) kann einfach über das virtuelle sysfs-Filesystem erfolgen. Dazu schreibt man bestimmte Steuerworte in virtuelle Dateien im Verzeichnis /sys/class/leds/led0 – am simpelsten in der Shell mit „echo“ und Ausgabeumlenkung. Ggf. muss zuvor mit „modprobe“ ein Kernel-Modul geladen werden, um bestimmte LED-Anzeigefunktionen (wie Blinken oder den so genannten „Heartbeat“) bereitzustellen.
Das Bash-Skript „led0“ unterstützt die Funktionen „an“, „aus“, „Blinken“ mit variabler Frequenz und Pulsweite, sowie „Heartbeat“ – ein Rhythmus ähnlich dem eines schlagenden Herzens. Außerdem kann auf die normale Funktion (Anzeige der SD-Karten-Aktivität) wieder zurückgesetzt werden.
Das Skript ist als root auszuführen, beispielsweise mit sudo:
Die möglichen Aufrufoptionen werden angezeigt, wenn man das Skript ohne Argumente aufruft – oder mit „led0 --help“ ;-)
Eingabe-Taster
Der Eingabe-Taster ist mit Pin 26 des Pfostensteckers (GPIO 7) verbunden und schaltet diesen bei Betätigung auf Masse, während ein per Software aktivierbarer Pull-Up-Widerstand den Pin bei offenem Taster auf High-Pegel hält. Das Python-Modul RPi.GPIO ist für die Ansteuerung der GPIO-Pins bestens geeignet, ab der Version 0.5.0a ist es auch in der Lage, Interrupts zu verarbeiten. Ich nutze dies hier, um den Taster nicht in einer Schleife permanent abfragen zu müssen, sondern erst bei Betätigung des Tasters und einen dadurch ausgelösten Interrupt die Funktion für die weitere Verarbeitung der Benutzereingabe anzuspringen.
Das Python-Skript „button.py“ definiert zunächst GPIO 7 als Input und aktiviert den internen Pull-Up-Widerstand. In der Hauptschleife wird dann ein Wartezustand eingeleitet, der erst durch einen Interrupt wieder beendet wird. Ausgelöst wird dieser Interrupt durch eine fallende Flanke an GPIO 7 (erzeugt durch Drücken des Tasters). Anschließend wird das Tastenprellen durch eine 0,2 Sekunden lange Pause überbrückt und geprüft, ob der Tasters nach mehr als 2 Sekunden noch immer gedrückt ist. Ist dies der Fall, wird mit dem Skript led0 (s. o.) ein Flackern der Status-LED erzeugt und danach ein Shutdown ausgelöst. Andernfalls wird die Variable „status“ umgeschaltet und ihr jeweiliger Wert (0 oder 1) durch ein entsprechendes LED-Signal angezeigt. An dieser Stelle könnte man nun eine beliebige Anwendung starten und stoppen. Danach geht das Skript wieder in den Schlafzustand über und wartet auf den nächsten Interrupt.
Das Skript wird nach dem Booten in /etc/rc.local als Daemon in den Hintergrund gestartet:
Liste der Komponenten
Komponente | Produkt | Hersteller | Händler |
---|---|---|---|
Raspberry Pi | Raspberry Pi Model A | Raspberry Pi | exp-tech |
SD-Card-Adapter | MicroSD Card Adapter | Quilix | ModMyPi |
WLAN-Adapter | Edimax EW-7811Un | Edimax | Amazon |
Akku | NB-4L – 3.7 Volt – 760 mAh | Canon et. al. | Amazon |
Akku-Ladegerät | Canon CB-2LVE | Canon | Amazon |
Spannungswandler | Pololu S7V8F5 | Pololu | exp-tech |
Schiebeschalter | Hartmann SX254L | Hartmann Electronic | Conrad |
Drucktaster | Namae JTP-1243 | Namae Electronics | Conrad |
Anschlusslitzen | Steckbuchse mit Litze | Conrad | Conrad |
Gehäuse (optional) | Clear Transparent Case | SB-Component | Amazon |
Mögliche Verbesserungen
Die nachstehenden Verbesserungen halte ich für interessant und machbar, getestet habe ich sie aber nicht.
- Andreas van der Locht schlägt vor, den Raspberry Pi ausschließlich über den Ausgang des Spannungswandlers mit Strom zu versorgen, und dessen Eingang über einen Umschalter wahlweise mit dem Akku oder mit dem Steckernetzteil zu verbinden. Damit könnte einer der beiden Schalter eingespart werden, und es wäre die Gefahr gebannt, dass versehentlich der Ausgang des Spannungswandlers durch S2 mit dem Ausgang des Steckernetzteils kurzgeschlossen wird. Mit einem zusätzlichen Kondensators am Eingang des Spannungswandlers könnte dann u. U. sogar im laufenden Betrieb zwischen Netzteil und Akku umgeschaltet werden. Allerdings müsste dann eine zweite Mikro-USB-Buchse untergebracht werden.
Known Issues
- Da das Absinken der Akkuspannung nicht überwacht wird, erfolgt der Zusammenbruch der Ausgangsspannung des Spannungswandlers ohne jede Vorankündigung. Wenn nicht rechtzeitig ein Shutdown ausgelöst wird, kann das zu einer Beschädigung des Dateisystems (nur der Software – nicht der Hardware) führen.
- Wenn ein Steckernetzteil angeschlossen und Schalter S2 geschlossen ist, sind die Ausgänge von Steckernetzteil und Spannungswandler kurzgeschlossen. Letzterer hat keine reverse-voltage protection, dieses Szenario ist daher unbedingt zu vermeiden.
- Die von mir verwendeten Litzen mit integrierten Pfostenstecker-Steckbuchsen haben keinen Verpolungsgschutz, es ist daher darauf zu achten, dass sie richtig herum auf die Pfostenstecker aufgesteckt werden (siehe Fotos oben).
- Aufgrund der Modifikationen am Raspberry Pi (Entfernung der Audio- und Video-Buchsen, Anlöten von Kabeln) verliert man natürlich jegliche Garantieansprüche.