serial communication exercises [week 11]

Exercise 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:

const int knobLed = A0; //sign up variable
 
void setup() {
  Serial.begin(9600); //set the baud rate
  Serial.println("0"); //start of the handshake, start the call-response pattern
  pinMode(A0, INPUT);
}
 
void loop() {
  while (Serial.available()) { //whenever there is anything available in serial buffer, do
    if (Serial.read() == '\n') { //whenever there is new line, it means that all info came correctly
      int sensor = analogRead(knobLed); //read from potentiometer
      delay(1);
      Serial.println(sensor); //send info to the processing
    }
  }
}

Processing:

import processing.serial.*; //import library
Serial myPort; //create serial object
int xPos=0; 
int yPos;
 
void setup() {
  size(960, 720);
  yPos=height/2;
  printArray(Serial.list()); //printing array
  String portname=Serial.list()[1]; //choose the correct port number!
  println(portname);
  myPort = new Serial(this, portname, 9600); //set the baud rate
  myPort.clear(); //clear the buffer
  myPort.bufferUntil('\n'); //wait until new line
}
 
void draw() {
  background(255);
  ellipse(xPos, yPos, 30, 30);
}
 
void serialEvent(Serial myPort) { //whenever receives incoming serial message, this function is called 
  String s=myPort.readStringUntil('\n'); //read the string until new line character
  s=trim(s); //safeguard to trim extra characters (whitespaces)
  if (s!=null) { //check to make sure it's not null
    println(s); 
    int value = int(s);  //sending value s
    xPos=(int)map(value, 0, 1023, 0, width); 
  }
  myPort.write("\n"); //other side of the handshake, send back over to arduino
}

Exercise 2: make something that controls the LED brightness from processing;

Arduino:

float brightness;

void setup() {
  Serial.begin(9600); //set the baud rate
  Serial.println("0"); //start the handshake
  pinMode(5, OUTPUT);
}

void loop() {
  while (Serial.available()) {
    brightness = Serial.parseFloat(); //receive brightness info in a string from processing
    if (Serial.read() == '\n') { //whenever there is new line, it means that all info came correctly
       analogWrite(5, brightness); //change the brightness of LED accordingly
       Serial.print("\n"); //send  new line to processing
    }
  }
}

Processing:

import processing.serial.*;
Serial myPort; //create serial object
float brightness; //variable to send to arduino
 
void setup(){
  size(960,720);
  printArray(Serial.list());
  String portname=Serial.list()[1]; //choose the correct port number!
  println(portname);
  myPort = new Serial(this,portname,9600); //set the baud rate
  myPort.clear(); //clear the buffer
  myPort.bufferUntil('\n'); //wait until new line
}

void draw(){
  background(255);
  ellipse(mouseX,mouseY,30,30);
  brightness = map(height-mouseY, 0, height, 0, 255); 
}

void serialEvent(Serial myPort){ //whenever receives incoming serial message, this function is called 
  println(brightness); 
  myPort.write(int(brightness)+"\n"); //other side of the handshake, send back over to arduino
}

Exercise 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;

Arduino:

const int knobLed = A0;
const int led1 = 3;
int onOff = 0;

void setup() {
  Serial.begin(9600); //set the baud rate
  Serial.println("0"); //start the handshake
}

void loop() {
  while (Serial.available()) {
    onOff = Serial.parseInt(); //receive onOff info from processing
    if (Serial.read() == '\n') { //whenever there is new line, it means that all info came correctly
      int sensor = analogRead(knobLed); //read from potentiometer
      delay(1);
      Serial.println(sensor); //send info to processing
            if (onOff == 1) { 
              analogWrite(led1, 255);//turn on LED
            } else {
              analogWrite(led1, 0); //turn off LED
            }
    }
  }
}

Processing:

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

import processing.serial.*;
Serial myPort; //create serial object
int knob;

void setup() {
  size(640,360);
  noFill();
  position = new PVector(0, 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()[1]; //choose the correct port number!
  myPort = new Serial(this,portname,9600); //set the baud rate
  myPort.clear(); //clear the buffer
  myPort.bufferUntil('\n'); //wait until new line
}

void draw() {
  background(255);
  if (!keyPressed){
    wind.x=knob;
    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;
    }
}
  
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);
  }
}

void serialEvent(Serial myPort){ //whenever receives incoming serial message, this function is called 
  String s=myPort.readStringUntil('\n');  //read the string until new line character
  s=trim(s);  //safeguard to trim extra characters (whitespaces)
  if (s!=null){ //check to make sure it's not null
    println(s);
    int values[]=int(split(s,',')); //sending value s
    knob=(int)map(values[0],0,1023,0, width*.01);
  }
  if (round(velocity.y) < 0) {
    myPort.write(1 + "\n");
  } else {
    myPort.write(0 + "\n");
  }
}

Video:

Leave a Reply