음악에 반응하는 LED 콜라병

by 조혜인 | 2017-02-23 19:23
coaster LED 음악 인터랙티브 컵받침 필립스


요즘 혼술족, 혼밥족이 늘어나면서 인테리어 소품으로 LED 컵받침이 인기가 많습니다. 대표적으로 필립스의 LED 컵받침(PHILIPS COLOR CHANGING LED DRINK COASTERS)이 있습니다. 국내에서 10만원 가량에 판매하고 있습니다. 각도를 기울일 때 마다 여러가지 색상으로 바뀌며, 10시간 충전 시 6시간 이용이 가능하다고 합니다.



(출처 HiConcumption)


목소리나 음악에 반응하는 아이템이 있다면 어떨까요? 이 프로젝트는 음악에 반응하는 인터랙티브 LED 설치물을 만드는 방법을 소개합니다.(Arduino & Neopixel Coke Bottle Party Light) 간단한 만들기로 혼자만의 시간을 더 재미있게 즐겨보세요.





1. 준비물

- 아두이노 우노 보드
- 12pixel NEOPIXEL
- 1000 µf 6.3v 커패시터
- 300~500ohm 저항
- 우드 (네오픽셀을 박고, 콜라병을 올릴 수 있는 원형 형태면 어떤 것이든 가능)
- 9v wall wart
- 40mm 송곳
- 볼트, 너트 ,워셔, 서페이서
- 전선
- 납땜 도구
- 브레드보드
- 아두이노를 담을 플라스틱박스
- 스위치
- 마이크 (AdaFruit MAX9184)














2. 만드는 과정

STEP 1. 밑판 만들기

제가 소개하는 인스트럭터블스에서는 집에 있는 우드를 활용해 밑판을 만들었습니다. 저는 레이저컷으로 만들 예정입니다.





STEP 2. 네오픽셀 링(Ring) 준비하기

네오픽셀에 납땜을 해 전선을 연결합니다. 회로도는 아래와 같습니다. 아두이노와 커패시터, 마이크, LED를 적절하게 연결해 줍니다.






STEP 4. 소스코드 업로드 하기

소스코드를 업로드 합니다.

// Sound activated LEDs with the Trinket and NeoPixels

#include <Adafruit_NeoPixel.h>

#define MIC_PIN 1 // Microphone is attached to pin 2 A1 on the Trinket
#define LED_PIN 0 // NeoPixel LED strand attached to pin 0 on Trinket
#define N_PIXELS 4 // number of pixels in LED strand
#define N 100 // Number of samples to take each time readSamples is called
#define fadeDelay 5 // delay time for each fade amount
#define noiseLevel 10 // slope level of average mic noise without sound

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int samples[N]; // storage for a sample collection set
int periodFactor = 0; // keep track of number of ms for period calculation
int t1 = -1; // times of slope > 100 detected.
int T; // period between times scaled to milliseconds
int slope; // the slope of two collected data sample points
byte periodChanged = 0;

// Arduino setup Method
void setup()
{
strip.begin();
ledsOff();
delay(500);

displayColor(Wheel(100));
strip.show();
delay(500);
}

// Arduino loop Method
void loop()
{
readSamples();
}


// Read and Process Sample Data from Mic
void readSamples()
{
for (int i = 0; i < N; i++)
{
samples[i] = analogRead(MIC_PIN);

if (i > 0)
{
slope = samples[i] - samples[i - 1];
}
else
{
slope = samples[i] - samples[N - 1];
}

// Check if Slope greater than noiseLevel - sound that is not at noise level detected
if (abs(slope) > noiseLevel)
{
if (slope < 0)
{
calculatePeriod(i);

if (periodChanged == 1)
{
displayColor(getColor(T));
}
}
}
else
{
ledsOff();
}

periodFactor += 1;
delay(1);
}
}

void calculatePeriod(int i)
{
if (t1 == -1)
{
// t1 has not been set
t1 = i;
}
else
{
// t1 was set so calc period
int period = periodFactor * (i - t1);
periodChanged = T == period ? 0 : 1;
T = period;
//Serial.println(T);

// reset t1 to new i value
t1 = i;
periodFactor = 0;
}
}

uint32_t getColor(int period)
{
if (period == -1)
return Wheel(0);
else if (period > 400)
return Wheel(5);
else
return Wheel(map(-1 * period, -400, -1, 50, 255));
}


void fadeOut()
{
for (int i = 0; i < 5; i++)
{
strip.setBrightness(110 - i * 20);
strip.show(); // Update strip
delay(fadeDelay);
periodFactor += fadeDelay;
}
}

void fadeIn()
{

strip.setBrightness(100);
strip.show(); // Update strip

// fade color in
for (int i = 0; i < 5; i++)
{
//strip.setBrightness(20*i + 30);
//strip.show(); // Update strip
delay(fadeDelay);
periodFactor += fadeDelay;
}
}

void ledsOff()
{
fadeOut();

for (int i = 0; i < N_PIXELS; i++)
{
strip.setPixelColor(i, 0, 0, 0);
}
}

void displayColor(uint32_t color)
{

for (int i = 0; i < N_PIXELS; i++)
{
strip.setPixelColor(i, color);
}

fadeIn();
}

// Input a value 0 to 255 to get a color value.
// The colors are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos)
{
if (WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}













































































































































































STEP 5. 우드와 회로, 콜라병 합치기

작업한 우드와, 회로, 콜라병을 적절하게 조합합니다.



3. 마무리

작동하는 모습입니다. 아름답네요! 양산화 하기 좋게 따라 만들어 보면 좋겠습니다.
콜라병 개수나 용도 등을 바꿔서 다른 목적으로 응용하기 좋은 아이템인 것 같습니다.  




댓글 1

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어
음악에 반응하는 LED 콜라병현재글