LEDs auch nach fertig ausgeführtem Script aktiv halten

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Ich bin ziemlich neu mit Raspberry PI GPIO Steuerung und Python.

    Ich habe nun ein Script geschrieben welches LED, welche am Raspi angeschlossen sind anschalten, nun möchte ich jedoch das die LEDs auch an bleiben wenn das Script schon Fertig ist (alles ausgeführt). Wie kann ich das Machen?

    Python
    import time
    from gpiozero import LED
    
    GPIO.setmode(GPIO.BCM)
    
    LEDS1L1 = LED(9)
    
    LEDS1L1.on()
    
    time.sleep(10)

    Danke für eure Hilfe:):)

  • Gar nicht. Du darfst das Skript nicht beenden. Du kannst zb signal.pause() dazu benutzen. Kann man in den gpiozero Beispielen sehen, wie es gemacht wird.

  • Man könnte das Ganze auch mit etwas Hardware, wie z.B. mit einem bistabilem Relais, Schieberegister bzw. mit einem I2C i/O Portexpander o.ä. umsetzen. Dort schickt man Daten hin, welche die entsprechende Hardware nach Programmende im zuvor bestimmten Zustand halten. Nebenbei schützt man damit auch die GPIO Ports des RPis.

    • Official Post

    Wie kann ich das Machen?


    Ich traue mich das fast nicht zu zeigen, aber so what...


    Python
    #!/usr/bin/env python3
    
    from RPi import GPIO
    
    GPIO.setmode(GPIO.BCM)
    
    GPIO.setup(9, GPIO.OUT)
    GPIO.output(9, True)
  • Ich glaube beim Schreiben in /sys/class/gpio blieb der Ausgang erhalten.


    gpiozero ruft wahrscheinlich eine Art cleanup auf wenn der Prozess beendet wird.

    Ja, das ist richtig.

    Man kann sogar weiterhin gpio-zero nutzen.
    Es wird beim Verlassen der alte Zustand wieder hergestellt, zumindest laut Dokumentation.
    Ein explizites cleanup ist nicht notwendig, aber man muss wissen, dass der cleanup implizit beim Verlassen des Programms durchgeführt wird.

    Ich setze z.B. einen Ausgang mit einem Shell-Script ziemlich früh während der Boot-Phase, da ansonsten die Elektronik vom Akku den Raspberry Pi wieder ausschaltet (Spannung weg).


    Diesen Pin nutze ich mit gpiozero überhaupt nicht. Was genau passieren würde, wenn ich den Status des Pins verändern würde, weiß ich nicht.
    Das habe ich bis jetzt noch nicht getestet.



    Bash
    #!/bin/sh
    
    # Lebenserhaltung
    # 0 -> Wlan-Modul geht aus
    echo "26" > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio26/direction
    echo "1" > /sys/class/gpio/gpio26/value
    • Official Post

    Es wird beim Verlassen der alte Zustand wieder hergestellt

    Nein, das macht gpiozero nicht, sondern ein cleanup. ;)


    Mit dem Skriptchen aus Beitrag #5 Habe ich eine LED eingeschaltet. Nachdem das durchlief bleibt die LED an und der Prompt erscheint wieder. Mit folgendem Skript soll diese LED für 3 Sekunden ausgeschaltet werden und nach Deiner Theorie müsste diese danach wieder leuchten, macht die aber nicht.

    Python
    #!/usr/bin/env python3
    
    from gpiozero import LED
    from time import sleep
    
    led = LED(9)
    
    led.off()
    
    sleep(3)

    Die LED bleibt aus wenn der Prompt erscheint.

  • Nein, das macht gpiozero nicht, sondern ein cleanup.

    Dann ändere mal die FAQ auf der Seite von gpiozero und überprüfe das bitte nochmal im Quellcode: https://gpiozero.readthedocs.i…quivalent-of-gpio-cleanup


    Hinweis: Für den Test müsstest du vor dem Start des Programms einen Ausgang auf High setzen. Im Programm selbst setzt du die LED auf Low. Wenn nach dem Beenden des Programms die LED leuchtet, weißt du, dass gpiozero den Status der benutzten Ausgänge wieder herstellt.


    Man kann sehr schnell zu falschen Annahmen kommen, wenn man nicht genau weiß was man testet und wie man es testet.

    • Official Post

    Für den Test müsstest du vor dem Start des Programms einen Ausgang auf High setzen.

    Das tat ich.


    Im Programm selbst setzt du die LED auf Low. Wenn nach dem Beenden des Programms die LED leuchtet, weißt du, dass gpiozero den Status der benutzten Ausgänge wieder herstellt.

    Hast Du gelesen was ich schrieb? :conf:


    Man kann sehr schnell zu falschen Annahmen kommen, wenn man nicht genau weiß was man testet und wie man es testet.

    Mir ist bewusst was ich tat. Wie kommst Du zu dieser Annahme?


    Dann ändere mal die FAQ auf der Seite von gpiozero

    Du kannst Dich gerne auf meinen Test berufen und das selber erledigen, aber ich glaube Ben hat andere Prioritäten.

  • Ja warte, ich werde das jetzt mal für dich testen und wehe das stimmt nicht :D


    So, getestet.


    Folgendes Szenario:

    GPIO26 auf High schalten:


    Ich habe dort auch eine LED angeschlossen, um den Status sehen zu können.

    So, LED leuchtet nun.


    Als Nächstes steuere ich einen Ausgang an, der nicht belegt ist (auch keine LED).

    Python
    from gpiozero import LED
    from time import sleep
    
    led = LED(17)
    led.off()
    sleep(5)


    Wenn ich das Programm starte, passiert zur Laufzeit nichts, die LED auf GPIO26 bleibt an.

    Nach Beendigung des Programms bleibt die LED an.


    Nun der gleiche Test mit dem GPIO26, an der die LED mit angeschlossen ist:

    Python
    from gpiozero import LED
    from time import sleep
    
    led = LED(26)
    led.off()
    sleep(5)


    LED ist nun aus und bleibt auch nach Beendigung des Programms aus.


    Und cat sagt folgendes:

    Code
    root@Akku413c11de(rw):/home/server# cat /sys/class/gpio/gpio26/direction
    in


    Es findet ein implizites cleanup statt, aber der zuvor gesetzte Zustand via sysfs wird nicht berücksichtigt.

    Zur Vollständigkeit halber habe ich den gleichen Code noch mal mit der Methode colse() aufgerufen.

    Das gleiche Verhalten.


    Also stimmt meine Aussage, dass der Cleanup implizit ist, ergo stimmt auch die FAQ und nichts muss geändert werden.

    Und hier noch der Quellcode als Beweis, dass das Cleanup implizit stattfindet: https://github.com/gpiozero/gp…/gpiozero/devices.py#L621


    Die sysfs api ist übrigens deprecated.

    Edited once, last by DeaD_EyE ().

    • Official Post

    Es findet ein implizites cleanup statt, aber der zuvor gesetzte Zustand via sysfs wird nicht berücksichtigt.


    Damit hast Du meinen Test bestätigt und

    restoring your GPIO pins to the state they were found.

    was ja eben nicht der Fall ist, wie Du selber bemerkt hast. ;)

  • Der Test bestätigt, dass sysfs ignoriert wird, aber auch ein implizites cleanup auf alle im Programm verwendeten Pins angewandt wird.

    Das sysfs ignoriert wird, habe ich von Anfang an bezweifelt, aber nicht den cleanup selbst.


    Nicht ohne Grund habe ich in meinem Projekt den GPIO26 gemieden, da dieser die Spannung nach ca. 60 Sekunden abschaltet, wenn er auf low ist.

    Trotzdem verwende ich an einer oder zwei Stellen gpiozero. Würde gpiozereo nun auch ein implizites Cleanup auf GPIO26 durchführen, obwohl ich diesen Pin mit gpiozero nicht genutzt habe, hätte ich das gemerkt. Spätestens dann, wenn der Raspberry Pi ausgegangen wäre und es hätten sich einige Leute über mich Beschwert.


    Bestimmte Pins sind z.B. im unkontrollierten Zustand auf High gezogen, andere auf Low.

    Ich vermute mal, dass sich das cleanup auf diesen Ausgangszustand bezieht. Als würde man den Raspberry Pi gerade erst einschalten.

    Aber auch Ressourcen werden durch das Cleanup freigegeben, wodurch eine andere Instanz von gpiozero den GPIO nutzen kann.


    Ich brauche jetzt 1L Kaffee und Kippen ^^