BangLED - NeoPixels LED Strip

NeoPixels란 Adafruit Industries 에서 개발한 RGB LED로 마치 컴퓨터 모니터의 Pixel 처럼 제어할 수 있는 편리한 LED 다.

NeoPixels Stick

사진의 흰색 정육면체처럼 생긴 부품이 NeoPixels 의 핵심이 되는 WS2812B 라고 하는 칩으로, LED 불빛을 키는 것 이외에 신호를 다른 LED 에 넘겨줄 수 있는 신통방통한 녀석이다. 이것이 어떤의미냐 하면, 기존의 LED 의 경우 10 개의 LED 를 켜기 위해서는 최소 40개의 선을 연결하지 않으면 안되었다. R, G, B 세가지 색의 신호와 Gnd 까지 LED 당 각각 4개의 선을 연결해야 했고, 이 때문에 사용하기에 매우 불편하였다.

위 사진처럼 단색 LED 의 경우에도 최소 각각 2개를 연결하지 않으면, 제대로된 결과물을 보여줄 수 없었다. 그런데, NeoPixels 의 경우에는 이를 단 3가지 선만 연결하면 LED 가 몇개가 되든 (실제로 물리적인 한계는 있을것 같으나, 최대값을 테스트해보진 않았다.) 간단하게 색상까지 제어할 수 있는 기능을 사용할 수 있다.

1. Wiring

연결법은 위의 사진과 같다. 화살표 방향을 주의하자.

2. Test

아래 코드를 테스트 해보자.

#include <Adafruit_NeoPixel.h>

#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(25, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();
}

void loop() {
  strip.setPixelColor(0, 255, 0, 0);
}

Adafruit 의 NeoPixel 은 외부 라이브러리 설치를 필요로 한다. 링크 를 클릭해서 설치해보자.

3. Color Wipe

0 번부터 25 번까지 차례대로 불이 들어오게 하기.

#include <Adafruit_NeoPixel.h>

#define PIN            6
#define NUMPIXELS      20

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int wait = 100; // delay for half a second

void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setBrightness(255);
}

void loop() {  
  for ( int i = 0; i < NUMPIXELS; i++ ) {
    pixels.setPixelColor(i, pixels.Color(255, 0, 0));
    pixels.show();
    delay(wait);
  }
}

4. Rainbow

빨주노초파남보 무지개 색상으로 서서히 변하게 하기.

#include <Adafruit_NeoPixel.h>

#define PIN            6
#define NUMPIXELS      20

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int wait = 100; // delay for half a second

uint32_t redColor = pixels.Color(255, 0, 0);
uint32_t orangeColor = pixels.Color(255, 127, 0);
uint32_t yellowColor = pixels.Color(255, 255, 0);
uint32_t greenColor = pixels.Color(0, 255, 0);
uint32_t blueColor = pixels.Color(0, 0, 255);
uint32_t namColor = pixels.Color(127, 0, 255);
uint32_t purpleColor = pixels.Color(255, 0, 255);
uint32_t colors[] = {
  redColor, orangeColor, yellowColor, greenColor, blueColor, namColor, purpleColor
};

void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setBrightness(255);
}

void loop() {  
  for (int i = 0; i < 7; i++) { // 한번 가기
    for ( int j = 0; j < NUMPIXELS; j++ ) {
      pixels.setPixelColor(j, colors[i]);
    }

    pixels.show();
    delay(wait);
  }
}

5. Wheel

0-255 의 값을 넣어서 색상을 자연스럽게 변하게 하기 위한 함수. 4번 Rainbow 를 이 함수를 사용해 구현하기 위해서는 아래 함수를 사용하자.

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

위 코드는 아래 Wheel 함수를 필요로 한다.

uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } 
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } 
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

6. Move Point

Pixel 한개를 스트립을 통해 앞뒤로 움직이게 해보세요.

#include <Adafruit_NeoPixel.h>

#define PIN            6
#define NUMPIXELS      20

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int wait = 10; // delay for half a second

void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setBrightness(255);
}

void loop() {  
  for (int i = 0; i < NUMPIXELS; i++) { // 한번 가기
    for ( int j = 0; j < NUMPIXELS; j++ ) {
      pixels.setPixelColor(i, pixels.Color(255, 0, 255));

      if ( j != i ) {
        pixels.setPixelColor(j, 0);
      }
    }

    pixels.show();
    delay(10);
  }

  for (int i = NUMPIXELS-1; i >= 0; i--) {
    for ( int j = NUMPIXELS-1; j >= 0; j-- ) {
      pixels.setPixelColor(i, pixels.Color(255, 0, 255));

      if ( j != i ) {
        pixels.setPixelColor(j, 0);
      }
    }

    pixels.show();
    delay(wait);
  }
}
comments powered by Disqus