[아두이노 강좌] 07. 버튼을 이용하여 RGB LED 색상 제어하기

이번 게시글에서는 6번 강좌에서 셋업하였던 세개의 푸쉬버튼을 이용하여 RGB LED의 색깔을 제어하는 실험을 진행하도록 하겠습니다.

overview.jpg

브레드보드 레이아웃

브레드보드 레이아웃은 아래와 같습니다. RGB LED의 가장 긴다리는 2번째 줄에 연결하여 GND에 연결되어 있는 것을 주의하십시오

본 레이아웃은 RGB LED가 공통 음극을 가진 타입을 기준으로 작성되었습니다. 만약 공통 양극을 가진 RGB LED를 가지고 있다면 가장 긴 다리를 +5V에 GND대신 연결하십시오.

fritzing.jpg

아두이노 코드

아래의 코드를 아두이노에 로드합니다.

시작할때, 모든 LED는 꺼져 있게 되며 버튼을 누르고 있으면 LED는 점점 밝게 빛나게 됩니다. 브레드보드상의 제일 상단에 있는 버튼은 빨강, 중간은 초록, 제일 밑의 버튼은 파랑색을 조절하는 버튼입니다.

버튼들을 서로 눌러서 색이 어떻게 섞이는 지 확인하여 보십시오. 다시 시작하고 싶으시면 아두이노의 리셋버튼을 눌러 초기화 시키십시오. USB커넥터 옆에 있는 버튼입니다.

  1. int redLEDPin = 11;
  2. int greenLEDPin = 10;
  3. int blueLEDPin = 9;
  4. int redSwitchPin = 7;
  5. int greenSwitchPin = 6;
  6. int blueSwitchPin = 5;
  7. int red = 0;
  8. int blue = 0;
  9. int green = 0;
  10. void setup()
  11. {
  12. pinMode(redLEDPin, OUTPUT);
  13. pinMode(greenLEDPin, OUTPUT);
  14. pinMode(blueLEDPin, OUTPUT);
  15. pinMode(redSwitchPin, INPUT_PULLUP);
  16. pinMode(greenSwitchPin, INPUT_PULLUP);
  17. pinMode(blueSwitchPin, INPUT_PULLUP);
  18. }
  19. void loop()
  20. {
  21. if (digitalRead(redSwitchPin) == LOW)
  22. {
  23. red ++;
  24. if (red > 255) red = 0;
  25. }
  26. if (digitalRead(greenSwitchPin) == LOW)
  27. {
  28. green ++;
  29. if (green > 255) green = 0;
  30. }
  31. if (digitalRead(blueSwitchPin) == LOW)
  32. {
  33. blue ++;
  34. if (blue > 255) blue = 0;
  35. }
  36. analogWrite(redLEDPin, red);
  37. analogWrite(greenLEDPin, green);
  38. analogWrite(blueLEDPin, blue);
  39. delay(10);
  40. }

스케치를 보면 LED를 제어하기 위한 세개의 출력 핀이 있고, 이 출력 핀은 PWM핀으로 LED의 각 컬러로 들어가는 전력을 제어할 있습니다.

또 다른 세개의 핀이 필요한데 이 핀들은 버튼을 위하여 사용이 됩니다. setup함수에서 입력으로 설정되었으며 HIGH상태로 풀업되어, 만약 버튼이 눌리게 된다면 LOW상태로 변화하게 됩니다.

핀이 정의된 다음에는 red, green, blue라는 변수들이 나오게 됩니다.

  1. int red = 0;
  2. int blue = 0;
  3. int green = 0;

이 변수들은 LED의 각 RGB 채널의 빛의 세기를 저장하는 값입니다. 만약 red가 0이라면 LED의 빨강색부분은 꺼지게 되며, 255라면 최고치의 빨강색을 밝게 표현합니다.

loop함수는 두 부분으로 나뉘어 있는데 첫번째 부분은 버튼을 체크해서 red, green, blue변수에 버튼의 상태에 따라 필요한 변화를 주는 부분입니다. 예를 들어 빨강색용 버튼을 체크하는 부분은 아래와 같습니다.

  1. if (digitalRead(redSwitchPin) == LOW)
  2. {
  3. red ++;
  4. if (red > 255) red = 0;
  5. }

digitalRead함수를 실행하게 되고 red 핀이 LOW상태인것을 발견하게 되면 이것은 버튼이 눌렸다는 것을 의미합니다. 그래서 red변수에 1을 더하게 됩니다.

PWM용으로 쓸수 있는 최대 값은 255이기 때문에 다음 라인에서 red가 255를 넘는지를 확인 한 후 넘었다면 0으로 다시 설정합니다.

두번째 부분은 analogWrite함수를 수행하는 부분으로 각각의 LED의 색을 설정하게 됩니다.

  1. analogWrite(redLEDPin, red);
  2. analogWrite(greenLEDPin, green);
  3. analogWrite(blueLEDPin, blue);

마지막으로 loop의 마지막에는 짧은 딜레이를 주어 색의 변화를 조금 늦추어 줍니다. 이 딜레이가 다다면 푸쉬버튼의 물리적인 노이즈로 색이 랜덤하게 변할 수 있습니다.

 

Comments