GPIO Relais schaltet nur einmal

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin zusammen,

    Besitzer eines RPi 4 8GB Modells, einfaches 3.3v Relais angeschlossen an 3.3v, GND und GPIO4, Python in Version 3.

    Problem: Das Relais zieht nur beim aller ersten Aufruf meines Python-Scripts an. Wenn ich das Relais durch ein zweites Script wieder in Grundstellung bringe und dann das Relais wieder durch das Anzieh-Python-Script anziehen lassen möchte, passiert nix. Das Relais zieht nicht an. Erst nach Neustart des RPi's ist wieder ein einmaliges Anziehen möglich. Bis zum Ausschalten, danach hilft wieder nur ein Neustart.

    Script-Inhalt zum Anziehen des Relais:

    #!/usr/bin/python3


    import time

    import RPi.GPIO as GPIO

    time.sleep(1)

    GPIO.setwarnings(False)

    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(7, GPIO.OUT)

    GPIO.output(7, GPIO.LOW)

    time.sleep(1)

    exit()


    Script für Grundstellung:

    #!/usr/bin/python3

    import time

    import RPi.GPIO as GPIO

    time.sleep(1)

    GPIO.setwarnings(False)

    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(7, GPIO.OUT)

    GPIO.output(7, GPIO.HIGH)

    GPIO.cleanup()


    time.sleep(1)

    exit()

    Kann mir da jemand helfen und Tipps geben um das Problem zu beheben ?

    Vielen Dank! :) :)

  • Guten Morgen
    Hast du es mal mit der Variante einer Parameterübergabe probiert ?

    Der Aufruf würde dann überpython3  -m <Path>/<Dateiname> on oder off erfolgen

    es grüßt euer
    Willy

  • coone4life

    Du musst für das selbe Problem keine 2 Threads auf machen .

    Dann fehlt in deinem Script, welches das Relais anziehen lassen soll, ein GPIO.cleanup().

    Statt dem Rpi.Gpio könntest du aber auch GpioZero nutzen. Das ist schön dokumentiert und lässt sich einfacher Programmieren bzw. dein Programm wird übersichtlicher.

    Wenn du noch verrätst was du vor hast, könnte man eventuell beide Programme zu einem zusammenfassen und wenn das Programm dauerhaft laufen soll könnte man noch eine Service Unit anlegen.

    Ansonsten das was Willy schrieb.

  • Guten Morgen

    Das fehlende GPIO.cleanup() im "Anzieh-Script" dürfte hier wohl weniger die Rolle spielen, denn wenn wie der TO schreibt, das später aufgerufene "Abfall-Script" funktioniert, wäre doch diese Stelle des Cleanup schon übersprungen ?
    Keine Ahnung, wie hier die Zusammenhänge sind ?

    Diesen Code habe ich jetzt mal nur mit einer LED am Ausgang getestet und natürlich die bequemere Methoden von gpiozero angewendet.

    Falls du verhindern willst, dass durch einen weiteren externen Aufruf ein sofortiges Zurückschalten in den Ausgangszustand verhindert wird - im Falle dessen das der Aufruf mit unterschiedlichen Parametern innerhalb eines Zeitlimits erfolgt, st das so nicht möglich.
    Python-Script Aufruf - Initiierung des GPIO Port, ausführen des Schaltvorganges ja. Aber keine unmittelbare Verrieglungsfunktion, die ein sofortiges zurückschalten durch erneuten Script-Aufruf verhindert.
    ( Vielleicht etwas ungeschickt ausgedrückt, aber ich hoffe man versteht was ich meine ;) )

    es grüßt euer
    Willy

  • Das fehlende GPIO.cleanup() im "Anzieh-Script" dürfte hier wohl weniger die Rolle spielen....

    Meine Vermutung kommt durch den Neustart, weil danach das Anzieh-Script wieder funktioniert.

    Fred´s Vorschlag kann man auch machen. Generell sollte man Warnungen nicht abschalten oder einfach GPioZero nutzen.

  • GPIO.cleanup()

    Das wird in jeder Anleitung sinnlos wiederholt, ohne es verstanden zu haben.

    Zitat von übersetzt mit deepl


    RPi.GPIO bietet eine eingebaute Funktion GPIO.cleanup(), um alle verwendeten Ports aufzuräumen. Aber seien Sie sich darüber im Klaren, was diese Funktion tut. Sie betrifft nur alle Ports, die Sie im aktuellen Programm gesetzt haben. Sie setzt alle Ports, die Sie in diesem Programm verwendet haben, wieder in den Eingabemodus zurück. Dadurch wird verhindert, dass ein Port, der als Ausgang auf HIGH gesetzt ist, versehentlich an GND (LOW) angeschlossen wird, was zu einem Kurzschluss und möglicherweise zum Durchbrennen des Ports führt. Eingänge können entweder 0 V (LOW) oder 3,3 V (HIGH) verarbeiten, daher ist es sicherer, Anschlüsse als Eingänge zu belassen.

    Dein Programm würde genauso ohne gpiozero laufen, sofern du GPIO.cleanup entfernst.

    Was viele auch nicht bedenken, dass gpiozero RPi.GPIO als backend verwendet. gpiozero ist in Python geschrieben und RPi.GPIO in C. Wenn man nun ein Modul lädt, dass unnötigerweise mehr importiert, dauert der Start des Interpreters länger. Auf einem Desktop-PC mit 5GHz CPU und schnellen IO bekommt man das kaum mit. Auf einem RPi mit langsamer microSD und wenigen IOPS stören solche imports gerade dann, wenn man das Script z.B. beim Booten ausführt. Das verlängert dann unnötigerweise die Bootzeit.


    Hier mal ein Beispiel mit RPi.GPIO und dem ArgumentParser, der nur on|off auswertet.

    Anmerkung: PIN anpassen

    Zeit mit gpiozero (Programm unverändert, nur den Import hinzugefügt):

    Code
    deadeye@rpi0w2:~ $ time python w.py 
    usage: w.py [-h] {off,on}
    w.py: error: the following arguments are required: action
    
    real    0m0.478s
    user    0m0.409s
    sys     0m0.069s

    Zeit ohne gpiozero:

    Code
    deadeye@rpi0w2:~ $ time python w.py 
    usage: w.py [-h] {off,on}
    w.py: error: the following arguments are required: action
    
    real    0m0.220s
    user    0m0.184s
    sys     0m0.036s


    Es spricht nichts gegen die Verwendung von gpiozero bei komplexeren Programmen oder etwas, dass z.B. auf Flanken reagieren soll.

    Wie lange es dauert, bis der Python-Interpreter alles importiert hat, kann man sich ausgeben lassen:

    Spoiler anzeigen

    Das gleiche Beispiel ohne gpiozero:

    Spoiler anzeigen

    Deutlich weniger...


    PS: Beim Neustart geht natürlich alles verloren. Wenn man einen Ausgang so früh wie möglich beim Booten gesetzt werden soll, dann am besten über die /boot/config.txt mit gpio.

    Code
          # Set GPIO16 auf high
          # Deckungsgleich mit dem Beispiel
          gpio=16=op,dh

    PPS: ich hatte mal selbst so ein Problem. Ein Hardwaretimer (RC-Glied) schaltete den RPi nach ca. 60 Sekunden ab, wenn ein GPIO-Signal nicht auf HIGH ist. Dann wurde der Kondensator über den Widerstand entladen und die Spannung ist dann abgeschlatet worden. Das Problem war, dass ich den Ausgang mit einem Bootscript nicht schnell genug schalten konnte. Das führte dann unweigerlich zu einer Boot-Loop. Die Lösung war es dann die config.txt zu verwenden, da die schon geladen wird, bevor der Kernel geladen ist. Ich war darüber erstaunt wie schnell der Ausgang gesetzt worden ist. Soweit ich mich erinnern konnnte dauert das beim RPI0W unter einer Sekunde.

    3 Mal editiert, zuletzt von RestlessMud46765 (11. August 2022 um 11:23) aus folgendem Grund: bool entfernt und True/False durch 1/0 ersetzt.

  • Hallo zusammen,

    vielen Dank für die zahlreichen Hilfestellungen ;)

    Guten Morgen
    Hast du es mal mit der Variante einer Parameterübergabe probiert ?

    Der Aufruf würde dann überpython3  -m <Path>/<Dateiname> on oder off erfolgen

    Das Ganze hat wunderbar funktioniert, aber auch nur, bis ich einmal an und wieder abgeschaltet habe. Leider danach wieder das gleiche Problem wie vorher....Es scheint also irgendwas systemtechnisch zu blockieren...so rein logisch schlussgefolgert...:/

  • Guten Tag coone4life,

    schon die 2. Variante #4 ausprobiert, die funktioniert ohne Relais, nur mit einer LED zur Funktionskontrolle bei mir auf einem 3er PI...


    Yes, nothing happens...

    Da das nun schon ewigkeiten her ist das ich das Ganze installiert habe...evtl alles rund um das GPIO gedöhns mal entfernen und neu installieren?

    Das Ganze System neu machen ist unmöglich; es läuft ne NC-Instanz auf dem Pi.

  • Guten Tag


    Diese wenigen Schritte würden dich jetzt überfordern ? GPIOZERO und RPi.GPIO bestehen parallel.
    Ich meine ja nur mal so, statt jetzt Stunden oder Tage einem Fehler ohne Fehlermeldung hinterher zu laufen, wäre das für mich der bequemste Weg.

    es grüßt euer
    Willy

  • Guten Tag coone4life,

    jetzt nochmal eine nachfrage, das Relais hängt direkt an diesem GPIO ?
    Oder hängt da noch eine Vorwiderstand und eine Schalttransistor dazwischen ?

    Ich frage ja nur mal so, weil direkt dürfte die Strombelastungsgrenze des GPIO-Ports überfordern :gk1:

    Alternativ mal ein einfache LED mit Vorwiderstand probiert ? Nicht das du mit diesem Aufbau aktiv dein PI grillst !?

    Sieht das so aus ?


    Oder doch irgendwie anders ?

    es grüßt euer
    Willy

  • Ich würde ganz unten anfangen, z.B. damit:

    Starte das Skript so wie es hier drüber steht bitte im Terminal und mit python3, nicht mit Thonny oder vergleichbar!

    Was macht das Relais und was sind die Ausgaben vom Skript?

  • jetzt nochmal eine nachfrage, das Relais hängt direkt an diesem GPIO ?
    Oder hängt da noch eine Vorwiderstand und eine Schalttransistor dazwischen ?

    Ich frage ja nur mal so, weil direkt dürfte die Strombelastungsgrenze des GPIO-Ports überfordern :gk1:

    Hier mal eine Beschreibung (Infos) des Relais laut AZ Delivery

    Zitat

    Das KF-301 Relais Modul besteht aus zwei LEDs (rot/grün), drei

    Widerständen, einem NPN-Transistor, einer Gleichrichterdiode und einem

    Relais, das bis zu 5A 50V AC or 5A 30V DC verarbeiten kann

  • Also ich habe eine Vermutung:

    Da es sich bei dem Relais um einen LowLevel Trigger Relais hat schaltet das Relais ja nur wenn der GPIO Pin auf "Low" steht.

    Das Abfall-Script setzt den Pin ja auf High.

    Vielleicht verhindert irgendwas (ich weiß aber nicht was), dass sich der Pin wieder von High auf Low setzt wenn einmal ein Low/High Wechsel erfolgt ist.

    Gibt's ne Möglichkeit den Status des Pins abzufragen wie der aktuelle Stand ist ?

    Ich glaube das genau das das Problem ist.

    Das Script aus meinem ersten Post hat bis vor n paar Tagen wunderbar funktioniert.

  • Ich würde ganz unten anfangen, z.B. damit:

    Starte das Skript so wie es hier drüber steht bitte im Terminal und mit python3, nicht mit Thonny oder vergleichbar!

    Was macht das Relais und was sind die Ausgaben vom Skript?

    Das teste ich später wenn ich zu Hause bin.

    Antwort folgt dann umgehend :)

  • Das Script aus meinem ersten Post hat bis vor n paar Tagen wunderbar funktioniert.

    Gibt es "undervoltage" Meldungen in die /var/log/syslog? Das findest Du mit cat /var/log/syslog* | grep voltage heraus.

    Falls ja, was für ein Netzteil verwendest Du und hast Du evtl. ein anderes zum Gegentesten rumliegen?

    Zeige Ausgaben und Code bitte in Codeblocks, das ist dieser Button im Foreneditor! ;)

  • Guten tag Franjo G,


    schaue mal bitte in den chronologischen Ablauf der Posts. Erst nachdem ich meine Vermutung geäußert hatte, kam der TO mit der Angabe heraus um welches Relais es sich im speziellen handelt. Davor ist auch noch kein Anderer auf die Idee kommen in der Verkablung, oder am Relais Typ selber einen Fehlerzusammenhang zu suchen.
    Du musst mir nicht extra eine halbe Stunde nach der Offenbarung durch den TO die Anleitung posten. Das schaffe ich durchaus noch allein. Und du brauchst auch nicht so zu tun, dass du nun der große Erleuchter bist, und mich belehren müsstest.
    Denn wenn du den Eingangspost gelesen hättest, steht dort :

    Besitzer eines RPi 4 8GB Modells, einfaches 3.3v Relais angeschlossen an 3.3v, GND und GPIO4, Python in Version 3.

    Schaut man nun dieses Datenblatt wird eins auffällig das mit dem Arduino das Relais als Dauerstromversorgung über den 5 V Pin gespeist wird, jedoch beim PI, welches im übrigen ebenfalls 5 V zur Verfügung stellen könnte, nur über 3,3 Volt betreiben.

    Dieses würde in dem Zusammenhang auch nicht erklären, weshalb das Relais bei AZ-Delivery als

    KF-301 1-Relais 5V Modul Low-Level-Trigger

    geführt wird, jedoch in den verfügbaren Anleitungen unterschiedliche Versorgungsspannungen genannt werden.
    Wenn das Relais am Arduino mit 5 Volt betrieben werden kann, warum sollte es dann nicht auch am Raspberry Pi mit 5 V funktionieren ?
    Das wäre doch jetzt erst einmal die Frage die zu klären wäre, bevor wir uns hier weiter ohne jede genauere Angabe zu den Fehlermeldungen gegenseitig irgendwas an den KOPF werfen.

    coone4life
    Wenn es sich wirklich um dieses Modell Relais handelt wir du aufgeführt hat, würde ich jetzt folgendes machen:

    Da wie du sehen kannst das Relais auch mit 5 V funktionieren soll, was soll passieren ?

    Einfach die Verbindung zu PIN1 = 3,3 V auf den PIN 2 umstecken. Also der rechte PIN daneben. Damit erfolgt wie im Anleitungsbeispiel Arduino die Stromversorgung über 5 V. Falls es Teil dabei killen sollte, was jedoch nicht passieren dürfte, dann reklamierst du das Teil, und sagst du hättest es wie in der Anleitung an einem Arduino mit 5 V betrieben.

    5 Volt sind 5 Volt, egal ob es ein Arduino oder Raspberry Pi ist !

    Siehe detaillierte Produktbeschreibung auf der Anbieter Webseite:

    Hier wird aber auch von einer Vc von 5 V gesprochen, bzw. geschrieben.

    es grüßt euer
    Willy

  • Guten Tag coone4life

    Bezugnehmend auf den letzten Satz in deiner Aussage würde ich sogar schon fast die Vermutung äußern, dass du die 3,3 Volt Schiene auf dem PI Board gekillt hast.
    Hast du zufälliger Weise ein kleines Multimeter zu Hause um nachzuprüfen ob die 3,3 Volt noch sauber an den PINs 1 und 17 anliegen, bzw wie sich diese Spannung verhält, wenn das Relais gerade angezogen ist ?

    es grüßt euer
    Willy

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!