brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Sep 13. 2020

30. 화려한 빛의 향연 : 네오픽셀 사용법 #1

네오픽셀(NeoPixel)은 주소를 지정하여 다양한 색으로
발광할 수 있는 LED의 한 종류이다. 

그런데 한 가지 색을 가지고 있는 LED와 달리 양과 음의 단자만을 가지고 있지 않고, 컨트롤 용 데이터 선을 하나 더 가지고 있다. 이 데이터선을 이용하여 빛의 색과 밝기 그리고 순서까지 제어할 수가 있다.


네오픽셀은 다양한 형태를 가지고 있다. 

기다란 선 형태에 줄지어 배치된 형태도 있고, 원형으로 만들어진 상품도 있다.

다양한 형태의 네오픽셀 부품들


원형 네오픽셀을 아두이노에 연결하고 예제 하나를 실행해 보았다.

아래 동영상은 수강생 중 한 분이 수강 후 전시회를 위하여 만든 '조명이 있는 나무집'의 영상이다.

멋진 나무집을 짓고 그 안에 네오픽셀을 이용하여 조명을 만든 작품이다.


네오 픽셀은 이렇게 다양한 색의 빛을 보여줄 수 있는 도구이다.




어떠한 형태로 구성되어 있어도 네오픽셀 모듈의 내부 구조는 동일하다.

VCC - 5V 입력 핀과

GND 접지 핀과

Data In 핀 

Data Out 핀 

이렇게 4개의 핀이 존재한다.


경우에 따라서는 VCC와 GND가 여러 개 있을 수 있지만 그것은 연결을 용이하게 추가한 핀들이어서 내부적으로는 모두 연결되어 있다고 생각하면 된다.

DI(Data In)과 DO(Data Out)은 하나의 모듈에 하나씩 있게 되는데, 이것은 전체 모듈의 시작 LED와 끝 LED와 연결되어 있는 거이다.


아래의 사진은 원형으로 8개의 NeoPixel LED를 포함하고 있는 상품이다.


좌측은 전면의 사진이고, 우측은 뒷면을 확대한 사진인데, 납땜이 되어 있어 자세히 보이지 않지만, 죄 측에 GND, IN, VCC, GND와 같은 단자가 있고, 우측에 GND, OUT, VCC, GND 단자가 있다.

GND가 좌우에 2개씩 있는 건 좀 특이한 스타일이지만 그중 1개만 사용해도 된다.

VCC와 GND는 다른 부품처럼 5V의 전원과 GND에 연결을 하면 되지만, IN과 OUT은 다른 부품과 구분해서 사용해야 한다.


네오 픽셀은 LED 하나하나에 그 주소가 있다고 생각하면 된다. 따라서  IN과 가장 가까운 LED가 0번이면 순서에 따라 1,2,3,4,.... 와 같이 주소가 있다고 생각하면 된다. 8개의 LED가 있는 경우 0번부터 7번까지 주소가 부여되고, 만일 추가로 그 뒤에 다른 네오픽셀을 연결한다면 VCC와 GND를 연결하고, 다음 네오픽셀의 IN과 지금 사용된 네오픽셀의 OUT을 연결해 주면 된다. 그렇게 되면 뒤의 네오픽셀의 주소는 8번부터 시작하게 된다.


네오픽셀은 하나의 직선에 일렬로 늘어선 LED가 그 직선의 위치에 맞는 주소를 가지고 있는 구조로 만들어져 있다고 생각하면 된다.

각각의 LED를 지정하여 어떤 색의 빛으로 불을 켤지를 결정하는 것은 코드로 할 수 있다.


네오픽셀을 이용한 간단한 회로를 하나 만들어 보자.

2번 핀과 GND 사이에  버튼스위치를 연결,

네오픽셀의 VCC는 5V, GND는 GND에 연결,

네오픽셀의 DI(또는 IN)는 6번 핀에 연결했다.


TinkerCad로 작업을 한다면 

빨간 박스의 라이브러리 포함을 눌러 NeoPixel 라이브러리 옆의 [포함] 버튼을 누르면 

#include <Adafruit_NeoPixel.h>

이라고 라이브러리가 자동으로 포함될 것이고, 


아두이노 스케치 프로그램을 사용하신다면

메뉴의 툴-라이브러리 관리 - 에서 neopixel을 검색하여 Adafruit NeoPixel by Adafruit 라이브러리를 설치한다.


이제 네오픽셀을 사용할 준비가 모두 끝났다.

아래의 코드를 입력하고 버튼을 누르면 어떤 일일 발생하는지 보자.

라인 7의  Adafruit_NeoPixel strip = Adafruit_NeoPixel(pCOUNT, pxlPIN, NEO_GRB + NEO_KHZ800);라는 명령어를 통하여  pCount 개수만큼의 네오픽셀이 sPin(2번)에 연결되었음을 알려주고, 차후에 이를 이용할 변수를 strip이라는 이름에 저장한다.


네오픽셀은  Adafruit_NeoPixel 명령어의 리턴 값을 가지고 있는 strip 변수를 이용하여 다음과 같이 작동한다. setup 함수11번부터 13번 라인까지 있는 아래의 코드의 한국어 번역본을 보자.


  strip.begin(); // strip으로 등록된 네오픽셀을 사용한다

  strip.setBrightness(30);  // 밝기를 30만큼으로 정한다. 최댓값은 255이다.

  strip.show(); // 앞서 설정된 내용을 네오픽셀에 전달하여 실행한다.


위의 내용은 setup 함수에서 지정하여 해당 네오픽셀을 사용하기 위한 준비를 한다.


이제 loop 함수를 보자.

17번에서 버튼이 눌렸음을 확인하고 

18번의  strip.setPixelColor(0, strip.Color(255, 0, 0));

명령어는 특정 주소의 LED에 특정 색으로 불을 밝히라는 명령어이다.

setpixelColor(LED주소, 컬러 지정 RGB) 

의 형식으로 사용되는 명령어이다. 따라서 첫 번째 LED(0번)에 R 값 즉 붉은 값을 최대치(255)로 만들라고 명령을 한 것이다.

Color(RED, GREEN, BLUE)와 같이 값을 지정하면 된다.

RGB의 값(0~255)을 적절히 배합하면 이론 상 1천6백만 가지 색을 구현하는 것이 가능하다.

19번 라인의 strip.setPixelColor(strip.numPixels()-1, strip.Color(0, 255, 0));     

는 현재의 네오픽셀의 개수보다 1 작은 값 즉 마지막 LED의 불을 켜라는 것이고, 컬러는 GREEN(녹색) 최댓값을 켜라는 것이다.



결과는 위의 그림과 같이 보일 것이고. 붉은색이 0번 녹색이 11번을 가리키는 것이므로 해당 네오픽셀은 붉은색 LED로부터 시계방향으로 LED가 배치되어 있음을 알 수 있다.


강좌가 길어져서 실제로 네오 픽셀을 응용하는 방법과 장난감 만들기는 다음 회에 계속하도록 하겠다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari