반응형

LED에 대해서는 이 블로그에서 많이 다루었는데 아이러니 하게도 LED 밝기 조절은 해보지 않았던 것 같다. 그래서 오늘은 LED 밝기 조절과 여러가지 색의 LED를 이용해서 색의 혼합을 통한 색상 만들기에 대해서 알아보도록 하겠다. 아두이노에 연결된 LED 는 ON/OFF 의 디지털 신호만 있는 것이 아니라 아날로그 신호를 보낼 수 있다. 즉 코드에 따라서 출력전압을 조절 할 수 있는 것이다. LED에 공급되는 전압을 조절할 수 있게되면 LED의 밝기를 조절할 수 있는 것이다. 통상적으로 LED 는 전압이 커지면 밝아지고 낮으면 어두워진다.


아두이노 우노의 경우  3, 5, 6, 9, 10, 11 번 핀(Digital PWM 지원 핀)으로 analogWrite 를 할 수 있다. 먼저 코드를 하나 만들어 보겠다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define REDPIN 5
 
#define FADESPEED 10     // 밝아지고 어두워지는 Speed 조절
 
void setup() {
  pinMode(REDPIN, OUTPUT);
}
 
void loop() {
  int r;
  // 빨간 LED 가 점점 밝아짐
  for (r = 0; r < 256; r++) { 
    analogWrite(REDPIN, r);
    delay(FADESPEED);
  }
  
  // 빨간 LED 가 점점 어두워짐
  for (r = 255; r > 0; r--) { 
    analogWrite(REDPIN, r);
    delay(FADESPEED);
  }   
}
cs

 

위의 코드는 아두이노 5번핀에 연결된(물론 LED 짧은 다리는 GND에 연결) LED를 analogWrite를 이용해서 점진적으로 밝게 그리고 어둡게 하는 코드이다. 코드에 보면 for 문으로 총 255 단계(256 아님, 256일 경우 LED 꺼짐)의 전압을 LED 로 보내고 있다. 255 단계의 전압값은 변수 r 에 저장되어서 analogWrite(연결핀, 밝기값 r) 로 LED 의 밝기를 컨트롤 하고 있음을 알 수 있다. FADESPEED 변수는 밝아지고 어두워지는 시간을 조절한다.


위의 동영상은 위의 코드를 적용한 동영상이다. 우측의 노란, 파란 LED 는 다음 테스트를 위한 LED로서 신경쓰지 말자 영상을 보면 빨간 LED가 DigitalWrite 할 때 와는 다르게 점진적으로 밝아지고 어두워지는 것을 볼 수 있다.


그럼 이번에는 analogWrite를 이용해서 빛의 삼원색인 RGB (Red, Green, Blue) 를 가지고 빛을 혼합하여 새로운 색을 만드는 원리를 알아보자 하지만 이를 제대로 알아보기 위해서는 RGB LED Strip (LED의 빛을 잘 섞어줄 수 있도록 만든 부품) 이라는 것이 필요한데 나에게는 이것이 없다. 만약 가지고 있다면 아래에서 소개하는 코드를 이용해서 보다 완벽하게 구현할 수 있을 것이다.

 

위의 사진이 RGB LED Strip 이라는 부품이다. 보라색을 내고 있는 것을 볼 수 있는데 이것은 Blue 와 Red 를 섞으면 이런 색이 나온다고 한다. R, G, B 색을 내는 LED 중에서 R 과 B 가 적절한 밝기로 섞이는 순간 이런 보라색을 내는 것이다.


위의 그림은 RGB 를 섞으면 대충 어느색으로 변하는지 알려준다. 참고로 모두 다 섞으면 백색이 된다.


연결은 간단하다. 브레드보드를 이용해서 아두이노의 GND 를 각 LED의 짧은 다리를 공통적으로 연결했으며 (음극, Cathode) , Anode쪽의 연결은 Red 는 5번핀, Yellow 는 6번핀, Blue 는 3번핀에 연결하였다. 그리고 녹색 LED가 없어서 Yellow 를 연결하였다. 물론 이렇게하면 당연히 제대로 된 빛의 혼합에 의한 색은 볼 수 없다. 그저 3개의 LED가 밝아졌다 꺼졌다 할 뿐이다. 이 글의 목적은 원리의 파악이므로 그냥 넘어가기로 한다. ;;  제대로 해 보고 싶은 사람은 위에서 말했던 RGB LED Strip 이라는 부품을 연결하면 된다.


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
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
 
#define FADESPEED 5     // 밝아지고 어두워지는 Speed 조절
 
void setup() {
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
}
 
void loop() {
  int r, g, b;
 
  // 파란색에서 보라색으로 변화
  for (r = 0; r < 256; r++) { 
    analogWrite(REDPIN, r);
    delay(FADESPEED);
  } 
  // 보라색에서 빨간색으로 변화
  for (b = 255; b > 0; b--) { 
    analogWrite(BLUEPIN, b);
    delay(FADESPEED);
  } 
  // 빨간색에서 노란색으로 변화
  for (g = 0; g < 256; g++) { 
    analogWrite(GREENPIN, g);
    delay(FADESPEED);
  } 
  // 노란색에서 녹색으로 변화
  for (r = 255; r > 0; r--) { 
    analogWrite(REDPIN, r);
    delay(FADESPEED);
  } 
  // 녹색에서 청록색으로 변화
  for (b = 0; b < 256; b++) { 
    analogWrite(BLUEPIN, b);
    delay(FADESPEED);
  } 
  // 청록색에서 파란색으로 변화
  for (g = 255; g > 0; g--) { 
    analogWrite(GREENPIN, g);
    delay(FADESPEED);
  } 
}
cs


위의 코드는 각각의 LED 의 밝기를 조절해서 빛을 혼합해서 새로운 색을 만들어주는 코드이다. RGB 에 없는 보라색, 노란색, 청록색 등을 만들어 주는 것을 알 수 있다. 여기에서 쓰인 변수들도 맨 위의 코드와 마찬가지로 for 문을 이용해서 각각의 LED 에 analogWrite 값을 조절해 밝기를 조절하고 있는 것을 알 수 있다. 길이만 늘어났지 거의 같은 코드이다.


실행결과이다. 예상대로 빛이 섞이지 않고 그냥 따로 따로 논다. 하지만 이런 원리로 빛의 합성으로 새로운 색을 만들 수 있다는 것은 알게되었다. 지금 드는 생각이지만 3개의 LED의 간격을 줄이고 빛의 산란을 일으키는 뿌연 간유리 등을 통해 색을 본다면 혼합될 수도 있지 않을까? 생각해본다. 아무튼 지금은 그런게 없으니 패스.


이런 원리가 요즘 많이 쓰이는 곳이 있다. 바로 공원 산책로 등에 쓰이는 LED Strip 이다. 위의 영상은 우리동네 산책로에 있는 LED Strip이 쓰인 길이다. 길다란 호스모양의 LED Strip이 길 옆 난간에 부착되어 있고 각각의 빛을 발산하면서 새로운 색을 합성하고 변화하면서 역동적인 조명을 만들어낸다. 아마 이런 곳에도 아두이노는 아니겠지만 비슷한 마이크로프로세서가 쓰여서 새로운 색을 만들도록 제어를 하고 있지 않을까 생각해본다.

반응형

+ Recent posts