본문으로 바로가기

아두이노 보드를 사용한 RGB LED 제어 실습

category 소프트웨어/Arduino 2026. 3. 12. 00:49

1. 아두이노 보드를 사용한 RGB LED 제어 실습 (1)

 

블랙베리에 있는 RGB LED를 제어하는 실습을 해보도록 하겠습니다. RGB LEDSK6812MINI라는 LED 모듈로

같은 LED모듈을 여러 개 연결한 후 하나의 데이터 라인으로 모든 LED를 제어할 수 있다는 특징을 가집니다.

 

 

 

이 같은 제어가 가능한 이유는 앞서 디지털 출력, 아날로그 출력 실습에서 전압으로 밝기를 제어했던 RED LED와는 다르게 SK6812LED 하나하나에 제어기가 있어서 데이터 라인을 통해 들어온 신호를 해석하여 LED의 색상을 변경하거나 데이터를 다음 LED에 넘기는 방식으로 동작하기 때문입니다.

LED와 통신하기 위해서는 정해진 타이밍 규칙을 지키는 정교한 신호를 만들어야 합니다.

SK6812를 제어하는 신호를 만들기 위해 이번 실습에서는 Adafruit_NeoPixel 라이브러리를 사용할 것입니다.

라이브러리는 아두이노 소프트웨어에서 [스케치 -> 라이브러리 포함하기 -> 라이브러리 관리]를 클릭하면 나타나는 라이브러리 매니저 창에서 “Adafruit NeoPixel을 검색하여 설치할 수 있습니다.

 

 

 

2. 아두이노 보드를 사용한 RGB LED 제어 실습 (2)

 

실습에서 사용할 Adafruit NeoPixel 클래스의 메소드는 아래와 같습니다.

  • begin() : RGB LED의 데이터 핀을 OUTPUT으로 설정하고 통신을 준비하는 메소드입니다.
  • setBrightness(brightness) : RGB LED의 밝기를 설정하는 메소드 입니다. brightness의 범위는 0~255입니다.
  • show() : 램에 저장된 LED 데이터를 LED에 전송하여, 설정했던 변경사항들이 LED에 적용되어 보여지게 하는 메소드입니다.
  • Color(red, green, blue): 각각의 red, green, blue 값들을 32비트 부호 없는 정수로 만들어 반환합니다. 각 색상 값의 범위는 0~255 입니다.
  • setPixelColor(led_idx, uint32t_color) : 인자로 받은 32비트 RGB 색상 값을 led_idx에 해당하는 위치에 있는 RGB LED에 설정합니다. Idx는 0부터 시작합니다. 설정 후 show()를 호출해 주어야 LED에 적용이 됩니다.

 

3. 아두이노 보드를 사용한 RGB LED 제어 실습 (3)

 

 

 

(1) RGB LED를 제어하기 위한 네오픽셀 라이브러리를 포함시키고 RGB LED에 연결된 데이터핀의 번호와, 연결된 RGB LED 개수를 정의합니다. 정의된 값들을 사용해 RGB LED를 제어하는 데 사용할 Adafruit_NeoPixel 객체를 pixels라는 이름으로 생성합니다.
 
(2) setup 에서는 RGB LED와의 통신을 준비하고, 밝기를 100으로 설정하고, 변경사항을 적용합니다.
 

loop 에서는 아래 3~5번 동작을 반복합니다.

(3)RGB LED에 빛의 삼원색인 빨강, 초록, 파랑색을 단독으로 순서대로 켭니다.
 

4. 아두이노 보드를 사용한 RGB LED 제어 실습 (4)

 

 
(4) RGB LED에 빛의 삼원색을 두 가지씩 혼합한 노랑, 시안, 마젠타색을  순서대로 켭니다.
 
(5) RGB LED에 빛의 삼원색 모두를 혼합한 흰색을 켭니다.
 

빛의 삼원색의 혼합은 아래와 같습니다

 

 

블랙베리에 프로그램을 업로드하면 RGB LED가 아래 사진과 같은 순서로 색상이 바뀌기를 반복합니다.

 

 

 

//////////////  RGB LED
#include <Adafruit_NeoPixel.h>
#define RGB_LED_PIN 3
#define NUM_PIXELS  1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_PIXELS,
                                             RGB_LED_PIN,
                                             NEO_GRBW + NEO_KHZ800);

void setup() {
  pixels.begin(); // RGB LED 설정
  pixels.setBrightness(100); // 밝기 설정
  pixels.show(); // 변경사항을 보이기
}

void loop() {
  pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // 빨강
  pixels.show();
  delay(1000); // 1초 유지
  
  pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // 초록
  pixels.show();
  delay(1000); // 1초 유지
  
  pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // 파랑
  pixels.show();
  delay(1000); // 1초 유지

  
  pixels.setPixelColor(0, pixels.Color(255, 255, 0)); // 노랑
  pixels.show();
  delay(1000); // 1초 유지
  
  pixels.setPixelColor(0, pixels.Color(0, 255, 255)); // 시안
  pixels.show();
  delay(1000); // 1초 유지
  
  pixels.setPixelColor(0, pixels.Color(255, 0, 255)); // 마젠타
  pixels.show();
  delay(1000); // 1초 유지
  
  
  pixels.setPixelColor(0, pixels.Color(255, 255, 255)); // 흰색
  pixels.show();
  delay(1000); // 1초 유지

  pixels.setPixelColor(0, pixels.Color(255, 128, 0)); // 주황색
  pixels.show();
  delay(1000); // 1초 유지

  pixels.setPixelColor(0, pixels.Color(128, 255, 0)); // 연두색(라임그린)
  pixels.show();
  delay(1000); // 1초 유지

  pixels.setPixelColor(0, pixels.Color(255, 0, 128)); // 핫핑크색
  pixels.show();
  delay(1000); // 1초 유지

  pixels.setPixelColor(0, pixels.Color(0, 128, 255)); // 하늘색
  pixels.show();
  delay(1000); // 1초 유지

}

 

 

5.  [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 내용 설명

 

블랙베리 후방부의 왼쪽 버튼을 누르면 음악이 1회 연주되고, 연주에 맞춰 RGB LED의 색깔도 랜덤으로 변하며, 중간에 오른쪽 버튼을 누르면 음악 연주가 종료되고 LED 조명도 꺼지도록 코드를 작성해 보세요.

 

We Wish You A Merry Christmas 악보에 맞춰 음악을 재생하려고 합니다. 악보를 구한 후, 악보의 음계와 음표를 각각 melody tone 배열로 만들어 Buzzer에서 재생되도록 활용합니다.

악보 출처 : http://www.paulgladis.com/-content/uploads/2016/12/We-Wish-You-a-Merry-Christmas.jpg

RGB LED는 랜덤함수를 이용하여 음표마다 임의의 색상을 띠게 되고, 음표의 길이만큼 불이 켜지도록 합니다.

If 문을 사용하여 왼쪽 스위치를 누르면 for 문 내에서 melodytone 배열이 차례로 읽히며 ‘We wish you a merry Christmas’ 노래가 1번 연주되고, 노래에 맞춰 LED 색이 변합니다.

for 문 내에 if 문을 사용하여 연주 중간에 오른쪽 스위치를 누르면 연주 중인 노래를 마치고 LED 조명도 꺼지도록 해야 합니다.

 

 

 

 

6. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 주의 사항

 

  • 버튼을 누르면 연주와 LED 점등이 중단될 수 있도록 조건문을 잘 구성해야 합니다.
  • 연주하는 동안에 음계가 같은 경우가 많으므로 음계별 RGB LED색을 지정하는 것보다 랜덤 함수를 사용하는 것이 단조로움을 피할 수 있습니다.
  • RGB LED는 색을 만들기 위해 0~255 범위의 자연수를 3개 사용하므로, random 함수 사용시 범위를 1부터 255까지 사용합니다. 0을 사용하지 않는 이유는 우연히 (0,0,0)이 되어 불이 들어오지 않는 것을 방지하기 위함입니다.

 

7.  [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (1)

 

 

 

(1) 스위치와 부저를 사용하기 위한 핀 번호를 정의합니다.
 
(2) RGB LED를 제어할 때 사용하는 pixels 객체를 생성합니다.
 
(3) 연주에 사용할 음계의 주파수를 정의합니다.
 

(4) 연주에 사용할 박자의 길이(mSec)를 정의합니다.

 

 

8. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (2)

 

 
(5) 연주에 사용할 박자의 길이(mSec)를 정의합니다.
 
(6) 연주할 음계와 박자를 저장하는 melody 배열과 note 배열을 생성 후 초기화 합니다.
 
(7) 이전에 연주된 음계를 저장하는 prevNote변수를 선언합니다.
 
 

setup에서는 아래와 같은 동작을 합니다.

 
(8) 음계와 박자 배열의 길이가 다른지 확인합니다. 배열의 길이가 다르면 더 이상 프로그램이 진행되지 않습니다.
 
(9) RGB LED 제어를 위해 초기화 메서드를 실행하고, 두 개의 스위치 핀을 입력 핀으로 설정합니다.

 

 

 

9.  [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (3)

 

 

 

loop 에서는 아래와 같은 동작을 반복 합니다.

(10) 왼쪽 버튼이 눌렸는지 확인합니다. 눌렸다면 아래의 동작을 수행합니다.
1)melody 배열의 크기만큼 반복하는 for 문을 실행합니다. 내부 동작은 아래와 같습니다.
 
I.이전에 연주한 음과 같은 음을 연주해야 한다면 이전 음과 구분되도록 하기 위해 소리와 LED를 잠깐 끕니다.
II.소리를 내기 시작한 시간을 저장하는 soundStartTime변수, 소리 재생 후 재생이 끝나길 기다리는 중인지를 저장하는 isWaiting변수, 오른쪽 버튼이 눌렸는지를 저장하는 isStopButtonPressed 변수를 선언 후 초기화 합니다.
III.현재 음계의 소리를 내야 하는 시간동안 반복하는 while문을 실행합니다. 내부 동작은 아래와 같습니다.
 

① while문 밖에 있는 for 문을 종료하기 위해 isStopButtonPressedtrue를 저장한 후 breakwhile 문을 종료합니다.

 

 

 

10. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (4)

 

 

 

loop 에서는 아래와 같은 동작을 반복 합니다.

10.왼쪽 버튼이 눌렸는지 확인합니다. 눌렸다면 아래의 동작을 수행합니다.

 

 

1)melody 배열의 크기만큼 반복하는 for 문을 실행합니다. 내부 동작은 아래와 같습니다.
 
III.현재 음계의 소리를 내야 하는 시간동안 반복하는 while문을 실행합니다. 내부 동작은 아래와 같습니다.
isWaitingfalse라면 현재 연주해야 하는 음계의 소리가 나게 하고 랜덤한 색상으로 RGB LED를 켭니다. prevNote에는 현재 연주한 음계의 주파수를 저장합니다. 부저와 RGB LED를 켠 후에는 isWaitingtrue를 저장합니다.

isWaitingtrue라면 소리를 내야 하는 시간이 끝날 때 까지 대기합니다.

 

 

2) for 문의 실행이 끝나면 연주가 끝난 것이므로 부저와 RGB LED를 끕니다.

 

 

728x90
728x90