Pi3B+ Frage zum Verhalten der GPIO-Pins

  • Hallo Ihr,


    ich habe bei meinem Türsteuerungsprojekt bis auf 2 alle GPIO Pins belegt und die Verbindungen der Pins zu den "Abnehmern" auf einer Loch-Platine mit Drähten etwas ungeordnet zu Anschlussklemmen am Rand der Platine vorgenommen. Ground-Anschlüsse gehen von mehreren Ground-Pins ab.

    Im ausgebauten Zustand werden mit einem Python Testskript, welches mit add_event_detect() und einer Callback-Funktion arbeitet, die Anschlüsse in einer Schleife überprüft. Bei manchen stelle ich merkwürdige Effekte fest, z.B. sprechen bei Betätigung eines Tasters mehrere Pins nacheinander an. Ich bin momentan ziemlich verunsichert. Das jetzt nur nebenbei.

    Ein besonderer Effekt, den ich feststelle, besteht darin, dass mein Prüfskript anspricht, wenn ich mit einem Schraubendreher das Gehäuse von USB- oder LAN-Anschluss antippe oder in der Verdrahtung einen Ground-Anschluss. Ist das normal ?


    Der Pi wird von einem "offiziellen" Steckernetzteil (Himbeere drauf) versorgt, welches seine 5,1 V liefert (ohne USB-Kabelverlängerung!). Die ganze Konstruktion hat im zusammengebauten Zustand mit der Steuerung von 2 Türen schon mal funktioniert.


    maksimilian

  • maksimilian

    Changed the title of the thread from “Pi3B+ Frage zum Verhalten der GPIO-Ausgänge” to “Pi3B+ Frage zum Verhalten der GPIO-Pins”.
  • Naja, da sind die Eingänge halt recht empfindlich. Wenn über längere Kabel Signale von außen eigestreut werden oder das SIgnal auf einem Kabel sich auf die Kabel nebendran überträgt oder Impulse beim Berühren von Stromf+hrenden Teilen was auslösen...

    Hast du Pullups eingebaut oder per Software eingeschaltet?

    Hast du Strombegrenzungswiderstände vor den GPIO-Eingängen? Du solltest an jedem GPIO einen 1K Widerstand haben.

    (Die alleine nützen allerdings nur sehr begrenzt was.) Ein Zusätzlicher Kondensator macht daraus eine Hardware-Entprellung (RC-Glied / Tiefpassfilter). 10 µF sollten genügen.


    Enpfehlenswert ist bei Schaltungen mit langen Leitungen zu Türkontakten usw. die Kontakte/Leitungen mit einer höheren Spannung jeweils (mit Vorwiderstand) an einen Optokoppler zu führen und mit dem Ausgang des Optokopplers die GPIOs zu schalten.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Mein Schaltplan ist eine Erweiterung des im Anhang abgebildeten Plans.

    Ich zeige auch mal die Steuerplatine. Ist der "Drahtverhau" akzeptabel ? Im Endstadium verwende ich geschirmtes mehradriges Kabel für die Leitungen zu Sensoren und Motoren. Hier noch das Test-Skript:


    ()>

  • Den Code hab ich jetzt nicht durchgearbteitet - das ist mir zu lang.

    Aber ich vermute stark, dass du vor allem Probleme mit Störsignalen hast. Die bekommst du nur mit einer vernünftigen Entprellung in den Griff.

    Bei länger anliegenden Signalen ist softwareseitig ist die einfachste Methode, einfach im Falle eines Signals noch zweimal in kurzem Abstand (ein paar Millisekunden) nachzuschauen, ob das Signal noch da war. Wenn es ein Taster oder Türsensor ist, wird wohl keiner ein kürzeres Signal als 100 ms erzeugen. Ist das Signal nach ein paar ms wieder weg, war es wohl nur eine Störung.

    Richtig verlässlich bekommst du es mit Hardwareentprellung. Ich würde dir Raten, die Leitungen zu den Sensoren mit einer höheren Spannung zu versorgen (5V vom Pi oder ggf. sogar ein extra Netzteil mit 12 oder 24 Volt) und die Eingänge über Optokoppler zu führen. RC-Glieder kannst du an die GPIOs bauen oder vor die Optokoppler bauen oder ganz weglassen. Im ersten Fall bist du auf der Sichern Seite. In den anderen beiden Fällen kannst du versuchen, Störungen, die danach noch vielleicht auftreten, mit den Funktionen von GPIOZERO rausfiltern. Ich habe selbst mit GPIOZERO noch nicht gearbeitet - aber es bietet wohl deutlich komfortablere Features als die normalen GPIO-Funktionen.Meines Wissens kann man damit auch solche Störungen rausfiltern.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Danke, Gnom, dass Du Dir die Zeit für meine Problematik nimmst. Ich denke, dass das Test-Skript jetzt nicht so wichtig ist. Mit Sensoren meinst Du wohl die Reed-Kontakte. Sollte ich auch die Taster über Optokoppler führen ?

    Wäre es zu viel verlangt, wenn Du mir die Schaltung zeigst, die einen GPIO-Pin mit einem Sensor/Taster verbindet zusammen mit einer Empfehlung für den Koppler ?

    Eine 12V Quelle ist in Form eines Meanwell-Netzteils bereits vorhanden, welches über den Motortreiber die beiden Getriebemotore versorgt. Dessen 230V Versorgung wird aber erst bei einer erforderlichen Tür(Motor)-Bewegung über ein Solid State Relay zugeschaltet. Das mache ich, weil Türbewegungen recht selten (nur morgens und abends) erfolgen und das 12V-Netzteil nicht 7/24 an den 230V hängen soll. Deshalb würde ich für die Optokoppler-Lösung die 5 V vom Pi nehmen wollen.

  • Hallo!


    Ein verbreiteter Standard-Optokoppler ist der Typ 817. Es gibt ihn auch mit 4 Optokopplern in einem Gehäuse, dann heißt er 847. Googel mal nach Optokoppler 847 oder Optoppler 817.

    Ich würde auch die Taster über Optokoppler führen.

    Ein Kondensator kann die Entstörung übernehmen - etwas mehr als 22 µF geht auch - bis 100 µF (entspricht 100 ms bei 1 KOhm Widerstand). Du kannst es auch ohne Kondensator probieren, solltest dann aber ggf. noch softwareseitig Störungen abfangen.

    Du musst die internen Pullups per Software einschalten (oder noch externe mit 50-100 KOhm) an die GPIOs hängen - ich bevorzuge aber die internen).


    Und so müsste das aussehen:

    In deinem Schaltbild sind übrigens die Kondensatoren an der falschen Stelle - die sind wirkungslos. Wo hast du denn diesen Schaltplan her???

    Und außerdem wären die Kondensatoren zu klein - bei 1 KOhm-Widerstand sind 100 nF gerade mal 0,1 ms, das reicht nicht, um ein Störsignal oder ein Prellen rauszufiltern.

    Geschirmte Leitungen brauchst du nicht - das bringt nicht viel und kostet nur Geld. Mach ne saubere Entprellung, dann klappts.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited 5 times, last by Gnom ().

  • Hallo Gnom, ich bin Dir wirklich dankbar ! Noch dazu der Hinweis auf den fehlerhaften Schaltplan (Quelle). Den habe ich zugegebenermaßen nicht in allen Teilen hinterfragt. Da wird ja der Kondensator ohne Widerstand in einem Ruck entladen, womit es keine Entprellwirkung geben kann. Das macht sich bei meinen Tests auch bemerkbar.

    Die von Dir vorgeschlagene Zeitkonstante von 22 ms ist schon hoch. Da es bei meinem Thema nicht darauf ankommt, schnell nacheinander betätigte Taster zu unterstützen, gibt das aber mehr Sicherheit. Die zeitliche Verzögerung bis zum Start der vom Taster ausgelösten Funktion ist sicher vernachlässigbar. Ich werde dann aber auch softwaremäßig entprellen, was sowieso empfohlen wird.


    Der 4er Optokoppler wäre für mich passend, da ich 4 Taster und 4 Reeds verwenden möchte. Den kann ich gleich im Neu-Design der Platine vorsehen.

  • 22 ms ist doch nichts... bis die Tür auch nur einen Spalt offen ist oder der Finger wieder vom Taster ist, sind die um. Ein schlechter Taster oder Kontakt kann aber schon mal weit über 20 ms prellen. Insofern kannst du ruhig höher gehen mit dem Kondensator. 100 ms - 1/10 Sekunde... das merkt kein Mensch.

    Viel Erfolg!

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Also, ich kenn ja deine Einkommensverhältnisse nicht... aber ich finde 27 Cent für einen Tantalkondensator oder notfalls 4 Cent für einen Elko nicht so extrem teuer...


    Du kannst aber auch die Widerstände größer machen und kleinere Kondensatoren nehmen. Aber preislich gibt sich das doch nicht so extrem viel.

    Dann solltest du aber externe Pullups nehmen und die Anordnung ändern.

    - Statt des 1 KOhm am GPIO kannst du auch 100 KOhm nehmen.

    - Also Kondensator reichen dann 0,22 µF = 220 nF.

    - Der Pullup muss dann aber links am Widerstand anschließen und auf 3,3 V gehen. Der Widerstand sollte deutlich kleiner sein, als der erste. Ich würde 5-10 KOhm nehmen.


    Bei dieser Anordnung erfolgt das Entladen über 100 KOhm, das Laden über 105-110 KOhm - als beides ungefähr gleich schnell. Das hat grundsätzlich den Vorteil, dass bei steigenden und fallenden Signalen die Entprellzeiten etwa gleich sind.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • 1 mF ist vielleicht etwas viel. 1 Sekunde Reaktionszeit auf Tastendrücke... aber du kannst es ja mal probieren.

    Aber etwas kleinere Elkos solltest du auch auf vielen Platinen finden.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Der Code sieht hart zusammenkopiert aus.


    Du initialisierst deine LEDs Rot, Grün und Gelb alle am GPIO-Pin 4.

    Du importierst auf einem anderen Modul die Konstanten.

    Kann man machen, aber der * import müllt den Modul-Namespace voll.


    Dann fällt noch auf, dass du zwei Quelldateien in eine kopiert hast.

    Letztendlich kann der Code nicht oder nur schlecht funktionieren, da du in Zeile 273 eine busy-loop machst.


    Code
    try:
        while True:
            pass
    ...


    Der Code sollte sogar das Auslösen der Callbacks verhindern oder sehr stark verzögern. Python nutzt zwar POSIX Threads unter Linux, ist aber der Definition nach Singlethreaded. Es kann nur ein Python-Statement gleichzeitig ausgeführt werden. Die busy-loop arbeitet die ganze Zeit gegen die Callbacks.


    Entweder nutzt du signal.pause() oder du packst ein time.sleep(1) in die loop.

  • Bevor ich meine Platine neu implementiere noch ein Versuch, sie zu retten. Der Test von Gnoms Vorschlag in #6 stünde ebenfalls noch an.

    Nachdem inzwischen das Steuerungskript fertig ist (und gut funktioniert) bleibt leider immer noch das Phänomen bestehen, dass einige Pins für mich unerklärliche Effekte zeigen. Besonders wichtig sind für mich die Reed-Kontakte wegen ihrer Steuerungsfunktion für die Türen. Den Schaltplan kann man sich hier im Beitrag #30 anschauen (enthält noch Fehler, die aber mit meinem Problem nichts zu tun haben).

    Ich ändere gerade versuchshalber die Pin-Zuordnung, im ersten Versuch mit einer Verschlimmbesserung. Der Reed-U1 an Pin 3 reagiert überhaupt nicht. Die Durchmessung zeigt aber, dass er korrekt angeschlossen ist und bei Annäherung eines Magneten schließt. Mir ist klar, dass die Situation von außen schwer einzuschätzen ist. Ich versuche, mich schrittweise voran zu tasten. Im Moment habe ich folgende Frage:

    Müssen die I2C-Pins für gpiozero besonders konfiguriert werden ?

    Sorry, hatte ich hier schon mal nachgefragt.

  • Da ich jetzt den Pi über einen Stepdown Wandler versorge, habe ich bei dem versuchshalber die Spannung auf 5,2 V erhöht. Und siehe da, jetzt reagieren die Reed-Pins "vernünftig". Da ich die Befürchtung habe, dass es im Betrieb der Anlage zu Spannungsschwankungen kommen kann, stellt sich mir die Frage, wie die Pegel der Pins besser stabilisiert werden können. Vielleicht kann sich Gnom nochmal melden und seinen Vorschlag von #6 diesbezüglich gegebenenfalls bekräftigen.

    Wie weit dürfte ich die Spannung (Pi 3B+) denn hochdrehen ?