GPIO Ports Konfigurieren

  • Ich hab mir ein PHP Script geschrieben um die Richtung und den Wert der GPIO Pins ändern zu können...

    Dazu gesagt habe ich erst später (wurde hier in Post#2 erwähnt) erfahren das es sowas bereits gibt, fand es aber trotzdem interessant das selber zu programmieren :)


    Vorraussetzungen:

    Spoiler anzeigen
    • wiringPi

      Code
      git clone git://git.drogon.net/wiringPi
      cd wiringPi/
      ./build
    • Ein zusätzliches Script "sudowebscript.sh" , was dem "www-data" Benutzer erlaubt bestimmte Befehle mit root -Rechten auszuführen:
      /var/sudowebscript.sh
    • Das Script " sudowebscript.sh " muss in /etc/sudoers eingetragen werden:
      Code
      www-data ALL=NOPASSWD:/var/sudowebscript.sh

    Das eigentliche PHP Script:
    /var/www/GPIO.php

    Allerdings habe ich auch als root ein seltsames Problem :-/

    Code
    root@raspberrypi:/var/www# echo pwm >/sys/class/gpio/gpio17/direction 
    -bash: echo: Schreibfehler: Das Argument ist ungültig.
    root@raspberrypi:/var/www#

    :helpnew:

  • Hmm, weil mir das bisher noch nicht bekannt war und ich gerne "sinnloses zeuchs" programmiere :D :blush:

    Danke für den Hinweis (erneut) :thumbs1:


    (aber wo liegt mein fehler? ;))

  • Hey meigrafd,

    errno 2 wäre "no such file or directory" ....
    Hängt evtl. mit sudo zusammen ... da gibts nen workaround, weil Du im script ja sudo nicht verwenden kannst - es sei denn, Du änderst was in der sudoer ... aber das muss ich erst suchen. Hatten wir schon das eine oder andere mal ...

    cu,
    -ds-

  • Ja ein derartigen Workaround habe ich hier auch irgendwo gepostet ;)


    Aber mit "sudo -u www-data" funktioniert der Befehl ja, also muss man dafür eigentlich kein root sein, oder?

  • Ne, aber ich mach ja auch nicht

    Code
    sudo -u www-data sudo echo "out" > /sys/class/gpio/gpio17/direction


    Wenn ich im PHP Script "sudo" davor setze funktionierts aber leider auch nicht :(

    Code
    exec("sudo echo $newPIN > /sys/class/gpio/export",$output,$error);

    /etc/sudoers

    Code
    www-data ALL=(ALL) NOPASSWD: ALL

  • Ne, aber ich mach ja auch nicht

    Code
    sudo -u www-data sudo echo "out" > /sys/class/gpio/gpio17/directio

    Damit meinte ich das ich das NICHT mache, und deshalb der Befehl normal als www-data Benutzer ausgeführt wird und da nunmal auch funktioniert - und ich deshalb nicht glaube das ich den Befehl unbedingt mit root-Rechten ausführen muss

    Also ja: der Unterschied ist gewollt ;) *hide*

    Code
    -u user     The -u (user) option causes sudo to run the specified command as a user other than root.

    Das macht aber alles kein Unterschied:

    Code
    root@raspberrypi:~# sudo -u www-data sudo echo "out" > /sys/class/gpio/gpio17/direction
    root@raspberrypi:~# cat /sys/class/gpio/gpio17/direction                               
    out
    root@raspberrypi:~# sudo -u www-data echo "in" > /sys/class/gpio/gpio17/direction     
    root@raspberrypi:~# cat /sys/class/gpio/gpio17/direction 
    in
    root@raspberrypi:~# sudo -u www-data echo "out" > /sys/class/gpio/gpio17/direction   
    root@raspberrypi:~# cat /sys/class/gpio/gpio17/direction                         
    out
    root@raspberrypi:~#

    Deshalb glaub ich eher das der Fehler irgendwo anders im PHP Script liegt :s =(

  • Habe den ersten Post aktuallisiert, allerdings habe ich auch als root ein seltsames Problem :-/

    Code
    root@raspberrypi:/var/www# cat /sys/class/gpio/gpio9/{direction,value}  
    in
    0
    root@raspberrypi:/var/www# echo 1 >/sys/class/gpio/gpio9/value   
    -bash: echo: Schreibfehler: Die Operation ist nicht erlaubt.


    Wieso dürfen bei GPIO Ports die in Richtung " in " sind der Wert nicht auf 1 gestellt werden?

    :helpnew:

  • Hallöchen,

    hmmm ich hab das mal ausprobiert:


    Code
    pi@raspberrypi ~ $ gpio export 0 in
    pi@raspberrypi ~ $ echo 1 /sys/class/gpio/gpio0/value 
    1 /sys/class/gpio/gpio0/value
    pi@raspberrypi ~ $


    Code
    pi@raspberrypi ~ $ ls -l /sys/class/gpio/
    insgesamt 0
    --w------- 1 root root 4096 Aug 17 19:56 export
    lrwxrwxrwx 1 root root    0 Aug 17 19:55 gpio0 -> ../../devices/virtual/gpio/gpio0
    lrwxrwxrwx 1 root root    0 Aug 17 19:56 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
    --w------- 1 root root 4096 Aug 17 19:56 unexport


    Code
    pi@raspberrypi ~ $ ls -l /sys/class/gpio/gpio0/
    insgesamt 0
    -rw-r--r-- 1 root root 4096 Aug 17 19:56 active_low
    -rw-r--r-- 1 root root 4096 Aug 17 19:56 direction
    -rw-r--r-- 1 pi   pi   4096 Aug 17 19:55 edge
    drwxr-xr-x 2 root root    0 Aug 17 19:56 power
    lrwxrwxrwx 1 root root    0 Aug 17 19:55 subsystem -> ../../../../class/gpio
    -rw-r--r-- 1 root root 4096 Aug 17 19:55 uevent
    -rw-r--r-- 1 pi   pi   4096 Aug 17 19:55 value

    geht alles ohne root ....

    cu,
    -ds-

  • Hallo zusammen,

    jetzt mal im Ernst. Sobald ein GPIO-Pin als Eingang definiert ist, soll dieser doch das elektrische Signal, welches an dem GPIO-Pin anliegt, erkennen und als entsprechenden Wert über die "/sys/class/gpio/gpioX/value" bereitstellen. Das bedeutet doch, dass die Datei nur noch lesbar sein sollte. Aus welchem Grund sollte man jetzt den Wert in der Datei ändern können und vor allem was sollte dann passieren? Soll dann der GPIO-Pin auch das entsprechende elektrische Signal ausgeben? Denkt mal bitte darüber nach was ihr eigentlich machen wollt.

    Gruß Georg

  • Da fällt mir spontan eins ein: Simulieren :)

    Ein " in " Pin gibt sowieso nix aus oder? Wenn dann reagiert eine Software darauf was "rein" kommt

    Wenn man einen Pin als " in " konfiguriert und ein Script/Programm geschrieben hat was die Value ausliest, könnte man es so dann simulieren ohne "in echt" etwas auf den Pin geben zu müssen... Deshalb dachte ich dass das eigentlich auch gehen müsste :-/


    Aber Oke, wenn das nicht vorgesehen ist werd ich die "Value" Spalte grau hinterlegen bzw nicht auswählbar machen sobald es auf Direction " IN " eingestellt ist - Danke :)

Jetzt mitmachen!

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