Unter den unzähligen Einsatzmöglichkeiten eines Raspberry Pi finden sich durchaus auch solche, bei denen ein Stromausfall kritisch wäre. Deshalb gibt es für den kleinen ARM-Rechner sogar eine regelrechte unterbrechungsfreie Stromversorgung (USV). Linux-Magazin-Autor Udo Seidel war elektrisiert.
Im einfachsten Fall reicht ja eine Batterie oder ein Akkupack – eine richtige USV bietet aber noch viel weiter gehende Möglichkeiten, von denen dieser Artikel einige auslotet.
Erste Schritte
Der Start mit der schicken USV namens Upis für den Raspberry ist denkbar einfach. Der Lötkolben kann schon mal im Schrank bleiben. Die Upis besteht aus einem Board, das man über die GPIO-Pins des ARM-Zwergs [1] anschließt, und einem Lithium-Polymer-(Lipo-)Akkumulator. Im Lieferumfang ist ebenfalls ein Stückchen Spiegelklebeband, um den Akku auf der USV zu fixieren.
Sind Raspberry und Upis miteinander verbunden, passen sie leider nicht in die üblichen Gehäuse. Erstens ist das Gesamtkonstrukt höher als der ARM-Zwerg allein. Zweitens gibt es zusätzliche Anschlüsse und Schalter, die entsprechende Öffnungen brauchen (Abbildung 1). Wer kein Lego zur Hand hat, kann im Internet passende Gehäuse für die Huckepack-Konstruktion bestellen [2].
Übrigens gibt es zwei Varianten der USV: eine Basis-Version und eine Delux-Ausgabe [3]. Der Formfaktor ist nahezu identisch, allerdings hat Letztere einen größeren Akku, einen zweiten Spannungseingang und bietet mehr Funktionen. Aber selbst die Basis-Variante ist schon beeindruckend und bildet die Grundlage für diesen Artikel. Unterschiede beider Variationen kann man in (http://4, http://5) nachlesen. Einige wichtige Eigenschaften sind:
- Automatisches Laden der Sicherungsbatterie
- Programmierbares Herunterfahren des Rechners nach Stromausfall
- I2C-Schnittstelle
- Überwachbar durch externe Programme und Skripte (beispielsweise Nagios)
- Temperatursensor
- Serielle Schnittstelle
Die USV kann erst nach dem Starten des ARM-Rechners die Stromversorgung übernehmen. Sprich: Zum erfolgreichen Booten ist Strom aus der Steckdose nötig. Die Grundeinrichtung ist schnell erledigt. Einfach das USV-Board mit dem Lipo-Akku verbinden, dann gemäß Anleitung auf den Mini-Rechner stecken, Stromversorgung anschließen – und fertig. Die USV prüft ab sofort permanent, ob Spannung anliegt.
Vor den ersten Tests sollte die Batterie aufgeladen sein. Fällt die externe Stromversorgung aus, läuft der ARM-Zwerg rund zwei Stunden munter weiter. Ohne zusätzliche Maßnahmen bemerkt das Betriebssystem auf dem Raspberry den Wechsel auf Batteriestrom allerdings gar nicht. Der aktuelle Zustand der Upis lässt sich aber bequem über den I2C-Bus ([6], [7]) auslesen.
Vortasten
Als Erstes steht die Überprüfung und gegebenenfalls Aktualisierung der Firmware des Upis-Boards an. Bis Mitte September 2014 war dazu ein Windows-System erforderlich. Inzwischen ist die Aktualisierung direkt vom angeschlossenen ARM-Rechner aus möglich. Dafür ist jedoch etwas Handarbeit angesagt.
Die Kommunikation erfolgt über die serielle Schnittstelle der USV, die muss vom Raspberry aus erreichbar sein. Dazu setzt der Benutzer zwei Jumper des Upis um – Details erläutert das Anwenderhandbuch [4] unter, “Route Raspberry Pi RS232 to Upis Serial Port”.
Vor dem eigentlichen Firmware-Upgrade sollte der Anwender die Einstellung testen und prüfen, ob die so genannten Upis-Terminalkommandos funktionieren (Listing 1). Damit das USV-Board die speziellen Terminalbefehle erkennt, beginnen sie mit einem »@-« Zeichen. Eine Beschreibung aller Kommandos findet sich im Benutzerhandbuch.
Listing 1
Terminalkommandos
01 $ minicom -b 38400 -o -D /dev/ttyAMA0 02 03 @version 04 05 www.pimodules.com 06 Upis Basic 07 Firmware Version:1.096 Beta Version 08 Hardware Release:VCO2 09 10 11 @status 12 ... 13 Powering Source:USB 14 Upis RTC Date:2014:10:26 15 Upis RTC Time:12:45:54 16 17 Average Powering Values 18 ---------------------- 19 RPi Voltage:05.07 V 20 ... 21 Real Time Clock Correction Factor value is: 0x00 22 Analog Sensor Temperature:43 C 0109 F 23 ...
Der zweite vorbereitende Schritt ist das Umstöpseln der Spannungsquelle. Für das Firmware-Upgrade ist der Micro-USB-Anschluss des Raspberry zuständig. Hintergrund ist, dass die Installationsprozedur einen kompletten Reset des Upis-Boards vornimmt. Das würde dann auch die Stromversorgung des ARM-Rechners unterbrechen. Zum Schluss gilt es noch, das Python-Skript [8] und die zu ladende Firmware auf den Pi zu kopieren und eventuell die notwendigen Pakete »python-serial« und »python-smbus« zu installieren.
Das Firmware-Upgrade an sich ist dann recht unspektakulär. Zunächst setzt der Benutzer die USV in den so genannte Bootloader-Modus. Dazu muss er den Knopf »RST« drücken und halten, »SDWN« ebenfalls drücken und halten, »RST« loslassen, »SDWN« loslassen. Am Ende sollte die Status-LED auf der Upis rot leuchten. Nun kann der Benutzer das oben erwähnte Python-Skript starten (Abbildung 2, [9]).
Als dieser Artikel geschrieben wurde, war übrigens die Firmwareversion 1.096Beta aktuell. Diese ist allerdings nur über das Forum [8] erhältlich und nicht offiziell als stabil freigegeben. Im Briefkasten landen die Upis-Boards (immer noch) mit Version 1.00.
Seriell geht immer noch
Für den Zugriff auf die serielle Schnittstelle des Raspberry benutzt man normalerweise die entsprechenden GPIO-Pins. Der Autor verwendet so genannte serielle USB-zu-TTL-Kabel, die einfach über verschiedene Läden im Internet zu beziehen sind. Wegen der USV-Platine sind die Pins nur leider nicht mehr zugänglich. Das ist aber kein Problem. Beim Firmware-Upgrade leitet der Bastler durch entsprechende Jumper die serielle Schnittstelle des Raspberry auf die des Upis um. Analog richtet er die Umleitung auf den Micro-USB-Anschluss der USV ein. Dann verbindet er den USB-Port des PC mit dem Pendant des Upis-Boards – mit etwas Glück ist damit alles erledigt.
Im hier beschriebenen Fall erfolgte die Kommunikation über das zuvor erwähnte serielle USB-zu-TTL-Kabel mit »minicom« auf dem angeschlossenen Linux-PC. Für den Zugriff über den Micro-USB-Anschluss der Upis war nicht die geringste Konfigurationsanpassung nötig – weder auf dem Raspberry-Betriebssystem noch auf dem PC.
Strom weg – was nun?
Die erste Aufgabe einer USV ist es, die angeschlossenen Geräte vor kurzen Stromausfällen zu bewahren. Doch muss sie auch auf den Fall vorbereitet sein, dass die Ausfallzeit länger ist, als der Akku Spannung geben kann. Normalerweise leitet die USV in diesem Fall das automatischen Beenden der Anwendungen und das saubere Herunterfahren der angeschlossenen Geräte ein. Die Upis gibt sich keine Blöße und bringt auch dafür das nötige Grundgerüst mit.
Der Anwender kann den Status der Spannungsversorgung auf zwei Weisen auslesen und entsprechende Aktionen auslösen. Außerdem gibt es einen Hardwareknopf, der – falls entsprechend konfiguriert – den ARM-Zwerg sauber herunterfährt. Beim Firmware-Upgrade ist dieser Schalter unter dem Namen SDWN (ShutDoWN) schon mal aufgetaucht. Es gibt sogar eine Software-seitige Implementierung über das Upis-Terminalkommando »@sdwn« .
Egal ob Hardware oder Software, die Information über den Shutdown-Wunsch lässt sich am GPIO-Pin Nummer 27 auslesen. Wenn der Raspberry auf den Tastendruck reagieren soll, muss dort also ein Programm laufen, das den Status eben jenes Pin ausliest. Das Handbuch der USV-Platine liefert ein einfaches Python-Skript frei Haus (Listing 2), das den ARM-Rechner per »shutdown -h now« sanft ausschaltet.
Listing 2
Shutdown-Skript
01 #!/usr/bin/env python 02 # Importieren der Zugriffsbibliotheken für GPIOs, Betriebssystem und Zeit-Verzoegerung 03 import RPi.GPIO as GPIO 04 import time 05 import subprocess 06 07 # Anpassen der Nummerierung der Pins 08 GPIO.setmode(GPIO.BCM) 09 10 # Auf Pin Nummer 27 geben wir acht. 11 GPIO.setup(27, GPIO.IN, pull_up_down= GPIO.PUD_UP) 12 13 # Eine Schleife zum Warten, bis jemand den Knopf drueckt (was Pin 27 dann signalisiert) 14 15 while True: 16 # Abfrage, ob ueber Pin 27 was reingekommen ist 17 if(GPIO.input(27)==0): 18 # Dieses Kommando werden wir ausfuehren 19 cmd="sudo shutdown -h now" 20 # Das Kommando von eben an das Betriebssystem schicken 21 pid=subprocess.call(cmd, shell=True) 22 break 23 # 1 Sekunde warten 24 time.sleep(1) # 1 Sekunde warten 25 # Fertig
Fehlt noch das automatische Ausschalten. Ein Wechsel des Status der Spannungsversorgung muss offensichtlich der Trigger dafür sein. Wie weiter oben beschrieben, sind besondere Schritte nötig, damit der Raspberry bemerkt, dass er auf Batterie läuft. Wieder hilft ein Upis-Terminalkommando. Mit »@pwrinfo on« weist der Benutzer die USV-Platine an, eine Statusänderung der Spannungsversorgung auf der seriellen Schnittstelle auszugeben (Abbildung 3). Lauscht hier ein Prozess, kann er auf gewünschte Weise darauf reagieren.
Der Anwender könnte auch über »@pm« die gewünschte Information regelmäßig abfragen und dann die entsprechenden Aktionen auslösen. Wem das Hantieren mit der seriellen Schnittstelle zu fummelig ist, der kann auch den I2C-Bus zum Auslesen der benötigten Daten benutzen. Die dafür nötige Registeradresse lautet 0x6A 0x00.
Nettes Zusatzpaket
Neben der eigentlichen USV-Funktion stattet die Upis-Platine den kleinen ARM-Rechner mit einer Reihe nützlicher Zusätze aus. Da wäre zunächst der mechanische Ein/Aus-Schalter (Abbildung 1). Entweder hat der Benutzer bislang tapfer das Kabel abgezogen, um den Raspberry stromlos zu machen, oder eine der Bastelanleitungen (http://10, http://11) im Internet umgesetzt. Beides erübrigt sich, wenn er die hier vorgestellte USV besitzt.
Ein weiteres Highlight ist die Batterie-gestützte Echtzeit-Uhr (Real Time Clock). Damit sie funktioniert, ist etwas Vorbereitung nötig. Der Zugriff funktioniert über den I2C-Bus des Raspberry, der im Auslieferungszustand deaktiviert ist. Theoretisch gehört auch das Setzen von zwei Jumpern auf der Upis zu den Vorarbeiten. In der Realität sind aber alle Steckbrücken, wo sie hingehören.
Listing 3 zeigt die notwendigen Schritte auf Software-Seite. Im Schnelldurchlauf sind dies das Laden der Kerneltreiber für die Echtzeit-Uhr und den Datenbus sowie die logische Verknüpfung beider. Danach ist die Uhr über das Kommandozeilen-Programm »hwclock« steuerbar. Der erste Schritt ist das Stellen der Uhr.
Listing 3
Inbetriebnahme der Echtzeit-Uhr
01 $ modprobe i2c-bcm2708 02 $ modprobe rtc-ds1307 03 $ ls /sys/class/i2c-adapter/i2c-1 04 1-003b 1-004c 1-004d delete_device device name new_device power subsystem uevent 05 $ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device 06 $ hwclock -r 07 Sun 26 Oct 2014 20:31:20 UTC
Eine detaillierte Vorgehensweise findet sich im Handbuch [4]. Die verschiedenen Hardwarevarianten des Raspberry nummerieren die I2C-Busse unterschiedlich. Die Kommandos in Listing 2 funktionieren für die B-Version. Für eine Reboot-feste Konfiguration muss der Benutzer das Laden der Kernelmodule und das Instanzieren der Echtzeit-Uhr automatisieren. Für Raspbian wären »/etc/modules« , »/etc/modprobe.d/raspi-blacklist.conf« und »/etc/rc.local« die entsprechenden Dateien.
Die Echtzeit-Uhr lässt sich auch für das automatische Starten und Stoppen des Raspberry Pi verwenden. Die USV-Platine speichert dafür zwei Werte: »START« und »STOP« . Ersterer definiert, wie viele Minuten der ARM-Rechner läuft, bevor Upis ihn über eine vordefinierte Routine herunterfährt. Die in »STOP« hinterlegte Zahl bestimmt, nach wie vielen Minuten die USV den Raspberry wieder hochfährt.
Fazit und Ausblick
Das Potenzial von Upis ist groß und braucht sich hinter dem etablierter Produkte etwa von APC oder Eaton nicht zu verstecken. Unerwähnt blieben hier beispielsweise noch der Temperatursensor oder die LED-Schnittstelle. Unter [12] findet sich ein kleines C-Programm, das einen tiefen Einblick in den aktuellen Status der Upis-Einheit gibt. Zugegeben: Der Preis von 40 Euro für die Basis-Variante liegt höher als der für den ARM-Zwerg selbst. Dafür bietet die USV aber auch einiges mehr als nur eine unterbrechungsfreie Stromversorgung.
Infos
- GPIO: http://www.raspberrypi.org/documentation/usage/gpio/
- Passende Gehäuse: http://www.rasppishop.de/neue-artikel/198/gehaeuse-fuer-upis-und-raspberry-pi
- Upis Advanced: http://www.modmypi.com/pi-modules-upis-advanced
- Upis-Manual: http://www.pimodules.com/_pdf/Upis_Manual_V1.10.pdf
- Upis-Module: http://pimodules.com/_pdf/Upis%20Module%20FAQ%201.5.pdf
- NXP: http://www.nxp.com/documents/user_manual/UM10204.pdf
- I2C-Bus: http://www.i2c-bus.org/de/i2c-bus/
- Forum: http://www.forum.pimodules.com/viewtopic.php?f=10&t=67#p330
- Youtube-Video: http://www.youtube.com/watch?v=CgyTqgtN7Mg
- Pi-Buch: http://pi-buch.info/?p=116
- Bastelanleitung: http://events.linuxfoundation.org/sites/events/files/slides/RasPiHacks.pdf
- Beispielskript: http://www.forum.pimodules.com/viewtopic.php?f=7&t=47









