Problem mit GPIO Ansteuerung

  • Hallo Forum,


    ich habe angefangen etwas mit den GPIOs zu experimentieren und scheitere schon an grundlegendem :-(.


    Was will ich tun:

    Ich möchte gerne mit Python ein ganz simples "Programm", bei dem einer der GPIOs zum Eingang wird und wenn das eine Spannung drauf kommt (Taster) er mir "Hallo" schreibt oder ähnliches.


    Zur Kontrolle habe ich folgendes geschrieben:


    -----------------------------------------

    import RPi.GPIO as GPIO


    pin = 17


    GPIO.setmode(GPIO.BCM)

    GPIO.setup (pin,GPIO.IN)


    while True:

    if GPIO.input(pin) == GPIO.HIGH:

    print("INPUT")

    else:

    print("KEIN INPUT")


    -----------------------------------------


    Nun starte ich das Programm und er zeigt ständig "KEIN INPUT" an, was richtig ist.

    Sobald ich nun aber ein Kabel an den Input anschließen und sonst nichts, springt er schon zwischen INPUT und KEIN INPUT hin und her ohne erkennbares Muster.

    Wollte eig. das Kabel kurz an Pin1 dranhalten um das ganze zu testen, verzweifle aber schon jetzt. Ich gehe davon ich habe irgendwo einen kleinen Denkfehler und freue mich auf eure Hilfe



    Danke

  • Wenn der EIngang einfahc offen ist, nur mit einem Kabel dran, dann weiß er nicht so genau, ob er high oder low ist und kann zwischen beidem hin und her springen. Da reicht schon etwas statische Aufladung oder ein bisschen Elektromagentische Welle im Raum und schon sprint das hin und her. Deshalb verbindest du den Pin mit einem großen Widerstand (10-50 KOhm) mit 3,3 V oder mit GND (0 Volt), damit er weiß, was er registrieren soll, wenn kein definiertes Signal anliegt. Das geht intern, indem du es per Software einstellst. Such mal nach Pullup oder Pulldown.

    Wenn du einen Pullup (also Widerstand zu 3,3 V) benutzt, schlatest du den EIngang, indem du ihn mit GND verbindest. Andersrum, wenn du einen Pulldown (Widerstand zu GND) benutzt, dann schaltest du das Signal, indem du den Eingang mit 3,3 V verbindest.

    Zwischen den Pin und den Taster sollte zur Sicherheit noch ein Widerstand mit 1000 Ohm.


    Du findest das alles aber in jeder beliebigen Anleitung für Grundlagen zu GPIOs. Mach dich mal schlau in entsprechenden Yutube-Videos oder Tutorials.

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

  • Peltrax Wenn Du gerade anfängst, solltest Du vielleicht auch gleich mit `gpiozero` statt `RPi.GPIO` anfangen. Das ist eine neuere Bibliothek mit einer besseren API und besserer Dokumentation.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Hallo Peltrax,


    willkommen im Forum! ;)


    Eins vorab:

    bei dem einer der GPIOs zum Eingang wird und wenn das eine Spannung drauf kommt

    Geschaltet wird grundsätzlich (bestenfalls) gegen GND um somit bei einem eventuellen Faselfehler Magischen Rauch zu vermeiden! :angel:


    gpiozero ist, wie bereits genannt, das bessere Mittel der Wahl. Ein Beispiel mit Bild, angelehnt an Dein Vorhaben findest Du hier: https://gpiozero.readthedocs.i…table/recipes.html#button.

    Bei gpiozero wird per default die BCM/GPIO-Nummerierung verwendet, aber die hast Du ja in Deinem Entwurf auch ausgewählt und somit dürfte Dir klar sein, welcher Pin welche GPIO-Nummer hat. Um sicherheitshalber nochmals nachzusehen verwende ich persönlich https://pinout.xyz, weil das schön übersichtlich dargestellt und klickbar ist.


    Wissenswertes über die GPIO findest Du z.B.

    hier: https://www.elektronik-kompend…/raspberry-pi/2006031.htm,

    hier: https://www.elektronik-kompend…/raspberry-pi/1907101.htm

    und hier: https://www.elektronik-kompend…/raspberry-pi/2002191.htm und deren weiterführende Links.

  • Hier ist Doku zu den Eingängen: raspberry-gpio-python/wiki/Inputs/


    Der Parameter pull_up_down legt fest, ob der interne Widerstand gegen Masse oder 3.3V geschaltet ist.

    Ohne diese Angabe und ohne externe Widerstände hat der Eingang keinen definierten Zustand.

    Es können z.B. kapazitive Änderungen (durch die Hand) entstehen und dann hat man irgendwelche Zustände.


    gpiozero nutzt den RPi.GPIO als Backend. Standardmäßig wird z.B. gpiozero.Button ohne Angabe als pud_up konfiguriert, also gegen 3.3V gezogen. Korrigiert mich, falls es doch andersherum ist.


    Die externen Widerstände sollte man am besten immer nutzen, auch wenn es fehlerfrei ohne geht.

    Ob man die internen Widerstände zusätzlich über die Konfiguration beschaltet, ist Geschmackssache.