개발 관련/아두이노,IOT

WS2812B 사용하기 예제.

snoworca 2014. 10. 6. 01:46

 이전 포스팅 '저렴한 RGB LED(WS2812B) 구임/사용기' 라는 포스팅에서 WS2812B 에 대하여 잠깐 소개한적이 있다.  간단한 사용 방법에 대하여 소개를 하지 않아서 본격적으로 사용법에 대하여 소개를 하려고 한다.


   우선 구입은 Aliexpress 와 같은 해외 사이트를 추천한다. 글을 올린 시간 기준으로 100개에 약 18달러정도 한다.

   (http://www.aliexpress.com/premium/WS2812B-100pcs-Heatsink.html?ltype=wholesale&d=y&origin=y&SearchText=WS2812B+100pcs+Heatsink&isPremium=y&initiative_id=SB_20141005041503&isViewCP=y&catId=)


   뿐만 아니라 LED 매트릭스와 스트립도 검색하면 싼 값에 구입할 수 있다. WS2812B는 복잡한 배선과 코딩하기 어려운 일반적인 RGB LED 의 좋은 대안이 될 수 있다. 

   

   WS2812B 는 사실 Adafruit 의 Neopixel 에도 사용되는데 이는 Neopixel 의 라이브러리를 그대로 이용해도 사용 가능하다. (옵션 변경을 통하여 WS2811 도 가능하다, 아래 예제코드 참고.)

(Neopixel)



  우선 Neopixel  라이브러리 프로젝트(https://github.com/adafruit/Adafruit_NeoPixel를 library 폴더에 다운받아 Arduino 툴에 라이브러리로 추가한다.  (스케치 -> 라이브러리 가져오기 -> add Library 를 선택한 뒤에 NeoPixel 라이브러리 폴더 선택) Neopixel 라이브러리 라이센스가 GPLv3 인 것에 유의하자. (사용/수정시 GPLv3 로 소스 배포, 상업적 사용 불가)


   우선 예제를 한 번 실행시켜보자. 상단 메뉴의 '파일 -> 예제 -> Neopixel -> Simple' 을 열면 간단한 사용 예제를 볼 수 있다. 만약 예제가 안 나온다면 아두이노툴을 재시작 하자.


   이 곳에서 여러분이 연결한 WS2812B 의 개수를 NUMPIXELS 에 설정하고 PIN 에 연결되는 디지털 핀을 설정할 수 있다.




  WS2812B 와 아두이노의 연결 회로는 다음과 같이 매우 간단하다.




  자, 이제 아까 불러온 예제 파일을 조금 수정하여 Serial 콘솔을 통하여 읽어온 값을 기반으로 선택한 LED 의 색을 바꾸는 간단한 프로젝트를 만들어 보겠다.


  우선 WS2812B 10개를 다음과 같이 연결해 보았다. 

  


 

  그리고 다음과 같은 코드를 작성여 아두이노로 업로드 하였다.


예제코드:

#include <Adafruit_NeoPixel.h> // 컨트롤 핀 #define PIN 6 // WS2812B 의 연결된 개수 #define NUMPIXELS 10 #define READ_BUFFER_SIZE 6

// 만약 WS2811 를 사용할 경우 NEO_KHZ800 을 NEO_KHZ400 으로 변경해야 한다. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int R = 0, G = 0, B = 0, selectNum; char buffer[READ_BUFFER_SIZE]; int readNumber(); void setup() { pixels.begin(); // This initializes the NeoPixel library. Serial.begin(9600); } void loop() { // 핀 번호 입력. Serial.print("Select LED(0~"); Serial.print(NUMPIXELS - 1); Serial.print(") : "); // Serial 에 값이 들어올 때 까지 대기하는 동안 지속적으로 업데이트 해준다. while(!Serial.available()) pixels.show(); // 값을 입력 받는다. selectNum = readNumber(); Serial.print("R(0~255) : "); while(!Serial.available()) pixels.show(); R = readNumber(); Serial.print("G(0~255) : "); while(!Serial.available()) pixels.show(); G = readNumber(); Serial.print("B(0~255) : "); while(!Serial.available()) pixels.show(); B = readNumber(); pixels.setPixelColor(selectNum, pixels.Color(R,G,B)); pixels.show(); } // String 으로 입력받은 숫자를 integer 형태로 변환하여 반환한다. int readNumber() { int index = 0, number = 0; while(Serial.available()) { delay(5); buffer[index++] = Serial.read(); buffer[index] = '\0'; if(index + 1 == READ_BUFFER_SIZE) { break; } } Serial.flush(); number = atoi(buffer); Serial.println(number); return number; }



결과 :



  시리얼 콘솔을 통하여 LED 의 번호를 설정하고 RGB 값을 설정한다. 

색상을 설정한 LED 는 이렇게 불이 들어온다.