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 활용
'아두이노 디스플레이' 카테고리의 다른 글
[디스플레이/E-ink] 전자잉크 Heltec 2.13 inch E-ink display V2 (Waveshare 2.13 inch e-paper) (0) | 2020.07.09 |
---|---|
[디스플레이/OLED] SSD1306 driver 기반의 얇고 긴 OLED, 0.91 inch 128x32 (0) | 2017.06.08 |
[디스플레이/컬러OLED] SSD1331 driver를 갖춘 color OLED 96x64 0.95 inch (0) | 2017.06.08 |
[디스플레이/WS2812] 8x8 WS2812 LED 디스플레이 사용법 (0) | 2016.12.12 |
[디스플레이/MAX7219] 8 digits LED(7 segments), MAX7219 (0) | 2015.12.19 |
[디스플레이/원형칼라LED] 링형 RGB LED WS2812 Ring x24를 사용해 심플한 조명을 구현해보자 (0) | 2015.10.16 |
[디스플레이/터치스크린] 2.4인치TFT Touchscreen LCD 쉴드(ST7781 or ILI9325) (4) | 2015.04.19 |
[디스플레이/문자LED] 4자리(digits) 영숫자 출력 가능한 LED : TM1637 모듈 (0) | 2015.04.18 |
[디스플레이/8x8 LED] MAX7219 기반 8x8 단색 LED 표시장치 (0) | 2015.04.15 |
[디스플레이/OLED] 저전력의 최소 핀으로 구현가능한 고해상도 소형 OLED (128x64) 모듈 (0) | 2015.01.26 |