Serial Communication

Hey Guys!

I’m busy making a project where my accelerometer @arduino can controle a ellipse @processing

But the problem is, it doesn’t work. I think it has something to do with receiving two data’s in processing at the same moment (value waardeX & value waardeY).

Hope someone can help me out!

My arduino code:

#include <Wire.h>
#include <Adafruit_MMA8451.h>
#include <Adafruit_Sensor.h>

int waardeX;
int waardeY;

Adafruit_MMA8451 mma = Adafruit_MMA8451();            //maak object acceleromter aan

void setup(void) {
  Serial.begin(9600);                                 //begin Seriële verbinding
  Serial.println("Adafruit MMA8451 test!");           //print waardes accelerometer

  if (! mma.begin()) {                                //mma.begin() om de sensor te herkennen.
    Serial.println("Couldnt start");                  //"MMA8451 found!" bij goed signaal, "Couldnt start" bij slecht signaal
    while (1);
  }
  Serial.println("MMA8451 found!");

  mma.setRange(MMA8451_RANGE_2_G);                    //lees range van 2_G (voor relatief slome bewegingen)

  Serial.print("Range = "); Serial.print(2 << mma.getRange());
  Serial.println("G");

}

void loop() {

  // Read the 'raw' data in 14-bit counts
  mma.read();                                         //lees rauwe data accelerometer uit
  Serial.print("X:\t"); Serial.print(mma.x);          //lees x waardes
  Serial.print("\tY:\t"); Serial.print(mma.y);        // lees y waardes
  Serial.println();                                   //print de waardes met een delay van 500ms
  delay(500);

  /* Get a new sensor event */
  sensors_event_t event;

  Serial.print(waardeX, DEC);
  Serial.print(",");
  Serial.print(waardeY, DEC);
  Serial.print("|");                                   //Schrijf waardes X & Y naar processig
}

My Processing code:

import processing.serial.*;

Serial myPort;                                   //Maak Serial object aan
String val;                                      //Ontvangen data van serial poort.

int waardeX;
int waardeX1;
int waardeY2;
int waardeY;

void setup() {
  printArray(Serial.list());
  String portName = Serial.list()[0];            //0 is mijn Arduino poort. 
  myPort = new Serial(this, portName, 9600);     //open de poort. Zelfde als serial.begin(9600) bij arduino zodat arduino en processing hetzelfde communiceren.

  size(500, 500);                                //Grootte van het scherm
}

void draw() {
  background(255);                               //Achtergrondkleur
  ellipse(waardeX, waardeY, 20, 20);               //20,20 is grootte/breedte cirkel
  fill(200, 10, 100);                                       //maak het bolletje zwart

  waardeX = (int)map(waardeX1, 4000, -4000, 0, 500);        //waardeX mappen naar waa
  waardeY = (int)map(waardeY2, -4000, 4000, 0, 500);

  {
    println(waardeX);
  }
}

void serialEvent(Serial myPort) {
  String myString = myPort.readStringUntil(124); //the ascii value of the "|" character
  if (myString != null ) {
    myString = trim(myString); //remove whitespace around our values
    int inputs[] = int(split(myString, ','));
    //now assign your values in processing
    if (inputs.length == 2) {
      waardeX = inputs[0];
      waardeY = inputs[1];
    }
  }
}

In your Arduino code, you are sending “X:xxxY:yyy0,0|” each time through loop(), with a 1/2 second pause after the .

In your Processing code, you are reading all the data up to the pipe symbol, and splitting it at the commas. The first string is therefore “X:xxxY:yyy0” and the second string is “0”.

How can you expect that first string to be converted to an int?

Why are you never assigning values to waardeX and waardeY in the Arduino? Why are you sending the X:, Y:, tabs, carriage return, line feed and sensor values when you don’t plan (properly) to use them?

Shouldn’t you be assigning mma.x to waardeX and mma.y to waardeY?