Wie kann ich beim Raspberry Pi ein Script mit einem GPIO wieder schließen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

vielleicht einfach mit

killall Joystick.sh

Dazu wird es wohl aber mit deinem Programm nicht kommen, denn an diese Stelle kommst du erst dann, wenn sh /home/pi/Joystick.sh terminiert und dann musst und kannst du es auch nicht mehr beenden.

Hinter

 sh /home/pi/Joystick.sh 

muss dann mindestens noch ein & für "arbeite im Hintergrund"

Wenn so ein dort aufgerufenes Programm im Hintergrund arbeite, dann gibt es auch seine Prozess-ID zurück und die kannst du dann eindeutig für

kill -9 "diese-PID"

benutzen, wenn die in einer Variablen steht.

Noch 2 Anmerkungen:

Für "Script geöffnet" und "Script geschlossen" sollten besser die Begriffe "gestartet" und "beendet" benutzt werden. Öffnen steht mehr für Edit als für Run.

Hast du mal überlegt, ob du als Scriptsprache vielleicht die tclsh-Shell benutzen solltest. Im einem Raspberry benutze ich die, um meine gesamte Haustechnik damit zu steuern.

Hier nur einige Zeilen in tclsh

aus

 gpio17=$(cat /sys/class/gpio/gpio17/value)

würde

set gpio17 [ eval exec cat  /sys/class/gpio/gpio17/value ]

und aus

sh /home/pi/Joystick.sh &

würde

set joy_PID [ eval exec sh /home/pi/Joystick.sh & ]

und zum Beenden von Joystick.sh

eval exec kill -9 $joy_PID

Auf den ersten Blick sieht das zwar alles viel Umfangreicher aus, ist aber doch recht übersichtlich und nachvollziehbar. Da muss man auch nicht fragen, was gerade in der Variablen ? steht ...

Ein weiter Vorteil ist, dass man Informationen wie mit echo $gpio17 grafisch darstellen kann

z.B. mit

if { $gpio17 == "0" } { set text "GPIO-Pin 17 ist LOW " } else {  set text "GPIO-Pin 17 ist HIGH"  }

tk_messageBox -icon info -titel "Systemmeldung" -message $text 
Woher ich das weiß:Berufserfahrung – openSuSE seit 1995
RobSch1910 
Fragesteller
 20.11.2014, 11:53

Könntest du mir das oben genannte Script einmal komplett übersetzen in tclsh? Bei mir funktioniert das nicht ganz....

0
guenterhalt  20.11.2014, 14:06
@RobSch1910

So könnte ein Script zum Starten/Stoppen aussehen. Mit der GPIO-Schnittstelle habe ich mich nicht weiter beschäftigt. Nur so viel, dass es auf meinem Raspberry

/sys/class/gpio/gpio17/value

nicht gibt. Daher habe ich es auch nur auf meinem großen PC mit einer anderen Datei getestet.

Die ersten 3 Zeilen sind für das Betriebssystem und sollten nicht verändert werden.

In den nächsten 2 Zeilen werden nur Variable gesetzt, so dass man die Namen nicht mehrfach schreiben muss. pid ist eine Variable für die Prozess-ID das runFlag sagt, dass das Script ( Joystick ) bereits gestartet wurde und nicht noch einmal gestartet wird, wenn das gpio-Pin abgefragt wird. Die catch-Anweisung verhindert den Programmabsturz, wenn kill -9 nicht erfolgreich war (z.B. wenn die pid nicht existiert) after ist so etwas wie sleep, hier aber in Millisekunden.

#!/bin/bash
# \
exec tclsh  "$0" "$@"

set joystick /home/pi/Joystick.sh 
set gpioPort /sys/class/gpio/gpio17/value

set pid ""
set runFlag  "no"
while { 1 } { set fpin [open $gpioPort  r ]
              set gpio17 [ read $fpin 1 ]
              close $fpin   
              set gpio17 [expr $gpio & [format %x 0x01  ] ]
              if { $gpio17 == "1" } { if { $runFlag == "no"  } { set pid [eval exec $joystick & ] ;  set runFlag "yes"   } } else {
                                      if { [ catch { eval exec kill -9 $pid  } ] == "0" } { set runFlag "no" }
                                    }
              after 100
             }
0

Hallo

Wie kann ich beim Raspberry Pi ein Script mit einem GPIO wieder schließen?

Warum startest Du nicht das Kommando welches in Joystick.sh steht, statt des Scripts?

Oder testest einfach den Zustand:

if [ $(cat /sys/class/gpio/gpio17/value) == 1 ;
exit 0
else
echo "0" > /sys/class/gpio/gpio17/value
fi

Aber vielleicht erklärst Du mal was da genau gemacht werden soll, eventuell gibt es einen einfacheren Weg.

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102