Raspberry Pi Pico: Reset und Neustart bei unerwarteten Fehlern

Bei Anwendungen, bei denen im Programmcode ein unerwarteter Fehler den Betrieb komplett lahmlegen kann, ist es sinnvoll, den Raspberry Pi Pico im Fehlerfall automatisch neu zu starten. So bleibt das System auch nach einem unerwarteten Programmcode-Abbruch weitgehend autonom und verfügbar.
Mit einer Fehlerbehandlung und einem Neustart sind Stand-alone-Projekte mit dem Raspberry Pi Pico widerstandsfähiger gegenüber unerwarteten Fehlern und können sich selbständig wieder in einen definierten Betriebszustand versetzen. Wir wollen das an einem Beispiel ausprobieren.

Programmcode mit eingebautem Fehler

Der folgende Programmcode lässt die Onboard-LED auf dem Raspberry Pi Pico sekündlich an- und ausgehen. Das tut sie aber nur solange der Programmcode läuft. Wenn jedoch ein Fehler auftritt, dann würde der Programmcode abbrechen und die LED würde aufhören zu blinken. Um einen Fehler zu provozieren enthält die letzte Codezeile in der while-Schleife eine Division durch Null, die nach 9 Sekunden ausgeführt wird.

# Bibliotheken laden
import machine
import time

# Onboard-LED
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=1)

# Variable für die Laufzeitmessung
lifetime = time.ticks_ms()

# Hauptprogramm
while True:
    time.sleep(1)
    led_onboard.toggle()
    # Codezeile, die zu einem Fehler führt (nach 9 Sekunden)
    if time.ticks_ms()-lifetime > 9000: x = 1 / 0

Würde dieser Fehler im Stand-alone-Betrieb auftreten, dann würde die LED nicht mehr blinken. Ein Neustart wäre erforderlich. Aber dazu müsste der Fehler im Programmcode erkannt werden, um dann einen Neustart auszulösen.

Programmcode mit Fehlerbehandlung und Neustart

Der folgende Programmcode lässt die Onboard-LED auf dem Raspberry Pi Pico sekündlich an- und ausgehen. Auch hier ist die Codezeile mit dem Fehler enthalten, der nach 9 Sekunden provoziert wird. Zusätzlich wurde das Hauptprogramm um eine Fehlerbehandlung erweitert, die den Fehlertext auf der Kommandozeile ausgibt und zusätzlich in eine Datei schreibt, damit man später noch feststellen kann, was der letzte Fehler war.

# Bibliotheken laden
import machine
import time

# Onboard-LED
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=1)

# Variable für die Laufzeitmessung
lifetime = time.ticks_ms()

try:
    # Hauptprogramm
    while True:
        time.sleep(1)
        led_onboard.toggle()
        # Codezeile, die zu einem Fehler führt (nach 9 Sekunden)
        if time.ticks_ms()-lifetime > 9000: x = 1 / 0
except Exception as error:
    # Fehlerbehandlung
    error_text = 'Fehler: ' + str(error) + ' nach ' + str((time.ticks_ms()-lifetime)/1000) + ' s'
    # Ausgabe der Fehlermeldung in der Kommandozeile
    print(error_text)
    # Ausgabe der Fehlermeldung in eine Datei
    with open('error.txt', 'w') as file: file.write(error_text)
finally:
    # Fail Safe
    pass
    led_onboard.off()

# Neustart durch Reset
print()
print('Gleich mache ich einen Neustart')
time.sleep(3) # !!!
machine.reset()

Im oberen Programmcode sind die Zeilen, die zum Hauptprogramm gehören, fett markiert.

Vorsicht!

Dieser und ähnliche Programmcodes können Probleme verursachen:

  1. Das nachträgliche Einfügen einer Fehlerbehandlung und Neustart-Funktion kann dazu führen, dass man einen bereits gut funktionierenden Programmcode umbauen, alles erneut testen und dann noch Fehler korrigieren muss. Das macht keinen Sinn.
  2. Aus Sicht einer integrierten Fehlerbehandlung ist das manuelle Beenden des Programmcodes mit CTRL+C oder STOP in der Thonny Python IDE ein Fehler. Das heißt, man muss den Programmcode ein zweites Mal beenden. Und zwar bevor der Reset ausgelöst und ein Neustart erzwungen wird. Wenn aber durch die Fehlerbehandlung gleich ein Neustart ausgelöst wird, dann bekommt man den Programmcode nie beendet (Stichwort Soft-Brick).

Die Frage ist, wie realisiert man einen Autostart mit der Datei main.py, einer Fehlerbehandlung mit Logging und Neustart, wobei man in der Thonny Python IDE noch die volle Kontrolle behält? Außerdem wäre es gut, den bereits bestehenden Programmcode nicht umbauen zu müssen.

Autostart mit Abbruch, Fehlerbehandlung und Neustart

Wir beschäftigen uns mit einer Lösung, wie man einen Raspberry Pi Pico funktionssicher und stand-alone bzw. autark betreiben kann. Dabei geht es um einen Autostart mit Abbruch-Funktion, einer Fehlerbehandlung mit Logging und Neustart. Und das funktioniert ohne am Hauptprogramm eine Zeile Code ändern zu müssen.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren