1. 아두이노 보드를 사용한 RGB LED 제어 실습 (1)
블랙베리에 있는 RGB LED를 제어하는 실습을 해보도록 하겠습니다. 이 RGB LED는 SK6812MINI라는 LED 모듈로
같은 LED모듈을 여러 개 연결한 후 하나의 데이터 라인으로 모든 LED를 제어할 수 있다는 특징을 가집니다.

이 같은 제어가 가능한 이유는 앞서 디지털 출력, 아날로그 출력 실습에서 전압으로 밝기를 제어했던 RED LED와는 다르게 SK6812는 LED 하나하나에 제어기가 있어서 데이터 라인을 통해 들어온 신호를 해석하여 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)

loop 에서는 아래 3~5번 동작을 반복합니다.
4. 아두이노 보드를 사용한 RGB LED 제어 실습 (4)

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

블랙베리에 프로그램을 업로드하면 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 문 내에서 melody와 tone 배열이 차례로 읽히며 ‘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)

(4) 연주에 사용할 박자의 길이(mSec)를 정의합니다.
8. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (2)

setup에서는 아래와 같은 동작을 합니다.
9. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (3)

loop 에서는 아래와 같은 동작을 반복 합니다.
① while문 밖에 있는 for 문을 종료하기 위해 isStopButtonPressed에 true를 저장한 후 break로 while 문을 종료합니다.
10. [심화 실습 예제] 아두이노 보드를 사용한 제어 실습 코드 (4)

loop 에서는 아래와 같은 동작을 반복 합니다.
isWaiting이 true라면 소리를 내야 하는 시간이 끝날 때 까지 대기합니다.
2) for 문의 실행이 끝나면 연주가 끝난 것이므로 부저와 RGB LED를 끕니다.
'소프트웨어 > Arduino' 카테고리의 다른 글
| 모바일베이스(MobileBase) (0) | 2026.03.12 |
|---|---|
| 그리퍼 제어하기 (0) | 2026.03.12 |
| 아두이노 디지털 출력을 사용한 LED 제어 실습 #2 (0) | 2026.03.12 |
| 아두이노 디지털 출력을 사용한 LED 제어 실습 #1 (0) | 2026.03.11 |
| Arduino Control (Jellibi AGV) - 서보(Servo) 모터와 부저(Buzzer) (0) | 2026.03.09 |