Raspberry Pi – Arduino – Browser Communication
By admin, Oktober 17th, 2012,in Arduino, Arduino Workshops, Promo, Raspberry Pi, Raspberry Pi Tutorials, Roboter | 11 Comments »
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):
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):
then
echo "Usage: ./arduino-bridge.sh [valueToSubmitToArduino] "
exit
fi
screen -S arduino -X stuff "$1"$'\n'
Das Script zum Disconnect (arduino-disconnect.sh):
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.
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:
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/.
Rufen wir das Script jetzt über die Konsole auf funktioniert es schonmal ziemlich gut.
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:
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:
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.
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
hey michi,
was ist genau das problem? an welcher stelle kommst du nicht weiter?
Gruß,
Roland
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
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.
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
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.
Everything works if i manually execute the ./arduino-connect.sh…
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?
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 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
...
HELP: no screen session found
@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!