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.
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)
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:
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 |
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
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
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
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
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.
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
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.
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