Taster am PIN 3 & 5 gibt immer 1 aus

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Morgen,

    ich finde mich seit kurzem in die elektronische Welt mit dem RasPi ein und stoße gerade auf mein erstes Problem:

    Eines der beliebtesten Projekte (für Neulinge) ist wohl das Webradio. Auch ich bastel mir so ein Dingen zusammen und grundsätzlich läuft die ganze Sache mit MPD, LCD und den Buttons zum Verstellen der Sender ganz rund.
    Um das volle Potential des Pi auszunutzen kam mir die Idee alle verfügbaren GPIOs mit einem Taster zu versehen um dann via Python die verschiedensten Aktionen auszulösen. (Von Lautstärke rauf, runter, Pause, Sender vor- und zurück, Playlist wechsel, LCD scrolling schneller, langsamer, versch. Anzeigen auf dem LCD). Kurzum: Training im Hardwarebasteln und Pythonprogrammierung.

    Der Aufbau mit dem Pi Model A (der Kleine, ohne Netzwerk) erfolgte anhand bekannter Anleitungen aus dem Netz. Das 16x2 LCD Display habe ich an die untere Reihe des Pi's angeschlossen (nach dieser Anleitung). Somit sind die GPIOs 18, 23,24,25,8 & 7 schon mal belegt.

    Die verbliebenen 11 wollte ich wie bereits erwähnt mit Tastern bestücken. Alle Taster werden vom PIN 1 mit 3.3 V versorgt und haben jeweils einen 10K Widerstand zum GND und natürlich die Datenleitung zum GPIO.

    Frage ich den Status der Taster mit einem einfachen Python Programm ab so erhalte ich bei 9 GPIOs eine korrekte Anzeige wann der Taster gedrückt ist und wann nicht. Nur bei GPIO02 und GPIO03 (PIN 3 & 5) klappt es nicht, diese stehen dauerhaft auf "1" und reagieren nicht auf den Taster.

    Ich hangel mich bereits seit Stunden durch das Netz und finde dazu einfach keine Lösung.
    Diese beiden Pins scheinen irgendwie "anders" zu sein als die anderen und verlangen offenbar "anders" angesprochen zu werden, nur weiß ich nicht wie...

    Über GPIO readall sehe ich, das diese PINs auf HIGH geschaltet sind:

    Versuche ich diese mit GPIO write 8 0 auf Low umzustellen gibt es keine Änderung.

    Während ich diesen Text verfasste habe ich noch etwas rumprobiert und festgestellt, das die PINs 3 & 5 doch zu einer Reaktion zu bewegen sind: Ich habe quasi aus einem Akt der Verzweifelung den Mode auf "OUT" gestellt und siehe da - das Python Skript gibt den korrekten Wert aus.

    Jetzt bin ich vollends verwirrt... und über meinem Kopf steht ein großes Fragezeichen!

    Warum verhalten sich GPIO2 & 3 anders als alle anderen?
    Gibt es einen Weg diese PINs auch mit GPIO.IN funktionieren?

    ...und sollte das nicht funktionieren: Wäre es ein Problem die PINs mit den Taster über GPIO.OUT dauerhaft anzusprechen (Schließlich möchte man dem Pi ja nicht schaden...)?

    Es wäre sehr nett wenn mir das jemand erklären könnte oder weiß wo im großen weiten Netz dieser Umstand bereits erklärt wurde.

  • Bei Pin 3 und 5 sitzen PullUp-Widerstände mit 1,8Kiloohm für den I2C-Bus mit auf der Platine.
    Du kannst die auch normal als Input benutzen, solltest dann aber gegen Masse schalten. Dann bekommst Du bei geschlossenem Schalte eine 0 und hast normal eine 1 an dem Pin.

  • Vielen Dank für die schnelle Antwort Orb!

    Wenn ich - als blutiger Anfänger - das richtig verstehe bringen diese Pins ihre Widerstände bereits mit und somit kann ich dort meine 10K Ohm Widerstände weglassen - bzw. die 10K Widerstände stören sich mit den bereits vorhanden.

    Somit wäre es korrekt den Taster auf der einen Seite mit den 3.3V zu versorgen und auf der Gegenseite nur das Datenkabel und eine Verbindung zum GND zu legen?


  • Wenn ich - als blutiger Anfänger - das richtig verstehe bringen diese Pins ihre Widerstände bereits mit und somit kann ich dort meine 10K Ohm Widerstände weglassen - bzw. die 10K Widerstände stören sich mit den bereits vorhanden.

    die stören sich nicht nur machen deine 10k auch nix anderes als die vorhandenen 1,8k, also kann der 10k auch wegbleiben



    Somit wäre es korrekt den Taster auf der einen Seite mit den 3.3V zu versorgen und auf der Gegenseite nur das Datenkabel und eine Verbindung zum GND zu legen?

    nö, wie orb meinte nach GND schalten, das heisst der Taster kommt zwischen GND und GPIO
    (zu 3,3V sitzt doch schon der Widerstand deswegen siehst du immer 1 ! mehr 1 geht 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)

    Einmal editiert, zuletzt von jar (6. September 2013 um 12:15)

  • Danke, Jar für die Erklärung! Ein kleines Licht ist mir nun aufgegangen! :)

    Der Taster sitzt nun zwischen GND und GPIO und reagiert auf den Taster. Den Widerstand musste ich jedoch entfernen, denn mit ihm tat sich gar nichts.

    Bleibt nun noch das Problemchen mit dem HIGH.
    Die Pins wollen sich nicht auf LOW umschalten lassen und so beginnt der Abfragekreislauf immer mit der "1". Das ist unschön, da die anderen GPIOs allesamt mit der "0" beginnen und ich es vermeiden möchte für 2 PINs die Abfrageroutine umzustellen.

    Ich hatte versucht mit "os.system('gpio mode x down") die Pins 'umzudrehen' was jedoch nicht von Erfolg gekrönt wurde.

    Gibt es einen Weg dieses im Python Skript zu bewerkstelligen?


  • Danke, Jar für die Erklärung! Ein kleines Licht ist mir nun aufgegangen! :)

    Der Taster sitzt nun zwischen GND und GPIO und reagiert auf den Taster. Den Widerstand musste ich jedoch entfernen, denn mit ihm tat sich gar nichts.

    Bleibt nun noch das Problemchen mit dem HIGH.
    Die Pins wollen sich nicht auf LOW umschalten lassen und so beginnt der Abfragekreislauf immer mit der "1". Das ist unschön, da die anderen GPIOs allesamt mit der "0" beginnen und ich es vermeiden möchte für 2 PINs die Abfrageroutine umzustellen.

    Ich hatte versucht mit "os.system('gpio mode x down") die Pins 'umzudrehen' was jedoch nicht von Erfolg gekrönt wurde.

    Gibt es einen Weg dieses im Python Skript zu bewerkstelligen?


    du brauchst doch nur umdrehen ???

    ich habe keine Ahnung von python, denke aber so müssete es gehen

    statt:

    Code
    if input_value == True:
                    print "Taster gedrueckt"
            else:
                    print "Taster nicht gedrueckt"

    macht man eben:

    Code
    if input_value != True:
                    print "Taster gedrueckt"
            else:
                    print "Taster nicht gedrueckt"

    oder:

    Code
    if input_value == False:
                    print "Taster gedrueckt"
            else:
                    print "Taster nicht gedrueckt"

    aber orb meinte auch mal man könnte das definieren auf negative Logik, ein Weg wird es geben.

    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)

  • Du könntest Dir in Python XOR (logische Bitoperation, "exklusives ODER") ansehen.

    Sinngemäss (die Syntax in Python ist sicher anders, ich verwende kein Python):

    Du möchtest:
    Aus gelesener 0 wird 1 --> 0 XOR 1 = 1
    Aus gelesener 1 wird 0 --> 1 XOR 1 = 0

    Du codierst also sinngemäss:
    ReadValue = ReadValue XOR 1

    Gruß, mmi

  • Da hatte ich wohl zu unklar ausgedrückt, sorry dafür!

    Ich hatte ja geschrieben: "...da die anderen GPIOs allesamt mit der "0" beginnen und ich es vermeiden möchte für 2 PINs die Abfrageroutine umzustellen."

    Damit meinte ich, das es kein Problem ist auf Softwareseite die Abfrage für die PINs umzudrehen, das würde ich auch so lösen wie es jar beschrieben hat: Aus True wird False und umgekehrt. Es ist halt nicht so schön wenn 9 Routinen auf "True"/"0" abfragen und 2 hier aus der Reihe tanzen und über "False"/"1" zum Ziel kommen.


    Was ich suche wäre eine GPIO-Lösung!

    Irgendwie sollte man diesen kleinen störrischen PINs doch mitteilen können wie sie sich zu verhalten haben und das ist: Gib mir die "Null" bis der Taster gedrückt wird!

    Soweit ich das Verstehe erreicht man das indem der Pegel durch einen Befehl auch "Low" gesetzt wird, nur nehmen diese PINs den Zustand bei mir nicht an. (s.o.)
    Möglich das es gar nicht vorgesehen ist das man die PINs 3 & 5 in diesem Modus nutzen kann, denn ich habe im Netz recht vergeblich nach einer solchen Lösung gesucht.

    Vielleicht findet sich ja noch jemand der weiß, wie man die PINs 'umbiegen' kann, bis dahin bekommen die störrischen Diven halt eine Sonderbehandlung im Code und ich frage sie "umgekehrt" ab. ;)


  • Dreh doch alle um.
    Also Deine 10k gegen 3,3Volt und die Taster alle gegen GND. Dann sind sie einheitlich und auch störunanfälliger.

    ein sehr guter Vorschlag, ist IMHO immer die beste Lösung. :thumbs1:

    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)


  • Dreh doch alle um.
    Also Deine 10k gegen 3,3Volt und die Taster alle gegen GND. Dann sind sie einheitlich und auch störunanfälliger.

    Das klingt sehr logisch! Wieder etwas gelernt.

    Für dieses Projekt habe ich die 'Knöppe' jedoch schon fertig gelötet und in ein Gehäuse verfrachtet, war schon eine Fummelei die beiden Störenfriede wieder freizulegen und umzulöten. Aber für ein Projekt "Webradio 2.0" werde ich die Schaltung dann mal so wie Du sie beschrieben hast aufbauen.

    Ich werde mich jetzt erstmal auf die Python Programmierung stürzen - da gibt es ja auch noch viel zu tun.

    Ich danke allen die sich mit meinem Problem beschäftigt haben und drücke hier mal den "Erledigt" Knopf.

Jetzt mitmachen!

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