Statusabfrage Taster während Prozedur mit time.sleep-Funktion

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Raspi-Gemeinde!

    Ich habe ein Problem an meinem Projekt mit der Python-Programmierung.:helpnew:
    Folgendes Setup:
    Mein Raspi steuert über die GPIO Pins einen Gleichstrommotor an. Dieser wird über eine Zeitkomponente mit der time-Funktion "time.sleep()" angesteuert. Der Motor treibt einen Schlitten auf einer Schiene an und soll abschalten, wenn dieser das Ende der Schiene erreicht hat.
    Kurz: Wenn Taster-Input, dann Prozedur beenden.

    Mein Programmcode sieht folgendermaßen aus:

    "output_DSLR_1" und "output_DSLR_2" sind nur Impulsgeber für das Auslösen von Bilder an einer Kamera.
    Die "motor_time" in "time.sleep(motor_time)" ist eine integer Zahl und stellt die Sekunden der Fahrt dar, wo der Motor den Schlitten bewegt. Dieser wird im Code weiter vorne automatisch berechnet. Als Beispiel kann man hier die "motor_time" mit = 20 Sekunden gleich setzen.
    "zeit_int" ist eine durch Benutzereingabe gegebene Zeitkomponente. Hier als Beispiel = 10 Sekunden.

    Ich hab schon etliches mit while-Schleifen etc. probiert, jedoch stoppt mein Schlitten nie währrend der Fahrt, wenn ich die Taster manuell betätige. :wallbash: Ich vermute, dass der Pi den Status währrend der time.sleep-Funktion nicht abfragen kann.
    Kann mir jemand helfen, wie ich den Status der beiden Taster während der Prozedur abfragen kann und bei einem positiven Input den Motor zum stoppen bringen kann!?

    Auf Hilfe hofft
    LTSmash

  • Statusabfrage Taster während Prozedur mit time.sleep-Funktion? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Hi,

    würde ich in python auch so machen. Bei Knopfdruck einen Interrupt auslösen der vom Signal handler abgefangen wird.

    Hier mal ein Beispiel für einen Interupt mittels STRG+C.

    Code
    import signal
    import sys
    def signal_handler(signal, frame):
        print 'You pressed Ctrl+C!'
        sys.exit(0)
    signal.signal(signal.SIGINT, signal_handler)
    print 'Press Ctrl+C'
    while True:
        continue

    Hier gibts noch ein weiteres praktisches Beispiel und hier die zur Verüfügung stehenden Interrupts

  • Vielen Dank für die schnellen Antworten!


    Zitat


    [font="Tahoma, Verdana, Arial, sans-serif"]würde ich in python auch so machen. Bei Knopfdruck einen Interrupt auslösen der vom Signal handler abgefangen wird.[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Hier mal ein Beispiel für einen Interupt mittels STRG+C.[/font]

    Code
    import signal
    import sys
    def signal_handler(signal, frame):
        print 'You pressed Ctrl+C!'
        sys.exit(0)
    signal.signal(signal.SIGINT, signal_handler)
    print 'Press Ctrl+C'
    while True:
        continue

    @[font="Tahoma, Verdana, Arial, sans-serif"]dbv:[/font]
    Leider kenn ich mich mit den Interrupts noch nicht so aus. Wo steht denn die Bedingung, bei der der Signal handler anspringt?! Also in deinem Beispiel Ctrl+C ?

    Einmal editiert, zuletzt von LTSmash (10. September 2013 um 13:40)


  • Ich hab schon etliches mit while-Schleifen etc. probiert, jedoch stoppt mein Schlitten nie währrend der Fahrt, wenn ich die Taster manuell betätige.

    Wie dbv und dreamshader geschrieben haben, solltest Du mit Interrupts arbeiten.

    Jetzt kann man eher semioptimal CTRL+C auslösen, wenn dein Schlitten das Ende erreicht hat. Du kannst allerdings mit das RPi.GPIO-Bibliothek Interrupts durch einen Taster auslösen lassen.

    Ein anschauliches Beispiel dazu findest Du hier:
    http://raspi.tv/2013/how-to-us…rpi-gpio-part-3

    Was die Problematik mit dem Sleep betrifft.. Ohne mich genauer damit beschäftigt zu haben, würde ich das Warten in einen seperaten Thread auslagern und die Instanz beenden, sobald die Interrupt-Methode aufgerufen worden ist.

    Gruß
    Christian

  • Hallo miteinander,

    vielen Dank für die vielen Ideen und Anmerkungen.
    Ich habe nun einen ersten Teilerfolg: Mein Schlitten fährt und bleibt stehen sobald ich einen Taster betätige.
    Allerdings habe ich noch ein Problem. Ich bekomme folgende Fehlermeldung:

    sys.excepthook is missing
    lost sys.stderr
    :s
    Mein Programmcode:

    Wenn ich nach dieser Meldung google, finde ich zwar Erläuterungen, kann diese allerdings leider nicht nachvollziehen. Entschuldigt bitte meinen unsauberen Programmierstil. :rolleyes:
    Kann mir wer auf einfache Art und Weise erklären, was noch nicht rund läuft?
    Dank schon mal im Voraus.

  • Natürlich nicht. Sorry.

  • Hm das sieht aber anders aus als das was du zuvor gepostet hast - Zuletzt nutzt du " for i in range(100): " aber in Post#7 steht " for i in range(anzahl_int): " :huh:


    anyway - ich denke es liegt am " for i in range " bzw an dem "print" innerhalb dessen


    Ich weiss nicht ob das eine saubere Lösung wäre aber theoretisch müsste der Fehler verschwinden wenn du unter "for i in Range" folgendes setzt:

    Code
    try:
        sys.stdout.close()
    except:
        pass
    try:
        sys.stderr.close()
    except:
        pass
  • Zitat


    [font="Tahoma, Verdana, Arial, sans-serif"]Hm das sieht aber anders aus als das was du zuvor gepostet hast - Zuletzt nutzt du " for i in range(100): " aber in Post#7 steht " for i in range(anzahl_int): " [/font]icon_question2.gif

    @ [font="Tahoma, Verdana, Arial, sans-serif"]meigrafd:[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Ja das stimmt. in Post#7 habe ich noch eine Variable benutzt. Um die Komplexität des Ganzen so gering wie möglich zu halten, nutze ich für die Lösung des Problems eben 100. Das ist ein von mir herausgestellter Erfahrungswert. Am eigentlichen Problem mit [/font]
    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]sys.excepthook is missing[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]lost sys.stderr[/font]

    [/font]
    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]macht dies keinen Unterschied, ob nun range(anzahl_int) oder range(100).[/font][/font]

    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]Vielen Dank für die Hilfestellung. :thumbs1:Ich werde, den von dir vorgeschlagenen Code später ausprobieren.[/font][/font]

  • Hi liebe Gemeinde,

    hier die Ergebnisse der Vorschläge von [font="Tahoma, Verdana, Arial, sans-serif"]dbv und [font="Tahoma, Verdana, Arial, sans-serif"]meigrafd: [/font][/font]

    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"] dbv: [/font][/font]
    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]17gk.jpg
    [/font][/font]
    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]Der Code:[/font][/font]

    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]Er macht 3 Durchgänge (statt 100) und bricht dann ab. [/font][/font]

    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]@ meigrafd: [/font][/font]
    [font="Tahoma, Verdana, Arial, sans-serif"][font="Tahoma, Verdana, Arial, sans-serif"]cgr9.jpg
    [/font][/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Der Code:[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Wie du sehen kannst, passiert nichts. Er bricht sofort ab. [/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Noch jemand ne Idee, wie ich das Problem lösen könnte?! :helpnew:[/font]

    Einmal editiert, zuletzt von LTSmash (17. September 2013 um 15:08)

  • Du solltest das ja auch ans Ende der "for i in" einfügen nicht genau dadrunter ;)

    In python (und auch bei anderen Programmiersprachen um den Code besser lesen zu können) ist die Formatierung wichtig, so kann man zB bei


    erkennen, das alles über "print fertig" zusammengehört und zwar zum "for i in"

    Wenn man aber stattdessn sowas:


    nutzt, kann man das nicht mehr wirklich erkennen und ist somit extrem mühsam zu entziffern- ausserdem stellt sich Python dann eigentlich ziemlich an und wirft errors aus...

    Spoiler anzeigen

    Das ist bei anderen Programmiersprachen auch so, sowas hier:


    ist einfacher "zu lesen" als sowas:

    PS: Ich nutze immer die Tabulator-Taste (tab) um den Zeilenversatz zu machen

  • Hi,

    okay dann werde ich den Code per Hand wohl eingeben müssen. Ich schreibe den Code in notepad++ und schiebe ihn dann per Wifi auf meinen Raspberry. Ich bin davon ausgegangen, dass die Formatierung in den Editor des Forums übernommen wird ...

    Wo meinst du soll ich

    Code
    try:
       sys.stdout.close()
    except:
       pass
    try:
       sys.stderr.close()
    except:
        pass


    einfügen?
    An das Ende innerhalb der for-Schleife oder außerhalb der Schleife darunter?

    P.S.: Die Tabulator-Funktion funktioniert nicht im Beitragseditor, wenn ich einen Code schreibe. Es wird dann nämlich zum nächsten Button gesprungen.

    Einmal editiert, zuletzt von LTSmash (17. September 2013 um 17:50)

  • Wo meinst du soll ich
    einfügen?
    An das Ende innerhalb der for-Schleife oder außerhalb der Schleife darunter?

    Ans Ende der for-Schleife aber innerhalb dessen würd ich mal probiern, ansonsten eben danach... kA probiers aus ;)

    P.S.: Die Tabulator-Funktion funktioniert nicht im Beitragseditor, wenn ich einen Code schreibe. Es wird dann nämlich zum nächsten Button gesprungen.

    Ja hier nicht aber in deinem Editor (nano / notepad++ / ultraedit / proton / wasauchimmer)
    Ansonsten machst du copy&paste in nano

  • dbv:

    Zitat


    [font="Tahoma, Verdana, Arial, sans-serif"]mit meiner Version stirbt er immer nach 3 Bildern? nimm mal alle prints raus und lass das überschreiben des sys.excepthook auch weg. Es muss ja einen grund geben warum er aufhört.[/font]

    Wenn ich den print-Befehl und die Zeile mit dem sys.excepthook weg lasse, passiert das selbe. Das gleiche in grün. Nach 3 Durchläufen der for-Schleife ist Sense.
    Das Ergebnis schaut wie folgt aus:
    4fjlzv5win7m.jpg

    Mein Code:

    Mach ich noch irgendwas falsch?! :s

Jetzt mitmachen!

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