Benutzer-Werkzeuge

Webseiten-Werkzeuge


skript:kommunikation

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
skript:kommunikation [2018/04/30 00:04]
d.golovko angelegt
skript:kommunikation [2018/11/21 16:23] (aktuell)
d.golovko
Zeile 1: Zeile 1:
 =====Kommunikation zwischen Processing und Arduino===== =====Kommunikation zwischen Processing und Arduino=====
  
-Eine detailliertere Anweisung mit verschiedenen Varianten (mit und ohne Bibliothek) gibt es an [[techniken:​datenaustausch|dieser Stelle]] ​in Wiki. Hier wird es um die einfache Kommunikation ohne Bibliotheken gehen. Wir werden die Positions ​unseres Mauszeigers auf der Processing-Zeichenfläche an das Arduino schicken und damit eine LED oder einen Servo ansteuern. ​+Eine detailliertere Anweisung mit verschiedenen Varianten (mit und ohne Bibliothek) gibt es an [[techniken:​datenaustausch|dieser Stelle]] ​im Wiki. Hier wird es um die einfache Kommunikation ohne Bibliotheken gehen. Wir werden die Position ​unseres Mauszeigers auf der Processing-Zeichenfläche an den Arduino schicken und damit eine LED oder einen Servo ansteuern. ​
  
-====1. Ein Zeichen von Processing ​ans Arduino schicken====+====1. Ein Zeichen von Processing ​an den Arduino schicken====
  
-Zuerst wollen wir Folgendes tun: wenn unser Mauszeiger sich in der oberen Hälfte der Zeichenfläche befindet, soll die eingebaute LED (''​LED_BUILTIN''​) angehen; ansonsten soll die LED sich ausschalten. Dies können wir mit Hilfe der seriellen Kommunikation realisieren,​ nur anstatt an den Seriellen Monitor von Processing (die Konsole unten) sollen die Zeichen ​ans Arduino geschickt werden. Wir modifizieren das Processing-Beipiel SimpleWrite (Libraries=>​Serial=>​SimpleWrite). ​+Zuerst wollen wir Folgendes tun: wenn unser Mauszeiger sich in der oberen Hälfte der Zeichenfläche befindet, soll die eingebaute LED (''​LED_BUILTIN''​) angehen; ansonsten soll die LED sich ausschalten. Dies können wir mit Hilfe der seriellen Kommunikation realisieren,​ nur anstatt an den Seriellen Monitor von Processing (die Konsole unten) sollen die Zeichen ​an den Arduino geschickt werden. Wir modifizieren das Processing-Beipiel SimpleWrite (Libraries=>​Serial=>​SimpleWrite). ​
  
-Wir müssen in unserem Processing-Programm angeben, an welchem Port wir mit dem Arduino kommunizieren wollen. Dies ist fast immer der letzte geöffnete Port sein:+Wir müssen in unserem Processing-Programm angeben, an welchem Port wir mit dem Arduino kommunizieren wollen. Dies ist fast immer der letzte geöffnete Port:
 <code java> <code java>
   String portName = Serial.list()[Serial.list().length-1];​   String portName = Serial.list()[Serial.list().length-1];​
Zeile 15: Zeile 15:
 </​code>​ </​code>​
  
-Dann können wir z.B. ein Zeichen über diesen Port ans Arduino schicken:+Dann können wir z.B. ein Zeichen über diesen Port an den Arduino schicken:
 <code java> <code java>
 myPort.write('​H'​);​ myPort.write('​H'​);​
Zeile 25: Zeile 25:
 </​code>​ </​code>​
  
-Auf der Empfängerseite (Arduino) müssen wir dann darum sorgen, dass der Datentyp richtig interpretiert wird. +Auf der Empfängerseite (Arduino) müssen wir dann dafür ​sorgen, dass der Datentyp richtig interpretiert wird. 
  
-Nun werden wir ein '​H' ​ans Arduino schicken, wenn der Mauszeiger sich in der oberen Hälfte der Zeichenfläche befindet, '​L'​ in der unteren Hälfte:+Nun werden wir ein '​H' ​an den Arduino schicken, wenn der Mauszeiger sich in der oberen Hälfte der Zeichenfläche befindet, '​L' ​wenn er in der unteren Hälfte ​ist:
  
 <code java RegulateLed.pde>​ <code java RegulateLed.pde>​
Zeile 61: Zeile 61:
  
 void loop() { void loop() {
-  ​while (Serial.available()) { // Wenn Daten verfügbar,+  ​if (Serial.available()) { // Wenn Daten verfügbar,
     char val = Serial.read();​ // lesen und in var ablegen     char val = Serial.read();​ // lesen und in var ablegen
     if (val == '​H'​) { // Wenn '​H'​ geschickt,     if (val == '​H'​) { // Wenn '​H'​ geschickt,
Zeile 72: Zeile 72:
 </​code>​ </​code>​
  
-====2. Mehrere Informationen zusammen von Processing ​ans Arduino schicken====+ 
 +====2. Mehrere Informationen zusammen von Processing ​an den Arduino schicken====
  
 Im zweiten Beispiel werden wir mit dem Mauszeiger sowohl die LED als auch den Servo ansteuern. Bei der y-Koordinate bleibt es beim alten (s. das Beispiel oben). Für die Steuerung des Servos werden wir die x-Koordinate auf der Processing-Zeichenfläche nutzen: wenn der Mauszeiger ganz links ist (x=0), soll der Servo die Position 30° annehmen; wenn der Mauszeiger ganz rechts ist (x=600) die Position 150°; alle Werte dazwischen sollen dementsprechend berechnet werden. D.h. wir müssen zwei Informationen verschicken:​ die x- und y-Koordinate. Vorher fassen wir sie zusammen zu einem String. Wir müssen uns entscheiden,​ wie wir die einzelnen Informationen voneinander trennen. In diesem Beispiel werden wir die Winkelwerte von den LED-Status-Werten mit einem Semikolon (;) trennen und die Nachrichten mit einem Zeilenumbruch (\n). Unsere Nachrichten sehen z.B. so aus: Im zweiten Beispiel werden wir mit dem Mauszeiger sowohl die LED als auch den Servo ansteuern. Bei der y-Koordinate bleibt es beim alten (s. das Beispiel oben). Für die Steuerung des Servos werden wir die x-Koordinate auf der Processing-Zeichenfläche nutzen: wenn der Mauszeiger ganz links ist (x=0), soll der Servo die Position 30° annehmen; wenn der Mauszeiger ganz rechts ist (x=600) die Position 150°; alle Werte dazwischen sollen dementsprechend berechnet werden. D.h. wir müssen zwei Informationen verschicken:​ die x- und y-Koordinate. Vorher fassen wir sie zusammen zu einem String. Wir müssen uns entscheiden,​ wie wir die einzelnen Informationen voneinander trennen. In diesem Beispiel werden wir die Winkelwerte von den LED-Status-Werten mit einem Semikolon (;) trennen und die Nachrichten mit einem Zeilenumbruch (\n). Unsere Nachrichten sehen z.B. so aus:
Zeile 78: Zeile 79:
   * "​120;​0\n"​ => Servowindel 120°, LED aus usw.   * "​120;​0\n"​ => Servowindel 120°, LED aus usw.
  
-Die Winkelwerte müssen wir vor dem Verschicken in Processing von ''​int''​ zu einem ''​String'' ​umwandeln:+Diesen ​''​String'' ​stellen wir dann so zusammen:
 <code java> <code java>
-    int angle = (int)(mouseX / 600.0 * 120 + 30); +    int angle = round(mouseX / 600.0 * 120 + 30);  // den float-Wert aufrunden
     //120, weil 150 Grad - 30 Grad = 120 Grad (kleinster und höchster einstellbarer Winkel bei unseren Servos)     //120, weil 150 Grad - 30 Grad = 120 Grad (kleinster und höchster einstellbarer Winkel bei unseren Servos)
-    myPort.write(new Integer(angle).toString() ​+ ";​1\n"​);​+    myPort.write(angle + ";​1\n"​);​
 </​code>​ </​code>​
  
-Auf der Arduino-Seite empfangen wir ein String (eine Zeichenkette), ​welches ​wir erstmal verarbeiten müssen. ​Das String wird zuerst zu einem ''​char''​-Array umgewandelt. In diesem Array suchen wir dann, an welcher Position das Semikolon steht. Alles, was vor dem Semikolon ist, wandeln wir zu einer Zahl um und schicken diese an den Servo. Das Zeichen unmittelbar nach dem Semikolon wandeln wir ebenso zu einer Zahl um -- sie bestimmt, ob die LED an- oder ausgeschaltet werden muss. Dabei nutzen wir die Funktionen ''​String.toCharArray()''​ und ''​String.substring()''​. ​+Auf der Arduino-Seite empfangen wir einen String (eine Zeichenkette), ​welchen ​wir erstmal verarbeiten müssen. ​Der String wird zuerst zu einem ''​char''​-Array umgewandelt. In diesem Array suchen wir dann, an welcher Position das Semikolon steht. Alles, was vor dem Semikolon ist, wandeln wir zu einer Zahl um und schicken diese an den Servo. Das Zeichen unmittelbar nach dem Semikolon wandeln wir ebenso zu einer Zahl um -- sie bestimmt, ob die LED an- oder ausgeschaltet werden muss. Dabei nutzen wir die Funktionen ''​String.toCharArray()''​ und ''​String.substring()''​. ​
  
 Die kompletten Programme sehen dann so aus: Die kompletten Programme sehen dann so aus:
Zeile 101: Zeile 102:
  
 void draw() { void draw() {
-  int angle = (int)(mouseX / 600.0 * 120 + 30); // Servowinkel anhand der x-Koordinate berechnen+  int angle = round(mouseX / 600.0 * 120 + 30); // Servowinkel anhand der x-Koordinate berechnen
   if (mouseY < 200) { // wenn der Mauszeiger in der oberen Hälfte ist   if (mouseY < 200) { // wenn der Mauszeiger in der oberen Hälfte ist
-    myPort.write(new Integer(angle).toString() ​+ ";​1\n"​); ​+    myPort.write(angle + ";​1\n"​); ​
   } else { // wenn der Mauszeiger in der unteren Hälfte ist   } else { // wenn der Mauszeiger in der unteren Hälfte ist
-    myPort.write(new Integer(angle).toString() ​+ ";​0\n"​); ​+    myPort.write(angle + ";​0\n"​); ​
   }   }
   delay(100); // warte, bevor die nächste Nachricht verschickt wird   delay(100); // warte, bevor die nächste Nachricht verschickt wird
Zeile 124: Zeile 125:
  
 void loop() { void loop() {
-  ​String message = "";​ // Speichert die eingelesenen Daten +  ​if (Serial.available()) { // Wenn Daten verfügbar,​ 
-  while (Serial.available()) { // Wenn Daten verfügbar,​ +    ​String ​message = Serial.readStringUntil('​\n'​);​ // Bis zum Zeilenumbruch lesen
-    message = Serial.readStringUntil('​\n'​);​ // Bis zum Zeilenumbruch lesen +
-    char split[message.length()];​ // Speichert die einzelnen Zeichen des Strings +
-    message.toCharArray(split,​ message.length());​ // Fülle die Variable split mit Zeichen+
     int semicolonIndex = message.indexOf(';'​);​ // Position des Semikolons im String     int semicolonIndex = message.indexOf(';'​);​ // Position des Semikolons im String
-    ​String ​angle = message.substring(0,​ semicolonIndex);​ // Lese den Winkelwert aus +    ​int angle = message.substring(0,​ semicolonIndex).toInt(); // Lese den Winkelwert aus 
-    ​String ​led = message.substring(semicolonIndex+1,​ semicolonIndex + 2); // Lese den LED-Wert aus +    ​int led = message.substring(semicolonIndex+1,​ semicolonIndex + 2).toInt(); // Lese den LED-Wert aus 
-    motor.write(angle.toInt()); // Der Winkel muss vorher zum int umgewandelt werden +    motor.write(angle);​ // Der Winkel muss vorher zum int umgewandelt werden 
-    digitalWrite(LED_BUILTIN,​ led.toInt()); // Mach die LED an oder aus (1=HIGH, 0=LOW)+    digitalWrite(LED_BUILTIN,​ led); // Mach die LED an oder aus (1=HIGH, 0=LOW)
   }   }
 } }
Zeile 140: Zeile 138:
 ====3. Ausgabe auf der Konsole==== ====3. Ausgabe auf der Konsole====
  
-Es wäre gut zu wissen, was für Daten eigentlich auf dem Arduino ankommen. Den Seriellen Monitor können wir leider nicht nutzen, denn der gleiche Port ist mit dem Empfangen von Daten beschäftigt. Stattdessen ​könne ​wir die Daten an Processing schicken und diese dort auf der Konsole ausgeben. Auf der Arduino-Seite gibt es dafür den alten Befehl:+Es wäre gut zu wissen, was für Daten eigentlich auf dem Arduino ankommen. Den Seriellen Monitor können wir leider nicht nutzen, denn der gleiche Port ist mit dem Empfangen von Daten beschäftigt. Stattdessen ​können ​wir die Daten an Processing schicken und diese dort auf der Konsole ausgeben. Auf der Arduino-Seite gibt es dafür den alten Befehl:
 <code cpp> <code cpp>
 Serial.println("​Diesen Text will ich ausgeben"​);​ Serial.println("​Diesen Text will ich ausgeben"​);​
skript/kommunikation.1525039477.txt.gz · Zuletzt geändert: 2018/04/30 00:04 von d.golovko