Skip to content

Arduino mit einem Raspberry Pi verbinden und kommunizieren lassen

Heute beschreibe ich die Schritte, die nötig sind, um einen Arduino mit einem Raspberry Pi zu verbinden, so dass beide Komponenten Daten über eine serielle Verbindung austauschen können (in beide Richtungen).

Für dieses Projekt habe ich die folgende Hardware im Einsatz (Amazon):

Raspberry Pi Rev. 02
Arduino
Servo
Webcam (kompatibel zum Raspberry Pi)

Für mein Projekt habe ich mich dazu entschieden, dass Ganze mit Hilfe eines Webservers und PHP auf dem Raspberry Pi zu realisieren. Beide Geräte sind per USB miteinander verbunden. Das Ziel soll sein, über ein Webinterface Befehle an den Arduino zu senden (bspw. für die Ansteuerung eines Servos oder LEDs). In meinem Beispiel steure ich über ein Webinterface einen Servo auf dem eine Webcam installiert ist. Die jeweilige Position des Servos wird dabei vom Webinterface zum Servo übertragen, somit lässt sich die Position der Webcam genau ausrichten. Dazu aber später mehr. Hier die Schaltung:

Versuchsaufbau
Versuchsaufbau

Das Vorspiel

Zuerst muss der Raspberry Pi vorbereitet werden. Wir brauchen zunächst einmal einen Webserver. Grundlage dazu ist ein installiertes Raspbian mit konfigurierten SSH Zugriff.

1. Pakete updaten

sudo apt-get update

2. Apache installieren

sudo apt-get install apache2

Nachdem dies erfolgreich geschehen ist, könnt ihr im Browser testen, ob es geklappt hat. Dazu einfach die IP-Adresse des Raspberrys im Browser eingeben. „It works“ solltet ihr nun sehen.

Als nächstes brauchen wir PHP.

1. PHP installieren

sudo apt-get install php5

Auch das geht schnell + einfach. Das Webverzeichnis findet ihr unter „/var/www/“.

Jetzt gehts los

Nachdem nun alle Vorbereitungen getroffen wurden, gehts los.

Innerhalb unseres PHP-Skripten benötigen wir eine Klasse, die den Verbindungsaufbau bzw. Verbindungsablauf abbildet. Ich benutze dazu diese: phpSerial

So sieht mein PHP-Skript aus:

 include "php_serial.class.php";

 $serial = new phpSerial();
 $serial -> deviceSet("/dev/ttyACM0"); // usb port ansteuern
 $serial -> confBaudRate(9600); // baudrate definieren
 $serial -> confParity("none");
 $serial -> confCharacterLength(8);
 $serial -> confStopBits(1);
 $serial -> confFlowControl("none");
 $serial -> deviceOpen();

 sleep(3); // da der PI jedes mal neugestartet wird.

 $serial -> sendMessage('180!'); // um 180 grad drehen
 $read = $serial -> readPort(); // rückgabe abfragen

 echo $read; // rückgabe ausgeben

 $serial -> deviceClose();

Damit dies so funktioniert, müssen wir dem Apache-User erlauben, auf den USB-Port zuzugreifen. Dazu führen wir über SSH diesen Befehl aus:

chown www-data:www-data /dev/ttyACM0

www-data ist dabei der Benutzer. Dieser kann variieren, daher bei Bedarf anpassen. Den aktuellen Apache Benutzer kann man mit der PHP-Funktion get_current_user() ermitteln.

Auf dem Arduino läuft das folgende Skript.

#include  

int input = 0;
int servo = 9;
Servo myservo;

void setup() {                
  Serial.begin(9600);
  myservo.attach(servo);
  myservo.write(90);
}

String command = ""; // beinhaltet den aktuellen befehl

void loop() 
{
	if (Serial.available() > 0) 
	{
        input = Serial.read();
		char currentChar = input;

		if(currentChar  == '!') // frage nach trennzeichen
		{
			Serial.println("Servo befindet sich auf Position: ");
			Serial.println(command);
			myservo.write(command.toInt()); 

			command = ""; // befehl wieder leeren
		}else
		{
			command = command + currentChar ; // falls noch kein trennzeichen vorhanden, erweitere kommando
		}
    }
}

Der Arduino baut Stück für Stück den Befehl auf. Sobald das definierte Trennzeichen kommt (bei mir ist es das „!“), weiß der Arduino, dass der Befehl vollständig ist und kann diesen ausführen. Hier würde es sich auch anbieten, mit einem Switch-Konstrukt Befehle entgegen zu nehmen.

Für mein Projekt habe ich auf einen Servo eine Webcam gebastelt. Über das Webinterface, lässt sich nun diese Kamera drehen.

Verwendete Hardware bei Amazon:

Raspberry Pi Rev. 02
Arduino
Servo
Webcam (kompatibel zum Raspberry Pi)

Veröffentlicht inAllgemeinArduinoHardwareRaspberry Pi

Comments are closed.