음악에 맞추는 네오픽셀 램프를 만들어 보자

by 하민정 | 2017-01-12 12:46
neopixel 네오픽셀 디지털아트 아두이노 음악에반응하는 조명만들기

재료

  • 조명 캡 1개
  • 0.10 uF 축전기 1개
  • 아두이노 우노 1개
  • 전기 마이크 1개
  • 점퍼 와이어 1개
  • WS2812B LED 1개
  • 10k 저항 1개

                               


화려한 LED 를 갖춘 네오픽셀을 이용하여 램프를 제작한 프로젝트들을 다양했지만, 

이것에 추가로 음악에 맞추어 변하는 램프를 만드는 쉽고 센스 있는 프로젝트를 

instructables 에서 접하여 함께 만들어 보고자 합니다. 


  '음악에 맞추어 반응하는 램프를 만들어 간단하고 예쁘게 방안을 꾸며 봅시다.'   


Step 1. 준비물 


- WS2812B LED (납땜 이전의 것) 

- 0.10 uF 축전기 

- 전기 마이크 

- 10k 옴 저항 

- 아두이노 우노 

- 점퍼 와이어 

- LED 를 넣을 조명 


※ 납땜 되어진 LED 의 경우, 그것을 이용하여 덧붙이기 쉽지 않으므로 

이 프로젝트에서는 납땜 이전의 WS2812B LED 를 사용하도록 합시다. 


Step 2. 하드웨어 연결방법 


 납땜 하기 


다음의 회로를 갖춘 LED 로 WS2812B 각각을 납땜 합니다. 




LED 각각의 VSS 와 VDD 사이의 핀에 104 축전기를 납땜하도록 합니다. 

만약, 납땜 되어진 LED 를 사용하는 경우에는 이 핀이 이미 되어진 것이기 때문에 넘어가도 됩니다. 


모든 VSS 핀 들을 점퍼 와이어로 연결합니다. 

VDD 핀도 마찬가지로 모두 연결되어야 합니다. 

연속된 LED 의 첫번째 LED 의 경우 두 개 여분의 점퍼 와이어를 납땜해 놓도록 합니다. 


이제 하나의 VSS 를 아두이노의 GND 에 연결하고, 

다른 하나의 VDD 를 아두이노의 5V 에 연결하도록 합니다. 


첫번째 LED 의 DOUT 를 두번째 LED 의 DIN (data in) 핀과 연결하도록 합니다. 

그 다음, 두번째 LED 의 DOUT 를 세번째 LED 의 DIN 핀과 연결하도록 합니다. 

연속된 LED 를 이렇게 연결합니다. 


첫번째 LED 의 DIN 핀의 경우 아두이노의 6번 핀에 연결합니다. 


위의 순서로 납땜을 하여 다음과 같은 모형을 만듭니다. 




 마이크 연결하기 


                                       


ⅰ. 다음으로 마이크를 아두이노와 연결합니다. 

ⅱ. 마이크에 점퍼 와이어를 납땜합니다. 

ⅰⅱ. 마이크의 - 다리는 아두이노의 GND 와 연결합니다. 

ⅳ. + 다리는 10k 저항과 아두이노의 A0 핀과 연결합니다. 

ⅴ. 저항의 다른 쪽은 아두이노의 5V 에 연결합니다. 


Step 3. 코드 


1
2
3
4
5
6
#define MIC_PIN A0 // Microphone
#define LED_PIN 6 // NeoPixel LED strand
#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 10 // delay time for each fade amount
#define noiseLevel 2 // slope level of average mic noise without sound
cs


▶ 이 프로젝트의 경우 4개의 LED 를 이용하는 것을 바탕으로 진행 되었으므로 

만약 더 많은 갯수의 LED 를 사용하는 경우 

위 코드의 <#define N_PIXEL 4 > 를 내가 이용하는 LED 의 갯수 만큼으로 증가시켜 줍니다. 


▶ 소음레벨을 정의해 주어야 합니다. 

이것은 사용하는 마이크에 따라 오차가 다르므로, 내가 지금 사용 하고 있는 마이크에 맞추어 

재설정이 필요한 부분입니다. 

코드를 돌려 보아 마이크가 어느정도 민감하게 인지하는지 확인해 보아야 합니다. 


만약 자신이 이용하는 마이크가 현재 설정된 코드에 비해 어느 정도 이상으로 민감하지 않다면, 

< #define noiseLevel 2 > 부분에서 숫자를 낮추어 

< #define noiseLevel 1 > 과 같이 바꾸어 주어야 합니다. 


반대로 너무 민감한 경우, 숫자를 증가 시켜 줍니다. 

< #define noiseLevel 2 > 부분을 

< #define noiseLevel 6 > 과 같이 바꾸어 줍니다. 


▶ 조명이 어느정도 빠르기로 변하는지 설정해 주는 것은 fadeDelay 정의를 바꾸어 줍니다.

만약 LED 가 너무 빨리 깜빡 거린다면, 숫자를 증가 시켜 주어야 합니다. 

위에서 < #define fadeDelay 10 > 부분을 

< #define fadeDelay 50 > 과 같이 바꾸어 줍니다. 


반대로 너무 느리게 깜빡 거린다면, 

< #define fadeDelay 10 > 부분을 

< #define fadeDelay 1 > 과 같이 숫자를 감소시켜 주어야 합니다. 


▶ 아두이노와 PC 를 USB 포트를 통해 연결하고, 

음악을 재생시켜 봅니다. 

LED가 음악에 맞추어 변하는 것을 볼 수 있습니다. 


※ 만약 LED 가 음악에 반응하여 바뀌지 않거나, 제대로 켜지지 않는다면

다음 몇가지를 확인하여 점검해 볼 수 있습니다. 


1. 코드에서 noiseLevel 설정을 바꾸어 보도록 합니다. 

2. 음악의 볼륨을 높여 보도록 합니다. 

3. 음악과 마이크의 거리를 가까이 두도록 합니다. 

4. 10k 저항을 1k 혹은 100k 로 바꾸어 보도록 합니다. 


▶ 준비한 LED 를 넣은 예쁜 조명에 LED 를 넣어 줍니다. 

이 프로젝트의 경우 직접 접어서 LED 캡을 만들었는데, 

이는 다음을 참고하여 만들수 있습니다. 



▶ 다음은 전체 코드 입니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Sound activated LEDs with the Trinket and NeoPixels
#include <Adafruit_NeoPixel.h>
 
#define MIC_PIN A0 // Microphone
#define LED_PIN 6 // NeoPixel LED strand
#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 10 // delay time for each fade amount
#define noiseLevel 2 // 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(0);
    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);
  }
}
 
 
cs



Step 4. 수행 결과 






댓글 0

디지털 아트

음악에 맞추는 네오픽셀 램프를 만들어 보자

by 하민정

MADE BY