본문 바로가기
아두이노 디스플레이

[디스플레이/LED] 끈형태의 LED줄을 통해 조명제어를 해보자 : WS2812 LED

by 작동미학 2015. 3. 29.
반응형

WS2812 LED strip(여러 개의 LED가 결합된 끈형태)을 가지고 다양한 조명 효과를 내보자.

 

▶ 이 가이드를 따라하면

- WS2812 LED strip을 제어할 수 있다

- FastLED 라이브러리를 사용할 수 있다.

 

▶ 먼저 읽으면 좋은 글

- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

WS2812 LED는 LED strip중 대표적인 제품이다. RGB 3가지 색에 대하여 0~255 밝기를 지정할 수 있기 때문에 현존하는 대부분의 색상 제어가 가능하다. 인터넷에서도 저렴하게 구매를 할 수 있다. (방수 버전과 그렇지 않은 버전으로 나뉘지만, 대략 15$이하에 구매 가능하다)

<60개짜리 WS2812 LED strip, 5V/GND/D6(를 각각 그림의 VCC(빨)/GND(흰)/DataPin(녹) 에 연결>

여담으로 이러한 LED를 사용한 가장 재미있는 응용은 바로 이 동영상을 참조해보자.

https://www.youtube.com/watch?v=Og8UedGGbRA

 

그리고 WS2812 LED는 중간을 절단해서 길이를 조절할 수도 있다. 이때는 역시 해당 절단면의 5V/GND/Datapin을 위와 똑같이 연결해주고 소스코드의 LED숫자만 조절해주면 된다.

LED도 다량을 연결해서 사용하는 경우는 전류 공급 부족 이슈가 존재한다. 다만 적절한 USB전원으로도 60개 정도는 버틸 수 있다. 여기서는 arduino의 5V를 곧바로 연결하여 사용한다. LED만 연결한 경우라면 이 정도로도 충분히 작동한다.

 

▶ 소스 코드 입력 및 구동

여기서는 이러한 LED제어에 많이 사용되는 FastLED 라이브러리를 사용한다. 상세한 내용은 http://fastled.io/ 를 참조하면 되며 라이브러리는 https://github.com/FastLED/FastLED에서 받아서 사용한다. 단 Arduino 1.5.8 이상의 개발환경하에서는 3.0버전 말고 2.x버전을 사용해야만 문제가 없다. https://github.com/FastLED/FastLED/archive/v2-finalrc.zip 를 받아서 사용하자.

아래의 소스는 Arduino 1.6.1에서 컴파일했으며, 위 2.x버전의 최신버전을 사용했다. 예제소스는 내부의 testled소스를 약간 수정한 버전이다.

기본적으로는 각 번호별 LED의 R/G/B에 대한 밝기값을 0~255 정해줌으로써 다양한 색을 표현한다(256*256*256 개의 색 표현이 가능). memset을 통해 이 값을 정의하고 FastLED.show()를 통해 한꺼번에 점등시킨다.

LED(NUM_LEDS) 숫자와 datapin 번호만 확인하자.

GitHub 소스링크 : https://github.com/bbangpan/bbangpan.com/blob/master/neibc_ws2812_fastled/neibc_ws2812_fastled.ino

 

소스 :

/* Originally posted on www.bbangpan.com

 

Program Description: ESP8266 WiFi Module testing code

Needed library : FastLED (2.x latest)

Tested on : Arduino 1.6.1, Arduino UNO

 

reference : fastled.io testleds

 

Copyright (c) 2015 www.bbangpan.com. All rights reserved.

This program can be used for any non-commercial purpose freely. */

 

#include "FastLED.h"

// Number of RGB LEDs in the strand

#define NUM_LEDS 60

 

// Define the array of leds

CRGB leds[NUM_LEDS];

// Arduino pin used for Data

#define PIN 6

 

void setup()

{

FastLED.addLeds<NEOPIXEL, PIN, RGB>(leds, NUM_LEDS);

}

 

void loop() {

// one at a time

for(int j = 0; j < 3; j++) {

for(int i = 0 ; i < NUM_LEDS; i++ ) {

memset(leds, 0, NUM_LEDS * 3);

switch(j) {

case 0: leds[i].r = 255; break;

case 1: leds[i].g = 255; break;

case 2: leds[i].b = 255; break;

}

FastLED.show();

delay(10);

}

}

 

// growing/receeding bars

for(int j = 0; j < 3; j++) {

memset(leds, 0, NUM_LEDS * 3);

for(int i = 0 ; i < NUM_LEDS; i++ ) {

switch(j) {

case 0: leds[i].r = 255; break;

case 1: leds[i].g = 255; break;

case 2: leds[i].b = 255; break;

}

FastLED.show();

delay(10);

}

for(int i = NUM_LEDS-1 ; i >= 0; i-- ) {

switch(j) {

case 0: leds[i].r = 0; break;

case 1: leds[i].g = 0; break;

case 2: leds[i].b = 0; break;

}

FastSPI_LED.show();

delay(1);

}

}

 

// Fade in/fade out

for(int j = 0; j < 3; j++ ) {

memset(leds, 0, NUM_LEDS * 3);

for(int k = 0; k < 256; k++) {

for(int i = 0; i < NUM_LEDS; i++ ) {

switch(j) {

case 0: leds[i].r = k; break;

case 1: leds[i].g = k; break;

case 2: leds[i].b = k; break;

}

}

FastLED.show();

delay(3);

}

for(int k = 255; k >= 0; k--) {

for(int i = 0; i < NUM_LEDS; i++ ) {

switch(j) {

case 0: leds[i].r = k; break;

case 1: leds[i].g = k; break;

case 2: leds[i].b = k; break;

}

}

FastLED.show();

delay(3);

}

}

}

 

구동해보면 밝기 조절, 색조절, 순차적 점등 등 다양한 예제를 볼 수 있고, 적절히 수정하면 원하는 효과를 낼 수 있다. LED를 적절히 제어하여 소품 촬영용 조명으로 쓰는 것도 나쁘지 않다.

<예제에 따라 수행시 각 종 색깔로 순차 점등 등을 확인할 수 있다>

기타 라이브러리 내부에 존재하는 예제들을 구동해보고 자신에 맞게 적용하자.

▶ 구매 가이드

WS2812 LED strip(5V) : http://www.aliexpress.com/item/1M-WS2812B-WS2812-rgb-led-strip-60-led-m-IP30-White-PCB-DC5v-SMD-5050-Individually/1972958059.html ($12)

 

강의 키워드

아두이노 조명, Arduino LED, WS2812, FastLED 활용

 

반응형