Es ist soweit. Ich habe es geschafft, dass der Raspberry Pi im Browser Befehle annimmt und diese an den Arduino weitergibt. Damit ist mein per WLAN ferngesteuerter Roboter kurz vor der Vollendung.

So sieht es dann am Ende aus :-):


Aber beginnen wir mal von vorn. Vor kurzem habe ich euch gezeigt, wie man mit dem Raspberry Pi eine Verbindung zum Arduino über USB herstellt.

Für PHP gibt es leider keine lauffähige Variante, weshalb ich mich entschieden habe, ein kleines Bash Script zu schreiben, welches Befehle von PHP annimmt und dann diese an den Arduino weiterleitet. Damit habe ich Python umschifft, weil ich im Moment wenig Lust habe, mich mit Python zu beschäftigen. Und ausserdem dachte ich mir, dass wir jetzt schnell Ergebnisse sehen wollen :-).

Hier das Script für den Connect (arduino-connect.sh):

screen -S arduino /dev/ttyACM0 115200
sleep 2
echo "Connected to Arduino"

Der Sleep ist leider notwendig, da es einen kurzen Moment dauert, bis die Connection für Befehle freigegeben ist.

Jetzt das Script für die Befehle (arduino-bridge.sh):

if [ -z $1 ]
then
echo "Usage: ./arduino-bridge.sh [valueToSubmitToArduino] "
exit
fi

screen -S arduino -X stuff "$1"$'\n'

Das Script zum Disconnect (arduino-disconnect.sh):

screen -X -S arduino quit
echo "Disconnected from Arduino"

Nun kann ich per PHP das Programm ansprechen und Signale senden. Dazu müssen wir aber erstmal php installieren. Da wir später den Apache Webbrowser ebenfalls benötigen installieren wir den mal gleich mit.

sudo apt-get install php5 php5-cli apache2

Nachdem das erledigt ist, prüfen wir die Verbindung, indem wir in unseren Browser die IP Adresse des Raspberry Pi`s eingeben. In meinem Fall: http://192.168.23.110/.

Es sollte eine Ausgabe des Webbrowsers erscheinen:

Apache Default Screen

Apache Default Screen

Jetzt legen wir ein kleines PHP Script im Webroot (/var/www/arduino-control.php) ab, mit dem wir die LED steuern werden. Die anderen Scripte legen wir ebenfalls in den Ordner /var/www/.

<?php

exec("./arduino-connect.sh");
echo "You are now connected to Arduino...\n";
sleep(2);

exec("./arduino-bridge.sh 1");
echo "LED on";
sleep(5);

exec("./arduino-disconnect.sh");
echo "You are now disconnected from Arduino...\n";

Rufen wir das Script jetzt über die Konsole auf funktioniert es schonmal ziemlich gut.

php arduino-control.php

Rufen wir es über den Webbrowser auf, passiert erstmal garnichts. Das liegt an den Berechtigungen. Da der Apache als www-data User läuft, darf er nicht einfach einen Screen aufmachen etc… damit wir das schnell beheben (ACHTUNG: Quickfix) lassen wir den Apache einfach als User „pi:pi“ laufen. Dazu bearbeiten wir die Datei envvars sudo vi /etc/apache/envvars. Folgende zwei Zeilen müssen wir verändern:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

nach:

export APACHE_RUN_USER=pi
export APACHE_RUN_GROUP=pi

Jetzt noch einmal den Apache neustarten mit sudo /etc/init.d/apache2 restart, das Script über den Browser aufrufen und die LED geht an. MAGIC :-).

Nun noch schnell die Webseite ein wenig aufgehübscht und mit Buttons versehen:

<?php
session_start();
if ($_GET['connect'])
{
  if ($_SESSION['connected'] != 1)
  {
    shell_exec("./arduino-connect.sh");
    $_SESSION['connected'] = 1;
    sleep(2);
    echo "You are now connected to Arduino...\n";
  }
  else
  {
    echo "You are already connected to Arduino...\n";
  }
}

if ($_GET['led_on'] == 1)
{
  if ($_SESSION['connected'] == 1)
  {
    system("/bin/bash arduino-bridge.sh 1");
    echo "LED on";
  }
  else
  {
    echo "You are not connected. Please connect first.";
  }
}

if ($_GET['led_off'] == 1)
{
  if ($_SESSION['connected'] == 1)
  {
    system("/bin/bash arduino-bridge.sh 0");
    echo "LED off";
  }
  else
  {
    echo "You are not connected. Please connect first.";
  }
}

if ($_GET['disconnect'] == 1)
{
  if ($_SESSION['connected'] == 1)
  {
    shell_exec("./arduino-disconnect.sh");
    $_SESSION['connected'] = 0;
    echo "You are now disconnected from Arduino...\n";
  }
  else
  {
    echo "You are already disconnected from Arduino...\n";
  }
}
echo "<br/>";
echo "<strong>Raspberry Pi / Arduino Control Panel</strong><br/>";
echo '<a href="?connect=1">Connect</a><br/>';
echo '<a href="?led_on=1">LED ON</a><br/>';
echo '<a href="?led_off=1">LED OFF</a><br/>';
echo '<a href="?disconnect=1">Disconnect</a><br/>';

Das Ergebnis sieht dann so aus:

Raspberry Pi - Arduino Control Panel

Raspberry Pi – Arduino Control Panel

Und nun könnt ihr eins und eins zusammenzählen. Als nächstes wird der WLAN Stick installiert. Dann kommt der Webcam Stream auf die Webseite geladen und die Buttons schalten nicht eine LED, sondern den Motorshield meines Arduino. Damit habe ich ein über WLAN steuerbares RC Car mit Webcam Funktionalität. Wenn das mal nicht geil ist :-D.

11 Responses to “Raspberry Pi – Arduino – Browser Communication”

  1. michi sagt:

    Hi!

    Danke für die Anleitung. Leider klappt das bei mir nicht!
    Denke das liegt daran das ich keine envvars im apache-Verzeichnis habe sondern nur eine im apache2… 😉

    Gibt es dazu einen nicht-quick-fix!?

    Beste Grüße
    michi

  2. Roboman sagt:

    hey michi,

    was ist genau das problem? an welcher stelle kommst du nicht weiter?

    Gruß,
    Roland

  3. michi sagt:

    Hallo Roland

    also.. er kann keine screen session aufbauen bzw auf keine bestehende zugreifen. Da bekomme ich auch die Meldung: „No screen session found.“. Denke das liegt an mangelnden Rootrechten des www-data Benutzers.
    Ich glaube du umgehst das indem du bei dir die envvars anpasst. Diese liegt aber bei mir nicht im /etc/apache sondern im /etc/apache2 Verzeichnis. Eine Anpassung dort ist auch ohne das gewünschte Ergebnis geblieben

    Kannst du mir da weiterhelfen!?

    Beste Grüße
    Michi

  4. Roboman sagt:

    ich habe den user in die adm und sudo gruppe eingetragen, damit ich als root user mehr rechte habe. Das sollte dein problem lösen:

    mein pi user ist in den folgenden Gruppen:

    pi adm dialout cdrom sudo audio video plugdev games users netdev input

    Obwohl ja der Apache die Connection herstellt. Aber mein www-data user ist auch nur in der Gruppe www-data.

    Es wäre hilfreich, wenn du mal postest, was bei dir passiert, wenn du die connection versuchst auf der CLI herzustellen.

  5. Olund sagt:

    Hi! Trying to follow your code, everything works from ssh but when i try to do „php arduino-control.php“ i get this error..

    Line 3 is if ($_GET[‚connect‘])

    php arduino-control.php
    PHP Notice: Undefined index: connect in /var/www/arduino-control.php on line 3
    PHP Notice: Undefined index: led_on in /var/www/arduino-control.php on line 18
    PHP Notice: Undefined index: led_off in /var/www/arduino-control.php on line 31
    PHP Notice: Undefined index: disconnect in /var/www/arduino-control.php on line 44
    Raspberry Pi / Arduino Control PanelConnect
    LED ONLED OFF<a href="?disconnect=1

  6. Roboman sagt:

    this is just a notice. the notice will be removed if you modify your php script to:

    <?php
    error_reporting(0);

    if ($_GET...

    but if nothing happened than there is another error. maybe the same as michi said. i was just looking into the code and i found that i changed the apache startup user to pi:pi. You have to do this, if you want this tutorial up and running.

    there are other ways to do that, but i haven`t tested them yet.

  7. Olund sagt:

    Everything works if i manually execute the ./arduino-connect.sh…

  8. Raffael sagt:

    Hallo,

    ich habe auch probiert das Projekt nachzubauen, aber leider klappt das nicht ganz.

    Wenn ich das robot-control.php aus der commandline unter putty aufrufe (mit „php robot-control.php …“), dann klappt es. Mit in Putty sehe ich auch den screen und kann diesen mittels zweiter Putty-Session und „screen -ls“ diese Session auch sehen.

    Wenn ich das ganze aus dem Browser aufrufe, bekomme ich eine Fehlermeldung „Must be connected to a terminal.“ Die Fehlermeldung bezieht sich auf den „screen -S“ Befehl im connect-Shellscript. Hattest du diesen Fehler auch zwischendurch und wenn ja, wie hast du das gelöst?

    Soweit ich das sehe, ist das Problem, dass „screen -S“ ein interaktiver Befehl ist und einen Terminal braucht. Diesen bietet die PHP-Funktion shell_exec() aber nicht. Deshalb, wollte ich fragen, ob du einen Verdacht hast, warum das bei dir klappt.

    Zum Testen habe ich den „screen -S“-Befehl mal durch ein „screen -ls“ im connect-Shellscript geändert und dann das ganze im Browser aufgerufen. Das klappt. Es liegt also kein Berechtigungsproblem vor.

    Wie also, hast du es geschafft, dass der interaktive Befehl „screen -S“ bei dir aus dem Browser heraus läuft?

  9. Roboman sagt:

    Hey Leute,

    ich habe mal meine Sourcen hochgeladen unter:
    http://www.robosphere.de/wp-content/uploads/2013/02/RobospherePiDuino.zip

    Diese Sourcen beziehen sich auf das Folgetutorial:
    http://www.robosphere.de/raspberry-pi-steuert-arduino-roboter/

    Ich habe die Rechte der Files wie folgt:

    -rwxrwxrwx  1 pi   pi    141 Okt 17 19:14 arduino-bridge.sh
    -rwxrwxrwx  1 pi   pi     49 Okt 17 19:13 arduino-connect.sh
    -rwxrwxrwx  1 pi   pi   1,5K Nov  2 14:21 arduino-control.php
    -rwxrwxrwx  1 pi   pi     68 Okt 17 19:14 arduino-disconnect.sh
    -rw-r--r--  1 pi   pi   1,5K Nov 10 21:02 control.html
    -rw-r--r--  1 pi   pi    13K Nov 10 21:19 help_steuerkreuz.png
    -rwxrwxrwx  1 pi   pi    177 Okt 16 23:20 index.html
    -rw-r--r--  1 pi   pi    736 Nov 10 21:06 robot-control.php

    Ausserdem läuft der Apache als User „pi“ und nicht mehr „www-data“.

    less /etc/apache2/envvars

    ...
    export APACHE_RUN_USER=pi
    export APACHE_RUN_GROUP=pi
    ...
  10. Armando sagt:

    HELP: no screen session found

  11. jdi sagt:

    @Raffael
    Ich hatte das gleiche Problem. Die Lösung war letztendlich die screen-connection mit den Parametern -dmS zu starten (Start screen in „detached“ mode).
    arduino-connection.sh:
    screen -dmS arduino /dev/ttyACM0 115200

    Bei mir funktionierts jetzt einwandfrei 🙂

    @Roboman – Vielen Dank für die super gute Anleitung und das spannende Projekt!

Leave a Reply