Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
GPIO: Programm starten und wieder beenden.
Blue Offline
Seit dem 17.10.2006 dabei!

Beiträge: 21.529
Registriert seit: Jul 2008
Beitrag #1
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?
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2017 12:10 von DosAmp.)
05.01.2017 00:41
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Playitlouder Offline
Hier könnte ihre Werbung stehen

Beiträge: 5.202
Registriert seit: May 2010
Beitrag #2
RE: GPIO: Programm starten und wieder beenden.
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).

.
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2017 01:17 von Playitlouder.)
05.01.2017 01:13
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Alpha Offline
Oskar

Beiträge: 16.344
Registriert seit: Jan 2009
Beitrag #3
RE: GPIO: Programm starten und wieder beenden.
Quick & Dirty: kill -9 `pgrep mplayer` oder "killall -9 mplayer"

Mark IV Style Motherfucker!
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2017 01:15 von Alpha.)
05.01.2017 01:14
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Vicky Offline
come sempre

Beiträge: 2.775
Registriert seit: Jul 2008
Beitrag #4
RE: GPIO: Programm starten und wieder beenden.
mir war langweilig

Code:
import RPi.GPIO as GPIO
import signal
import time
import subprocess
import os
import sys

buttonPin = 6
GPIO.setmode(GPIO.BCM)
GPIO.setup(buttonPin,GPIO.IN)

last = 0

while True:
    if (last != GPIO.input(buttonPin)):
        last = GPIO.input(buttonPin)
        if (last == 1):
            p = subprocess.Popen(["mplayer", "/dev/video0"])
        else:
            os.kill(p.pid, signal.SIGTERM)

python stinkt btw
05.01.2017 02:49
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Blue Offline
Seit dem 17.10.2006 dabei!

Beiträge: 21.529
Registriert seit: Jul 2008
Beitrag #5
RE: GPIO: Programm starten und wieder beenden.
Jeix is ja voll der pro q.q

Ich teste das heut abend mal
05.01.2017 04:18
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #6
RE: GPIO: Programm starten und wieder beenden.
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.

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2017 16:07 von DosAmp.)
05.01.2017 12:26
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste