2015년 5월 25일 월요일

ATmega128A에서 light_ws2812 라이브러리로 WS2812B 사용하기

이전 포스트에서는 아두이노에서 WS2812B를 사용하는 방법을 설명했었다. 이번 포스트에서는 ATmega128A에서 light_ws2812 라이브러리를 사용하는 방법을 설명하겠다.
github애서 light_ws2812를 다운받으면 light_apa102_AVR, light_ws2812_Arduino, light_ws2812_ARM, light_ws2812_AVR 디렉토리가 있고 리눅스나 *nix 환경에서 Makefile을 사용하는데 익숙한 사람이 아니면 막상 라이브러리를 받아도 사용하는데 힘들수가 있다.
윈도우 환경에서 AVR 프로그래밍을 하는 경우 가장 일반적인 경우 WinAVR과 AVRStudio4를 많이 사용하므로 그 기준으로 설명하겠다.

라이브러리에 필요한 파일은 light_ws2812_AVR 디렉토리 내의 ws2812_config.h, Light_WS2812/light_ws2812.c, Light_WS2812/light_ws2812.h 이다. 자신의 프로젝트 디렉토리에 이 3개의 파일을 복사한 후, 프로젝트의 소스파일과 헤더파일에 각각 추가시켜줘야 한다.

그리고 기본 설정은 WS2812의 Din 핀은 PortB의 1번번 핀에 연결하도록 되어 있다. 핀 포트/번호를 변경하려면 ws2812_config.h 파일의 아래 부분을 변경해 주면 된다.


또한 예제 파일을 실행해 보고 싶으면 Examples 디렉토리에 Chained_writes.c, RGB_blinky.c 가 들어있어 이 파일들을 라이브러리와 함께 빌드 해 주면 된다. 단 예제파일은 ATtiny85 기준으로 작성되어 있으므로 ATmega128A에서 사용하려면 아래 소스코드에서 빨간색으로 표시한 부분은 삭제하고 빌드하면 된다.


라이브러리를 사용하는 방법은 예제 코드를 보면 쉽게 알 수 있다. 각 WS2812 LED는 r,g,b 값을 가지고 ws2812_sendarray() 함수를 이용해 각 LED의 rgb 값이 들어있는 포인터와 전송할 바이트 수를 넘겨주면 곧바로 LED에 color가 반영된다. (각 LED당 3바이트가 되므로 8개 LED의 color를 변경하려면 8*3 = 24 바이트를 전송해 줘야 한다.)



전송이 시작되면 처음 3바이트는 첫번째 LED의 color, 다음 3바이트는 두번째 LED의 color...이런식으로 색이 변경된다. 전송이 끝나고 다시 첫번째 LED부터 색을 변경하려면 50us 딜레이를 줘야 한다.


위의 그림처럼 ws2812_sendarray() 함수를 연속으로 호출하면 다음 LED의 color가 변경된다.


위의 그림처럼 ws2812_sendarray 함수를 호출하기 전에 50us 이상의 딜레이가 있으면 다음번 ws2812_sendarray 함수 호출로 보내는 데이터가 다시 첫번째 LED color부터 변경된다.