Taster an GPIO löst selbstständig aus

  • Hey hey,


    ich hatte vor meine Klingel etwas zu modernisieren mit einem Pi Zero 2 w.

    Dazu habe ich mich an folgende Anleitungehalten: https://roboticsbackend.com/ra…gpio-interrupts-tutorial/


    Folgenden Code nutze ich:


    Das funktioniert auch soweit auch super bis auf ein Problem: Der Taster löst auch so aus, wenn er nicht gedrückt wird (ca. 1x alle ~2h normalerweise).

    Dazu habe ichgelesen, dass der intere Pull-Up Resistor nicht immer passt und man lieber einen 10k dazuschalten soll.

    Das habe ich heute gemacht, allerdings habe ich meine Auslöser immer noch auch wenn der Taster nicht gedrückt wird (Code dann ohne pull_up_down=GPIO.PUD_UP) .

    Die Kabel sind bei mit ca. 50cm lang - kann es daran liegen? Ansonsten ist noch ein 7zoll Display dran (HDMI + Micro USB) sowie eine Kamera.

    Jemand einen Tipp, an was es liegen könnte?


    Danke!

  • Go to Best Answer
  • gpiozero statt RPi.GPIO ist eher das Mittel der Wahl. Ein Beispiel angelehnt an Deinen Code wäre:


    Die Kabel sind bei mit ca. 50cm lang - kann es daran liegen?

    Gut möglich! Ist da evtl. ein Kühlschrank oder ein ähnlicher möglicher Auslöser in der Nähe oder im Stromkreis?

  • Der Widerstand alleine hat kaum einen Einfluss auf das Verhalten bei externen Störungen. Wenn du das beseitigen willst, kannst du kurze auslösende Impule entweder mit der Software rausfiltern (wenige ms nach dem Auslösen noch mal nachsehen, ob das Signal tatsächlich noch da ist oder ob es nur eine kurze Störung war) oder mit einem RC-Glied rausfiltern, also vor den Eingang einen Widerstand und einen Kondensator setzen.

  • Hallo,


    danke für eure Antworten. gpiozero hat bisher keine Probleme gemacht, daher war es vermutlich das. Störquellen sind eigentlich keine in der Nähe.

    Ich beobachte es mal und hoffe das es jetzt so geht.

  • gpiozero statt RPi.GPIO ist eher das Mittel der Wahl. Ein Beispiel angelehnt an Deinen Code wäre:


    Gut möglich! Ist da evtl. ein Kühlschrank oder ein ähnlicher möglicher Auslöser in der Nähe oder im Stromkreis?

    Da es heute doch wieder spinnt (drücke Button 1x -> Löst aber zigmal aus bis zum Neustart):

    Bei mir verbindet der Taster GPIO 16 mit GND, das sollte ja richtig sein oder? Und bracu hich bei dem Code einen zusätzlichen Pull-Up Resistor oder nutzt der den internen?


    Danke!

  • Da es heute doch wieder spinnt (drücke Button 1x -> Löst aber zigmal aus bis zum Neustart)

    Kann es sein, dass der Taster ein weg hat?


    Du könntest es mit einer bounce time versuchen, aber vermutlich wird das in dem Fall den Fehler nicht beheben.

    Python
    button = Button(16, bounce_time=0.2)


    Bei mir verbindet der Taster GPIO 16 mit GND, das sollte ja richtig sein oder?

    Korrekt!



    Und bracu hich bei dem Code einen zusätzlichen Pull-Up Resistor oder nutzt der den internen?

    Bei gpiozero werden per default die internen Pullups verwendet. Siehe dazu auch hier: https://gpiozero.readthedocs.i…nput.html#gpiozero.Button

  • Hallo zusammen,


    bin neu im Forum und habe ein ähnliches Problem mit meinem Raspbery Pi Pico.

    Ich habe mit ein Bundle mit dem kleinen englischen Guide gekauft und bin über die
    Feiertag am experimentieren. Leider klappt das nicht so ganz mit dem Einlesen des
    Tasters. Egal welchen PIN ich als IN benutzt, es kommt immer wieder zu falschem Triggern.

    Ich vermute mal, dass das mit einem floatendem Eingang zu tun hat. Aber irgendwie hätte ich
    erwartet, dass man die kleinen Experiments auf dem "Get started with..." Guide auch genau
    so ausführen kann. Von einem zusätzlichen externen Pull up steht da nichts und ich habe
    leider auch keinen :-(.


    Ich habe den Code genau so eingegeben, wie es in dem kleinen Buch steht.

  • Problem gelöst. In dem kleinen Übungsbuch stand nichts dvon, dass man den GPIOs erst sagen sollte, ob sie pull-up oder pull-down geschaltet sein sollen.
    Kaum macht man es richtg, schon geht's ;) .

  • Nur um sicher zu sein, so hast du es schon probiert ?

    Ob der 1k-Ohm-Widerstand jetzt vor oder nach dem Taster ist, ist erst einmal egal.

    So würde ich es jetzt machen, dann muss ich aber pull_up=none mit in den code einbauen, richtig?

  • bei gpiozero muss man das explizit angeben, damit keiner benutzt wird


    pull_up (bool or None) – If True, the pin will be pulled high with an internal resistor.
    If False (the default), the pin will be pulled low.

    Will nicht klugscheissern, hatte nur zufällig die Seite noch auf ^^


    Standard ist beim gpiozero 'pull_up = False'. Bitte nicht 'None' setzen, das wäre kein definierter Zustand:


    If None, the pin will be floating. As gpiozero cannot
    automatically guess the active state when not pulling the pin, the
    active_state parameter must be passed.

    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Standard ist beim gpiozero 'pull_up = False'.

    Nicht bei gpiozero.button, dort ist der True. ;)https://gpiozero.readthedocs.i…nput.html#gpiozero.Button

    Quote

    pull_up (bool or None) – If True (the default), the GPIO pin will be pulled high by
    default. In this case, connect the other side of the button to ground.
    If False, the GPIO pin will be pulled low by default. In this
    case, connect the other side of the button to 3V3. If None, the
    pin will be floating, so it must be externally pulled up or down and
    the active_state parameter must be set accordingly.

  • Jetzt bin ich etwas verwirrt: Muss ich false oder none nutzen? Dachte es sollte floating sein, da der Pull-up durch die Verbindung zum 3,3V Pin kommt.

    Sorry für die vermutlich dumme Frage :)

    • Best Answer

    Bei einem externem Pullup auf pull_up=None setzten und dann noch active_state=False, wobei ich mir bei letzterem nicht 100%ig sicher bin. Falls die Logik doch andersherum sein sollte, das merkst Du beim Schalten, dann kannst Du active_state noch auf True setzen.


    ABER Du kannst das auch erstmal einfach so lassen wie es ist, also weder pull_up noch active_state setzten, wenn Du einen externen Pullup verwendest. Dann ist zwar der interne Pullup noch aktiv, aber vielleicht reicht es ja damit auch.

  • Alles klar, ich probiere es mal ohne.

    Ohne die Verbindung zum 3,3v PIN hat es auf jeden Fall in den letzten Tagen mal wieder auf einmal 100x hintereinander ausgelöst - hoffe das passiert nicht mehr.

    Ich werde berichten, danke euch allen!

  • Die internen PullUps liegen so zwischen 50 - 60 kOhm.
    Bei gpiozero hat man noch den Vorteil, dass active_state automatisch gesetzt wird, sofern pull_up == True oder pull_up == False ist.


    Quote from api_input.html#button

    pull_up (bool oder None) - Wenn True (Standard), wird der GPIO-Pin standardmäßig hochgezogen. In diesem Fall muss die andere Seite der Taste mit Masse verbunden werden. Wenn False, wird der GPIO-Pin standardmäßig auf low gezogen. Verbinden Sie in diesem Fall die andere Seite des Knopfes mit 3V3. Bei None ist der Pin potentialfrei, muss also extern nach oben oder unten gezogen werden und der active_state-Parameter muss entsprechend eingestellt werden.


    Quote from gpiozero.InputDevice

    active_state (bool oder None) - Bei True ist der Zustand des Hardware-Pins HIGH, der Software-Pin ist HIGH. Bei False ist die Eingangspolarität umgekehrt: wenn der Zustand des Hardware-Pins HIGH ist, ist der Zustand des Software-Pins LOW. Verwenden Sie diesen Parameter, um den aktiven Zustand des zugrundeliegenden Pins einzustellen, wenn er als nicht gezogen konfiguriert ist (wenn pull_up None ist). Wenn pull_up True oder False ist, wird der aktive Zustand automatisch auf den richtigen Wert gesetzt.


    active_state muss nur gesetzt werden, wenn pull_up == None.

    • pull_up auf True gesetzt:
      Der interne pull_up wird aktiviert und active_state wird automatisch auf False gesetzt.
    • pull_up auf False gesetzt:
      Der interne pull_down wird aktiviert und active_state wird auf True gesetzt.
    • pull_up auf None gesetzt:
      Weder der pull_up, noch der pull_down sind bei None aktiviert. Der Zustand der PINs wird dann nur noch über den externen pull_up/pull_down bestimmt. Wenn pud_up == None, muss active_state entsprechend gesetzt werden:
      • active_state == True, wenn ein externer pull_down verwendet wird
      • active_state == False, wenn ein externer pull_up verwendet wird.