Hoch- und runterfahren mittels Taster (incl. Status-LED)

  • Spontan fällt mir keine andere einfache Lösung ein, sorry.
    Ich kann das Problem auch nicht wirklich nachvollziehen. Denn egal ob ich den Mikroschalter einer Maus benutze oder den billigsten Drucktaster für 19 Cent von reichelt, um den Start zu versauen muss ich das schon provozieren. Und ich habe schon einige dieser kleinen Schaltungen eingebaut. Von daher wirst du wohl leider damit leben müssen, oder ein anderer hier im Forum hat noch eine gute Idee.

  • Hoch- und runterfahren mittels Taster (incl. Status-LED)? Schau mal ob du hier fündig wirst!

  • ich hab jetzt den ganzen thread nach "öffner" durchsucht.. nichts gefunden.. da ich grad zu faul bin mir den ganzen thread mit 10 seiten durchzulesen ob die frage schon kam..

    (auf die schaltung auf der ersten seite bezogen)
    warum einen schließer-taster und dann permanent bis zur betätigung strom durch den pullup-widerstand fließen lassen, statt einfach einen öffner-taster zu nehmen und nur dann strom fließen haben, wenn man den taster drückt?
    ja, ich weiß.. diese paar mA machen in einem Jahr gerade mal 0,3 cent auf der Rechnung aus.. ist eher eine Prinzipienfrage..

  • Ganz einfach: dadurch kann hoch- und runterfahren mit nur einem Taster bewerkstelligt werden. Und da der Eingang vom Pi sehr hochohmig ist und auch noch der Pull-up in Reihe davor sitzt, fließt deutlich weniger als ein mA. Angenommen, der Eingang hat 1MOhm (was jetzt willkürlich aus der Luft gegriffen ist), fließen dort ca. 3 µA. Da muss der Pi lange für an sein, bis sich der Stromzähler einmal gedreht hat :)

    (edit: etwas verständlicher formuliert)

    Einmal editiert, zuletzt von Kernkrank (14. November 2014 um 21:10)

  • Hallo,

    erstmal vielen Dank für das Tutorial -- funktioniert bei mir am RPi B prächtig.

    Nun hab ich die LED mal an Pin#3 statt #7 gehängt. Script geändert. Funktioniert.

    Aber: die LED glimmt weiter, wenn sie aus sein sollte.
    Also hab ich mal gemessen. Es liegen (mit grüner LED und 100 Ohm Vorwiderstand) noch 1,9V zwischen
    Pin#3 und GND. Nehme ich die LED weg (also ohne Last), dann sind es sogar 3,3V also eigentlich HIGH. Die Spannung bricht aber ein, wenn LED und Widerstand dran sind. Im LOW-Zustand fließen dann immer noch 0,8 mA über die LED, deshalb geht sie nicht ganz aus. Ist das so gewollt/normal oder hab ich da einen Defekt im Board? Pin#7 zeigt dieses Verhalten nicht, sondern benimmt sicvh wie erwartet.

    Viele Grüße,
    orlo11

  • Hi orlo11,

    Hört sich für mich nach aktivierten Pullup-Widerständen am I2C Bus an. Die LED wird vermutlich über diesen fröhlich mit Strom versorgt. :)

    Gib mal folgenden Befehl ein:

    Code
    gpio readall


    Steht jetzt bei SDA(bzw SCL) als Mode ALT0, wurde soweit ich weiß das I2C Modul beim Systemstart geladen. Dabei wurden auch gleich die beiden Pullups aktiviert welche für die I2C kommunikation nötig sind.
    Der Wert(Value) des Pins müsste bei dir also High sein, - was dann auch erklärt wieso die LED leuchtet.

    Versuch mal den Pin z.b. explizit als Ausgang zu definieren bevor du ihn verwendest:

    Code
    gpio mode 8 out


    Dann wieder mit gpio readall überprüfen.
    Jetzt müsste beim Pin 3(wiringPi pin 8) Mode auf OUT stehen und die LED aus sein.

    Grüße,
    Joh

    DON'T PANIC!

  • Hallo,

    ich bin neu, habe bisher keine Ahnung vom Raspberry, aber zum erzeugen kurzer Impulse mit Taster und Kondensator kann ich etwas sagen.


    Ich habe mich zwar nie näher mit Piepers Lösung beschäftigt, aber es klingt nach einem simplen Entpreller via Elko (Elektrolytkondensator). Ist kein Hexenwerk, du brauchst nur dieses eine Bauteil parallel zum Taster einbauen:

    "Entprellt" werden kurze Impulse/Tastenprellen unterdrückt und lange Impulse durchgelassen.

    Das Problem des Hängenbleiben bei langem Tastendruck erfordert meiner Meinung nach, dass bei einem Tastendruck der GPIO Pin nur kurz "0" geht und danach auf "1" zurückkehrt, auch wenn der Taster weiterhin gedrückt bleibt. Daher müssten lange Impulse unterdrückt und kurze durchgelassen werden.


    Erreichen kann man das, wenn man einen Kondensator in Reihe mit dem Schalter schaltet.

    also:
    3V3 ---- R_pullup ---[GPIO-Pin]----- Kondensator ------- Taster ------- 0V

    Funktionsweise:

    Taster nicht gedrückt:
    Der Kondensator ist ungeladen U_C = 0V. (Sollte er es nicht sein, entlädt er sich in diesem Zustand über seinen internen Verlustwiderstand, bis Vorstehendes der Fall ist.) Am GPIO Pin liegt über R_pullup 3,3 Volt an.

    Taster wird gedrückt:
    Der Kondensator zieht dabei den GPIO-Pin nach 0V.
    Damit fließt über R_pullup ein Strom, der den Kondensator langsam auflädt. Die Spannung eines Kondensators ist proportional zu seiner Ladung. U_C steigt also an und damit auch wieder die Spannung am GPIO-Pin. Der Strom über R_pullup sinkt dabei kontinuierlich. Das ganze kommt zur Ruhe, wenn der Kondensator auf 3,3V aufgeladen ist und über den R_pullup somit kein weiterer Ladestrom fließt.

    Taster wird losgelassen:
    Der Kondensator ist geladen, ein Pin liegt am GPIO Pin auf 3,3V und der andere Kondensator Pin am Schalter buchstäblich in der Luft. Was passiert ? nix, außer das der Kondensator sich langsam über seinen Verlustwiderstand entlädt und das Spiel van neuem beginnen kann.

    Man beachte, ein "idealer" Kondensator wäre hier echt fehl am Platz. Mit dem würde es einmal und nie wieder funktionieren.

    Die genaue Zeit für wie lange der GPIO Pin bei einer bestimmten Widerstand-Kondensator Kombination als "0" erkannt wird hängt von den Schaltschwellen der verwendeten Technik ab. Als Faustformel kann man von aber von von

    t ~= 1...2 * R * C

    ausgehen.

    Mit den 100k und 4.7µF aus der Entprellschaltung ergibt sich eine Zeit von
    t~= 1...2 * 100E3 * 4.7E-6 ~= 0.5 ... 1s


    Ich hoffe meine Erklärung ist verständlich und der Versuch auch die 'Funktionsweise' zu erklären sprengt nicht den Rahmen.

    Grüße
    Werner

    Ergänzung:
    Taster wird gedückt, aber Kondensator hat noch Restladung (U_C > 0):
    Ist der Kondensator beim erneuten Betätigen der Taste noch nicht wieder entladen, verkürzt sich die "0" Zeit entsprechend der Restladung. Sollte die Kondensatorspannung noch größer als die Schaltschwelle für Low-Pegel sein, reagiert der GPIO Pin überhaupt nicht.

  • Hallo Werner,

    danke, jetzt wird´s spannend. Toll erklärt, ich bilde mir sogar ein, es verstanden zu haben.

    Deine Idee klappt beim Hochfahren hervorragend:
    Anders als in Deiner Überschlagsrechnung angenommen, hat der Pullup nur 10k, aber wenn ich es richtig sehe, verkürzt gerade das den Impuls auf den notwendigen Wert: 0,5 - 1 s wären noch zu lang, aber mit 0,05 - 0,1 s funktioniert es.

    Allerdings kommt jetzt das nächste Problem:
    Der Raspberry erkennt den Tastendruck zum Herunterfahren nicht mehr, weil der Kondensator der direkten Verbindung von Pin 5 (GPIO-3) und Pin 6 (GND) "im Weg steht" - ich muss es so Laienhaft ausdrücken. Das ist unabhängig davon, ob der Kondensator geladen ist oder nicht. Nur wenn ich ihn während des Tastendrucks überbrücke, fährt der Raspberry herunter - klar, ist dann ja auch so, wie in der ursprünglichen Schaltung vorgesehen.

    Natürlich könnte ich das jetzt mit einem weiteren Taster lösen, aber das schöne an Kernkranks Schaltung/Skript war ja, dass das alles mit nur einem Taster funktioniert.

    Hast Du auch hierzu einen Lösungsvorschlag?

    Ansonsten trotzdem danke, hab wieder was gelernt!

    Gruß
    Sumpfnudel

  • Hallo Sumpfnu... (nee so heißt Du nicht wirklich),

    dem Runterfahren können 2 Dinge im Wege stehen.

    • mangelnde Geduld: wie beschrieben der Kondensator muss sich für einen 2ten Versuch erst wieder entladen und das macht er bisher nur über seinen internen Verlustwiderstand.
      Abhilfe hier: man schaltet dem Kondensator einen Widerstand parallel. Ohne groß zu rechnen würde ich 10 * R_pullup wählen.
    • die Impulszeit ist für den im Phyton Script gewählten Ablauf zu kurz.
      Ich hab von Phyton noch weniger Ahnung als vom Raspberry, aber Phyton scheint recht gut lesbar. Ich verstehe das Skript so, das es guckt ob der GPIO Pin "0" ist.
      - wenn ja, dann blinken und runter fahren.
      - wenn nein, dann 0.5s warten und wieder nach oben, schauen ob ...

      Angenommen der Impuls ist 0.05s lang, dann hast Du eine 9:1 Chance, dass der Impuls beim erreichen der Pin-Abfrage bereits wieder vorbei ist. Sprich es nicht funktioniert.
      Sofort neu drücken geht auch nicht wegen 1.

    Ich würde den Impuls daher nur so kurz machen, dass das Hängenbleiben gerade noch sicher ausbleibt. Parallel dazu würde ich den Kondensator 'schlechter' machen, sprich einen Entladewiderstand parallel schalten.

    Reicht das nicht, dann ggf. die Wait-Zeit im Script verkürzen, was aber die Prozessorlast erhöht.


    Ich hab den Thread jetzt doch mal ganz gelesen.
    Es wird einmal davon gesprochen, dass der Raspberry sich aufhängt, und dann wieder, dass er durch einen zu langes low am GPIO Pin in einen Safe-Mode geht. Der Safe Mode müsste ja irgendwo dokumentiert sein und somit auch das Timing, dass den Pi dort hin bringt.
    So wie ich die Infos zum Safe-Mode hier verstehe, hier ist er nicht überall vorhanden, und wenn er vorhanden ist, kann er konfiguriert werden.

    Das würde zumindest erklären, warum einige Probleme haben und andere nicht.

    Grüße
    Werner

  • Hallo Werner,

    nein, ich heiße nicht wirklich Sumpfnudel. :D Das kommt aus "Sophies Welt" und war dort ein Schimpfwort, das mir gefiel und von dort hängen geblieben war... tolles Buch übrigens.

    Du hast mich auf die richtige Lösung gebracht - und das ganz ohne Elektronik.

    Zunächst mal: Du hast Recht, ich hatte übersehen, dass der Schaltimpuls natürlich auch beim herunterfahren verkürzt ist und dadurch vom Phyton-Skript nicht erkannt wird.

    Der für mich entscheidende Tipp war Dein Link. In der config.txt konnte ich den Safe-Mode unterdrücken (avoid_safe_mode=1) und nun tut mein Mediaplayer genau das, was er soll.
    Egal, wie lang ich den Taster drücke, er fährt hoch; das Herunterfahren klappte ja sowieso immer.

    Einen Herzlichen Dank an Dich für Deine Mühe und an Kernkrank, für seine tolle Lösung zur Eintastenbedienung des Raspberry, die für mich so jetzt das Optimum darstellt.

    Schön dass in diesem Forum auch bei einfachen Fragen Unwissenden so freundlich geholfen wird.

    Es grüßt Euch freundlich
    Christoph

  • Hallo Joh,

    aus Deiner letzten Äußerung schließe ich, dass ich erst wiring-pi installieren muss, um Deinen Vorschlag umzusetzen?

    Code
    gpio readall


    hatte ich schon probiert, es kam aber nur die übliche Meldung, wenn ein Programm nicht installiert ist.
    Im Script wird ja Pin#3 per Python auf "OUT" gesetzt. Reicht das nicht? Greift wiring woanders ein?

    Vielen Dank für Deine Antwort und viele Grüße,
    orlo11.

  • weju Ich hatte das so aufgezeichnet wie ich die Idee von Pieper verstanden hatte. Deine Lösung ist übrigens super erklärt. Genau so hatte ich das in meiner ursprünglichen Planung auch angedacht, aber dann aus mehreren Gründen wieder verworfen. Die Schaltung sollte so einfach wie möglich sein und auch von absoluten E-Laien in ihrer Funktion verstanden werden können. Als ich im Praxistest merkte, dass man den Safemode bequem vermeiden kann, empfand ich den Kondensator einfach für nicht mehr nötig. Außerdem wollte ich genau das Problem vermeiden, auf das Sumpfnudel gestoßen ist. Die Schleifenzeit kann im Script zwar beliebig verkürzt werden, allerdings stieg beim herantasten ab 0,4s die Prozessorlast im Ruhezustand an.

    Dein Tipp mit der config.txt ist aber klasse, werde ich in das Tut mit aufnehmen. Danke dafür!

  • Hallo Sumpf... ä Christoph


    Der für mich entscheidende Tipp war Dein Link. In der config.txt konnte ich den Safe-Mode unterdrücken (avoid_safe_mode=1) und nun tut mein Mediaplayer genau das, was er soll.
    Egal, wie lang ich den Taster drücke, er fährt hoch; das Herunterfahren klappte ja sowieso immer.

    Genau das klappt bei mir leider nicht. Mein RPi schert sich nicht um den avoid Eintrag. Egal ob 1 oder 0, er hängt sich bei einem langen Impuls mit der "sh: can't access tty; job control turned off" Medung auf.

    Könnte ein Problem ab Noobs V1.3.x zu sein. Jedenfalls findet sich auf rpi.org eine entsprechende [url=http://www.raspberrypi.org/forums/viewtopic.php?f=66&t=66749%29,]Anfrage[/url].


    Kernkrank
    Der Kondensator ist ja auch unnötig, bzw. nötig ist er nur, wenn man einen Workaround braucht, weil man den safe_mode Mechanismus nicht abschalten kann oder will. Die Idee mit einem Jumper ein Notfall-System booten zu können hat ja was.


    Schön dass ich mit ein bisschen Schaltungstechnik helfen konnte. Ich werde Euch mit meinen Fragen sicher noch Nerven kosten. Der avoid_safe_mode Eintrag war ein Zufalls-Fund, weil ich hier und da Nachschlagen musste, was sich hinter diversen Begriffen, Befehlen & Funktionen verbirgt.

    Grüße
    Werner

  • Hallo Werner,

    ohne viel Ahnung zu haben las ich hier schon mehrfach von Problemen mit NOOBS im Zusammenhang mit der config.txt.
    Wenn Du nicht ständig zwischen verschiedenen Betriebssystemen wechseln musst, würde ich es mal ohne diesen Installations-Manager probieren.
    Kost ja nix und könnte helfen.

    Gruß
    Christoph

  • Hallo,

    ich hab noch eine Anregung.
    Mittels
    GPIO.wait_for_edge(5, GPIO.FALLING)
    statt
    if not (GPIO.input(5)):
    kann man auf die fallende Flanke warten, ohne PIN.5 zyklisch abfragen zu müssen.
    Wer NOOBs nutzt und daher auf einen kurzen Einschalt-Impuls angewiesen ist, der kann so den Kondensator in REIHE mit dem Taster nutzen und trotzdem zuverlässig ausschalten.

    Grüße
    Werner

  • Ich glaub die Nutzung von Interrupt wurde hier in diesem Thread schon mal vorgeschlagen. Siehe dazu Beitrag #91 und die Antwort darauf in Beitrag#93 :fies:

  • Hallo Meigrafd,

    ich bin mir gar nicht sicher, dass GPIO.wait_for_edge(..) per interrupt arbeitet.
    Und wenn muss man sich weder um Aufruf noch um die die Interrupt Routine kümmern.

    Einfaches ersetzen der "if not" Abfrage und entfernen der Schleife in Kernkranks Script reicht.
    Das ist so einfach, dass selbst ich es einbauen konnte. :huh:

    Die Interrupt Lösung aus #91 überfordert meine Python Kenntnisse dagegen noch bei weitem.

    Grüße
    Werner

    Einmal editiert, zuletzt von weju (2. Dezember 2014 um 07:57)

  • Bei mir will es auch partu nicht mit raspbmc klappen. alles soweit installiert, an funktioniert auch ohne probleme, nur aus will partu nicht reagieren. gebastelt hat der schalter nen kollege angeblich 1:1 nach der anleitung hier. woran kanns den liegen / wie kann ich das bugfixen. bin ein schlimmer linux noob.

Jetzt mitmachen!

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