Da Arduino auf Processing basiert eignen sich die beiden auch perfekt dazu Daten untereinander auszutauschen. Dazu verwenden wir die serielle Schnittstelle "Serial" die das asynchrone Austauschen von Daten ermöglicht.
Auf der Arduino Seite aktiviert man die serielle Schnitstelle in der "setup" Funktion und setzt eine Baudrate (bits/second) fest. Dann schreibt man die betreffenden Werte/Variablen mit Kommas getrennt in einer Zeile.
Hier ein Beispiel, welches die Werte von zwei Sensoren über die serielle Schnittstelle sendet:
void setup() { // open the serial port with a baudrate of 9600 Serial.begin(9600); } void loop() { // reading of pins int firstValue = analogRead(A0); int secondValue = analogRead(A1); // writing of a single line to serial "100,200" Serial.print(firstValue); Serial.print(','); Serial.print(secondValue); Serial.println(); // <- finish of line } |
Auf Processing-Seite müssen wir zunächst die Serial Library importieren, und die serielle Schnittstelle in der "setup" Funktion öffnen. Danach könne wir in der Callback Funktion "serialEvent" jeweils eine Zeile lesen, und die einzelnen Werte wieder rauslesen.
Hier ein Beispiel dass die beiden Werte ausliest und eine Ellipse zeichnet.
import processing.serial.*; Serial myPort; int firstValue, secondValue; void setup() { size(500, 500); // print all available ports println(Serial.list()); // open specific serial port myPort = new Serial(this, "/dev/cu.usbmodem12131", 9600); } void draw() { // draw ellipse background(0); fill(255); ellipse(width/2, height/2, firstValue, secondValue); } void serialEvent(Serial myPort) { // check if data is available if (myPort.available() == 0) { return; } // read a line as a string String str = myPort.readStringUntil('\n'); if (str == null) { return; } // remove leading and trailing whitespace str = trim(str); // split string String vals[] = split(str, ","); if (vals.length != 2) { return; } // convert values firstValue = int(vals[0]); secondValue = int(vals[1]); println(firstValue, secondValue); } |
Auf der Seite von Processing können wir einfach die Funktion *.write() aus der Serial Library nutzen. Es ist lediglich darauf zu achten, dass Werte als Strings an das Arduino gesendet werden. Mit der Funktion str(value) lässt sich jeder Wert (value) in einen String umwandeln. Zusätzlich senden wir zwischen jedem einzelnen Wert ein ‘,’ als Delimiter und ein carriage-return (“t”) als Indikator für das Ende der Übertragung.
import processing.serial.*; // Import the Processing Serial Library for communicating with arduino Serial myPort; // The used Serial Port void setup() { background(0); size(500, 500); println(Serial.list()); // Prints the list of serial available devices (Arduino should be on top of the list) myPort = new Serial(this, "/dev/cu.usbmodem12131", 9600); // Open a new port and connect with Arduino at 9600 baud } void draw() { int firstValue = 111; int secondValue = 222; int thirdValue = 333; myPort.write(str(firstValue)); myPort.write(","); myPort.write(str(secondValue)); myPort.write(","); myPort.write(str(thirdValue)); myPort.write("\n"); delay(1000); } |
Um auf der Seite des Arduino auf eingehende Nachrichten über die serielle Schnittstelle zu horchen müssen wir einige Funktionen benutzen. Diese sind:
charAt()
Diese Funktion retourniert das Zeichen in einem String an der angegebenen Position.
substring()
Diese Funktion erstellt einen Ausschnitt eines String von und bis zur angegebenen Position.
toInt()
Diese Funktion wandelt einen Sting in einen Int
#define LED_PIN 6 #define NUM_OF_VALUES 3 String incomingString =""; int incomingValues[NUM_OF_VALUES]; void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); } void loop() { if (Serial.available() > 0) { incomingString = Serial.readStringUntil('\n'); split(incomingString, incomingValues, NUM_OF_VALUES); } analogWrite(LED_PIN, incomingValues[0]); } void split(String inputString, int returnData[], int numOfValues) { int index = 0; int lastPos = 0; for(int i=0; i<inputString.length();i++) { if(inputString.charAt(i) == ',' && index < numOfValues) { String tempStr = inputString.substring(lastPos,i-1); returnData[index] = tempStr.toInt(); index++; lastPos = i+1; } } } |