if von GPIO wird nicht ausgeführt

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Gemeinde,

    ich habe hier ein Python Programm welches nicht so läuft, wie ich es will.

    Eine Eisenbahn mit zwei Endschalter und 2 Vorabschalter für die Geschwindigkeitsreduzierung.

    GPIO.in(26) ist Endlage hinten

    GPIO.in(6) ist Endlage vorne

    GPIO.in (5) ist Umschaltung schnell / langsam

    Das Programm habe ich irgendwo abgekupfert und auf meine Bedürfnisse angepasst.

    Mit den Tasten S (stop), R (run), F (vorwärts), B (Rückwärts), L (langsam) M (mittel) und H (schnell)

    funktioniert es. Aber die Abschaltung bzw Umschaltung geht nicht.

    Das Programm:

    import RPi.GPIO as GPIO
    from time import sleep

    in1 = 17 #24
    in2 = 27 #23
    en = 22 #25
    SL = 5
    Stop_V = 6
    Stop_R = 26
    temp1=1

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(in1,GPIO.OUT)
    GPIO.setup(in2,GPIO.OUT)
    GPIO.setup(en,GPIO.OUT)
    GPIO.output(in1,GPIO.LOW)
    GPIO.output(in2,GPIO.LOW)
    GPIO.setup(6,GPIO.IN)
    GPIO.setup(26,GPIO.IN,pull_up_down = GPIO.PUD_DOWN)
    GPIO.setup(5,GPIO.IN,pull_up_down = GPIO.PUD_DOWN)
    p=GPIO.PWM(en,1000)
    p.start(25)
    print("\n")
    print("The default speed & direction of motor is LOW & Forward.....")
    print("r-run s-stop f-forward b-backward l-low m-medium h-high e-exit")
    print("\n")

    while(1):

    x=raw_input()

           
    if x=='r':
    print("run")
    if(temp1==1):
    GPIO.output(in1,GPIO.HIGH)
    GPIO.output(in2,GPIO.LOW)
    print("forward")
    x='z'

    else:
    GPIO.output(in1,GPIO.LOW)
    GPIO.output(in2,GPIO.HIGH)
    print("backward")
    x='z'


    if x=='s' or (GPIO.input(6) == GPIO.HIGH) or (GPIO.input(26) == GPIO.HIGH):
    print("stop")
    print (GPIO.input(6))
    print (GPIO.input(26))
    GPIO.output(in1,GPIO.LOW)
    GPIO.output(in2,GPIO.LOW)
    x='z'

    elif x=='f' and GPIO.input(6) == GPIO.LOW:
    print("forward")
    type (GPIO.input(6))
    GPIO.output(in1,GPIO.HIGH)
    GPIO.output(in2,GPIO.LOW)
    temp1=1
    x='z'


    elif x=='b' and (GPIO.input(26) == GPIO.LOW):
    print("backward")
    type (GPIO.input(26))
    GPIO.output(in1,GPIO.LOW)
    GPIO.output(in2,GPIO.HIGH)
    temp1=0
    x='z'

    elif x=='l' or (GPIO.input(5) == GPIO.HIGH):
    print("low")
    type (GPIO.input(5))
    p.ChangeDutyCycle(18)
    x='z'
           

    elif x=='m':
    print("medium")
    p.ChangeDutyCycle(30)
    x='z'
               
    elif x=='h':
    print("high")
    p.ChangeDutyCycle(50)
           
    x='z'

        
       
    elif x=='e':
    GPIO.cleanup()
    break
       

    Die Eingänge werden wohl zum falschen Zeitpunkt oder gar nicht gelesen.

    Hardwaremässig habe ich alles in Ordnung.

    Zu meinen Magnetschalter habe ich parallel Widerstände von 100M geschaltet.

    Wenn ich mit pigs die Eingänge auslese, kommen sie auch.

    Was ist falsch am Programm?

  • [Umgangsformen]

    der code soll nicht bewertet werden! Ich brauche eine Lösung.

    Es macht keinen guten Eindruck, wenn Du mit Deinem 2. Post im Forum Leute die Dir helfen wollen vor dem Kopf stößt.

    (Wenn Du länger dabei bist, weißt Du wie Foristen einzuschätzen sind (z.B. anhand ihrer Beiträge) und was Moderator bedeutet.)

    Wenn du dich angegriffen fühlst, frage doch erstmal nach, um Mißverständnisse auszuschließen.

    Beiträge im Forum, schreibt keiner gegen Geld oder aus Langeweile, sondern um z.B. Dir zu helfen. Du hast keinen Anspruch darauf.

    Auch ein Softwareingenieur kann was dazulernen.

    Genug gepredigt...

    [/Umgangsformen]

    Hintergrund von hyles Hinweis ist die Funktion von Tabs in python.

    bitte verwende den Code-Button (</>) hier im Editor!

    den </>-Button findest Du im schwarzen Balken über dem Eingabebereich.

    Schönen Gruß, kle

    Edit: auch zu langsam

  • Hallo nochmal,

    ich fühle mich nicht angegriffen!

    Ich bin seit mehr als 10 Jahren bei opensuse im Forum. Jedes Forum wird anders behandelt. Hier bin ich Neuling. Bitte habt etwas Geduld mit mir. Ich werde es noch lernen.

    Danke

  • Hallo,

    Zitat


    Aber die Abschaltung bzw Umschaltung geht nicht.

    Welcher Teil deines Codes soll das denn sein? Das ist IMHO für Außenstehende nicht wirklich zu erkennen...

    Zum Code:

    • Variablennamen dürfen aussagekräftig sein, kryptisch Abkürzungen und Variablennamen mit einem Buchstaben machen den Code schwer lesbar.
    • Das `x='z` ist sinnlos, weil a) wird `x` nirgendwo gegen z geprüft, b) wird es direkt wieder durch `x=raw_input()` überschriben.
    • `if GPIO.input(channel)==GPIO.HIGH:` kann man als `if GPIO.input(channnel):` schreiben - so ist es auch in der Doku erklärt.
      Generell solltest du das neuere / schönere / besser gpiozero Modul nutzen und nicht das ältere/veraltete RPI.GPIO Modul.

    Gruß, noisefloor

  • bei

    if x=="S" soll der Motor angehalten werden

    if x=="f" soll der Motor vorwärts drehen

    if x=="b" soll der Motor rückwärts laufen

    if x=="r" soll der Motor starten

    Hast du das Programm verstanden?

    Bis auf die "oder" Stop_v und Stop_r läuft das Programm. Nur eben diese drei oder ( SL steht für schnell/Langsam) geht es nicht, weil die Eingänge nicht erkannt werden. Darum benötige ich eure Hilfe

    Bernd

    • Offizieller Beitrag

    Sorry, aber ich steige da nicht durch... Einerseits verwendest Du print(), was auf Python3 hindeutet, andererseits aber auch raw_input(), dass es imho in Python3 nicht mehr gibt. Mit welchem Befehl genau rufst Du das Script auf? :conf:

    Dann definierst Du ein paar GPIO als input, ohne uns die callbacks oder what ever der Variable x einen Wert zuweist zu zeigen. :denker:

    Das wird so nichts! Zeige bitte den ganzen Code und da Du ja erst seit kurzem dabei bist, lies auch mal das hier: Wie Frage ich nach Hilfe? zum Verständnis für unser gemecker... ;)

  • Hallo,

    was heißt denn "werden nicht erkannt"? Das die Pins 5, 6, 26 nicht als HIGH oder LOW erkannt werden? Woran machst du fest, dass sie nicht erkannt werden? Wenn deine `elif` Zweige nicht betreten werden, ist das ein Indiz, aber kein Beweis. Mir ist auch immer noch nicht klar, welche `elif` Zweige bei dir nie betreten werden. In Post #11 hast du `if` Anweisungen gepostet, die gar nicht in deinem Code vorkommen, jedenfalls nicht in dem aus Post #6.

    Außerdem kann das ja auch ein Fehler in deiner Schaltung sein. Poste die doch mal bzw. den Schaltplan oder ein mit Fritzing erstelltest Bild.

    Gruß, noisefloor

Jetzt mitmachen!

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