Aus Raspberry Pi Geek 10/2022

Batterieoptimierung für den Raspberry Pi Pico (Seite 2)

Abbildung 2 zeigt die Auswirkung: Mit diesen beiden Modi sinkt der Stromverbrauch in der Idle-Phase im Light-Sleep-Modus auf 17 mA, im Deep-Sleep-Modus auf 6 mA. Gut zu sehen ist auch der höhere Aufwand beim Aufwachen aus dem Tiefschlaf, der den Durchschnittsverbrauch im Beispielszenario auf 10 mA treibt. Der Akku hält dann also fünf Tage durch. Auf dem ESP32-S2, auf dem CircuitPython ebenfalls läuft, sinkt der Verbrauch im Tiefschlaf sogar unter 1 mA und der Durchschnittsverbrauch auf 2,5 mA – mit einer entsprechend längeren Laufzeit.

Abbildung 2: Der Stromverbrauch im Light-Sleep-Modus (oben) und im Deep-Sleep-Modus (unten).

Abbildung 2: Der Stromverbrauch im Light-Sleep-Modus (oben) und im Deep-Sleep-Modus (unten).

Wenn Sie die Schlafmodi selbst testen möchten, dann beachten Sie bitte, dass der Tiefschlaf nicht mit einer aktiven USB-Verbindung (also der seriellen Konsole) funktioniert. Dabei handelt es sich um eine Sicherheitsmaßnahme, die verhindern soll, dass fehlerhafter Code den Pico sofort in den Tiefschlaf schickt, ohne dass Sie eingreifen könnten.

Ebenfalls wichtig: Der Pico schaltet den 3,3-Volt-Ausgang nicht ab. Hängt dort Peripherie, läuft sie weiter. Wenn Sie das nicht möchten, müssen Sie die daran hängenden Geräte falls möglich vor dem Schlafen ebenfalls abschalten oder mit einer kleinen Schaltung deaktivieren.

Aufwachen per Knopfdruck

Zeitgesteuertes Aufwachen bietet sich als Lösung für viele zyklische Anwendungsprobleme an. Für das oben zitierte Beispiel der Fernbedienung bringt das aber nichts. Zum Glück gibt es neben alarm.time.TimeAlarm noch alarm.pin.PinAlarm. Hier wacht der Pico nach einem Spannungswechsel an einem Pin auf (Listing 2).

Listing 2

alarm.pin.PinAlarm

pin_alarm = alarm.pin.PinAlarm(WAKE_PIN,value=False,edge=True,pull=True)
if MODE == LIGHT_SLEEP:
  alarm.light_sleep_until_alarms(pin_alarm)
elif MODE == DEEP_SLEEP:
  alarm.exit_and_deep_sleep_until_alarms(pin_alarm)

Während sich beim leichten Schlaf hinsichtlich des Stromverbrauchs nichts ändert, arbeitet der Tiefschlaf bei PinAlarm deutlich effizienter als bei TimeAlarm und erreicht statt 6 mA sogar 1 mA. Sie müssen keinen Taster an den Pin anschließen: Jedes Bauteil, das den Pin auf Masse zieht, funktioniert ebenso. Als heißer Kandidat dafür bietet sich eine externe RTC wie die DS3231 mit ihrem Interrupt-Pin an.

Eine weitere Eigenschaft der CircuitPython-Implementierung erweist sich in diesem Zusammenhang als sehr nützlich: Die sleep_until_-Funktionen nehmen eine beliebige Anzahl an Alarmen entgegen. Bringt ein Gerät also mehrere Taster mit, müssen Sie keinen expliziten Aufwach-Button verwenden. Die Alarme für die Sleep-Funktionen können theoretisch bunt gemischt aus Timer- und Pin-Alarmen bestehen. Allerdings unterstützt nicht jeder Chip alle Variationsmöglichkeiten.

Manche Controller wachen zusätzlich auch per Touch-Event auf. Der Pico gehört nicht dazu, aber der ESP32-S2 unterstützt dieses Feature. Wie schon beim Timer-Alarm hängt auch beim Pin- und Touch-Alarm das Einsparpotenzial der Sleep-Modi vom Prozessor ab.

Alles weg?

Ein Nachteil des Deep Sleep besteht im kompletten Neustart des Programms, bei dem (fast) der gesamte Zustand des Pico verloren geht. Allerdings besitzen der Pico und andere MCUs auch nichtflüchtigen Speicher, sogenanntes NVRAM (Non-volatile RAM). Dieser Speicher verhält sich jedoch nicht wie ein Laufwerk, er lässt sich aus Programmen nur als Abfolge von Bytes adressieren. Auf dem Pico stehen dafür 4 KByte bereit. Der SAMD21 bringt lediglich 256 Byte mit, sein großer Bruder SAMD51 hingegen 8 KByte. Die Größe ist nicht dokumentiert, Sie finden die Werte im Quellcode von CircuitPython.

Ein Beispiel für den Zugriff sehen Sie in Listing 3. Die Zeilen 2 und 3 wandeln einen String in Bytes um und schreiben den Wert dann in den Speicher. Die Zeilen 4 und 5 lesen den Speicher wieder aus. Der Unterschied zwischen den beiden Alternativen liegt darin, dass die zweite Variante auch mit Unicode-Zeichen zurechtkommt, die aus mehr als einem Byte bestehen – das “ä” im Beispiel belegt drei Bytes. Zahlen kleiner als 255 wandeln Sie direkt um, für größere Zahlen verwenden Sie die Standardfunktionen to_bytes und from_bytes.

Listing 3

Permanenter Speicher

import microcontroller
microcontroller.nvm[42:48] = b'Hallo'
microcontroller.nvm[10:14] = 'Hä?'.encode('utf-8')
print(microcontroller.nvm[42:48])
print(microcontroller.nvm[10:14].decode('utf-8'))

Allerdings fanden sich im Netz keine Angaben über die mögliche Anzahl an Schreibzyklen des Pico-Speichers. Microchip gibt für den SAMD21 100 000 (minimal) bis 600 000 Zyklen (typisch) an, für den Pico dürfte der Wert in derselben Größenordnung liegen. Wer also minütlich in diesen Speicher schreibt, schöpft innerhalb eines Jahres das Kontingent aus. Hier benötigt man auf alle Fälle etwas mehr Programmintelligenz.

Manche Boards besitzen neben dem NVRAM noch weitere Speicherbereiche, deren Inhalt zwar den Deep Sleep übersteht, nicht aber einen kompletten Reset. Darunter fallen SAMD21/51-Boards und ESP-Boards, nicht aber der Pico. Im Gegensatz zum Flash leidet dieser manchmal auch Backup-Speicher genannte RAM-Bereich nicht durch Schreibvorgänge. CircuitPython stellt ihn in der Variablen alarm.sleep_memory als Byte-Array bereit. Der Zugriff erfolgt analog zu jenem auf das NVRAM.

Außensteuerung

Eine zusätzliche, sehr effiziente Möglichkeit für den Batteriebetrieb ermöglicht der Pin 3V3_EN des Pico (physischer Pin 37). Auf Masse gezogen, schaltet er den Pico samt des 3,3-Volt-Ausgangs komplett ab. Insbesondere bei kleineren Pico-Boards sparen die Hersteller diesen Pin allerdings ein.

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