[아두이노 강좌] 03. RGB LED 색깔 변경하기

이번 게시글에서는 아두이노로 RGB LED를 사용하는 방법에 대해 설명하겠습니다.

LED의 컬러를 제어하기 위해서는 아두이노의 analogWrite 함수를 사용하게 될 것입니다.

project_3_on_breadboard.jpg

먼저 RGB LED를 보면 일반 LED와 비슷하게 생겼지만 그 내부는 실제적으로 세개의 LED(각각 빨강, 초록, 파랑)가 있습니다. 이 세개의 LED의 밝기를 조절하여 섞으면 원하는 컬러를 만들수가 있습니다.

이것은 마치 물감을 가지고 색을 만들어 내는 것과 비슷한 작업입니다. LED의 밝기는 공급되는 전원의 양에 의해 제어되며, 아두이노의 analogWrite함수를 이용하여 전원의 양을 조절할 수 있습니다.

브레드보드 레이아웃

RGB LED는 4개의 다리가 나와 있습니다. 각각의 LED에는 양극 리드가 연결되어 있으며 세개의 LED의 음극리드는 하나로 묶여서 한개의 음극리드로 나와 있습니다.

rdb_led_cct_symbol.jpg

공통으로 사용하는 음극핀은 LED의 평평한 면으로부터 두번째 핀이며, 4개의 리드중 제일 깁니다. 이 리드는 그라운드로 연결되어야 합니다.

내부의 각 LED는 너무 많은 전류가 LED로 흘러와 LED가 망가지는 것을 방지하기 위해 270오옴의 저항이 각각 필요합니다. 세개의 양극 리드는 아두이노의 출력핀에 연결되는데 이 연결 사이에 아래와 같이 저항이 위치하여야 합니다.

만약 사용하는 LED의 양극이 1개이고 음극이 3개라면 제일 긴 다리를 가진 양극을 GND대신 +5에 연결하십시오.
fritzing.jpg

색깔

아마도 중고등하교 미술시간에 여러가지 물감을 빨강, 초록, 파랑 물감을 섞어 검정 물감을 만들어 보신 기억이 있을 겁니다. 빛은 물감과 다르게 빨강, 초록, 파랑 빛을 섞으면 하얀색이 됩니다. 세개의 LED의 밝기를 동일하게 설정하면 전체적인 컬러는 하얀색이되며 파랑LED를 끄고, 빨강과 초록 LED의 밝기를 동일하게 설정하면 노랑색이 됩니다. 이러한 방식으로 원하는 색을 만들어 낼수 있습니다.

rgb_color.png

아두이노 스케치

아래의 스케치 여러가지 색을 LED가 반복하여 표현할 수 있게 작성하여 놓은 스케치 코드입니다.

  1. int redPin = 11;
  2. int greenPin = 10;
  3. int bluePin = 9;
  4. void setup()
  5. {
      1. pinMode(redPin, OUTPUT);
  6. pinMode(greenPin, OUTPUT);
  7. pinMode(bluePin, OUTPUT);
  8. }
  9. void loop()
  10. {
  11. setColor(255, 0, 0); // red
  12. delay(1000);
  13. setColor(0, 255, 0); // green
  14. delay(1000);
  15. setColor(0, 0, 255); // blue
  16. delay(1000);
  17. setColor(255, 255, 0); // yellow
  18. delay(1000);
  19. setColor(80, 0, 80); // purple
  20. delay(1000);
  21. setColor(0, 255, 255); // aqua
  22. delay(1000);
  23. }
  24. void setColor(int red, int green, int blue)
  25. {
  26. analogWrite(redPin, red);
  27. analogWrite(greenPin, green);
  28. analogWrite(bluePin, blue);
  29. }
코드의 시작부분을 보면 먼저 LED의 각 리드가 아두이노의 어떤 핀에 연결되었는지 알려줍니다.
  1. int redPin = 11;
  2. int greenPin = 10;
    1. int bluePin = 9;

다음은 setup함수로 먼저 게시글에서 언급되었듯이 이함수는 아두이노가 리셋되면 딱한번 실행되는 함수입니다. setup함수에서 3개의 핀이 출력으로 사용된다고 설정하였습니다.

  1. void setup()
  2. {
  3. pinMode(redPin, OUTPUT);
  4. pinMode(greenPin, OUTPUT);
  5. pinMode(bluePin, OUTPUT);
  6. }
loop함수들 들어가기 전에 제일 마지막에 있는 setColor함수를 살펴보면
  1. void setColor(int red, int green, int blue)
  2. {
  3. analogWrite(redPin, red);
  4. analogWrite(greenPin, green);
  5. analogWrite(bluePin, blue);
  6. }

이 함수는 세개의 파라메서를 받는데 이 파라메터는 각각 빨강, 초록, 파랑 LED의 밝기값입니다. 0~255의 값을 받으며, 0은 off 255는 최대값의 밝기를 의미합니다. 그리고 analogWrite 함수를 호출하여 LED의 밝기를 설정합니다.

loop함수를 살펴보면 여러가지색을 만들고 각각1초간 딜레이하였다가 하는 작업을 반복하는 것을 확인 할 수 있습니다. 같은 수준의 밝기를 사용한 것을 확인할 수 있습니다.

  1. void loop()
  2. {
  3. setColor(255, 0, 0); // red
  4. delay(1000);
  5. setColor(0, 255, 0); // green
  6. delay(1000);
  7. setColor(0, 0, 255); // blue
  8. delay(1000);
  9. setColor(255, 255, 0);// yellow
  10. delay(1000);
  11. setColor(80, 0, 80); // purple
  12. delay(1000);
  13. setColor(0, 255, 255);// aqua
  14. delay(1000);
  15. }

만약 양극이 한개인 RGB LED를 사용한다면 컬러의 밝기값은 다음과 같이 255에서 뺀값을 사용하여야 합니다. : analogWrite(redPin, 255-red); .

16진수 컬러 코드 사용하기

인터넷이나 포토샵과 같은 프로그램을 보면 컬러를 #FF0000과 같은 6개의 16진수로 표기한 것을 본적이 있을 것입니다. 이 6개의 숫자는 처음의 두자리는 빨강, 그다음 두개는 초록, 마지막 두개는 파랑을 의미하는 숫자입니다. 빨강은 #FF0000인데 16진수 FF가 255를 의미하기 때문입니다. 이런 컬러코드방식은 코드별로 색상테이블이 존재하기 때문에 RGB LED에서 원하는 컬러를 디스플레이할 시 사용하기 편리합니다.

아래와 같은 인디고(#4B0082) 색상을 RGB LED에서 만들어 보겠습니다.

indigo.png
인디고의 빨강,초록, 파랑은 16진수로 각각 4B, 00, 82입니다. 이 값들을 아래와 이이 setColor의 파라메터값으로 넘겨주겠습니다.
  1. setColor(0x4B, 0x0, 0x82); // indigo
파라메터 앞에 붙은 0x는 숫자가 16진수임을 시스템에 알려주는 prefix입니다.

이론 (PWM)

Pulse Width Modulation (PWM)은 전원을 제어하는 기술입니다. LED의 밝기를 제어하기 위해 사용됩니다. 아래의 그림은 아두이노 PWM핀에서 나오는 신호를 보여줍니다.

how_pwm_works.jpg

대략 1/500 초마다 PWM출력은 펄스를 만들어 냅니다. 이 펄스의 길이는 analogWrite 함수에 의해 제어됩니다. analogWrite(0)은 아무런 펄스를 만들지 않는 것을 의미하고 analogWrite(255)는 펄스를 계속 만들고 있는 것을 의미합니다.

analogWrite에 넘겨주는 값을 지정함으로써 펄스를 만들수 있고, 만약 펄스가 전체 펄스에서 5%만 나온다면 전체 전력에서 5%만 공급되는 것이라고 볼수 있습니다.

실제적으로 LED는 pulse의 주기마다 계속 on/off되고 있지만 사람의 눈은 이런 속도로 깜박이는 것을 인식할수 없고 단지 밝기가 변하고 있는 것만 인식할 수 있습니다

Comments