Python Script mit Taster starten und stoppen

  • Hallo Zusammen,

    kennt jemand von Euch ne Möglichkeit wie ich über ein GPIO Pin nen Taster anschließen kann der ein laufenden Python Script pausiert und dabei die GPIOs resetet und mit nem 2. Taster das script wieder vollständig startet?

    Zum Fall selber, ich hab ein Roboter gebaut und für die Autonome Steuerung ein Python Script geschrieben. Ich habe an 2 Pins 11 und 9 setmode(GPIO.BCM) je einen Taster angeschlossen.
    Ich möchte damit erreichen das wenn der Roboter aktiv ist und ich den Taster drücke das der auf damit auf Pause gesetzt wird. So das auch die Motoren, die über die anderen GPIOs gesteuert werden angehalten werden. Mit dem zweiten Taster möchte ich dann das Script wieder weiterlaufen lassen.

    Hat da jemand eine Idee wie man das realisieren kann ?

    MFG

    Zappelmann

  • Supi Danke ich werde es mir durchlesen. Aber ich hab selber schon eine Lösung gefunden womit ich das so hinbekomme wie ich es eigentlich haben möchte.
    Trotzdem danke für den Tipp.


    Was mich jetzt noch interessieren würde wie man mit PWM Schrittmotoren ansteuern kann.
    KEINE SERVOS.
    Normale Motoren Ich möchte erreichen das ein Fahrzeug unter Bestimmung eines Ultraschallsignals von 100% Speed auf 50 % Speed reduziert. Gibt es dazu hier irgendwo ein Beispiel. Wie man das realisieren kann ?

    Danke

    MFG

    Zappelmann

  • Die Lösung findest du hier: FAQ --> Nützliche Links / Linksammlung --> Interrupt Bzw > hier <

    Definiere einfach eine Funktion welche das Script mit einer quasi "while running:" beschäftigt sobald der 1.Taster gedrückt wird. Eine 2.Funktion verändert dann die "running" Variable sobald ein 2.Taster gedrückt wird. Fertig :fies:

    [code=php]
    #!/usr/bin/python
    from __future__ import print_function
    import RPi.GPIO as GPIO
    import time
    import Queue # https://pymotw.com/2/Queue/

    #GPIO pins
    Taster1 = 24
    Taster2 = 27

    # GPIO-Nummer als Pinreferenz waehlen
    GPIO.setmode(GPIO.BCM)

    # GPIO vom SoC als Input deklarieren und Pull-Down Widerstand aktivieren
    PULL = GPIO.PUD_DOWN #GPIO -> GND
    #PULL = GPIO.PUD_UP #GPIO -> 3V3
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=PULL)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=PULL)

    # Dictionary definieren. http://www.tutorialspoint.com/python/python_dictionary.htm
    dictionary = {}
    dictionary['pause'] = False

    queue = Queue.Queue()

    # Script pausieren/blockieren/beschaeftigen
    def Pause():
    while dictionary['pause'] == True:
    time.sleep(1)

    # ISR
    def Interrupt(pin):
    if pin == Taster1:
    queue.put(pin)
    if pin == Taster2:
    print("Fuehre Script weiter aus")
    dictionary['pause'] = False

    try:
    # Interrupt Event hinzufuegen. Auf steigende Flanke reagieren und ISR "Interrupt" deklarieren sowie Pin entprellen
    GPIO.add_event_detect(Taster1, GPIO.RISING, callback=Interrupt, bouncetime=200)
    GPIO.add_event_detect(Taster2, GPIO.RISING, callback=Interrupt, bouncetime=200)
    # keep script running
    while True:
    time.sleep(0.5)
    if not queue.empty():
    job = queue.get()
    if job == Taster1:
    print("Pausiere Script")
    dictionary['pause'] = True
    Pause()
    print("...puh... Im super heavy busy...")
    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    print("\nQuit\n")
    [/php]

    //EDIT: Das funktioniert auch mit nur einem Taster:

    [code=php]
    #!/usr/bin/python
    from __future__ import print_function
    import RPi.GPIO as GPIO
    import time
    import Queue # https://pymotw.com/2/Queue/

    #GPIO pins
    Taster1 = 24

    # GPIO-Nummer als Pinreferenz waehlen
    GPIO.setmode(GPIO.BCM)

    # GPIO vom SoC als Input deklarieren und Pull-Down Widerstand aktivieren
    PULL = GPIO.PUD_DOWN #GPIO -> GND
    #PULL = GPIO.PUD_UP #GPIO -> 3V3
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=PULL)

    # Dictionary definieren. http://www.tutorialspoint.com/python/python_dictionary.htm
    dictionary = {}
    dictionary['pause'] = False

    queue = Queue.Queue()

    # Script pausieren/blockieren/beschaeftigen
    def Pause():
    while dictionary['pause'] == True:
    time.sleep(1)

    # ISR
    def Interrupt(pin):
    if pin == Taster1:
    if dictionary['pause'] == True:
    print("Fuehre Script weiter aus")
    dictionary['pause'] = False
    else:
    queue.put(pin)

    try:
    # Interrupt Event hinzufuegen. Auf steigende Flanke reagieren und ISR "Interrupt" deklarieren sowie Pin entprellen
    GPIO.add_event_detect(Taster1, GPIO.RISING, callback=Interrupt, bouncetime=200)
    # keep script running
    while True:
    time.sleep(0.5)
    if not queue.empty():
    job = queue.get()
    if job == Taster1:
    print("Pausiere Script")
    dictionary['pause'] = True
    Pause()
    print("...puh... Im super heavy busy...")
    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    print("\nQuit\n")
    [/php]

Jetzt mitmachen!

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