Exercise1:
video:
code:
Arduino:
// IMA NYU Shanghai // Interaction Lab // For sending multiple values from Arduino to Processing void setup() { Serial.begin(9600); } void loop() { // to send values to Processing assign the values you want to send //this is an example int sensor1 = analogRead(A0); int sensor2 = analogRead(A1); //int sensor3 = analogRead(A2); // send the values keeping this format Serial.print(sensor1); Serial.print(","); // put comma between sensor values Serial.print(sensor2); //Serial.print(","); // put comma between sensor values //Serial.print(sensor3); Serial.println(); // add linefeed after sending the last sensor value // too fast communication might cause some latency in Processing // this delay resolves the issue. delay(100); // end of example sending values }
Processing:
background(0); } void draw() { getSerialData(); printArray(sensorValues); x = map(sensorValues[0],0,1023,0,width); y = map(sensorValues[1],0,1023,0,width); stroke(255); line(sensorp[0], sensorp[1],x, y); sensorp[0]=int(x); sensorp[1]=int(y); } void setupSerial() { printArray(Serial.list()); myPort = new Serial(this, Serial.list()[1], 9600); myPort.clear(); myString = myPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII myString = null; sensorValues = new int[NUM_OF_VALUES_FROM_ARDUINO]; } void getSerialData() { while (myPort.available() > 0) { myString = myPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII if (myString != null) { String[] serialInArray = split(trim(myString), ","); if (serialInArray.length == NUM_OF_VALUES_FROM_ARDUINO) { for (int i=0; i<serialInArray.length; i++) { sensorValues[i] = int(serialInArray[i]); } } } } }
Exercise 2:
video:
Arduino:
#define NUM_OF_VALUES_FROM_PROCESSING 1 /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/ #include <Servo.h> /** DO NOT REMOVE THESE **/ int tempValue = 0; int valueIndex = 0; bool prevState = false; bool currentState = false; Servo myservo; int processing_values[NUM_OF_VALUES_FROM_PROCESSING]; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); myservo.attach(11); } void loop() { getSerialData(); currentState = processing_values[0]; if (currentState != prevState && currentState == 1) { myservo.write(90); delay(100); myservo.write(0); } else { myservo.write(0); } prevState = currentState; } //receive serial data from Processing void getSerialData() { while (Serial.available()) { char c = Serial.read(); switch (c) { case '0'...'9': tempValue = tempValue * 10 + c - '0'; break; case ',': processing_values[valueIndex] = tempValue; tempValue = 0; valueIndex++; break; case '\n': processing_values[valueIndex] = tempValue; tempValue = 0; valueIndex = 0; break; } } }
processing:
import processing.serial.*; float x; float y; int NUM_OF_VALUES_FROM_ARDUINO = 2; /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/ int sensorValues[]; /** this array stores values from Arduino **/ int sensorp[]; String myString = null; Serial myPort; void setup() { size(500, 500); setupSerial(); sensorp = new int[NUM_OF_VALUES_FROM_ARDUINO]; import processing.serial.*; int NUM_OF_VALUES_FROM_PROCESSING = 1; /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/int processing_values[] = new int[NUM_OF_VALUES_FROM_PROCESSING]; /** this array stores values you might want to send to Arduino **/ Serial myPort; String myString; int x=40; int speedX = 7; void setup() { fullScreen(); background(0); setupSerial(); } void draw() { background(0); circle (x, 200, 80); x= x+speedX; if (x > width-40 || x < 0+40) { speedX = -speedX; } if (x > width-40) { processing_values[0] = 1; } else { processing_values[0] = 0; } sendSerialData(); } void setupSerial() { printArray(Serial.list()); myPort = new Serial(this, Serial.list()[1], 9600); myPort.clear(); myString = myPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII myString = null; } void sendSerialData() { String data = ""; for (int i=0; i<processing_values.length; i++) { data += processing_values[i]; //if i is less than the index number of the last element in the values array if (i < processing_values.length-1) { data += ","; // add splitter character "," between each values element } else { data += "\n"; // add the end of data character linefeed "\n" } } //write to Arduino myPort.write(data); print(data); // this prints to the console the values going to arduino } Homework: video:
Arduino:
// IMA NYU Shanghai // Interaction Lab // For sending multiple values from Arduino to Processing int buttonPin1 = 3; int buttonPin2 = 4; int counter1 = 0; int counter2 = 0; int buttonState1 = 0; int buttonState2 = 0; int prevState1 = 0; int prevState2 = 0; void setup() { Serial.begin(9600); } void loop() { // to send values to Processing assign the values you want to send //this is an example buttonState1 = digitalRead(buttonPin1); buttonState2 = digitalRead(buttonPin2); if (buttonState1 == 1) { if (buttonState1 != prevState1) { counter1 += 1; } } prevState1 = buttonState1; if (buttonState2 == 1) { if (buttonState2 != prevState2) { counter2 += 1; } } prevState2 = buttonState2; // send the values keeping this format Serial.print(counter1); Serial.print(","); // put comma between sensor values Serial.print(counter2); // Serial.print(","); // put comma between sensor values // Serial.print(sensor3); Serial.println(); // add linefeed after sending the last sensor value // too fast communication might cause some latency in Processing // this delay resolves the issue. delay(100); // end of example sending values }
Processing:
// IMA NYU Shanghai // Interaction Lab // For receiving multiple values from Arduino to Processing /* * Based on the readStringUntil() example by Tom Igoe * https://processing.org/reference/libraries/serial/Serial_readStringUntil_.html */ import processing.serial.*; int NUM_OF_VALUES_FROM_ARDUINO = 2; /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/ int sensorValues[]; /** this array stores values from Arduino **/ String myString = null; Serial myPort; void setup() { size(600, 600); background(0); setupSerial(); } void draw() { background(0); getSerialData(); printArray(sensorValues); if (sensorValues[0] % 2 == 1){ pushMatrix(); fill(255); translate(width*0.3, height*0.3); rotate(frameCount / 200.0); star(0, 0, 30, 70, 5); popMatrix(); } else { fill(0); } if (sensorValues[1] % 2 == 1) { pushMatrix(); fill(255); translate(width*0.7, height*0.7); rotate(frameCount / 200.0); star(0, 0, 80, 100, 40); popMatrix(); } else { fill(0); } } void setupSerial() { //printArray(Serial.list()); myPort = new Serial(this, Serial.list()[1], 9600); // WARNING! // You will definitely get an error here. // Change the PORT_INDEX to 0 and try running it again. // And then, check the list of the ports, // find the port "/dev/cu.usbmodem----" or "/dev/tty.usbmodem----" // and replace PORT_INDEX above with the index number of the port. myPort.clear(); // Throw out the first reading, // in case we started reading in the middle of a string from the sender. myString = myPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII myString = null; sensorValues = new int[NUM_OF_VALUES_FROM_ARDUINO]; } void getSerialData() { while (myPort.available() > 0) { myString = myPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII if (myString != null) { String[] serialInArray = split(trim(myString), ","); if (serialInArray.length == NUM_OF_VALUES_FROM_ARDUINO) { for (int i=0; i<serialInArray.length; i++) { sensorValues[i] = int(serialInArray[i]); } } } } } void star(float x, float y, float radius1, float radius2, int npoints) { float angle = TWO_PI / npoints; float halfAngle = angle/2.0; beginShape(); for (float a = 0; a < TWO_PI; a += angle) { float sx = x + cos(a) * radius2; float sy = y + sin(a) * radius2; vertex(sx, sy); sx = x + cos(a+halfAngle) * radius1; sy = y + sin(a+halfAngle) * radius1; vertex(sx, sy); } endShape(CLOSE); }