프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

Music Visualizer 꽃병 만들기

2014-09-22 10:35:05

개요

개요

사람의 감각은 오감이라 해서 청각, 시각, 후각, 미각, 촉각이 있다. 이 중에서 청각과 시각을 이용하여 소리를 시각화 해보자.



사운드 센서를 이용하면 소리를 수치값으로 받아 여러 형태로 가공이 가능하다. 
이번 프로젝트에서는 소리를 7SMD RGB LED과 결합하여 소리크기에 따라 색이 깜빡거리면서 변하는 꽃병을 만들어 보자.
소리의 변화가 없더라도 자동으로 RGB로 변화하기 때문에 그 자체로도 보기 이쁜 장식품이 될 수 있다.



이번 프로젝트에서 꽃병은 일반 분리수거통에서 쉽게 구할 수 있는 유리병으로 대체하여 제작하였다. 
밍밍한 일반 유리병이 위 사진처럼 이쁘게 빛날 수 있음을 기대하며 만들어 보자. 정말 쉽게 제작이 가능한 프로젝트이다.



동영상



필요한 사전 지식

7SMD RGB LED
사운드 센서

부품 목록

NO 부품명 수량 상세설명
1 아두이노 우노 1 아두이노
2 7SMD RGB LED 2 DFRobot
3 사운드 센서 1  
4 유리병 2  
5 스피커 1  
6 케이블 10-15  

부품명 아두이노 우노 7SMD RGB LED 사운드 센서 유리병 스피커 케이블
부품
사진

하드웨어 making

브레드보드




전자회로도




7 SMD RGB LED는 사진과 같이 병 아래쪽에 부착하면 된다.
빛이 강하기 때문에 유리와 물을 투과하게 하여 은은한 색감이 나올 수 있게 한다.



소프트웨어 coding

const int Soundsensor = A0; //사운드 센서 핀번호
const int sensitivity = 684; //사운드 센서 감도(초기값)

int prevVal = 0;
int sensorstate = 0;
int val = 0;

//7SMD RGB LED 핀번호 int B_1 = 3; int G_1 = 5; int R_1 = 6; int B = 9; int G = 10; int R = 11; void setup() {
//핀모드 설정 pinMode(Soundsensor, INPUT); for(int i=9;i<12;i++) pinMode(i,OUTPUT); pinMode(B_1,OUTPUT); pinMode(G_1,OUTPUT); pinMode(R_1,OUTPUT);
//시리얼통신 초기화 Serial.begin(9600); } void loop() {
//하나의 7 SMD RGB LED는 파란색에서 빨간색으로 변환
//다른 하나의 7 SMD RGB LED는 녹색에서 파란색으로 변환 for(int i = 0; i < 255; i++) { sensorstate = analogRead(Soundsensor)-sensitivity; measureSoundValue(sensorstate, prevVal); Serial.println(val);
//사운드센서에서 값이 측정될 경우 녹색 LED의 밝기값이 변화 analogWrite(B,255-i); analogWrite(R,i); blinkLED(G,val);
//다른 하나는 파란 LED의 밝기값이 변화 analogWrite(B_1,i); blinkLED(R_1,val); analogWrite(G_1,255-i); val = 0; prevVal = sensorstate; delay(50); }
//하나의 7 SMD RGB LED는 빨간색에서 녹색으로 변환
//다른 하나의 7 SMD RGB LED는 파란색에서 빨간색으로 변환 for(int i = 0; i < 255; i++) { sensorstate = analogRead(Soundsensor)-sensitivity; measureSoundValue(sensorstate, prevVal); Serial.println(val); //사운드센서에서 값이 측정될 경우 파란 LED의 밝기값이 변화 blinkLED(B,val); analogWrite(R,255-i); analogWrite(G,i); //다른 하나는 녹색 LED 밝기값이 변화 analogWrite(B_1,255-i); analogWrite(R_1,i); blinkLED(G_1,val); prevVal = sensorstate; val = 0; delay(50); }
//하나의 7 SMD RGB LED는 녹색에서 파란색으로 변환
//다른 하나의 7SMD RGB LED는 빨간색에서 녹색으로 변환 for(int i = 0; i < 255; i++) { sensorstate = analogRead(Soundsensor)-sensitivity; measureSoundValue(sensorstate, prevVal); Serial.println(val); //사운드센서에서 값이 측정될 경우 빨간 LED의 밝기값이 변화 analogWrite(B,i); blinkLED(R,val); analogWrite(G,255-i); //다른 하나는 파란 LED의 밝기값이 변화 blinkLED(B_1,val); analogWrite(R_1,255-i); analogWrite(G_1,i); prevVal = sensorstate; val = 0; delay(50); } delay(10); }
//사운드센서의 측정값에 따라 7 SMD RGB LED의 특정 LED를 깜빡거리게 하는 함수 void blinkLED(int pinNum ,int brightness) { analogWrite(pinNum, brightness); analogWrite(pinNum, 0); analogWrite(pinNum, brightness); }
//사운드센서가 측정하는 값에 크기에 따라 LED의 수치를 임의적으로 조절하는 함수 void measureSoundValue(int sensorstate, int prevVal) { if(abs(sensorstate - prevVal) > 31 ) val = 240; else if(abs(sensorstate - prevVal) > 28 ) val = 210; else if(abs(sensorstate - prevVal) > 25 ) val = 180; else if(abs(sensorstate - prevVal) > 22 ) val = 150; else if(abs(sensorstate - prevVal) > 19 ) val = 120; else if(abs(sensorstate - prevVal) > 16 ) val = 90; else if(abs(sensorstate - prevVal) > 13 ) val = 60; else if(abs(sensorstate - prevVal) > 10 ) val = 30; else if(abs(sensorstate - prevVal) > 7 ) val = 0; }
7 SMD RGB LED는 핀이 일반 3색 LED처럼 RGB따로 연결되어 있기 때문에 RGB의 값들을 각각 지정해서 색상을 바꾸게 된다.
loop에서는 크게 3개의 for문을 통해 7 SMD RGB LED를 빨강, 초록, 파랑 순으로 변환하게 된다.
for문에서는 1부터 255까지의 값을 특정 LED의 밝기값으로 지정하여 빨간 LED의 밝기값은 서서히 0부터 255까지 증가시키고 녹색 LED의 밝기값은 255부터 0까지 감소시키는 방법으로 RGB의 비율을 조절하여 색상을 바꾸게 된다.

analogWrite(B,255-i); 
analogWrite(R,i);
blinkLED(G,val);
위와 같은 경우에는 BlueLED는 i가 0일때 초기값이 255였기 때문에 7 SMD RGB LED는 처음에 파란색으로 나타난다. 하지만 for문이 돌아갈수록 i값은 점점 증가하기 때문에 BlueLED의 밝기는 점점 줄어들게 되고, 반면에 RedLED는 밝기값이 점점 증가하게 된다. 결국 for문을 255번 다 돌게 되면 BlueLED의 밝기는 255-255 = 0이 되고 RedLED의 밝기값은 255가 되어 7 SMD RGB LED는 파란색에서 빨간색으로 자연스럽게 변하게 된다.

이때 색상이 변할때 관여하는 BlueLED와 RedLED를 뺀 나머지 GreenLED는 사운드 센서가 측정하는 값에 맞추어서 그 밝기값이 변하게 된다. 
파랑에서 빨강으로 변할때는 초록색이 사운드센서값에 따라 밝기값이 변하고 빨강에서 초록으로 변할때는 파란색이 사운스센서값에 따라 밝기 변하게 된다.

void measureSoundValue(int sensorstate, int prevVal) {
  if(abs(sensorstate - prevVal) > 31 ) 
    val = 240;
  else if(abs(sensorstate - prevVal) > 28 )    
    val = 210;
  else if(abs(sensorstate - prevVal) > 25 )    
    val = 180;
  else if(abs(sensorstate - prevVal) > 22 )    
    val = 150;
  else if(abs(sensorstate - prevVal) > 19 )    
    val = 120;
  else if(abs(sensorstate - prevVal) > 16 )    
    val = 90;
  else if(abs(sensorstate - prevVal) > 13 )    
    val = 60;
  else if(abs(sensorstate - prevVal) > 10 )    
    val = 30;
  else if(abs(sensorstate - prevVal) > 7 )
    val = 0;
}
사운드센서는 크기에 따라 값이 변하게 되는데 구간별로 값을 나누어서 특정 밝기값을 보내게 따로 함수를 지정하여 만들었다.
그 전에 측정한 값과 현재 사운드 센서가 측정한 값을 비교하여 그 크기가 클 경우 LED의 밝기를 더 크게 변화시키는 방법으로 하였다. 
사운드센서가 전제 측정한 값이 10이고 지금 측정한 값이 25라고 한다면 값의 차이는 15이기 때문에 위 조건에 맞추어서 LED의 밝기는 60만큼 변하여 깜빡거리게 된다.

사운드 센서의 감도는 사용자가 센서에 달려있는 가변저항값을 조절하여 맞춰줘야 한다.

수박쨈

아두이노, 7 SMD RGB LED, 사운드센서