GPIO Events wenn Button nicht gedrückt wurde

  • Hallo Zusammen

    Ich bin an einem kleinen MPD Projekt und habe drei Buttons welche GPIO Pin's ansteuern.
    -Pause
    -Next
    -Prev

    Soweit funktioniert alles und die Buttons machen was sie sollen. Allerdings passiert es öfters, ca. 1x in der Stunde, dass eine Button-Aktion ausgeführt wird, ohne das der Button gedrückt wurde.
    Ich habe die Buttons nun von Pulldown auf Pullup umgebaut, allerdings habe ich immer noch das selbe verhalten.

    Ist ein solches Problem bekannt, wie wird dies gelöst?

    Besten Dank für eure Hilfe

  • Hallo

    Vielen Dank ja die bounce time ist bereits auf 500ms. Allerdings scheint es, dass das Problem durch Pullop Umbau gelöst wurde. Denke dass Problem war mein Code, dort nutzte ich GPIO.FALLING hatte aber einen Pulldown Resistor Verkabelung (ist mein erstes pi Projekt, und es gibt noch viel zu lernen).
    Nun habe ich bereits eine Stunde ohne falschen Event. Ich werde dies weiter beobachten.

    Generell was ist besser Pullop oder Pulldown? Speziell in Bezug auf Energie, da ich den PI an einer Powerbank betreiben möchte.

    Einmal editiert, zuletzt von shox (13. Januar 2016 um 22:40)

  • Hallo

    .
    Generell was ist besser Pullop oder Pulldown? Speziell in Bezug auf Energie, da ich den PI an einer Powerbank betreiben möchte.


    Das kommt auf die Schaltung an.
    Aber generell ist deine Konstruktion falsch. (siehe Anhang).
    Du schaltest 10k und 1k in Reihe (Spannungsteiler), hängst den GPIO ans untere Ende und ziehst mit dem Taster den Mittelabgriff des Spannungsteilers gegen Masse.???
    Bei nem Pull-up machs wie Beispiel 2.

    gruß root


  • Vielen Dank, dass mit dem 1k Widerstand habe ich von hier https://www.cl.cam.ac.uk/projects/raspb…s_and_switches/
    Ist dies nicht nötig?

    Hast Du nicht! Deine gemalte Schaltung hat den 1k gegen GND und parallel dazu einen Schließer. Das kann nicht funktionieren und ist so auch nicht auf der Seite gezeigt. Auf der Seite die Du bezeichnet hast, geht der 1k zum GPIO. Notwendig ist das nicht, aber er schützt den GPIO ein wenig vor Fremdeinflüssen.
    Automatisch zusammengefügt:

    Hast Du nicht! Deine gemalte Schaltung hat den 1k gegen GND und parallel dazu einen Schließer. Das kann nicht funktionieren und ist so auch nicht auf der Seite gezeigt. Auf der Seite die Du bezeichnet hast, geht der 1k zum GPIO. Notwendig ist das nicht, aber er schützt den GPIO ein wenig vor Fremdeinflüssen.

    Und jetzt revidiere ich mich gleich, weil klar ist Deine Schaltung OK. Die 1. Schaltung im vorherigen Beitrag ist nur etwas komisch gemalt. Also der Spannungsteiler ist so ok und funktioniert, muss aber nicht sein.

  • Vielen Dank für eure Hilfe. Ich bin es immer noch am analysieren, heute hatte von 08:30 bis 11:00 einen falschen Event. Ich habe die Bounce Time nun von 500ms auf 800ms geändert (500ms fand ich allerdings schon sehr hoch...) mal schauen ob ich immer noch falsche Events erhalte.

    Habt Ihr sonstige Empfehlungen betreffend falschen Events, ich möchte diese komplett vermeiden.


  • Vielen Dank für eure Hilfe. Ich bin es immer noch am analysieren, heute hatte von 08:30 bis 11:00 einen falschen Event. Ich habe die Bounce Time nun von 500ms auf 800ms geändert (500ms fand ich allerdings schon sehr hoch...) mal schauen ob ich immer noch falsche Events erhalte.

    Habt Ihr sonstige Empfehlungen betreffend falschen Events, ich möchte diese komplett vermeiden.

    welche Schaltung hast du denn nun aufgebaut?

    Also meine Wahl fiele auf 1k pullup an 3,3V für echte 3,3mA Strom wenn der Taster gedrückt wird für eine "festere" Anbindung und keinen R zum GPIO Port.

    Das mit den Bounce Events ist mir unklar, es sollte mehrfach geprüft werden ob der Taster gedrückt wird, die Fehlimpulse werden ja nicht konstant über XXXms anstehen.

    also prüft man mehrfach im Abstand von 10ms und wenn das Ergebnis immer gedrückt ist dann gilt es, sollte dazwischen ein NICHT gedrückt sein gilt es eben nicht, so werden kurze Störimpulse ausgeblendet oder Tastenprellen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Die Schaltung ist gemäss meinem ersten Schema aufgebaut (verständlicher hier im Anhang)

    Hier mein Code:

    Code
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(40, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.add_event_detect(38, GPIO.FALLING, callback=self.process_button, bouncetime=800)
    GPIO.add_event_detect(40, GPIO.FALLING, callback=self.process_button, bouncetime=800)
    GPIO.add_event_detect(36, GPIO.FALLING, callback=self.process_button, bouncetime=800)
  • bei 10k + 1k ist der PI so "floatend" angebunden das jeder Huster auf der Leitung auslöst!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Verstehe ich dich richtig? Damit dies nicht passiert soll ich R1 durch 1k ersetzen und R2 komplet weglassen? In den meisten Beispiele wird für R1 10k benutzt, R2 ist nicht in allen Beispielen enthalten und kann weggelassen werden.


  • Verstehe ich dich richtig? Damit dies nicht passiert soll ich R1 durch 1k ersetzen und R2 komplet weglassen?

    scheint so!


    In den meisten Beispiele wird für R1 10k benutzt, R2 ist nicht in allen Beispielen enthalten und kann weggelassen werden.

    ja aber für wen sind diese Beispiele?

    Arduinos haben i.d.R. 5V und damit ist der Störabstand größer.
    Jeder hat seine individuelle Störumgebung.
    Ein PI mit 3,3V ist halt mit 3,3V näher am GND mit 0V als ein Arduino und ich keine deine Umgebung nicht

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Vielen Dank für eure Hilfe. Ich bin es immer noch am analysieren, heute hatte von 08:30 bis 11:00 einen falschen Event. Ich habe die Bounce Time nun von 500ms auf 800ms geändert (500ms fand ich allerdings schon sehr hoch...) mal schauen ob ich immer noch falsche Events erhalte.

    Habt Ihr sonstige Empfehlungen betreffend falschen Events, ich möchte diese komplett vermeiden.

    Hallo shox,

    Die Bouncetime wird dir m.E. bei deinem Problem der Empfindlichkeit gegen Störimpulse eher nicht helfen.
    Eine Bouncetime von sagen wir 500 ms sorgt dafür, dass nach einem erkannten Impuls der Eingang für 500 ms quasi "taub" ist.

    Ein etwaiger Störimpuls am GPIO kommt also sehr wohl durch, egal erstmal wir lang oder kurz der ist. Dann ist in (meinem Beispiel) für 500 ms Ruhe.
    Der nächste Störimpuls kann also erst nach 500+ ms "ausgewertet" werden.

    Mit der Bouncetime x beschränkst du lediglich die Häufigkeit der Störimpulse auf 500 ms.


    Um die falschen Events zu vermeiden, gäbe es mehrere Möglichkeiten, die im wesentlichen darauf aufbauen, dass deine Störimpulse sehr viel kürzer als die
    gültigen Events sind.

    Einmal schaltungstechnisch per Kondensator (z.B. 10 nF) vom GPIO gegen Masse.
    Das macht den Eingang "langsamer".

    Oder den 10k Widerstand in deinem Beispiel niederohmiger zu machen, sagen wir 1-5k.
    Das macht den Eingang "unempfindlicher".

    Oder per Software, z.B. Wenn ein GPIO Event erkannt wurde, frage nach x ms nochmal ab, ob der GPIO immer noch auf dem gewünschten Pegel ist.
    Ist das der Fall, liegt ein gültiger Event vor, wenn nicht, wars ein Störimpuls.
    Damit kann ein gültiger Event anhand seiner Länge gut von einem Störimpuls unterschieden werden.

    Cheers
    Micha

    Einmal editiert, zuletzt von toweruser (14. Januar 2016 um 13:15)

  • OK ich werde heute Abend die Schaltung auf nur je 1k Widerstand umbauen und zusätzlich eine doppelte Überprüfung nach einem Sleep integrieren. Ich möchte 100% sichergehen, dass keine falschen Events ausgeführt werden.
    Wie verhält sich der Stromverbrauch mit nur 1k Widerstand, hab mal gelesen, dass grössere Widerstande den Akku verbrauch veringert. Generell was empfehlt in in betrach auf Akku verbrau? Nun habe ich Pullop sprich die drei GPIO's werden immer mit je 3.3 Volt gspiesen hat das nich eine Auswirkung auf den Akku-Verbrauch?

  • Hallo.


    Wie verhält sich der Stromverbrauch mit nur 1k Widerstand, hab mal gelesen, dass grössere Widerstande den Akku verbrauch veringert. Generell was empfehlt in in betrach auf Akku verbrau? Nun habe ich Pullop sprich die drei GPIO's werden immer mit je 3.3 Volt gspiesen hat das nich eine Auswirkung auf den Akku-Verbrauch?


    Halte dir einfach folgendes vor Augen:
    Der Pull-up sollte groß genug sein,dass bei gedrücktem Taster möglichst wenig Strom fließt, andererseits klein genug, damit du möglichst keinen Antenneffekt hast, und dir dadurch Störimpule einfängst.
    Ein GPIO als Eingang geschaltet hat einen sehr hohen Innenwiderstand und würde ohne Pull-up quasi "schweben".
    Bei 1k fließen grade mal 0,003A.Wie oben vorgeschlagen nimm nen 2k2, dann fließt noch weniger und du bist noch auf der sicheren Seite.
    Nochwas zu der Bouncetime:
    Die ist nicht dazu gedacht, irgendwelche Störimpulse zu ignorieren, sondern um das unweigerliche Prellen des Tasters beim drücken und loslassens zu ignorieren
    ~200 ms sind in der Regel ausreichend.

    gruß root


  • Bei 1k fließen grade mal 0,003A.Wie oben vorgeschlagen nimm nen 2k2, dann fließt noch weniger und du bist noch auf der sicheren Seite.

    sagst du ohne seine Störeinflüsse zu kennen?
    Er sollte es erst mal zum Funktionieren bringen, dann kann er immer noch hochgehen!


    Nochwas zu der Bouncetime:
    Die ist nicht dazu gedacht, irgendwelche Störimpulse zu ignorieren, sondern um das unweigerliche Prellen des Tasters beim drücken und loslassens zu ignorieren
    ~200 ms sind in der Regel ausreichend.

    aber auch kurze Störer werden so gefiltert, nicht nur Tastenpreller!

    Ich würde ja nicht nur 2x gucken gedrückt und losgelassen, sondern 4x nach Dannegger, sonst könnte zufällig am anfang und am Ende der "Guckzeit" ein pasender Störer drauf liegen, bei 4x in konstantem 10ms Raster eher unwahrscheinlich.

    https://www.mikrocontroller.net/topic/tasten-e…len-bulletproof

    ich nutze das sogar im µs Raster um Störer aus einer Lasertriggerung zu filtern.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (14. Januar 2016 um 14:55)

  • Habe mal mein Script mit folgendem Code erweitert:

    Code
    def process_button(self, button):
    time.sleep(0.01) # need to filter out the false positive
    if GPIO.input(button) != GPIO.LOW:
    print('quitting was probably a false positive')
    return
    print('Button was actually pressed, or GPIO event actually happened')

    Kann es aber erst heute Abend testen, die Schaltung werde ich ebenfalls heute Abend umbauen. Vielen Dank für eure Unterstützung!!!


  • ich nutze das sogar im µs Raster um Störer aus einer Lasertriggerung zu filtern.

    ...das kann und muss jeder für sich entscheiden.
    Dann bist aber auf lästiges pollen angewiesen und kannst nen effizienteren flankengesteuerten Interrupt wegwerfen.

  • Meine Code Erweiterung scheint zu funktioniren :thumbs1:

    Empfehlt Ihr mir dennoch den Umbau auf nur einen Widerstand R1 mit 1k oder 2.2k anstelle meines aktuellen Zustand R1 10k und zum GPIO R2 1k. Bitte zieht immer in betracht, das der PI möglichst wenig ENergie brauchen sollte.


  • Empfehlt Ihr mir dennoch den Umbau auf nur einen Widerstand R1 mit 1k oder 2.2k anstelle meines aktuellen Zustand R1 10k und zum GPIO R2 1k.


    auf jeden Fall, da du zum hohen Innenwiderstandes des GPIO Eingangs nochmal 11k dazuschaltest.


    ... Bitte zieht immer in betracht, das der PI möglichst wenig ENergie brauchen sollte.


    Du meinst den GPIO.Der Pi zieht das was er braucht.
    Meine persönliche Meinung ohne die Umgebung deines Pi's zu kennen:
    Wenn du jedes unnötige mA sparen willst, fang mit einem Rv von 3k3 an.Wenn keine Ruhe eintritt, runter auf 2k2. Wenn immer noch nicht, runter auf 1k.
    Und nicht wie jar vorgeschlagen hat von unten nach oben testen...du willst ja Strom sparen.
    Du kannst auch unter 1k gehen, aber wenn das nötig ist.... lebst du in einer Trafostation ö.ä... :D

    Ich persönlich hab mir irgendwann mal angewöhnt:
    Ein GPIO als Eingang bekommt nen externen Rv (2k2) als Pull-up, und ich schalte dann grundsätzlich den internen Pull-down (der hat ~50k) per Software dazu, und teste dann.
    Wenn das nicht geht greife ich zum Oszi und beobachte.... irgendwann sieht man was.

    gruß root

    Einmal editiert, zuletzt von root (14. Januar 2016 um 19:56)

Jetzt mitmachen!

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