Recitation 11 Documentation (Isaac Schlager)

PART 1:

For the first part of this recitation, we were asked to create an arduino-to-processing serial communication circuit that used two analogues and controlled drawing something on the screen. This exercise was relatively simple in that we already did something creating an etch-a-sketch in recitation 8. I used two potentiometers for this in A0, A1. Once i defined the serial arrays in arduino, all I had to do was create an x and y variable in processing, map the two arrays with these variables, and float an ellipse with these coordinates.

Arduino

// IMA NYU Shanghai
// Interaction Lab
// This code receives one value from Processing to Arduino

char valueFromProcessing;
int ledPin = 9;

void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}

void loop() {
getSerialData();

intbrightness1=map(values[0], 0, 500, 0, 255);
intbrightness2=map(values[1], 0, 500, 0, 255
analogWrite (9, values[0]);
analogWrite(11, values[1]);

// to receive a value from Processing
while (Serial.available()) {
valueFromProcessing = Serial.read();
}

if (valueFromProcessing == ‘H’) {
digitalWrite(ledPin, HIGH);
} else if (valueFromProcessing == ‘L’) {
digitalWrite(ledPin, LOW);
} else {
// something esle
}

// too fast communication might cause some latency in Processing
// this delay resolves the issue.
delay(10);
}

Processing

// IMA NYU Shanghai
// Interaction Lab
// This code receives one value from Processing to Arduino

char valueFromProcessing;
int ledPin = 9;

void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}

void loop() {
getSerialData();

intbrightness1=map(values[0], 0, 500, 0, 255);
intbrightness2=map(values[1], 0, 500, 0, 255
analogWrite (9, values[0]);
analogWrite(11, values[1]);

// to receive a value from Processing
while (Serial.available()) {
valueFromProcessing = Serial.read();
}

if (valueFromProcessing == ‘H’) {
digitalWrite(ledPin, HIGH);
} else if (valueFromProcessing == ‘L’) {
digitalWrite(ledPin, LOW);
} else {
// something else
}

// too fast communication might cause some latency in Processing
// this delay resolves the issue.
delay(10);
}

PART 2:

For the second part of the recitation, we had to use processing-to-arduino serial communication. We were asked to use the mouse to light up two separate LED’s. For this, in processing I used mousex and mousey functions and set things so that the x and y values that processing was sending through in arrays would be received as lighting each LED separately. I was able to complete this circuit, yet one of my LED’s was barely lighting up, and I was having trouble with its resistor for some reason. This is shown in the video below.

Arduino Code:

// IMA NYU Shanghai
// Interaction Lab

/**
This example is to send multiple values from Processing to Arduino.
You can find the Processing example file in the same folder which works with this Arduino file.
Please note that the echo case (when char c is ‘e’ in the getSerialData function below)
checks if Arduino is receiving the correct bytes from the Processing sketch
by sending the values array back to the Processing sketch.
**/

#define NUM_OF_VALUES 2 /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/

/** DO NOT REMOVE THESE **/
int tempValue = 0;
int valueIndex = 0;

/* This is the array of values storing the data from Processing. */
int values[NUM_OF_VALUES];

void setup() {
Serial.begin(9600);
}

void loop() {
getSerialData();

// add your code here
// use elements in the values array
// values[0];
// values[1];
int brightness1 = map(values[0], 0, 500, 0, 255);
int brightness2 = map(values[1], 0, 500, 0, 255);
analogWrite(9, brightness1);
analogWrite(11, brightness2);
}

//recieve serial data from Processing
void getSerialData() {
if (Serial.available()) {
char c = Serial.read();
//switch – case checks the value of the variable in the switch function
//in this case, the char c, then runs one of the cases that fit the value of the variable
//for more information, visit the reference page: https://www.arduino.cc/en/Reference/SwitchCase
switch (c) {
//if the char c from Processing is a number between 0 and 9
case ‘0’…’9′:
//save the value of char c to tempValue
//but simultaneously rearrange the existing values saved in tempValue
//for the digits received through char c to remain coherent
//if this does not make sense and would like to know more, send an email to me!
tempValue = tempValue * 10 + c – ‘0’;
break;
//if the char c from Processing is a comma
//indicating that the following values of char c is for the next element in the values array
case ‘,’:
values[valueIndex] = tempValue;
//reset tempValue value
tempValue = 0;
//increment valuesIndex by 1
valueIndex++;
break;
//if the char c from Processing is character ‘n’
//which signals that it is the end of data
case ‘n’:
//save the tempValue
//this will b the last element in the values array
values[valueIndex] = tempValue;
//reset tempValue and valueIndex values
//to clear out the values array for the next round of readings from Processing
tempValue = 0;
valueIndex = 0;
break;
//if the char c from Processing is character ‘e’
//it is signaling for the Arduino to send Processing the elements saved in the values array
//this case is triggered and processed by the echoSerialData function in the Processing sketch
case ‘e’: // to echo
for (int i = 0; i < NUM_OF_VALUES; i++) {
Serial.print(values[i]);
if (i < NUM_OF_VALUES – 1) {
Serial.print(‘,’);
}
else {
Serial.println();
}
}
break;
}
}
}

Processing Code

// IMA NYU Shanghai

// Interaction Lab

/**

* This example is to send multiple values from Processing to Arduino.

* You can find the arduino example file in the same folder which works with this Processing file.

* Please note that the echoSerialData function asks Arduino to send the data saved in the values array

* to check if it is receiving the correct bytes.

**/

import processing.serial.*;

int NUM_OF_VALUES = 2;  /** YOU MUST CHANGE THIS ACCORDING TO YOUR PROJECT **/

Serial myPort;

String myString;

// This is the array of values you might want to send to Arduino.

int values[] = new int[NUM_OF_VALUES];

void setup() {

  size(500, 500);

  background(0);

  printArray(Serial.list());

  myPort = new Serial(this, Serial.list()[ 15 ], 9600);

  // check the list of the ports,

  // find the port “/dev/cu.usbmodem—-” or “/dev/tty.usbmodem—-“

  // and replace PORT_INDEX above with the index 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;

}

void draw() {

  background(0);

  values[0] = mouseX;

  

  values[1] = mouseY;

  // changes the values

  /*for (int i=0; i<values.length; i++) {

    values[i] = i;  /** Feel free to change this!! **/

  //}

  // sends the values to Arduino.

  sendSerialData();

  // This causess the communication to become slow and unstable.

  // You might want to comment this out when everything is ready.

  // The parameter 200 is the frequency of echoing.

  // The higher this number, the slower the program will be

  // but the higher this number, the more stable it will be.

  echoSerialData(200);

}

void sendSerialData() {

  String data = “”;

  for (int i=0; i<values.length; i++) {

    data += values[i];

    //if i is less than the index number of the last element in the values array

    if (i < values.length-1) {

      data += “,”; // add splitter character “,” between each values element

    }

    //if it is the last element in the values array

    else {

      data += “n”; // add the end of data character “n”

    }

  }

  //write to Arduino

  myPort.write(data);

}

void echoSerialData(int frequency) {

  //write character ‘e’ at the given frequency

  //to request Arduino to send back the values array

  if (frameCount % frequency == 0) myPort.write(‘e’);

  String incomingBytes = “”;

  while (myPort.available() > 0) {

    //add on all the characters received from the Arduino to the incomingBytes string

    incomingBytes += char(myPort.read());

  }

  //print what Arduino sent back to Processing

  print( incomingBytes );

}

Overall, I feel like this was a good recitation for me to attend. I felt that I needed much more practicing with serial communication and this definitely helped with my final project which is based off of serial communication as well.

Leave a Reply