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:
- 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.
- 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:
- Raspberry Pi Pico: Programm automatisch starten (AUTORUN/AUTOSTART)
- Raspberry Pi Pico: Auf Werkseinstellungen zurücksetzen
- Raspberry Pi Pico im Stand-alone-Betrieb
- Raspberry Pi Pico: Hardware-Reset mit Taster (Neustart)
- MicroPython: Watchdog-Timer
Frag Elektronik-Kompendium.de
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
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
Online-Workshop: 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.
Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.