Week 11: Trio of Exercises

This week, we had to complete these three exercises:

  1. make something that uses only one sensor  on arduino and makes the ellipse in processing move on the horizontal axis, in the middle of the screen, and nothing on arduino is controlled by processing
  2. make something that controls the LED brightness from processing
  3. take the gravity wind example (https://github.com/aaronsherwood/introduction_interactive_media/blob/master/processingExamples/gravityExamples/gravityWind/gravityWind.pde) and make it so every time the ball bounces one led lights up and then turns off, and you can control the wind from one analog sensor

I was able to complete 2 of these in class, and the third one required some figuring out. The Arduino and Processing codes will be inserted for each in order here. I had to attach 2 videos at the end for exercise 3 because my phone memory was acting up and not letting me record long videos. This was the best I could manage.

Exercise 1

This exercise still has the code to take inputs from both sensors, in case we wanted to change it up.

Processing

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[2]; 
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(xPos,height/2,30,30); 
  
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
      yPos=(int)map(values[1],0,1023,0, height);
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}

Arduino

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

Exercise 2

Processing

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[2]; 
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(mouseX,mouseY,30,30); 
  
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  myPort.write((int)map(mouseY, height, 0, 0, 255)+"\n");
}

Arduino

int brightness;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    brightness = Serial.parseInt();
   
    if (Serial.read() == '\n') {
      analogWrite(5, brightness);
     Serial.println("0");
      
    }
  }
}

Exercise 3

Processing

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
int sensor = 0;
int sensor_prev = 0;
float pos_prev = 0;

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;
int bounce = 0;

void setup() {
  size(640,360);
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
  printArray(Serial.list());
  String portname=Serial.list()[2]; 
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw() {
  background(255);
  bounce = 0;
  if (sensor==0){
    wind.x=0;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if((int)position.y >= height-mass/2 && (int)position.y != pos_prev){
    bounce = 1;
  }
  
  if (position.y > height-mass/2) {
      pos_prev = (int)position.y;
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
    }
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed(){
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    int i = int(s);
    sensor = (int)map(i, 0, 1023, 0, width);
    if(sensor>sensor_prev){
      wind.x=1;
    }
    else if(sensor<sensor_prev){
      wind.x=-1;
    }
    sensor_prev = sensor;
  }
  myPort.write(bounce+"\n");
  
}

Arduino

int onOff;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    onOff = Serial.parseInt();
    if (Serial.read() == '\n') {
      int sensor = analogRead(A0);
     digitalWrite(5, onOff);
     Serial.println(sensor);
      
    }
  }
}

I used the value of the sensor compared to its previous value to move the wind left and right, instead of the left and right keys. I was initially going to leave the LED on at the end after updating bounce in the existing if block, but then I thought the same logic could be applied to the y position of the ball too and I added another if block to accommodate that.

Note: I’m not able to transfer the longer video for now, I’ll try to get it up as soon as I can.

That’s it for now, no long rambling post this time!

Serial Communication Examples

 Exercises 1

Make something that uses only one sensor on Arduino and makes the ellipse in processing move on the horizontal axis, in the middle of the screen, and nothing on Arduino is controlled by processing

– Arduino

int left = 0;
int right = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}
void loop() {
  // while the serial is available
  while (Serial.available()) {
    // info that we parse and send to processor 
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      Serial.print(sensor);
    }
  }
}

– Processing

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;
void setup(){
  size(960,720);
  // print list of ports
  printArray(Serial.list());
  // find the arduino port in the list and choose the right index/port
  String portname=Serial.list()[3];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}
void draw(){
  background(255);
  // when mouse pressed, we change the onoff
  // if mouse is on right , turn on the light
  ellipse(xPos,height/2,30,30);
  
  if (mousePressed){
    if(mouseX<=width/2)
      onOff2=false;
    else
      onOff=false;
  }else{
    onOff=onOff2=true;
  }
  
}
void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
    }
  }
  
 
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
 
}

 Exercises 2

Make something that controls the LED brightness from processing
-Arduino
float brightness_led;
void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(5, OUTPUT);
}
void loop() {
  while (Serial.available()) {
    
    brightness_led = Serial.parseFloat();
    
    if (Serial.read() == '\n') {
    
      analogWrite(5, brightness_led);
      Serial.println(brightness_led);
    }
  }
}

– Processing

import processing.serial.*;
Serial myPort;
int pos_x = 0;
int pos_y;
float brightness_led;
void setup() {
  size(960, 720);
  printArray(Serial.list());
  String portname=Serial.list()[5];
  println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}
void draw() {
  background(255);
  brightness_led = int(map(mouseX, 0, width, 0, 255));
  
  pos_y = height/2;
  ellipse(mouseX, pos_y, 30, 30);
}
void serialEvent(Serial myPort) {
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  myPort.write(brightness_led+ "\n");
}

 Exercises 3

Take the gravity wind example and make it so every time the ball bounces one led lights up and then turns off, and you can control the wind from one analog sensor

-Processing

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
int Mover = 0;
import processing.serial.*;
Serial myPort;
int speedWind;
int xPos=0;
int yPos=0;
boolean onOff=false;
void setup() {
  size(640,360);
  printArray(Serial.list());
  String portname=Serial.list()[5];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
  
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
}
void draw() {
  background(255);
  if (!keyPressed){
    wind.x= speedWind;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
    }
    
  
  
  println(velocity.y);
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}
void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    
    int values[] = int(split(s,','));
    
    
    if (values.length == 2){
      if (values[0] > values[1]){
        speedWind = 10;
      }
      else if (values[0] < values[1]){
        speedWind = -10;
      }
      else if (values[1] == values[1]){
        speedWind = 0;
      }
    }
    
  }
    if (round(position.y + mass) > height && round(velocity.y)  != 0){
    onOff = true;
    }
    else{
      onOff = false;
    }
  
    myPort.write(int(onOff) + "\n");
  
}
void keyPressed(){
  if (keyCode==LEFT){
    wind.x=-1;
  }
  if (keyCode==RIGHT){
    wind.x=1;
  }
  if (key==' '){
    mass= random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

– Arduino

int brightness = 0;
int previousValue = 0;
int moving = 0;
int onOff = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(2, OUTPUT);
  
}
 
void loop() {
  while (Serial.available()) {
    onOff = Serial.parseInt();
    if (Serial.read() == '\n') {
      int sensor = analogRead(A0);
      delay(1);
      
      
      Serial.print(sensor);
      Serial.print(",");
      Serial.println(previousValue);
      previousValue = sensor;
      
      if (onOff == 1){
        analogWrite(2, 255);
      }
      else{
        analogWrite(2, 0);
      }
    }
  }
}

Serial Communication Examples

 Exercises 1

Make something that uses only one sensor on Arduino and makes the ellipse in processing move on the horizontal axis, in the middle of the screen, and nothing on Arduino is controlled by processing

– Arduino

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  // while the serial is available
  while (Serial.available()) {
    // info that we parse and send to processor 
    right = Serial.parseInt();
    left = Serial.parseInt();

    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      Serial.print(sensor);

    }
  }
}

 

– Processing

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  // print list of ports
  printArray(Serial.list());
  // find the arduino port in the list and choose the right index/port
  String portname=Serial.list()[3];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  // when mouse pressed, we change the onoff
  // if mouse is on right , turn on the light
  ellipse(xPos,height/2,30,30);
  
  if (mousePressed){
    if(mouseX<=width/2)
      onOff2=false;
    else
      onOff=false;
  }else{
    onOff=onOff2=true;
  }
  
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
    }
  }
  
 
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
 
}

 

 Exercises 2

Make something that controls the LED brightness from processing
-Arduino
float brightness_led;

void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    
    brightness_led = Serial.parseFloat();
    
    if (Serial.read() == '\n') {
    
      analogWrite(5, brightness_led);
      Serial.println(brightness_led);
    }
  }
}


– Processing
import processing.serial.*;
Serial myPort;
int pos_x = 0;
int pos_y;

float brightness_led;

void setup() {
  size(960, 720);
  printArray(Serial.list());
  String portname=Serial.list()[5];
  println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw() {
  background(255);
  brightness_led = int(map(mouseX, 0, width, 0, 255));
  
  pos_y = height/2;
  ellipse(mouseX, pos_y, 30, 30);
}

void serialEvent(Serial myPort) {
  String s=myPort.readStringUntil('\n');
  s=trim(s);

  myPort.write(brightness_led+ "\n");
}

 Exercises 3

Take the gravity wind example and make it so every time the ball bounces one led lights up and then turns off, and you can control the wind from one analog sensor

-Processing

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
int Mover = 0;

import processing.serial.*;
Serial myPort;
int speedWind;

int xPos=0;
int yPos=0;
boolean onOff=false;


void setup() {
  size(640,360);
  printArray(Serial.list());
  String portname=Serial.list()[5];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
  
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
}

void draw() {
  background(255);
  if (!keyPressed){
    wind.x= speedWind;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
    }
    
  
  
  println(velocity.y);
}


  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    
    int values[] = int(split(s,','));
    
    
    if (values.length == 2){
      if (values[0] > values[1]){
        speedWind = 10;
      }
      else if (values[0] < values[1]){
        speedWind = -10;
      }
      else if (values[1] == values[1]){
        speedWind = 0;
      }
    }
    
  }
    if (round(position.y + mass) > height && round(velocity.y)  != 0){
    onOff = true;
    }
    else{
      onOff = false;
    }
  
    myPort.write(int(onOff) + "\n");
  
}

void keyPressed(){
  if (keyCode==LEFT){
    wind.x=-1;
  }
  if (keyCode==RIGHT){
    wind.x=1;
  }
  if (key==' '){
    mass= random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}


– Arduino

int brightness = 0;
int previousValue = 0;
int moving = 0;
int onOff = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(2, OUTPUT);
  
}
 
void loop() {
  while (Serial.available()) {
    onOff = Serial.parseInt();
    if (Serial.read() == '\n') {


      int sensor = analogRead(A0);
      delay(1);
      
      
      Serial.print(sensor);
      Serial.print(",");
      Serial.println(previousValue);

      previousValue = sensor;

      
      if (onOff == 1){
        analogWrite(2, 255);
      }
      else{
        analogWrite(2, 0);
      }
    }
  }
}

 Video

 

 

 

Class Assignment: Arduino-Processing Communication

Exercise 1:

Processing:
import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(xPos,yPos,30,30);
  if (mousePressed){
    if(mouseX<=width/2)
      onOff2=true;
    else
      onOff=true;
  }else{
    onOff=onOff2=false;
  }
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
      yPos=height/2;
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}
Arduino:
int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(3, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

 

 

Exercise 2:

Processing:
import processing.serial.*;
Serial myPort;
int xPos = 0;
int yPos = 0;
int onOff = 0;
int onOff2 = 0;
int brightness = 0;

void setup() {
  size(960, 720);
  printArray(Serial.list());
  String portname = Serial.list()[0];
  println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw() {
  background(255);
  brightness = int(map(mouseY, 0, height, 0, 255));
  ellipse(xPos, yPos, 30, 30);
  if (mousePressed) {
    if (mouseX <= width / 2) {
      onOff2 = brightness;
    } else {
      onOff = brightness;
    }
  } else {
    onOff = onOff2 = 0;
  }
}

void serialEvent(Serial myPort) {
  String s = myPort.readStringUntil('\n');
  s = trim(s);
  if (s != null) {
    println(s);
    int values[] = int(split(s, ','));
    if (values.length == 2) {
      xPos = (int)map(values[0], 0, 1023, 0, width);
      //yPos=(int)map(values[1],0,1023,0, height);
      yPos = mouseY;
    }
  }
  myPort.write(int(onOff) + "," + int(onOff2) + "\n");
}
Arduino:
int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      analogWrite(3, right);
      analogWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

 

Exercise 3:

Processing:
import processing.serial.*;
Serial myPort;

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
int[] values;

int onoff, onoff2;

void setup() {
  size(960, 720);
  printArray(Serial.list());

  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0, 0);
  acceleration = new PVector(0, 0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0, 0);
  hDampening=map(mass, 15, 80, .98, .96);


  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw() {
  background(255);
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x, position.y, mass, mass);
  if (position.y > height-mass/2) {
    velocity.y *= -0.9;  // A little dampening when hitting the bottom
    position.y = height-mass/2;
  }

  if (velocity.y!=0) {
    onoff=1;
    onoff2=0;
  } else {
    onoff=0;
    onoff2=1;
  }
}

void applyForce(PVector force) {
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void serialEvent(Serial myPort) {
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null) {
    println(s);
    values=int(split(s, ','));
    if (values.length==3) {
      if (values[0]==1) {
        wind.x=-2;
      }
      if (values[1]==1) {
        wind.x=2;
      }
      if (values[2]==1) {
        mass=random(15, 80);
        position.y=-mass;
        velocity.mult(0);
      }
      if (values[0]==0 && values[1]==0) {
        wind.x=0;
        velocity.x*=hDampening;
      }
    }
  }
  myPort.write(onoff+ ","+onoff2+"\n");
}

Arduino:
int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0,0");
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(3, right);
      digitalWrite(5, left);
      int button = digitalRead(A0);
      delay(1);
      int button2 = digitalRead(A1);
      delay(1);
      int button3 = digitalRead(A2);
      delay(1);
      Serial.print(button);
      Serial.print(',');
      Serial.print(button2);
      Serial.print(',');
      Serial.println(button3);
    }
  }
}

Week 11: Exercises

Exercise 1:
Arduino
void setup() {
  Serial.begin(9600);
  Serial.println("0");
}

void loop() {
  while (Serial.available()) {
    if (Serial.read() == '\n') {
      int sensor = analogRead(A0);
      Serial.println(sensor);
    }
  }
}
Processing
import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[1];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(xPos,yPos,30,30);
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    int value= int(s);
    xPos=(int)map(value,0,1023,0, width);
    yPos=height/2;
  }
  myPort.write("\n");
}
Exercise 2:
Arduino
void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(3, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    int right=Serial.parseInt();
    analogWrite(3,right);
  }
}
Processing
import processing.serial.*;
Serial myPort;
int brightness;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[1];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  brightness=int(map(mouseX,0,width,0,255));
  myPort.write(brightness+"\n");
}
Exercise 3:
Arduino
void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(3, OUTPUT);
}
void loop() {
  while (Serial.available()) {
    int right = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(3, right);
      int sensor = analogRead(A0);
      Serial.println(sensor);
    }
  }
}
Processing
import processing.serial.*;
Serial myPort; 
int light;
int pos;
int value=0;
float previous;

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;

void setup() {
  size(640, 360);
  noFill();
  printArray(Serial.list());
  String portname=Serial.list()[1]; 
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
}

void draw() {
  background(255);
  previous=position.y;
  if (!keyPressed){
    wind.x=map(value,0,1023,-1, 1); // Add the wind
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
   }
  // check when it touches the bottom
  if (position.y >= height-mass/2) {
      light= int(true); // turn led on
  }
  else {
    light= int(false); // turn led off
  }
  // compare previous position to the current one (check if it stopped bouncing)
  if (previous==position.y){light= int(false);}
}

void serialEvent(Serial myPort){
  String s = myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    value = parseInt(s);
    //wind.x = map(value,0,1023,-1, 1);
  }
  myPort.write(light+"\n");
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed(){
  if (keyCode==LEFT){
    wind.x=-1;
  }
  if (keyCode==RIGHT){
    wind.x=1;
  }
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

 

View post on imgur.com

In-class Exercises

Here were the prompts we got for this week:

  1. make something that uses only one sensor on Arduino and makes the ellipse in processing move on the horizontal axis, in the middle of the screen, and nothing on Arduino is controlled by processing
  2. make something that controls the LED brightness from processing
  3. take the gravity wind example (https://github.com/aaronsherwood/introduction_interactive_media/blob/master/processingExamples/gravityExamples/gravityWind/gravityWind.pde) and make it so every time the ball bounces one led lights up and then turns off, and you can control the wind from one analog sensor

Here’s the code for each:

Exercise 1:

Arduino sketch

void setup() {
  Serial.begin(9600);
  Serial.println("0,0"); 
}

void loop() {

 while (Serial.available()) {
 if (Serial.read() == '\n') {
      int sensor = analogRead(A0);
      Serial.println(sensor);
    }
  }
}

Processing sketch

import processing.serial.*;
Serial myPort;
int xPos=0;
void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[6];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}
void draw(){
  background(255);
  ellipse(xPos,height/2,30,30);
}
void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values=int(s);
    if (values >= 0){
      xPos=(int)map(values,0,1023,0, width);
    }
  }
  myPort.write("\n");
}

Exercise 2:

Changes Brightness according to mouseX

Arduino sketch

int led = 0;
int right = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}
void loop() {
  while (Serial.available()) {
    led = Serial.parseInt();
    //left = Serial.parseInt();
    if (Serial.read() == '\n') {
      analogWrite(2, led);
      //digitalWrite(5, left);
      Serial.println();
    }
  }
}

 

Processing sketch

import processing.serial.*;
Serial myPort;
//int xPos=0;
//int yPos=0;
int onOff=0;
//boolean onOff2=false;
void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[6];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}
void draw(){
  background(255);
  //ellipse(xPos,yPos,30,30);
 
    onOff = mouseX;
  
}
void serialEvent(Serial myPort){
 myPort.readStringUntil('\n');
  
  int mappedValues=(int)map(onOff,0,width,0, 255);
    println(mouseX+" "+mappedValues);

  myPort.write(mappedValues+"\n");
}

 

Exercise 3:

Arduino sketch

int left = 0;
int right = 0;
int ledOn=0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0"); 
  pinMode(2, OUTPUT);
}

void loop() {

 while (Serial.available()) {
    
    ledOn = Serial.parseInt(); 
    if (Serial.read() == '\n') {
      
      digitalWrite(2, ledOn);
      delay(2);
     
      int sensor = analogRead(A0);
      delay(1);
      Serial.println(sensor); 
    }
  }
 
}


 

Processing sketch

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;


import processing.serial.*; //serial library built-in
Serial myPort; 


int bounce = 0;
float oldPos = 0;
int oldValue;

void setup() {
 String portname=Serial.list()[6];  
 println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear(); //cleaning out serial buffer
  myPort.bufferUntil('\n'); //buffer /fill it up until \n
  
    size(960, 720);
  printArray(Serial.list());  //print out all the port that's available
 //find which one is your arduino that's the one port
  //this can change everytime - so recheck - check if it is the right port

 
  size(640,360);
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
  delay(1000);
}

void draw() {
    bounce = 0;

  background(255);
  if (!keyPressed){
   // wind.x=0;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if ((int(position.y) >= height-mass/2) && (oldPos!=int(position.y))){
      bounce = 1;
    }
  if (position.y > height-mass/2) {
      oldPos=int(position.y);
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
      //bounce = 1;
    }

// println("Y:"+position.y+" "+cond);
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed(){
  
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

void serialEvent(Serial myPort) {
  myPort.write(bounce+"\n"); //send information to the arduino
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  
  if (s!=null){
    int value=int(s);
    int mappedValues=(int)map(value,0,1023,0, width);
  //  println(s);
        println(value+" "+oldValue);

    if ((mappedValues <= width/2)&&(value!=oldValue)){
      wind.x=-1;
    }
    else if ((mappedValues > width/2)&&(value!=oldValue)){
      wind.x=1;
  }
  else
  wind.x=0;
      oldValue = value;


  }

}

Video demo

Serial Communication Exercises – Shamma & Theyab documentation

EXERCISE 1 :

Procedure – The sensor on the Arduino Is the LDR, light depending on resistor. So, once the value from the LDR Arduino is less than 200, the ellipse will move by adding 1 to the Xposition.

Challenges- The difficulty was in working using both processing and Arduino together to be able to read from Arduino and control processing ellipse. By using myport to create an object from serial reading in processing , the problem was solved.

PROCESSING CODE :

import processing.serial.*;
int xPos=0;
int yPos=100;
Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port

void setup(){
  size(200, 200); 
  String portname=Serial.list()[3];
  myPort = new Serial(this, portname, 9600);
  println(portname);
}
void draw()
{background(255);
  ellipse(xPos,yPos,30,30);
  
  if ( myPort.available() > 0) {  // If data is available,
 
   val = myPort.read();         // read it and store it in val
  }
  if (val == 0) {              // If the serial value is 0,
    fill(0);                   // set fill to black
  } 
  else {                       // If the serial value is not 0,
    fill(204);  xPos++;               // set fill to light gray
  }
  ellipse(xPos,yPos,30,30);
}

ARDUINO CODE :

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

}

void loop() {
      int sensor = analogRead(A0);
      delay(1);
 
      //Serial.println(sensor);
      //Serial.write(sensor);
        if (sensor <200)
 {  
    Serial.write(1);               // send 1 to Processing
  } else {           
    Serial.write(0);               // send 0 to Processing
  }
    delay(100);
    }

OUTPUT :

EXERCISE 2 :

Procedure – The program is to show two rectangles on processing screen. If the mouse is over the first square on the left, the brightness of the light is increased by 1 and if the mouse is over the second square, the brightness is less by 1. The analogWrite(ledPin,i) is the command used for controlling the brightness of the led.

Challenges- The hardship was to connect the serial to write to the Arduino. By creating 2 different rectangles, we had two options for increasing and decreasing the brightness of the light.

PROCESSING CODE :

import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;        // Data received from the serial port

void setup() 
{
  size(200, 200);
  String portName = Serial.list()[3];
  myPort = new Serial(this, portName, 9600);
  print(portName);
}

void draw() {
  background(255);
  if (mouseOverRect1() == true) {  // If mouse is over square,
    fill(204);                    // change color and
    myPort.write('H');              // send an H to indicate mouse is over square
  } 
  else {                        // If mouse is not over square,
    fill(0);                      // change color and
    //myPort.write('L');              // send an L otherwise
  
  if (mouseOverRect2() == true) {  // If mouse is over square,
    fill(204);                    // change color and
    myPort.write('L');              // send an H to indicate mouse is over square
  } 
  else {                        // If mouse is not over square,
    fill(0);                      // change color and
    //myPort.write('N');              // send an L otherwise
  }}
  rect(20, 20, 50, 100);         // Draw a square
  rect(90, 20, 50, 100);
}

boolean mouseOverRect1() { // Test if mouse is over square
  return ((mouseX >= 30) && (mouseX <= 70) && (mouseY >= 20) && (mouseY <= 120));
}
boolean mouseOverRect2() { // Test if mouse is over square
  return ((mouseX >= 90) && (mouseX <= 140) && (mouseY >= 20) && (mouseY <= 120));
}

ARDUINO CODE :

char val; // Data received from the serial port

int ledPin = 13; // Set the pin to digital I/O 4

int i = 10;

void setup() {

pinMode(ledPin, OUTPUT); // Set pin as OUTPUT

Serial.begin(9600); // Start serial communication at 9600 bps

}

 void loop() {

while (Serial.available()) { // If data is available to read,

val = Serial.read(); // read it and store it in val

if (val == 'H') { // If H was received
i++;
analogWrite(ledPin,i);

}
else if (val == 'L'){
i--;
analogWrite(ledPin,i); // Otherwise turn it OFF


}

delay(100); // Wait 100 milliseconds for next reading
}
}

OUTPUT :

EXERCISE 3 :

Procedure – The analog sensor used is the potentiometer on A1 analog port 1. If the value is less than 1024/2, the wind is blowing to the right. If the value is higher, then the wind is blowing to the left. Thus, the light turns on when the ball is bouncing.

Challenges- The challenge is to turn on the LED to have it on during the bouncing of the ball on processing screen. The second challenge was to use one analog sensor to make right and left movement, so our solution was to use a potentiometer that reads values from 0 to 1023. The mid value is the threshold, if under 1023/2, it moves to the right side, and if higher, moves to left side

PROCESSING CODE :

import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;  
PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;

void setup() {
  size(640,360);
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
  String portName = Serial.list()[3];
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  background(255);
  //if (!keyPressed){
   // wind.x=0;
  //  velocity.x*=hDampening;
 // }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  //
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
      myPort.write('L');
    } 
    else myPort.write('H');
    
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
  }
    
     if(val==0){
    wind.x=-1;
  }
 
   else{
    wind.x=1;
  }
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed(){
  if (keyCode==LEFT){
    
    wind.x=-1;
  }
  if (keyCode==RIGHT){
   
    wind.x=1;
  }
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

ARDUINO CODE :

char val; // Data received from the serial port

int ledPin = 13; // Set the pin to digital I/O 4

int i = 50;
int left = 0;
int right = 0;
int rightbool=0;
void setup() {

pinMode(ledPin, OUTPUT); // Set pin as OUTPUT

Serial.begin(9600); // Start serial communication at 9600 bps

}

 void loop() {

while (Serial.available()) { // If data is available to read,

val = Serial.read(); // read it and store it in val

}

if (val == 'H') { // If H was received

digitalWrite(ledPin,HIGH);

} else {

digitalWrite(ledPin,LOW); // Otherwise turn it OFF

}
int sensor = analogRead(A1);
//Serial.println(sensor);
if(sensor<511){rightbool=1; Serial.write(1);}
else {rightbool=0;Serial.write(0);}

delay(100); // Wait 100 milliseconds for next reading

}

CIRCUIT DIAGRAM:

FINAL VIDEO :

Week 11: Communication Exercise

DESCRIPTION: 

  1. make something that uses only one sensor  on arduino and makes the ellipse in processing move on the horizontal axis, in the middle of the screen, and nothing on arduino is controlled by processing
  2. make something that controls the LED brightness from processing
  3. take the gravity wind example

GIVEN CODE: 

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

/*

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[1];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(xPos,yPos,30,30);
  if (mousePressed){
    if(mouseX<=width/2)
      onOff2=true;
    else
      onOff=true;
  }else{
    onOff=onOff2=false;
  }
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
      yPos=(int)map(values[1],0,1023,0, height);
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}

 */

EXERCISE 1: 

int left = 0;
int right = 0;

void setup() {
 Serial.begin(9600);
 Serial.println("0,0");
 pinMode(2, OUTPUT);
 pinMode(5, OUTPUT);
}

void loop() {
 while (Serial.available()) {
   right = Serial.parseInt();
   left = Serial.parseInt();
   if (Serial.read() == '\n') {
     digitalWrite(2, right);
     digitalWrite(5, left);
     int sensor = analogRead(A0);
     delay(1);
     int sensor2 = analogRead(A1);
     delay(1);
     Serial.print(sensor);
     Serial.print(',');
     Serial.println(sensor2);
   }
 }
}


//////////////////////////////////////////////////////

import processing.serial.*;
Serial myPort;
int xPos=0;
//int yPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
 size(960,720);
 printArray(Serial.list());
 String portname=Serial.list()[4];
 println(portname);
 myPort = new Serial(this,portname,9600);
 myPort.clear();
 myPort.bufferUntil('\n');
}

void draw(){
 background(255);
 ellipse(xPos,height/2,30,30);
 //if (mousePressed){
 //  if(mouseX<=width/2)
 //    onOff2=true;
 //  else
 //    onOff=true;
 //}else{
 //  onOff=onOff2=false;
 //}
}

void serialEvent(Serial myPort){
 String s=myPort.readStringUntil('\n');
 s=trim(s);
 if (s!=null){
   println(s);
   int values[]=int(split(s,','));
   if (values.length==2){
     xPos=(int)map(values[0],0,1023,0, width);
     //yPos=(int)map(values[1],0,1023,0, height);
   }
 }
 myPort.write(int(onOff)+","+int(onOff2)+"\n");
}

EXERCISE 2: 

import processing.serial.*;
Serial myPort;
//int xPos=0;
int yPos=0;
float brightness;
//boolean onOff=false;
//boolean onOff2=false;

void setup(){
 size(960,720);
 printArray(Serial.list());
 String portname=Serial.list()[4];
 println(portname);
 myPort = new Serial(this,portname,9600);
 myPort.clear();
 myPort.bufferUntil('\n');
}

void draw(){
 background(255);
 ellipse(width/2,mouseY,30,30);
 brightness = map(mouseY,0,height,0,255);
 myPort.write(int(brightness)+ "\n"); 
 //if (mousePressed){
 //  if(mouseX<=width/2)
 //    onOff2=true;
 //  else
 //    onOff=true;
 //}else{
 //  onOff=onOff2=false;
 //}
}

//void serialEvent(Serial myPort){

//  String s=myPort.readStringUntil('\n');

//  s=trim(s);
//  //if (s!=null){
//  //  println(s);
//    //int values[]=int(split(s,','));

//    //if (values.length==2){
//    //  //xPos=(int)map(values[0],0,1023,0, width);
//    //  yPos=(int)map(values[1],0,1023,0, height);
//   // }
//  //}
//  //myPort.write(int(onOff)+","+int(onOff2)+"\n");

//}


//////////////////////////////////////////////

//int left = 0;
//int right = 0;
int brightness;

void setup() {
 Serial.begin(9600);
 Serial.println("0");
 pinMode(3, OUTPUT);
 //  pinMode(5, OUTPUT);
}

void loop() {
 while (Serial.available()) {
   brightness = Serial.parseInt();
   //left = Serial.parseInt();
   if (Serial.read() == '\n') {
     analogWrite(3, brightness);
     //digitalWrite(5, left);
     //      int sensor = analogRead(A0);
     //      delay(1);
     //      int sensor2 = analogRead(A1);
     //      delay(1);
     //      Serial.print(sensor);
     //      Serial.print(',');
     //      Serial.println(sensor2);
   }
 }
}

EXERCISE 3

int onoff;
void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(5, OUTPUT);
}
void loop() {
  while (Serial.available()) {
    onoff = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(5, onoff);
      int sensor = analogRead(A0);
      delay(1);
      Serial.println(sensor);
    }
  }
}


/////////////////////////////////////////////////////////////

import processing.serial.*;
Serial myPort;
PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
float windcontrolled;
boolean onoff = false;
void setup() {
  size(640,360);
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
  
  //port communication
  printArray(Serial.list());
  String portname=Serial.list()[4];
  println(portname);
  myPort = new Serial(this,portname,9600);
}
void draw() {
  background(255);
  if (!keyPressed){
    wind.x=windcontrolled;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
  }
  if (position.y >= height-mass) {
      onoff = true;
  }
  else{
    onoff=false;
  }
  
}
void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    int value = parseInt(s);
    windcontrolled = map(value,0,1023,-1, 1);
  }
  myPort.write(int(onoff)+"\n");
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}
void keyPressed(){
  if (keyCode==LEFT){
    wind.x=-1;
  }
  if (keyCode==RIGHT){
    wind.x=1;
  }
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}

VIDEO OF EXERCISE 3: 

 

In class exercises

Exercise 1:

Arduino Code:

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

Processing code:

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[2];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);

  ellipse(xPos,yPos,30,30);
  
  if (mousePressed){
    if(mouseX<=width/2)
      onOff2=true;
    else
      onOff=true;
  }else{
    onOff=onOff2=false;
  }
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
      //yPos=(int)map(values[1],0,1023,0, height);
        yPos=height/2;
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}

Exercise 2:

Arduino code:

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      analogWrite(3, right);
      analogWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

 

Processing code:

import processing.serial.*;
Serial myPort;
int xPos=0;
int yPos=0;
int onOff=0;
int onOff2=0;
int brightness=0;

void setup() {
  size(960, 720);
  printArray(Serial.list());
  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw() {
  background(255);
  brightness=int(map(mouseY, 0, height, 0, 255));
  ellipse(xPos, yPos, 30, 30);
  if (mousePressed) {
    if (mouseX<=width/2) {
      onOff2=brightness;
    } else {
      onOff=brightness;
    }
  } else {
    onOff=onOff2=0;
  }
}

void serialEvent(Serial myPort) {
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null) {
    println(s);
    int values[]=int(split(s, ','));
    if (values.length==2) {
      xPos=(int)map(values[0], 0, 1023, 0, width);
      //yPos=(int)map(values[1],0,1023,0, height);
      yPos=mouseY;
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}

 

Exercise 3:

Arduino code:

const int wind = A0;
const int brightness = 3;
int onOff = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0");


}

void loop() {
  while (Serial.available()) {
    onOff = Serial.parseInt();
    if (Serial.read() == '\n') {
      int sensor = analogRead(wind);
      delay(1);
      Serial.println(sensor);
      if (onOff == 1) {
        analogWrite(brightness, 255);
      } else {
        analogWrite(brightness, 0);
      }
    }
  }
}

 

Processing code:

import processing.serial.*;
Serial myPort;

PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;


int pos;
int prevPos = 0;
boolean Right = true;
int maxPos;

void setup() {
  size(640, 360);
  noFill();
  printArray(Serial.list());
  String portname=Serial.list()[2]; 
  myPort = new Serial(this, portname, 9600);
  myPort.clear();
  myPort.bufferUntil('\n');
  


  velocity = new PVector(0, 0);
    position = new PVector(width/2, 0);
  acceleration = new PVector(0, 0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0, 0);
  hDampening=map(mass, 15, 80, .98, .96);
  maxPos = (int)map(1023, 0, 1023, 0, width*.01);
 
}

void draw() {
  background(255);
  if (!keyPressed) {
    if (prevPos < pos) {
     Right = true;
    } else if (prevPos > pos) {
Right = false;
    }
    if (!Right) {
      wind.x = -(maxPos-pos);
    } else {
      wind.x = pos;
    }
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x, position.y, mass, mass);
  if (position.y > height-mass/2) {
    velocity.y *= -0.9;  // A little dampening when hitting the bottom
    position.y = height-mass/2;
  }
  prevPos = pos;
}

void applyForce(PVector force) {
 
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed() {
  if (keyCode==LEFT) {
    wind.x=-1;
  }
  if (keyCode==RIGHT) {
    wind.x=1;
  }
  if (key==' ') {
    mass=random(15, 80);
    position.y=-mass;
    velocity.mult(0);
  }
}

void serialEvent(Serial myPort) {
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null) {
    int value = int(s);
    pos = (int)map(value, 0, 1023, 0, width*.01);
  }
  if (round(velocity.y) < 0) {
    myPort.write(1 + "\n");
  } else {
    myPort.write(0 + "\n");
  }
}

Serial Communication Exercises

EXERCISE # 1

//Arduino:

int left = 0;
int right = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("0,0");
  pinMode(2, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    right = Serial.parseInt();
    left = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(2, right);
      digitalWrite(5, left);
      int sensor = analogRead(A0);
      delay(1);
      int sensor2 = analogRead(A1);
      delay(1);
      Serial.print(sensor);
      Serial.print(',');
      Serial.println(sensor2);
    }
  }
}

/*Processing :

import processing.serial.*;
Serial myPort;
int xPos=0;
boolean onOff=false;
boolean onOff2=false;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(xPos,height/2,30,30);
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    println(s);
    int values[]=int(split(s,','));
    if (values.length==2){
      xPos=(int)map(values[0],0,1023,0, width);
    }
  }
  myPort.write(int(onOff)+","+int(onOff2)+"\n");
}
*/

 

EXERCISE # 2

//Arduino:

int brightness;

void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(3, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    brightness = Serial.parseInt();
    if (Serial.read() == '\n') {
      analogWrite(3, brightness);
    }
  }
}



/*
Processing:
import processing.serial.*;
Serial myPort;
int yPos=0;
float brightness;

void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this,portname,9600);
  myPort.clear();
  myPort.bufferUntil('\n');
}

void draw(){
  background(255);
  ellipse(width/2,mouseY,30,30);
  brightness = map(mouseY,0,height,0,255);
  myPort.write(int(brightness)+ "\n");
}


*/

 

EXERCISE # 3

//Arduino

int onoff;

void setup() {
  Serial.begin(9600);
  Serial.println("0");
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    onoff = Serial.parseInt();
    if (Serial.read() == '\n') {
      digitalWrite(5, onoff);
      int sensor = analogRead(A0);
      delay(1);
      Serial.println(sensor);
    }
  }
}


/*
Processing

import processing.serial.*;
Serial myPort;
PVector velocity;
PVector gravity;
PVector position;
PVector acceleration;
PVector wind;
float drag = 0.99;
float mass = 50;
float hDampening;
float windcontrolled;
boolean onoff = false;

void setup() {
  size(640,360);
  noFill();
  position = new PVector(width/2, 0);
  velocity = new PVector(0,0);
  acceleration = new PVector(0,0);
  gravity = new PVector(0, 0.5*mass);
  wind = new PVector(0,0);
  hDampening=map(mass,15,80,.98,.96);
  
  //port communication
  printArray(Serial.list());
  String portname=Serial.list()[0];
  println(portname);
  myPort = new Serial(this,portname,9600);
}

void draw() {
  background(255);
  if (!keyPressed){
    wind.x=windcontrolled;
    velocity.x*=hDampening;
  }
  applyForce(wind);
  applyForce(gravity);
  velocity.add(acceleration);
  velocity.mult(drag);
  position.add(velocity);
  acceleration.mult(0);
  ellipse(position.x,position.y,mass,mass);
  if (position.y > height-mass/2) {
      velocity.y *= -0.9;  // A little dampening when hitting the bottom
      position.y = height-mass/2;
  }
  if (position.y >= height-mass) {
      onoff = true;
  }
  else{
    onoff=false;
  }
  
}

void serialEvent(Serial myPort){
  String s=myPort.readStringUntil('\n');
  s=trim(s);
  if (s!=null){
    int value = parseInt(s);
    windcontrolled = map(value,0,1023,-1, 1);
  }
  myPort.write(int(onoff)+"\n");
}
  
void applyForce(PVector force){
  // Newton's 2nd law: F = M * A
  // or A = F / M
  PVector f = PVector.div(force, mass);
  acceleration.add(f);
}

void keyPressed(){
  if (keyCode==LEFT){
    wind.x=-1;
  }
  if (keyCode==RIGHT){
    wind.x=1;
  }
  if (key==' '){
    mass=random(15,80);
    position.y=-mass;
    velocity.mult(0);
  }
}
*/

 

EXERCISE # 3 VIDEO