Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi - Smartphone


von Vik T. (volatility)


Lesenswert?

Hallo zusammen,

ich habe schon einiges mit dem kleinen Raspberry Pi (Version 2) gemacht 
und habe bereits die GPIOs die der Kleine zu bieten hat
genutzt um LEDs zu schalten bzw. Schalter einzulesen.
Das Ganze erfolgt über eine Library die man auf dem Raspberry 
installiert. Anschließend kann man mittels Shellkommando die jeweligen 
GPIOs schalten.

Beispielsweise würde der Befehl:

>gpio 3 1

den GPIO-Pin 3 auf High (1) schalten.


Mein Projket soll sein, mit dem Raspberry Pi über die GPIOs Relais zu 
steuern.
Bedient soll das Ganze über ein Android-Smartphone werden.

Ich stelle mir das so vor:

Auf dem Raspberry Pi läuft ein Apache Webserver. Verbunden wird dieser 
über WLAN mit dem Smartphone.
Auf dem Webserver liegt eine Webseite mit Buttons "Relais 1 ein/aus", 
"Relais 2 ein/aus", usw.
Drückt man nun einen dieser Buttons, soll das jeweilige Relais 
ein/ausschalten.

Bis dahin alles kein Problem.

Aaber: Wie mache ich die Schnittstelle zwischen geklicktem Button und 
Shellkommando?
Wie kann ich also eine Aktion "gpio 3 1" als Shellkommando ausführen, 
wenn vorher der Button-3 gedrückt wurde?


Ich habe mir nun eine umständliche Krücke überlegt, die aber eben aus 
meiner Sicht zu kompliziert für diesen Fall ist:
Nach dem Klick auf einen Button schreibt die Webseite (cgi über 
Perl/PHP) einen bestimmten Wert in eine Datei.
z.B.
>21
Würde bedeuten, Relais 2 soll geschaltet werden.
>30
Relais 3 soll stromlos gemacht werden

Ein Programm pollt im Sekundentakt nach den Inhalten dieser Datei 
(Endlosschleife -> schlecht!) und führt dann über system() o.ä. das 
Shellkommando aus.


Wie würdet ihr das machen?

Danke und Gruß

von ASCII (Gast)


Lesenswert?

In Perl/PHP dein 'gpio' starten?

von Jochen S. (jochen_s)


Lesenswert?

Hallo,

das ganze lässt sich per PHP als exec Befehl ausführen.
Dazu nimmt man:

exec("python test.py");

Das ganze läuft gut, da kann man auch Argumente mitgeben (argv[] array).

Allerdings muss der Nutzer Webserver rechte haben dieses script 
auszuführen.

Python ist hier dein Freund.

Mit diesen Schlagworten kannst du mal in Google rein gehen.

Gruß
Jochen

von Michi (Gast)


Lesenswert?


von Autor (Gast)


Lesenswert?

Genau so ein Projekt habe ich vor kurzem realisiert.

Ich habe die Relais allerdings nicht direkt geschalten, sondern über 
einen I/O Port Expander per I²C.

Das Webinterface wird per CGI Skript dargestellt, dort wird angezeigt 
welche Relais momentan aktiv sind etc.
Per Formulareingabe werden nun die nötigen Informationen zum Steuern, 
wie Relais und Port d. Relais übertragen.

Das HTML Dokument ruft beim Absenden der Formulardaten anschließend eine 
CGI-Datei auf, in welcher die Parameter ausgelesen und interpretiert 
werden. Für C gibt es verschiedene Bibliotheken mit denen du die GPIO 
Pins angesteuern kannst (Wiring Pi meine ich). Da ich mit I²C gearbeitet 
habe, verwendete ich I2c-dev.

Zur not kannst du auch in C per system("") die GPIO Befehle senden.

Gruß

von Vik T. (volatility)


Lesenswert?

Ah ok vielen Dank!

Dann war ja meine Idee garnicht so daneben ;-)


Also ich versuche es zunächst mal mit dem einfachen "system(gpio....)".
Beim Auslesen der Werte (gute Idee!) brauche ich wahrscheinlich ein 
kleines Programm drum herum, was mir den Rückgabewert von gpio beim 
Lesen in ein brauchbares interpretierbares Format wandelt, um dieses 
dann im Skript auszuwerten. ( if (wert == 1) print "Relais 
geschaltet")...

Danke

von Autor (Gast)


Lesenswert?

Hi,

system("") ist halt ein doch arg unsauberer Programmierstil :-).
Per #include müsste sich da eine entsprechende Bibliothek finden lassen.

Gerade wenn du den Inhalt des Webinterfaces dynamisch darstellen willst, 
also anzeigen welche Relais aktiv sind, lässt sich das vermutlich mit 
dem System("") nicht mehr anständig realisieren.

Als Webserver habe ich lighttpd verwendet. Ich glaube es gab anfänglich 
noch ein paar Probleme bzgl. den Dateiberechtigungen, aber das lässt 
sich erledigen.

Ich schaue hier mal weiterhin rein.

von Stefan (Gast)


Lesenswert?

> system("") ist halt ein doch arg unsauberer Programmierstil

Mag sein, aber es ist einfach und funktioniert. Und darauf kommt es an.

Aus Sicherheitsgründen (falls das eine Rolle Spielt) sollte man 
allerdings nicht irgendwelche Strings an den Befehl anhängen, die man 
vom Internet empfangen hat. Sonst können Böse Buben damit beliebige 
Systemkommandos absetzen.

Also Besser die beiden Zahlen über Internet empfangen, in Integer 
Variablen ablegen (damit es auch garantier nur Zahlen sein können) und 
dann damit den System Befehl zusammen basteln.

von Εrnst B. (ernst)


Lesenswert?

das "gpio"-Programm tut doch nichts anderes, als an ein paar Sysfs-Files 
herumzufrickeln.
Das geht auch direkt in PHP, ohne dass man den ganzen fork&exec overhead 
hat.

Pinnummner XXX nach /sys/class/gpio/export schreiben.

Richtung ("out","in") nach   /sys/class/gpio/gpioXXX/direction 
schreiben.

Input geht dann über read auf /sys/class/gpio/gpioXXX/value
Output logischerweise über write.

d.H. ein paar fopen, fread, fwrite & fertig.

Aber: das gpio-Programm ist suid-root, dein PHP wohl besser nicht. d.H. 
Zugriffsrechte musst du gesondert klären.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.