kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Serielle Kommunikation zwischen Arduino und PC, zwischen Arduino und lokalem Server

(EN google-translate)

(PL google-translate)

Informative Forumsdiskussionen und Links zum Thema:

PHP-Klasse, die die serielle Kommunikation über PHP erleichtert.
Forumsbeiträge zu POST-Anfragen beim Server über Javascript.
Forumsbeiträge zur seriellen Kommunikation über PHP.
Verwendung von xmlHttpRequest in Javascript.

Erstes Experiment: Serielle Kommunikation über den seriellen Monitor der Arduino-IDE

Das folgende Arduino-Programm aktiviert beim Mikrocontroller eine serielle Verbindung und schaltet eine LED ein, wenn ein A empfangen wird und schaltet sie aus, wenn irgendein anderes Zeichen empfangen wird:

char c;

void setup() 
{
    Serial.begin(9600);
    pinMode(13,OUTPUT);      
    digitalWrite(13,0);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  if(Serial.available())
  {
      c=Serial.read();
      if(c=='A')
      {
          digitalWrite(13,1);
      }
      else
      {
          digitalWrite(13,0);
      }
  }    
}

Code 0-1: seriell001b.ino im Ordner .../Arduino/seriell001b

seriell001b.zip

Um mit dem Programm vom PC aus kommunizieren zu können wird ein Terminal für serielle Kommunikation benötigt. Dieses bringt die Arduino-IDE bereits in Form des Seriellen Monitors mit:

Seriellen Monitor öffnen.

Bild 0-1: Seriellen Monitor öffnen.

Einstellugen am seriellen Monitor und senden des Zeichens A über den Knopf

Bild 0-2: Einstellugen am seriellen Monitor und senden des Zeichens A über den Knopf "Senden".

Zweites Experiment: Serielle Kommunikation mittels PHP

Für die nachfolgenden Experimente muß ein XAMPP-Server verfügbar sein. Entpacken Sie nachfolgendes .zip-File "serielltest.zip" in dessen htdocs-Ordner und starten den Webbrowser. Vorausgesetzt wird, dass außerdem der Arduino-Micro über USB mit dem PC verbunden ist und den seriellen Port ttyACM0 hat und obiges Programm auf den Arduino geflasht wurde und der lokale XAMPP-Server gestartet wurde.

serielltest.zip

Rufen Sie über einen Webbrowser im Wechsel folgende Links auf:

  • http://localhost/serielltest/an.php
  • http://localhost/serielltest/aus.php
htdocs/serielltest/an.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Bild 0-3: htdocs/serielltest/an.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

htdocs/serielltest/aus.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Bild 0-4: htdocs/serielltest/aus.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Drittes Experiment: Serielle Kommunikation mittels PHP ausgelöst durch ein Formular auf einer Webseite (LED blinkt)

htdocs/serielltest/post_lesen2.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Bild 0-5: htdocs/serielltest/post_lesen2.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)


Problem: Ein submit in einer POST-Anfrage führt zum Wechsel der Webseite zum "target".


Stimmen aktuelle Seite und target überein, kann immerhin auf der aktuellen Seite nach dem neu laden weitergearbeitet werden. Jedoch bedeutet es einen hohen Performance-Verlust bei jeder Serveranfrage die Seite neu zu laden.

Abhilfe schafft die Javascript-Funktion XMLHttpRequest():

Viertes Experiment: Serielle Kommunikation mittels PHP ausgelöst durch einen XMLHttpRequest() mit Javascript

htdocs/serielltest/request.html (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Bild 0-6: htdocs/serielltest/request.html (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

htdocs/serielltest/post_lesen3.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Bild 0-7: htdocs/serielltest/post_lesen3.php (htdocs/serielltest/php_serial.class.php muß auch dort liegen)

Übung

Erweitern Sie die Programmteile aus Experiment vier so, dass vom Arduino immer das vom Webbrowser ein empfangener ASCII-Großbuchstabe an diesen als Kleinbuchstabe zurückgesendet wird und dort auch empfangen und angezeigt wird.

Mögliche Probleme mit der seriellen Verbindung und deren Behebung

Zugriff auf einen seriellen Port erhält man, wenn dieser extra frei geschaltet wird mit (Beispiel, wenn der Port ttyACM0 heißt, was typische für das Arduino-Gerät unter Linux ist):

  • sudo chmod a+rw /dev/ttyACM0

... oder der aktuelle Linux-Benutzer ist Mitglied der Gruppe dialout.

Schließlich könnte ein anderes Programm den Zugang auf den seriellen Port verhindern, da es diesen gelockt hat, z.B. gtkterm oder der Arduino Serial-Monitor. Dieses müßte vor dem flashen beendet werden.