GPIO: Programm starten und wieder beenden.

  • öö

    Also ich möchte gerne, wenn z.b an GPIO 6 ein Signal anliegt das ein Programm gestartet wird.. dazu hab ich natürlich auch schon schöne Codeschnipsel gefunden:

    import RPi.GPIO as GPIO
    import time
    import os

    #adjust for where your switch is connected
    buttonPin = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(buttonPin,GPIO.IN)

    while True:
    #assuming the script to call is long enough we can ignore bouncing
    if (GPIO.input(buttonPin)):
    #this is the script that will be called (as root)
    os.system("python /home/pi/start.py")

    Soweit so gut.. jetzt kommt der kniffge Teil, sobald das Signal abfällt (Spannung verschwindet, GPIO = 0) möchte ich das er diesen Prozess killt.

    In dem Falle geht es um mplayer was im overlay liegt. Angesteuert wird per /dev/video0 eine Kamera, die sobald an GPIO 6 = 1 anliegt gestartet wird und sobald GPIO 6 = 0, halt aus geht.

    Ich hab allerdings gar kein Plan, selbst wenn ich Python könnte :D

    Wie kill ich den ein Prozess den das Programm auch erraten müsste und nicht mehr als den Befehl weiß? Oder kann man Prozesse mit einer Benutzerdefinierten ProzessID Starten? (Und somit natürlich dann vordefiniert killen?

    Einmal editiert, zuletzt von DosAmp (5. Januar 2017 um 12:10)

  • Gibts dafür unter linux nicht den "killall" befehl? Damit sollte man Prozesse beenden können, deren Namen man kennt.
    Den würde ich ausführen (das "python /home/pi/start.py" führt ja nur den Konsolenbefehl aus, kannst da hinschreiben, was du willst, glaube ich zumindest).

    Um das auszuführen brauchst du nen "false" Fall. In dem prüfst du, ob du jemals mplayer mittels GPIO gestartet hattest und wenn das wahr ist und ne Zeitverzögerung abgelaufen ist, killst du mplayer (Zeitverzögerung wegen Prellen).
    Also einfach nen else if fall machen in dem du (GPIO.input(buttonPin)==0) prüfst (weiß nicht wie das implementiert ist und bin zu faul nachzuschauen kann sein, das das so nicht tut) etwas warten und dann eine variable prüfen, ob du das Skript jemals gestartet hast (sonst killst du mplayer einfach dauerhaft).

    EDIT: Klar sollte sein, das das skript.py irgendwann returnen sollte, also nicht darauf warten, bis mplayer beendet wird, weil du sonst nie wieder zurück kommst. Kann man ja machen, dass mplayer seine Konsole nach /dev/null pumpt und so das Skript sofort weiter macht (sorry, bin Linux noob).

  • mir war langweilig

    python stinkt btw

  • Ich würde noch eine kleine Verzögerung mit time.sleep(0.05) o. ä. zur while-Schleife hinzufügen, da GPIO.input den unmittelbaren Zustand des Pins zurückgibt und das ganze Skript ansonsten so einen ganzen CPU-Kern fressen würde.

    Man könnte mit RPi.GPIO das ganze auch interruptbasiert gestalten, aber dann sollte man einen Callback mit Cooldown definieren, um Switch Bouncing (Zurückspringen der Schaltfeder beim Schaltvorgang) zu vermeiden.

Jetzt mitmachen!

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