Mit javascript GPIO-Pin ansteuern

  • Hallo zusammen
    Javascript soll ein Shell script starten, über das ein GPIO-Pin angesteuert wird.
    Der GPIO-Pin ist auf out gestellt und das Shell script hat Ausführungsrechte.
    Wenn ich das Shell script über die Shell starte, funktioniert es. Wenn ich das Shell script
    über Javascript ansteuer, wird mir im Browser(Firefox) das Shell script zum öffnen bzw.
    speichern angeboten.Wird also nicht ausgeführt.


    Hier noch die beiden Shell scripte (io10off und io10on)

    Bash
    #!/bin/bash
    gpio -g write 10 0


    Bash
    #!/bin/bash
    gpio -g write 10 1
  • Hallo jojouhr,
    so geht es nicht.
    Für deinen Fall benötigst du einen Web-Server. Oder hast du schon einen laufen?
    Wenn nicht, kannst du z.B. Apache installieren, obwohl der Apache nicht die beste Lösung für den Pi ist. Du kannst z.B Nginx oder was anderes installieren.


    document.location hat hier nichts zu Suchen. Du kannst entweder per AXAJ deine Skripte aufrufen, oder über <img src="">, in dem du mit Javascript dem scr-Attribut einen Wert zuweist.

  • Hallo olek07
    Ich habr auf meinem Raspi Apache 2 und wiringPI instalilert
    Auf dem Raspi wierd die Seite korrekt angezeigt, nur die Scripte
    werden nicht ausgeführt.Ich such erstmal im Forum, wie es mit
    AXAJ gemacht wird.
    Danke erst mal.

  • Hi Jojouhr,
    so wie du es dir gerade vorstellst, wird es leider nicht funktionieren. Der Server (Apache, Nginix, etc.) muss das Script (bzw. Programm) ausführen können. Um Shellscripte auszuführen, gibt es oft den Ordner "cgi-bin". Dazu gibt es auch hier eine relativ gute Anleitung :)


    Eine gute Möglichkeit wäre, PHP als Alternative zu benutzen. Dort gibt es den Befehl system(), welcher ein externes Programm ausführt (auch ein Shellscript :) ). Du kannst das ganze ganz einfach teste, wenn du ein Script (test.php) erstellst, wo drinnen steht

    PHP
    <?php echo system("gpio -g write 10 0");?>


    Das ganze kannst du dann (wie Olek07 bereits sagte) mit AJAX verbinden. AJAX ist dabei nich anderes wie Asynchrones Javascript und XML (wie der Name schon sagt) und ermöglicht es dir, per JavaScript anfragen an den Server zu senden, ohne die ganze Seite neu zu laden.


    Gruß, F4lcon

    Edited once, last by F4lcon ().


  • Hallo F4Icon
    Dein Tip mit dem PHP war gut.
    Ich habe auch etwas dazu im Net gefunden, und an meine Bedürfnisse angepasst.
    Aber es läuft immer noch nicht rund. :wallbash:
    Der erste Code funzt.

    PHP
    <html><head><?php if(isset($_GET['Befehl'])) {//GPIO 10 EINSCHALTEN if($_GET['Befehl'] === 'io10on') {      $val = trim(@shell_exec("/usr/local/bin/gpio -g write 10 1"));  }//GPIO 10 AUSSCHALTEN elseif($_GET['Befehl'] === 'io10off') {          $val = trim(@shell_exec("/usr/local/bin/gpio -g write 10 0"));  }}?></head><body><a href="<?php print($_SERVER['PHP_SELF']); ?>?Befehl=io10on" <form>    <input type="submit" value=" GPIO_10_on ">    </form></a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="<?php print($_SERVER['PHP_SELF']); ?>?Befehl=io10off" <form>     <input type="submit" value=" GPIO_10_off ">    </form>    </a></body></html>


    Der zweite Code funzt leider nicht. Kann der PHP-Code im Event-Handler
    (onmousedown bzw. onmouseup ) so nicht ausgeführt werden?
    Hier der zweite Code

    PHP
    <html><head><?php if(isset($_GET['Befehl'])) {//GPIO 23 Einschalten if($_GET['Befehl'] === 'io10on') {    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 10 1"));  }//GPIO AUSSCHALTEN  elseif($_GET['Befehl'] === 'io10off') {    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 10 0"));}}?></head><body>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;    <input type="button" value="GPIO-10"  onmousedown="<?php print($_SERVER['PHP_SELF']); ?> Befehl=io10on ;"  onmouseup="<?php print($_SERVER['PHP_SELF']); ?> Befehl=io10off ;"></body></html>


    Ich denke, so ganz falsch kann ich nicht liegen :shy:
    Ich bin für jede Hilfe dankbar.[/php]

  • Ich kenne leider deine Kenntnisse in PHP nicht, deswegen werde ich versuchen, es möglichst detailliert zu beschreiben :)
    Zunächst musst du verstehen, das JavaScript nur im Browser ausgeführt wird. PHP hingegen nur direkt auf dem Server. D.h. wenn du den Quelltext deiner Homepage abrufst, wirst du nur JavaScript sehen. Das PHP-Zeug wird ausgeführt und das Ergebnis angezeigt.


    Der PHP Code bei dir überprüft, ob die Variable $_GET['Befehl'] vorhanden ist. Das $_GET bedeutet (einfach gesagt), dass das "Befehl" in der URL steht (also script.php?Befehl=xxx). Im weiteren Verlauf überprüfst du, ob die Variable den Wert "io10off" hat (script.php?Befehl=io10off).


    Beim input-Button steht im Quelltext dann folgendes: onmousedown="(pfad/zur/datei.php Befehl=io10on ;" ($_SERVER['PHP_SELF'] gibt den Pfad zur aktuellen Datei an).
    Was wir aber benötigen, ist die Seite neu zu laden (mit den Befehl in der URL). Dazu musst du JavaScript noch sagen, dass er das Dokument neu laden soll:

    PHP
    onclick="location.href='<?php print($_SERVER['PHP_SELF']); ?>?Befehl=io10on ';"


    Ich hab das ganze jetzt mit onclick gemacht, da es bei onmousedown/up etwas komplizierter ist. Da darf er das Dokument nicht neu laden, sondern muss die Befehle im Hintergrund, also Asynchron ausführen. Bei diesen Vorgang kommt dann AJAX ins Spiel, welches eine Webseite im Hintergrund lädt (einfach gesagt).


    Gruß, F4lcon

  • Moin zusammen
    Ich habe das Problem anders gelöst. AJAX scheint wohl eine Reflexreaktion bei
    einigen Leuten zu sein. es geht auch ohne.:thumbs1:


    [hr]
    und hier die cgi-Datei io10off.cgi

    Bash
    #!/bin/bash
    
    
    gpio -g write 10 0
    
    
    echo "Status: 204 No Content"
    echo "Content-type: text/plain"
    echo ""


    [hr]
    und die io10on.cgi

    Bash
    #!/bin/bash
    
    
    gpio -g write 10 0
    
    
    echo "Status: 204 No Content"
    echo "Content-type: text/plain"
    echo ""


    [hr]
    Es muß Apache und WiringPi instaliert und passent konfiguriert sein
    Achtung: Wenn die cgi-Dateien auf einem Windows-Rechner geschrieben werden
    und auf den Raspi übertragen werden, kann es sein, das sie nicht verarbeitet werden.
    Der Zeilenumbruch ist unterschiedlich.
    Ich mach jetzt weiter mit meiner Robotersteuerung.
    Webcam-Steam und Steuertasten habe ich schon hinbekommen.
    Läuft noch nicht richtig rund, aber ich bin auf dem richtigen Weg.
    Melde mich wieder und Tschüs oder so.:thumbs1:

    Edited once, last by jojouhr ().