GPIO Pin reagiert bereits bei Berührung - warum?

  • Hallo Forum,
    im Augenblick bastel ich eine Lösung mit dem Raspi als Alarmanlage und bin auch schon recht weit.
    Zukünftig wird der Raspi auf einem GPIO Pin ein Signal von der Alarmanlage bekommen und weitere Schritte auslösen - das versuche ich gerade nachzustellen.


    Dazu habe ich ein Skript geschrieben, dass u.a. folgende Zeilen enthält:


    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.add_event_detect(pin, GPIO.RISING)
    while True:
    if GPIO.event_detected(self.alarmpin):


    Bisher habe ich folgendes Verständnis (und bin nicht sicher, ob ich richtig liege):
    - Definition von Pin-Nummerierung als HW Layout
    - Definition des Eingangspin und Initialisierung als logisch 0 (low)
    - Starten des Monitoring ob der Pin auf logisch 1 (high) gezogen wird
    - Wenn der Pin auf high gezogen worden ist, dann tue etwas


    So - jetzt die "seltsamen" Auffälligkeiten:


    - Bereits das metallische Berühren an dem Pin löst bereits das event_detect aus. Warum?
    (Meine Erwartung ist, dass hier ein logisch high Pegel (3,3V) anliegen muss. Wie kann ich das realisieren?)


    - Die Konsequenz ist, das bereits eine reine Verkabelung von dem Pin ein Detect auslöst
    - Dazu wird dann noch ständig (wenn in einer Schleife genutzt) das detect ausgelöst. Hier soll das nur einmal in einer gewissen Zeit (z.B. 10s) geschehen. Wie geht das? Der Parameter "bouncetime" wird ignoriert.


    Vielen Dank für die Unterstützung


    Gruß
    Merlin

  • Du solltest deinen Eingangs GPIO-Pin mittels eines hochohmigen Widerstand ( ca. 10k - 20k ) auf ein definiertes Potential ( 3,3V od. GND ) legen, damit verhinderst Du diese Erscheinungen, da auch nur ein Stück Draht eine Antenne ist, auf daß die CPU bei "entsprechenden Empfang" reagiert.
    [hr]
    Vielleicht solltest Du dir mal diesen aufschlußreichen Beitrag von orb ansehen, dann wird es bestimmt klar wie man seinen Raspberry am Besten beschaltet.


    Hardwarebasteleien

  • Ein offener Eingang ist eine Antenne und fängt alles ein, was an elektromagnetischen Wellen durch die Luft schwirrt. Wenn Du den Pin mit etwas metallischem berührst vergrößerst Du die Antenne und er fängt genug ein um einen High-Pegel zu erkennen. Deßhalb arbeitet man nie mit offenen Kontakten. Du nimmst also einen Widerstand und verbindest den Pin darüber mit GND. So hast Du immer einen definierten Pegel, High wenn Du 3,3Volt schaltest, Low über den Widerstand wenn nichts geschaltet ist.
    Eigendlich hast Du das schon mit
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    getan, über die Antennenwirkung schaffst Du es aber den Pulldown-Widerstand zu übersteuern.


    Aus diesem Grund macht man das in der Praxis genau andersrum, man benutzt PullUp-Widerstände
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    und schaltet Masse. Wenn es zu Störungen kommst lösen die in der Regel einen Wechsel auf High aus, das stört nicht wenn der Eingang sowieso schon auf High liegt und Du hast einen sichere Erkennung des Low-Pegels. Der Prozessor unstestützt sogar eine invertierung des gelesenen Pegels damit Du einen High-Pegel auslesen kannst wenn der Pin auf Low geht.

  • Hallo Zusammen,
    zunächst mal herzlichen Dank für die schnelle und hilfreiche Antwort.
    In die Richtung hatte ich auch schon gedacht und so was "vermutet"....
    Dennoch bin ich noch nicht am am Ziel.


    Ich habe jetzt mal folgendes Versucht:


    Zunächt mit einem 10k Widerstand meinen Eingangspin auf GND gelegt und mit
    GPIO.PUD_DOWN initialisiert und ein Event Detect mit GPIO.RISING gesetzt.
    Ergebnis: Das Skript feuert immer und löst sofort aus - permanent. (Ohne Status Wechsel auf der HW).


    Dasselbe nochmal mit Pin und 10k auf 3.3V.
    PUD_UP initialisiert und Event Detect auf GPIO.FALLING.
    Das gleiche Bild. Es feuert immer und löst ständig aus.


    Bisher bekomme ich also keinen definierten Ruhezustand hin - ausser ich lasse den Eingang offen (entgegen genannter Empfehlung). Dann löst jede Berührung aus (Antenne...).


    Schließlich sei noch gesagt, dass das Endziel eine Überwachung einer Alarmanlage ist.
    Diese wird bei Alarmierung ein Highpegel auf meinen Pin setzen (Ruhezustand kenne ich noch nicht).
    Daher will ich das Verhalten wie o.g. simulieren.


    Somit möchte ich erreichen:
    - Ein definierten Ruhezustand und das auslösen erst bei HIGH am Eingang (und dann auch nur einmal in gewisser Zeit).


    Vielen Dank für weitere Hinweise!
    Merlin


    P.S.: Im übrigen, für Links und Verweise auf Doku bin ich dankbar -- ist irgendwie etwas dünn, Material zu dem Thema zu finden.

  • Respekt!
    Da wäre ich jetzt nicht so schnell darauf gekommen...
    Also,


    Direkt Verbinde auf GND und mit PUD_DOWN initialisieren - auf ein RISING warten:
    --> funktioniert, doch wenn ich nur in die Nähe der Anschlusskäbelchen komme wird gefeuert.
    Lediglich das direkt Verbinden mit einer Klemme an den Pins klappt.


    Das gleiche mit 1k - feuert wie gehabt.


    Verbinden mit 1k auf 3.3V und mit PUD_UP initialisieren - auf ein FALLING warten:
    --> funktioniert hin und wieder und löst nur manchmal aus


    Direkt ohne Widerstand auf 3.3V wollte ich nicht testen (ohne Strombegrenzung).


    Mit der EM Verseuchung wäre denkbar. Sitze zum testen im Büro mit WLAN, DECT etc. und Co umd mehrere Devices...


    Scheint sehr empfindlich zu sein und die Idee mit Optokoppler wird wohl Sinn machen.
    Irgendwie muss ich das auf on hold legen bis ich "echt" testen kann.
    Scheint wohl ne sehr empfindliche Sache zu sein....


    Bin mir noch nicht sicher wie ich weiter verfahre - die anderen Module der Steuerung müssen auch noch geschrieben werden...


    Zumindest stimmt wohl die Logik der Software und es ist ein HW Thema.


    Gruß
    Merlin


  • Direkt ohne Widerstand auf 3.3V wollte ich nicht testen (ohne Strombegrenzung).


    Warum nicht? Du hast dem Pin auf Eingang gesctellt, er ist hochohmig (sonst hättest Du die Probleme nicht).
    Selbst als Ausgang sind die IOs Strombegrenzt (8/12mA) und kurzzeitig kurzschlussfest.


    Quote


    Mit der EM Verseuchung wäre denkbar. Sitze zum testen im Büro mit WLAN, DECT etc. und Co umd mehrere Devices...


    Um solche Störungen zu erreichen, reicht eine Büroumgebung nicht aus. Solche Störungen kenne ich nur aus Fabrikhallen in denen Maschienen im mehrstelligen Kilowattbereich anlaufen oder schlecht geschirmte Frequenzumrichter laufen. Und dann bei laaangen Anschlussleitungen.


    Quote


    Scheint sehr empfindlich zu sein und die Idee mit Optokoppler wird wohl Sinn machen.
    Irgendwie muss ich das auf on hold legen bis ich "echt" testen kann.
    Scheint wohl ne sehr empfindliche Sache zu sein....


    Nein, eigendlich nicht. Wenn Du mit 1000Ohm noch Probleme hast müsste ein Strom von etwa 3mA induziert werden.
    Das Problem liegt woanders.