2017년 12월 10일 일요일

아두이노와 프로세싱 연동: 가변저항으로 프로세싱 색상제어


아두이노와 프로세싱을 연동하는 프로젝트로서, 아두이노의 가변저항을 조절하여 프로세싱의 rect의 색상을 조절해봅니다. 과정은 간단합니다. 

1. 아두이노보드에 가변저항을 연결합니다. 가변저항의 세 단자에 GND, 5V, 그리고 A0(아날로그 입력)을 연결해 줍니다. (* 연결방법은 아래 포스트를 참조합니다.)

2. 아두이노 코드를 작성합니다.

3. 아두이노 프로그램에 시리얼 모니터(돋보기 아이콘)를 열어서 가변저항을 돌림에 따라 변하는 값이 제대로 출력되는지 확인합니다.

4. 프로세싱 코드를 작성합니다. 

5. 가변저항 연결 및 두 프로그램에 코드작성이 끝나면, 먼저 아두이노 업로드->프로세싱 play 순서로 작동해 봅니다. (연동시 아두이노 시리얼 모니터는 닫아줍니다) 



아두이노 코드 
-------------------------------------------------------------------------


int pot = A0; // 아날로그 핀 설정 

void setup() 
{
  Serial.begin(9600); //시리얼 통신을 시작한다.(기본 통신속도 9600)
}
void loop() 
{
  int val = map(analogRead(pot),0,1023,0,255);

//아날로그 입력값(A0)를 읽기 위해 analogRead 를 사용하고, 
//읽어들인 값을 변수 val에 전달한다. 
//map함수는 지난시간에 analogRead값을 4로 나누어 아날로그 입력값(0~1023)과 
//아날로그 출력값(0~255)의 범위를 맞춰주는 것과 같은 역할을 한다.

  Serial.println(val); // 값을 시리얼 모니터에 출력해준다. 
  delay(70);          //아두이노와 프로세싱이 연동되는 속도가 50이므로 
                        //이보다 빠르게 하면 작동을 하지 않으므로반드시 50이상으로 할 것
}


프로세싱 코드
--------------------------------------------------------------------

import processing.serial.*;  // 시리얼통신을 위해 프로세싱의 라이브러리를 불러온다. 
Serial port; 

float brightness=0; // 가변저항 값을 저장하는 변수 선언(실수형 float 변수)

void setup()
{
  size(800,500);
  
  port=new Serial(this,"COM4", 9600);  //시리얼 통신을 위한 객체 생성
                                                  //(각자 연결된 포트넘버를 쓰세요)

  port.bufferUntil('\n'); //줄바꿈('\n')이 나오기 전 까지 시리얼 통신 유지
}

void draw()
{
  fill(brightness,100,0); //가변저항에 의한 값을 R 값으로 하는 rect
  rect(100,100,250,250);

  fill(0,brightness,100);//가변저항에 의한 값을 G값으로 하는 rect
  rect(450,100,250,250);
}
void serialEvent(Serial port) //아두이노로 부터 값(데이터)가 들어올때마다 수행되는 함수
{

  brightness=float(port.readStringUntil('\n'));  //줄바꿈 전까지 데이터 읽음 
  println(brightness); //아두이노로 부터 받은 가변저항에 의한 값을 
                           //프로세싱 하단 창에 출력 
}

---------------------------------------------------------------------------------------------
구동테스트를 하여 촬영을 했으니 참고로 하세요. 

가변저항을 돌림에 따라 변하는 사각형의 색상

아두이노로 부터 프로세싱으로 가변저항에 의한 값을 받아 창에 출력하기 

2017년 12월 6일 수요일

아두이노, 프로세싱 연동

http://duco777.blog.me/176441873

가변저항으로 LED제어





int LED = 11; //LED를 11번핀에 연결

void setup (){
 Serial.begin(9600);
 pinMode(LED,OUTPUT); //11번 핀의 모드를 OUTPUT으로 설정해 줍니다
}
void loop(){
 int val = analogRead(A5)/4; // 가변저항을 아날로그 A5에 연결하고 이를 'val'에 저장

 Serial.println(val); // 시리얼 모니터로 가변저항 값을 출력
 analogWrite(LED, val); // 가변저항의 값을 LED(11번핀)로 보내 출력
}



아두이노 가변저항(potentiometer)



가변저항은 이름처럼 정해진 저항 값 내에서 저항 값을 바꿀 수 있는 저항을 말한다. 
주로 세 개의 핀으로 이루어져 있으며, 양쪽 핀은 각각 5V(전원의 +부분), 0V(전원의 -부분)이고
중간 핀은 저항 값이 변화함에 따라 변화하는 전압 값을 출력한다.
오늘은 이 가변저항으로 LED의 밝기를 조절해보려고 합니다.

가변저항으로 LED를 제어하기에 앞서 
일단 가변저항의 값을 시리얼모니터를 통해서 확인해본다. 

가변저항의 전압 값을 읽기 위해 아날로그 입력 핀(A0)을 사용한다.
이때 아날로그 입력 핀은 0-5V의 값을 0-1023으로 나타내준다. 

일단 정말로 아날로그 입력 핀의 값이 가변저항에 의해 변화하는 0-5V의 값을 0-1023으로 바꿔주는지 
시리얼모니터를 통해서 확인해보자. 


int pot = A0; // 아날로그 핀 설정 
void setup() 
{
  Serial.begin(9600); //시리얼 통신을 시작한다.(기본 통신속도 9600)
}
void loop() 
{
  int val = analogRead(pot);//아날로그 입력값(A0)를 읽기 위해 analogRead 를 사용하고 
                                    //읽어들인 값을 변수 val에 전달한다. 

  Serial.println(val); // 값을 시리얼 모니터에 출력해준다. 
  delay(800);
}




가변저항을 한 쪽으로 완전히 돌리면 값이 0V나 5V이며,
그러면 아날로그 입력 핀으로 읽어지는 값은 0 아니면 1023 일 것이다. 

https://www.youtube.com/watch?v=4vVjG8OK1fU

2017년 4월 26일 수요일

수업자료_blend() function using SUBTRACT argument in loops sketch

size(832,624);

background(loadImage("01.jpg"));
PImage img=loadImage("02.jpg");

int w=width/6;
int h=height/8;


for(int i=0; i<width; i+=w){
  for(int j=0; j<height; j+=h){
    blend(img,0,0,width,height,i,j,w,h,SUBTRACT);
  }
}

수업자료_image tiling

size(650,450);

PImage img=loadImage("02.jpg");
int cols=8;
int rows=8;
int w=width/cols;
int h=h=height/rows;
for(int i=0; i<height; i+=h){
  for(int j=0; j<width; j+=w){
    image(img,j,i,w,h);
  }
}



수업자료_filter_dart,lighr,sub

size(832,624);
background(loadImage("01.jpg"));
PImage img=loadImage("02.jpg");


blend(img,0,0,832,624,0,0,832,624,DARKEST);
blend(img,0,0,832,624,0,0,832,624,LIGHTEST);
blend(img,0,0,832,624,0,0,832,624,SUBTRACT);





수업자료_filter_posterize

size(1500,300);
background(255);
PImage img=loadImage("01.jpg");
image(img,0,0);

int cols=5;
int w=width/cols;
int h=height;

int[]vals={2,4,8,16,32};

for(int i=0; i<cols; i++){
  image(img,i*w,0,w,h);

  filter(POSTERIZE,vals[i]);

}

수업자료_filter(BLUR)

size(500,500);
background(255);
PImage img=loadImage("01.jpg");
image(img,0,0);
filter(BLUR,10);




수업자료_filter_threshold


size(800,200);

PImage img=loadImage("01.jpg");
float thresholdLevel=1.0;

for(int i=0; i<4; i++){
  image(img,200*i,0,200,200);
  filter(THRESHOLD,thresholdLevel);
  thresholdLevel-=0.25;
}
 
 
 

수업자료_filter(INVERT)

size(600,400);
background(255);
PImage img=loadImage("01.jpg");
image(img,0,0);
filter(INVERT);

수업자료_invert

size(600,400);
background(255);
PImage img=loadImage("01.jpg");
image(img,0,0);

loadPixels();
for(int i=0; i<(width*height); i++){
  int r=abs(int(red(pixels[i]))-255);
  int g=abs(int(green(pixels[i]))-255);
  int b=abs(int(blue(pixels[i]))-255);
  int a=int(alpha(pixels[i]));
 
  pixels[i]=color(r,g,b,a);
}
updatePixels();



2017년 4월 19일 수요일

수업자료_frameRate

void setup() {
  frameRate(4);
}
int pos = 0;
void draw() {
  background(204);
  pos++;
  line(pos, 20, pos, 80);
  if (pos > width) {
    pos = 0;
  }
}
---------------------------------------

import processing.video.*;
Movie myMovie;

void setup() {
  size(200, 200);
  frameRate(30);
  myMovie = new Movie(this, "totoro.mov");
  myMovie.frameRate(2);
  myMovie.loop();
}

void draw() {
  if (myMovie.available()) {
    myMovie.read();
  }
  image(myMovie, 0, 0);
}

수업자료_대소문자 키 입력



h AND H

void setup() {
size(500,500);
}

void draw() {
 

  if ((key =='h' || key=='H')) {
    fill(255,0,0);
  } else {
    fill(255);
  }
  rect(50, 50, 150, 150);

}

예제_easing을 이용해서 부드러운 선 그리기


easing을 이용해서 부드러운 선 그리기
















float x;
float y;
float px;
float py;
float easing = 0.05;

void setup() {
  size(640, 360);
  smooth();
  stroke(0,120);
}

void draw() {
 
  float targetX = mouseX;
  float dx = targetX - x;
  x += dx * easing;
 
  float targetY = mouseY;
  float dy = targetY - y;
  y += dy * easing;
 
  float weight=dist(x,y,px,py);
  strokeWeight(weight);
  line(x,y,px,py);
  py=y;
  px=x;
}
 

수업자료_easing



점진적인 변화 easing
변화값을 낮추어 부드럽게 하는 계수


float x;
float y;
float easing = 0.05;

void setup() {
  size(640, 360); 
  noStroke();  
}

void draw() { 
  background(51);
  
  float targetX = mouseX;
  float dx = targetX - x;
  x += dx * easing;
  
  float targetY = mouseY;
  float dy = targetY - y;
  y += dy * easing;
  
  ellipse(x, y, 66, 66);
}

수업자료_Audio Control

import ddf.minim.*;

Minim minim;
AudioPlayer groove;

void setup()
{
  size(512, 200, P2D);

  minim = new Minim(this);
  groove = minim.loadFile("groove.mp3", 2048);
  groove.loop();
}

void draw()
{
  background(0);
 
  stroke(255);
 
  for(int i = 0; i < groove.bufferSize() - 1; i++)
  {
    line(i, 50  + groove.left.get(i)*50,  i+1, 50  + groove.left.get(i+1)*50);
    line(i, 150 + groove.right.get(i)*50, i+1, 150 + groove.right.get(i+1)*50);
  }
}

void keyPressed()
{
  if ( groove.isPlaying() )
  {
    groove.pause();
  }
  else
  {
    // simply call loop again to resume playing from where it was paused
    groove.loop();
  }
}

수업자료_Audio Import

import ddf.minim.*;


Minim minim;//minim이란 이름의 미님을 선언
AudioPlayer groove;//오디오를 재생시킬 플레이어를 선언

void setup()
{
  size(512, 200, P2D);

  minim = new Minim(this); //객체의 생성
  groove = minim.loadFile("groove.mp3", 2048);//파일에서 읽어오기
  groove.play();//사운드 재생
}

void draw()
{
  background(0);

  stroke(255);

  for(int i = 0; i < groove.bufferSize() - 1; i++)
  {
    line(i, 50  + groove.left.get(i)*50,  i+1, 50  + groove.left.get(i+1)*50);
    line(i, 150 + groove.right.get(i)*50, i+1, 150 + groove.right.get(i+1)*50);
  }
}
void stop(){
  groove.close();
  minim.stop();
  super.stop();//
}

//void keyPressed()
//{
//  if ( key == 'l' ) groove.loop();
//}

예제_Video Mapping













지난시간 이미지 매핑과 마찬가지로
비디오를 매핑해보세요.

수업자료_Video Pause


Video Pause

import processing.video.*;

Movie myMovie;

void setup() {

size(200, 200);
background(0); 
myMovie = new Movie(this, "totoro.mov");  myMovie.loop();}
void draw() { 
background(255);  image(myMovie, 0, 0);

}

void movieEvent(Movie m) {

m.read();

}

void mousePressed() {

myMovie.pause();

}

void mouseReleased() {

myMovie.play();

}

수업자료_Video Jump


import processing.video.*;
Movie myMovie;

void setup() {
  size(400, 300);
  frameRate(30);
  myMovie = new Movie(this, "cubist.mov");
  myMovie.loop();
}

void draw() {
  if (myMovie.available()) {
    myMovie.read();
  }
  image(myMovie, 0, 0);
}

void mousePressed() {
  myMovie.jump(random(myMovie.duration()));
}

2017년 4월 13일 목요일

수업자료_Video Import


비디오파일 불러오기 video_import


import processing.video.*;     //video library

Movie movie;

void setup() {
  size(640, 360);
  background(0);

 
  movie = new Movie(this, "cubist.mov");  // Load and play the video
  movie.play();              //한번만 플레이
  //movie.loop();           //반복 플레이
}

void movieEvent(Movie m) {
  m.read();
}

void draw() {
  image(movie, 0, 0, width, height);
}

2017년 4월 12일 수요일

아두이노와 프로세싱 연동: 가변저항으로 프로세싱 색상제어

아두이노와 프로세싱을 연동하는 프로젝트로서, 아두이노의 가변저항을 조절하여 프로세싱의 rect의 색상을 조절해봅니다. 과정은 간단합니다.  1. 아두이노보드에 가변저항을 연결합니다. 가변저항의 세 단자에 GND, 5V, 그리고 A0(아날로...