Aus Raspberry Pi Geek 10/2022

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

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.

Perfekt für dieses Setup eignet sich der Enable Timer (Abbildung 3) von Adafruit [2]. Über ein etwas fummeliges Drehpoti oder wahlweise einen Festwiderstand stellen Sie dabei das Aufwachintervall ein. Außerdem erlaubt ein Button das manuelle Aufwecken.

Abbildung 3: Der Enable Timer TPL5111, erhältlich zum Beispiel von Berrybase für gut 6 Euro.

Abbildung 3: Der Enable Timer TPL5111, erhältlich zum Beispiel von Berrybase für gut 6 Euro.

Für das Abschalten sorgt der Pico selbst, sobald Sie einen GPIO-Pin mit dem Done-Pin des Timers verbinden und auf High setzen. Der sehr geringe Eigenverbrauch des Buttons liegt bei 20 µA, die Stromkurve nimmt die Idealform an (Abbildung 4). Der einzige Nachteil in dieser Konstellation besteht in der Einschränkung der Intervalle auf den Bereich zwischen einer Sekunde und zwei Stunden. Tagesintervalle funktionieren damit also nicht, aber für viele zyklische Anwendungsfälle eignet sich der Enable-Timer perfekt.

Abbildung 4: Wie das Diagramm zeigt, optimiert der Enable Timer TPL5111 den Stromverbrauch am besten.

Abbildung 4: Wie das Diagramm zeigt, optimiert der Enable Timer TPL5111 den Stromverbrauch am besten.

Alternative C

Wer auf CircuitPython setzt, gibt die volle Kontrolle über den Prozessor auf. Das betrifft nicht nur taktgenaue Signale, sondern auch den Speicher und die Peripherie. Wer das Letzte aus dem Pico und anderen MCUs herausholen will, kommt deshalb nicht um C/C++ herum.

Da aber letztlich die CircuitPython-Implementation das C/C++-SDK nutzt, lässt sich hinsichtlich der Schlafmodi nicht wesentlich mehr herausholen. Im Pico-SDK-Jargon heißt es zwar nicht Light Sleep und Deep Sleep, sondern Sleep Mode und Dormant Mode, doch dafür bietet das SDK die zwei Beispielprogramme hello_sleep und hello_dormant, die den Einsatz demonstrieren.

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