Aus Linux-Magazin 01/2015

Eine erstaunliche USV für den Raspberry Pi

© herjua, 123RF

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].

Abbildung 1: Die Upis bringt zusätzliche Anschlüsse und Schalter mit. Sie passt zwar sehr gut auf den Raspberry Pi, aber dann nicht mehr in die üblichen Gehäuse.

Abbildung 1: Die Upis bringt zusätzliche Anschlüsse und Schalter mit. Sie passt zwar sehr gut auf den Raspberry Pi, aber dann nicht mehr in die üblichen Gehäuse.

Ü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]).

Abbildung 2: Es empfiehlt sich, eine möglichst aktuelle Firmware zu installieren, um Fehler zu beheben und auch zusätzliche Funktionen freizuschalten.

Abbildung 2: Es empfiehlt sich, eine möglichst aktuelle Firmware zu installieren, um Fehler zu beheben und auch zusätzliche Funktionen freizuschalten.

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.

Abbildung 3: Entsprechend konfiguriert, sagt die Upis, wenn sich der Status der Spannungsversorgung ändert.

Abbildung 3: Entsprechend konfiguriert, sagt die Upis, wenn sich der Status der Spannungsversorgung ändert.

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.

Der Autor

Dr. Udo Seidel ist eigentlich Mathe-Physik-Lehrer und seit 1996 Linux-Fan. Nach seiner Promotion hat er als Linux/Unix-Trainer, Systemadministrator und Senior Solution Engineer gearbeitet. Heute ist er Leiter des Linux-Strategie-Teams der Amadeus Data Processing GmbH in Erding.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben