if von GPIO wird nicht ausgeführt

  • 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?

  • Hallo,

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

    Bernd

    Ich bin zwar Softwareingenieur aber ich schreibe mein erstes Programm mit Python.

    Sonst verwende ich Step-7, SCL oder Codesys.

  • In Python sind Einrückungen essentiell. Diese gehen verloren, wenn der Code nicht in einem Codeblock steht.


    //Edit Mal wieder zu langsam..

    "Alles, was wir sind, ist Sand im Wind, Hoschi."

  • [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

  • 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... ;)

    "Alles, was wir sind, ist Sand im Wind, Hoschi."

  • Das ist der gesamte Code. Ich habe mit print nur die Variablen ausgeben wollen.

    Das Programm läuft ja, nur die drei Eingangssignale erkennt er nicht.

    Im Geany starte ich das Programm. Mit "r" = run wird die Funktion gestartet.

  • 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