Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Arduino zu Processing

Auf der Arduino Seite ist das Prinzip relativ simpel. Man aktiviert man die serielle Kommunikation Schnitstelle in der "setup" Funktion und setzt eine Baudrate (bits/second) in der "setup" Funktion fest. Dann schreibt man einfach die betreffenden Werte/Variablen auf die serielle Schnitstelle. Man muss lediglich darauf achten, ein Trennzeichen (zbspl. Komma) zwischen den Werten und nach allen Werten ein new-line Zeichen "\n" zu schicken. Dies macht die Unterscheidung in Processing nachher umso einfachermit Kommas getrennt in einer Zeile.

Hier ein Beispiel, welches die Werte von zwei Sensoren über die serielle Schnittstelle sendet:

Code Block
languagecpp
titleArduino
collapsetrue
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 Callback Funktion "serialEvent" jeweils eine Zeile lesen, und die einzelnen Wert Werte wieder rauslesen.

Hier ein Beispiel dass die beiden Werte ausliest und eine Ellipse zeichnet.

Code Block
languagejava
titleProcessing
collapsetrue
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);
}

Processing zu Arduino

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.Für die Umgekehrte Kommunikation schreiben wir die Daten in Processing auch als Komma getrennte Werde in Zeilen:

Code Block
languagejava
titleBeispiel Processing zu Arduino
collapsetrue
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()); // Printsprint theall listavailable ofports
serial available devices (Arduino should be on top of the list) println(Serial.list());

  // open specific serial port
  myPort = new Serial(this, "/dev/cu.usbmodem12131usbmodem14621", 9600); // Open a new
port and connect with Arduino at 9600 baud
}


void draw()
{
  // prepare values
  int firstValue = 111;
  int secondValue = 222;
  int thirdValue = 333;

  // write values
  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 

Auf dem Arduino können wir dann diese Zeilen auch wieder in einzelnen Werte konvertieren:

Code Block
languagejavacpp
titleBeispiel Werte in Arduino empfangen
collapsetrue
#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);

  // open the serial port with a baudrate of 9600
  Serial.begin(9600);
}

void loop()
{
  // check if data is available
  if (Serial.available() > 0)
  {
    // read string
   incomingString String str = Serial.readStringUntil('\n');

    // split(incomingString data and write to incomingValues
    split(str, incomingValues, NUM_OF_VALUES);
  }

  // take first value and set LED
  analogWrite(LED_PIN6, incomingValues[0]);
}

void split(String inputString, int returnData[], int numOfValues)
{
  int index = 0;
  int lastPos = 0;

  for  for(int i = 0; i < i<inputStringinputString.length(); i++)
  {
    if (inputString.charAt(i) == ',' && index < numOfValues)
    {
      String tempStr = inputString.substring(lastPos, i - 1);
      returnData[index] = tempStr.toInt();
      index++;
      lastPos = i + 1;
    }
  }
}