Stromsparen am Raspberry Pi

Will man den Raspberry Pi mit einem Akku (z.B. Powerbank) betreiben, so ist eine möglichst lange durchgehende Laufzeit meist von hohem Interesse. Hier werden einige Maßnahmen gezeigt und besprochen, die helfen können, den Stromverbrauch des RPi zu senken und damit die Laufzeit mit einer Akku-Ladung zu erhöhen.
Es gibt einen vorherigen Beitrag zur Einrichtung des Raspberry Pi, welcher zunächst gelesen werden sollte. In den folgenden Versuchen wird ein Raspberry Pi 3 B+ verwendet. Die meisten Maßnahmen sollten für alle v3-Modell ebenso gelten.

Verwendete Bauteile

Grundlegende Überlegungen

Unabhängig von irgendwelchen Software- oder Hardwarehacks, sollten alle nicht benötigten Dienste (z.B. Server, Services, Datenbanken etc.) und Programme (top, screen, etc.) beendet werden, die für den Betrieb nicht benötigt werden, zunächst den Grundverbrauch auf ein notwendiges Minimum zu senken.
Auch sollten alle nicht benötigten Peripheriegeräte (Tastatur, Maus, USB-Sticks etc.) entfernt werden.
Da der Raspberry Pi kein Mikrocontroller ist (wie beispielsweise der ATmega oder ATtiny) gibt es hier keinen Sleep-Modus, in den man ihn versetzen könnten, um in Phasen der Untätigkeit Strom zu sparen.
Üblicherweise wird eine 5V-Spannungsquelle am Micro-USB-Anschluss des RPi verbunden, welche laut Hersteller mindestens 700mA (für Raspberry Pi Model A) bzw. bis zu 2,5A (für Raspberry Pi 3 Model B) haben sollte. Normalerweise wird der RPi jedoch deutlich weniger Strom verbrauchen (~200mA-500mA) in Abhängigkeit der durchgeführten Rechenoperationen. Natürlich wird beim Booten oder Ansehen eines Videos deutlich mehr Strom verbraucht als im Leerlauf des RPi.
(Im folgenden Beitrag wird die Spannungsversorgung immer über Micro-USB und nicht über die GPIOs verwendet)

Eigene Software

Betreibt man selbstgeschriebene Software, um beliebige Aufgaben mit dem RPi zu lösen, so ist es immer ratsam, auch den potentiellen Stromverbrauch mit zu berücksichtigen. Folgende Tipps können hierbei nützlich sein:

Wahl des Modells

Es gibt mittlerweile eine Vielzahl an Modellen und Versionen unterschiedlichster Spezifikation und Leistung. Daher sollte vor jeder Optimierung das richtige Modell für die betreffende Anwendungsmöglichkeit gewählt werden. Nach den Messungen von Alex Eames sieht man in folgender Tabelle, wie viel Strom die einzelnen Modelle im Leerlauf (Idle) aufnehmen.

Modell Stromaufnahme (Idle)
Raspberry Pi Zero 100 mA
Raspberry Pi 1A+ 100 mA
Raspberry Pi Zero W 120 mA
Raspberry Pi 1A 140 mA
Raspberry Pi 1B+ 200 mA
Raspberry Pi 2B 230 mA
Raspberry Pi 3B 230 mA
Raspberry Pi 1B 360 mA
Raspberry Pi 3B+ 450 mA

HDMI

Benötigt man keinen Monitor (z.B., wenn man über SSH eingeloggt ist), so kann man die HDMI-Schnittstelle abschalten.
Während des Betriebs (geht beim Neustart verloren):
HDMI ausschalten:
$ vcgencmd display_power 0 oder $ /usr/bin/tvservice -o
HDMI wieder aktivieren:
$ vcgencmd display_power 1 oder $ /usr/bin/tvservice -p

Will man bei jedem Neustart HDMI ausgeschaltet lassen, muss man folgendermaßen vorgehen:
In der Datei /etc/rc.local wird über exit 0 folgende Zeile eingefügt:
/usr/bin/tvservice -o
Zusätzlich wird in der Datei /boot/config.txt folgende Zeile hinzugefügt:
hdmi_blanking=2 (evtl. muss auch hdmi_blanking=1 genutzt werden).
Danach muss ein reboot des RPi ausgeführt werden, damit die Änderungen greifen.

Ersparnis: ~25mA

Interne LEDs

Die beiden SMD-LEDs können auch abgeschaltet werden, um ein wenig Stromverbrauch zu reduzieren.
(Manche Modelle haben nur die ACT LED)
Dazu müssen folgende Zeilen die Datei /boot/config.txt eingefügt werden:
# Disable the ACT LED
dtparam=act_led_trigger=none
dtparam=act_led_activelow=off

# Disable the PWR LED
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off

Danach muss ein reboot des RPi ausgeführt werden, damit die Änderungen greifen.

Ersparnis: ~5mA pro LED

USB/Ethernet

Falls man weder ein externes USB-Geräte noch Ethernet verwendet, kann man Einiges an Strom einsparen, indem man den USB-Bus-Chip komplett abschaltet:
$ echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/unbind
Wieder einschalten kann man es durch:
$ echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/bind
(anscheinend ist es nicht möglich einzelne USB-Port von Ethernet getrennt zu deaktivieren)

Ersparnis: ~200mA

Bluetooth

Abschalten des onboard-Bluetooth-Dienstes:
(Es gibt jedoch einige Hinweise, dass trotzdem die Bluetooth-Hardware weiterhin funkt)
$ sudo service bluetooth stop
Wieder aktivieren mit:
$ sudo service bluetooth start

Um Bluetooth direkt bei jedem Start zu deaktivieren wird in der Datei /boot/config.txt folgende Zeile ergänzt oder auskommentiert:
# Disable Bluetooth
dtoverlay=pi3-disable-bt

Zusätzlich werden noch folgende Dienste entfernt:
$ sudo systemctl disable hciuart.service
$ sudo systemctl disable bluealsa.service
$ sudo systemctl disable bluetooth.service

Danach muss ein reboot des RPi ausgeführt werden, damit die Änderungen greifen.

Ersparnis: ~10mA

Swapping

Auch die Zugriffe auf die SD-Karte zu vermindern, helfen Stromverbrauch einzusparen. Auch kann man das Auslagern von Daten auf die HDD (=SD-Karte) verhindern:
$ sudo swapoff -a

Ersparnis ist schwierig zu messen, da Swapping unregelmäßig stattfindet.

WLAN (WiFi)

Abschalten des WLAN-Dienstes (Vorsicht: man kann sich auch leicht vom RPi leicht aussperren, wenn man z.B. per SSH darauf zugreift):
$ sudo ifconfig wlan0 down
Wieder aktivieren mit:
$ sudo ifconfig wlan0 up

Um WLAN direkt bei jedem Start zu deaktivieren wird in der Datei /boot/config.txt folgende Zeile ergänzt oder auskommentiert:
dtoverlay=pi3-disable-wifi
Danach muss ein reboot des RPi ausgeführt werden, damit die Änderungen greifen.

Ersparnis: ~30mA

CPU-Kerne

Wenn keine besonders hohe Leistung an den RPi gefordert ist, kann man auch die max. Anzahl an CPU-Kernen reduzieren (ab Modell 2B). Dazu muss in der Datei /boot/cmdline.txt folgende Zeile hinzugefügt oder bearbeitet werden:
maxcpus=N
wobei N eine Zahl zwischen 1 und 4 ist.
Die Änderung der Anzahl der Kerne wird im Leerlauf kaum eine Stromersparnis mit sich bringen, aber entsprechend unter Last die Stromaufnahme limitieren.

CPU untertakten

Das Untertakten des CPU soll bei aktuellen Modellen mit ARM-CPU kaum einen Einfluss auf die Stromaufnahme haben, da der CPU sowieso in einen Stromsparmodus geht, sobald die Leistung nicht gebraucht wird.
Mit folgenden Befehlen kann man den Status des eigenen CPU überprüfen:
Aktuelle Spannung des Prozessors abfragen:
$ vcgencmd measure_volts
Aktuelle Frequenz des Prozessors abfragen:
$ vcgencmd measure_clock arm

Weiterführende Links

zurück