중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

NeoPixel(네오픽셀)

2014-10-01 13:32:01

개요

NeoPixel은 adafruit에서 구할 수 있는 LED제품으로 단일LED, Strip타입, Ring타입, Stick타입, 쉴드타입 등 다양한 모양의 제품이 존재한다.  
다양한 타입이 존재하지만 adafruit에서 제공하는 Adafruit_NeoPixel라이브러리를 사용하여 제어가 가능하기 때문에 사용법은 간단하다.




출처 : https://learn.adafruit.com/adafruit-neopixel-uberguide/overview

NeoPixel의 장점이라하면 LED의 색감도 좋은편이고 LED의 모양이 다양한 타입으로 존재하기 때문에 다양한 프로젝트에 여러 방법으로 응용하여 사용할 수 있으며, 사용방법이 하나의 라이브러리로 통일되어 있기 때문에 LED의 타입이 다르더라도 제어가 쉬운편이다. 
하지만 단점이라 하면 Adafruit에서 제공하는 라이브러리만을 통해서 제어가 가능하기 때문에 프로그래밍을 하면서 Adafruit의 도움을 받아 프로젝트를 했다는 느낌을 받는것이 단점이라고 하겠다.




NeoPixel은 웨어러블용으로 사용이 용이하기 때문에 Adafruit에서 제공하는 Flora보드나 다른 릴리패드와 같은 웨어러블용 보드와 함께 사용할때 강점이 극대화된다.
이번에는 간단하게 라이브러리안의 예제를 실행시켜 NeoPixel 몇가지를 사용해보자.

동영상

 

부품 목록

NO 부품명 수량 상세설명
1 아두이노 1 오렌지 보드
2 NeoPixel종류의 제품   adafruit제품
3 점퍼케이블 5~10 점퍼케이블
4 아답터 1 DC 5V

 

부품명 아두이노 NeoPixel종류의 제품 점퍼케이블 아답터
부품 사진

 

하드웨어 making

NeoPixel strip

 

 

브레드 보드

 

 

 

 

전자회로도

 

 

 

NeoPixel ring
 

브레드 보드


 

전자회로도

 

 

NeoPixel stick
 

브레드 보드


 

전자회로도

소프트웨어 coding

#include <Adafruit_NeoPixel.h>

#define PIN 6

//네오픽셀을 사용하기 위해 객체 하나를 생성한다. 
//첫번째 인자값은 네오픽셀의 LED의 개수
//두번째 인자값은 네오픽셀이 연결된 아두이노의 핀번호
//세번째 인자값은 네오픽셀의 타입에 따라 바뀌는 flag
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);


void setup() {
  strip.begin(); //네오픽셀을 초기화하기 위해 모든LED를 off시킨다
  strip.show(); 
}

void loop() {
  //아래의 순서대로 NeoPixel을 반복한다.
  colorWipe(strip.Color(255, 0, 0), 50); //빨간색 출력
  colorWipe(strip.Color(0, 255, 0), 50); //녹색 출력
  colorWipe(strip.Color(0, 0, 255), 50); //파란색 출력

  theaterChase(strip.Color(127, 127, 127), 50); //흰색 출력
  theaterChase(strip.Color(127,   0,   0), 50); //빨간색 출력
  theaterChase(strip.Color(  0,   0, 127), 50); //파란색 출력

  //화려하게 다양한 색 출력
  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

//NeoPixel에 달린 LED를 각각 주어진 인자값 색으로 채워나가는 함수
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

//모든 LED를 출력가능한 모든색으로 한번씩 보여주는 동작을 한번하는 함수
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);
  }
}

//NeoPixel에 달린 LED를 각각 다른색으로 시작하여 다양한색으로 5번 반복한다
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

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

//입력한 색으로 LED를 깜빡거리며 표현한다
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//LED를 다양한색으로 표현하며 깜빡거린다
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     //256가지의 색을 표현
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0); 
        }
    }
  }
}

//255가지의 색을 나타내는 함수
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);
  }
}
 

위 예제를 사용하기 위해서는 외부 라이브러리가 필요하다. 라이브러리는 아래링크를 통해서 받을 수 있다.

라이브러리 내려받기
외부 라이브러리 사용하는 방법

Adafruit의 LED용 라이브러리를 받게 되면 대부분 사용법이 비슷하다. 그 덕분에 사용법을 한번 익혀두면 두고두고 써먹을 수 있다.

 

 

#include <Adafruit_NeoPixel.h>

#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);

가장 먼저 해야할 일은 #include를 사용하여 Adafruit에서 제공하는 라이브러리를 사용한다고 선언하는 것이다.
두번째는 사용하는 LED의 핀번호를 선언한다. #define은 const와 같이 상수를 선언할 때 사용하는 문법이다. 상수란 한번 선언하면 중간에서 절대로 바꿀 수 없는 값으로 정의할 수 있다.(#define PIN 6은 const int PIN = 6; 과 같은 표현이다. 다만 #define은 뒤에 세미콜론(;)을 붙이지 않는다.)
세번째는 코드내의 객체를 생성한다. 생성할때 3개의 값을 넣게 되는데 첫번째 입력하는 핀번호는 지금 사용하는 LED에 달려있는 LEDPixel의 개수를 입력하면 되고, 두번째는 LED를 연결한 입출력핀을 입력하면 된다. 3번째 부분은 딱히 건드리지 않아도 된다.
현재 객체 이름이 strip으로 되어 있지만 ring을 사용하면 ring으로 바꿔주어도 상관없다.(안바꿔도 상관은 없다.)

 

 

 

 

void setup() {
  strip.begin(); //네오픽셀을 초기화하기 위해 모든LED를 off시킨다
  strip.show(); 
}

setup에서는 생성한 객체를 초기화시키는데 , 전에 입력받아서 NeoPixel이 켜진 상태라면 모든 LED를 끄고 입력받은 명령을 삭제하여 상태를 초기화 시킨다.(begin)
show()의 역할은 코드에서 작성한 명령을 NeoPixel로 넘겨 실제로 LED를 켜고 끄는 명령을 하게 하는 함수이다.

 

 

 

 

void loop() {
  //아래의 순서대로 NeoPixel을 반복한다.
  colorWipe(strip.Color(255, 0, 0), 50); //빨간색 출력
  colorWipe(strip.Color(0, 255, 0), 50); //녹색 출력
  colorWipe(strip.Color(0, 0, 255), 50); //파란색 출력

  theaterChase(strip.Color(127, 127, 127), 50); //흰색 출력
  theaterChase(strip.Color(127,   0,   0), 50); //빨간색 출력
  theaterChase(strip.Color(  0,   0, 127), 50); //파란색 출력

  //화려하게 다양한 색 출력
  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

loop에서는 adafruit에서 작성한 LED패턴 함수를 사용하여 하나의 LEDshow를 반복한다. 
사실 예제를 분석하고 adafruit에서 작성한 함수를 분석하여 적는다는건 의미없다고 생각하기 때문에(...) 대략적인 사용법만 적는다.
colorWipe()는 표현할 색, 패턴간 딜레이를 인자값으로 받는다. 패턴은 LED를 하나씩 입력한 색으로 칠해나가는 패턴을 보인다.
colorWipe(strip.Color(255,0,0), 50)이라하면 빨간색을 각 LED가 칠해지는 간격을 50ms로 하여 표현한다는 의미이다.
(strip.Color()에서는 인자값으로 0부터 255사이의 숫자를 3개 받는데 각각 R,G,B값을 나타낸다. 그 색을 표현하는 값이 커질 수록 그 색의 밝기는 점점 밝아진다. strip.Color(R,G,B))  

theaterChase()는 LED를 엇갈려서 반복해서 보여주는데
○●○●○●○●○● ->●○●○●○●○●○ -> ○●○●○●○●○● ->●○●○●○●○●○ 이런 모양으로 반복한다.
이 역시 colorWipe처럼 색과 딜레이를 인자값으로 받는다.

rainbow()와 rainbowCycle()은 NeoPixel에서 출력가능한 모든색 255가지를 보여주는데(255가지이지만 우리눈에서는 다 볼 수도 없고 구분도 불가능하다)
rainbow()와 rainbowCycle()의 차이점은 LED전체를 하나의 색으로 하여 시간경과를 통해 무지개로 보여줄 것이냐(NeoPixel전체가 하나의 색으로 통일되어 바뀜), 아니면 LED를 하나의 무지개처럼 표현하여 한 장면에 여러색을 보여줄 것인가의 차이이다.(각각 LED Pixel들이 다른색을 띔)
rainbowCycle()은 기본으로 5번 반복하여 표현하도록 작성되어 있는데 수정이 가능하다.

theaterChaseRainbow()는 theaterChase()가 한가지색을 엇갈려서 표현했다면 theaterChaseRainbow()는 여러가지색깔을 LED를 엇갈려서 표현한다.

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

NeoPixel, 아두이노