Aus Raspberry Pi Geek 10/2022

Batterieoptimierung für den Raspberry Pi Pico

© melpomen / 123RF.com

Sparschwein

Bernhard Bablok

Der auf IO getrimmte Hochleistungschip des Raspberry Pi Pico spart nicht mit Strom. Mit ein paar Kniffen hält er auch im Batteriebetrieb länger durch.

Viele Pins, ein variabler Spannungseingang und nicht zuletzt der gute Support in der Community machen den Raspberry Pi Pico zu einem beliebten Chip für Anfänger und Profis: einfach per USB-Kabel an den PC hängen und loslegen, Stromversorgung inbegriffen.

Spätestens, wenn der Chip autark arbeiten soll, kommt die Frage auf, wie lange der Akku durchhält, der ihn speist. Dieser Artikel verrät ein paar Stromspartricks, mit denen Sie die Laufzeit verlängern. Immer, wenn Sie in diesem Artikel “Pico” lesen, gilt das auch für andere Mikrocontroller – entweder, weil diese direkt CircuitPython unterstützen, oder weil alles auch analog mit C/C++ funktioniert.

Bildlich gesprochen gilt: Wer arbeitet, darf auch essen. Mikrocontroller verhalten sich im Normalzustand jedoch eher wie Nichtarbeiter. Eine Fernbedienung liegt fast zu 100 Prozent herum, muss dann aber sehr schnell auf einen Tastendruck reagieren. Selbst ein Sensor, der alle zehn Minuten die aktuelle Temperatur erfasst, kommt auf eine Aktivzeit von unter 1 Prozent. Der Pico soll also möglichst sparsam nichts tun.

Nachgemessen

Der Messaufbau für die im Folgenden gezeigten Programmbeispiele gestaltet sich simpel. Die Stromversorgung läuft über eine Messschaltung, die kontinuierlich Spannung und Strom überwacht. Die regelmäßige Arbeit simuliert der Pico über seine eingebaute LED, die er alle 30 Sekunden jeweils für eine Sekunde einschaltet. Dazwischen tut er nichts. Die Quellen der Beispielprogramme finden Sie im Github-Projekt [1] des Autors.

Wer sich mit dem Programmieren von Mikrocontrollern auskennt, der weiß, dass es verschiedene Methoden gibt, um etwas Zeit verstreichen zu lassen (Listing 1). Eine Möglichkeit besteht in einer leeren Schleife, die das Programm eine Weile lang beschäftigt (Zeilen 26 bis 29). Hier tritt der Pico quasi auf der Stelle. Der Stromverbrauch fällt entsprechend hoch aus (Abbildung 1), weswegen diese Variante als Vergleichsbasis für die Alternativen dient.

Der Grundbedarf des Pico liegt in diesem Aktiv-Warten-Modus bei 26 mA, die LED treibt den Verbrauch kurzzeitig um 5 mA nach oben. Für sich genommen ist aber der Grundbedarf immer noch sehr gering, denn selbst ein Pi Zero braucht im Idle-Zustand 90 mA. Das repräsentiert die Untergrenze dessen, was der Headless-Betrieb ohne große Klimmzüge erlaubt.

Listing 1

Leere Testschleife

import time
import board
import alarm
from digitalio import DigitalInOut, Direction, Pull
LED_TIME     = 1
INT_TIME     = 30 - LED_TIME
SPIN         = 0x1
SLEEP        = 0x2
LIGHT_SLEEP  = 0x3
DEEP_SLEEP   = 0x4
MODE         = SPIN
led           = DigitalInOut(board.LED)
led.direction = Direction.OUTPUT
# --- Arbeit simulieren
def work():
  led.value = 1
  time.sleep(LED_TIME)
  led.value = 0
# --- Hauptschleife
while True:
  work()
  if MODE == SPIN:
    next = time.monotonic() + INT_TIME
    while time.monotonic() < next:
      continue
  elif MODE == SLEEP:
    time.sleep(INT_TIME)
  elif MODE == LIGHT_SLEEP:
    time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic()+INT_TIME)
    alarm.light_sleep_until_alarms(time_alarm)
  elif MODE == DEEP_SLEEP:
    time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic()+INT_TIME) 40:
    alarm.exit_and_deep_sleep_until_alarms(time_alarm)
Abbildung 1: Der Stromverbrauch mit der leeren Schleife aus <a href="#artRef-l1">Listing&nbsp;1</a>.

Abbildung 1: Der Stromverbrauch mit der leeren Schleife aus Listing 1.

Als relativ praktisch erweist sich die Umrechnung des Verbrauchs in die erwartete Laufzeit an einem Akku. Die beliebten LiPo-Akkus weisen grob überschlagen eine Selbstentladung von 10 Prozent innerhalb der ersten 24 Stunden auf, danach etwa 5 Prozent pro Monat. Dieser Wert enthält bereits den Verbrauch durch die integrierte Schutzschaltung. Sobald die Spannung unter 3 Volt fällt, schaltet der Akku ab. Die Restkapazität nehmen wir auch mit 10 Prozent an. Genaue Werte für Selbstentladung und Restkapazität müssen Sie experimentell bestimmen.

Mit diesen Annahmen hält der blinkende Pico mit einem 1500-mAh-Akku 46 Stunden durch, der Pi Zero gut 15 Stunden. Der Einsatz eines RasPi ist folglich im Zusammenspiel mit Akkus nur in solchen Szenarien sinnvoll, bei denen es nicht auf lange Standzeiten ankommt – etwa bei Roboterautos.

Schlafmodi

Mit Python schicken Sie den Pico via time.sleep(X) für X Sekunden in den Schlaf (Listing 1, Zeile 30 und 31). Die technische Implementation auf dem Pico verwendet für time.sleep() allerdings busy_wait()-Funktionen des Pico-SDK. Die Schlaffunktion wirkt sich daher nicht auf den Stromverbrauch aus, lediglich der Python-Code gestaltet sich etwas übersichtlicher. Die Stromverbrauchsgrafik sieht beim Einsatz dieser Funktion auch genau so aus wie in Abbildung 1. Bei anderen Mikrocontrollern kann dagegen die Implementation recht sparsam sein, wie der im nächsten Abschnitt beschriebene Light-Sleep-Modus zeigt.

Neben time.sleep() bietet CircuitPython noch die zwei speziellen Schlafmodi Light Sleep und Deep Sleep an. In beiden hört die CPU nicht nur auf, zu rechnen, sondern schaltet auch diverse Funktionsblöcke des Chips ab. Das spart Strom. Beide Schlafmodi benötigen zum Aufwachen einen Wecker (Timer).

Beim Light-Sleep-Modus macht das Programm ganz normal an der Stelle nach dem Schlafbefehl weiter. Aus dem Tiefschlaf aufgeweckt startet der Pico dagegen nach der angegebenen Zeit neu durch, der aktuelle Programmkontext einschließlich der Werte der Variablen geht verloren. Die interne RTC des Pico behält nur beim leichten Schlaf ihren Wert.

Programmiertechnisch gestalten sich beide Varianten nicht sehr aufwendig, vorausgesetzt, Sie importieren das Modul alarm. Zuerst erstellen Sie einen Timer (Listing 1, Zeilen 33 und 36), danach verwenden Sie die Befehle alarm.light_sleep_until_alarms() (Zeile 34) beziehungsweise alarm.exit_and_deep_sleep_until_alarms() (Zeile 37).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben