네오픽셀 자료 > 개발자팁 | IOTsw_u2 U2 Project
개발자팁

Etc 네오픽셀 자료

본문


[Neopixel]


[외형]

네오픽셀은 용도에 따라 rings, strips, boards and sticks 등의 다양한 형태가 존재합니다.

 

                               이미지 출처 : 네오픽셀 페이지의 이미지들 편집

 

저는 흔히 RGB BAR라고 부르는 아래 사진처럼 릴에 감겨있는 스트립 형태하고 링 형태의 제품만 사용해 봤습니다.^^

참고로, 네오픽셀 스트립의 경우 1미터에 약 $25정도 합니다.^^

Adafruit NeoPixel Digital RGB LED Strip - White 60 LED - WHITE

제품 URL : https://www.adafruit.com/product/1138 

 

 

일반적으로 WS2812B가 사용된 스트립 제품들은 이렇게 미터 단위로 판매합니다.

 

 

제품은 1미터당 몇 개의 LED를 사용했는지와 방수 형태에 따라 제품군이 나뉩니다.

보통 1미터당 30 / 60 / 90 / 144개의 LED 제품이 판매되며 방수 형태는 IP30 / IP60 / IP65이 가장 많습니다.

미터당 사용된 LED 수가 많을수록 간격이 촘촘하겠죠? (144개짜리 제품은 거의 붙어있습니다.)

 

IP30: Non- waterproof

IP65: Waterproof in Silicon Coating

IP67: Waterproof in SiliconTube

 

또한, 스트립의 경우 절단 표시 부위를 잘라서 원하는 길이만큼 잘라서 사용해도 됩니다.

 

저처럼 납땜해서 사용해도 되고...

 

전용 커넥터를 이용해서 손쉽게 연결도 가능합니다.

 

무엇보다 위처럼 전용 커넥터를 사용하면 깔끔하게 연결할 수 있다는 장점이 있겠죠?

 

 

[용도 및 개념]

사진에서 가로*세로 5mm의 하얀색 사각형이 WS2812B입니다.


잘 안보이겠지만 모듈 안을 자세히 보면 작은 IC 칩이 하나 보입니다.

그 칩이 바로 주인공인 WS2811로 불리는 LED를 제어하는 LED 드라이버 칩입니다. (세부 내용은 첨부된 데이터 시트를 보세요.)

 

WS2812B는 이렇게 5mm의 사각형 안에 LED를 제어하기 위한 WS2811 LED 제어 칩과 RGB 칩이 모두 들어가 있습니다.

 

WS2811 데이터 시트를 보면 다음처럼 표현하고 있습니다.

Signal line 256 Gray level 3 channal Constant current LED drive IC

 

제 전공이 아니라 무슨 의미인지 모르겠지만 256 단계의 그레이 레벨과 3채널 정전류 LED 드라이버 IC라는 것 같군요.-_-;;

 

그리고 몇 가지 중요하다 싶은 내용도 옮겨 봅니다. (영어라 의미는 알아서~)

- Gray level 256 can be adjusted and scan freque ncy not less than 400Hz/s.

- Built in stabilivolt, Only add a resistance to IC VDD feet when under 24V power supply.



쇼핑몰을 보면 WS2812에서 좀 더 개선된 WS2812B 제품이 판매되고 있습니다.

아마 지금은 구매하는 제품들이 특별한 경우를 제외하고는 WS2812B라고 생각됩니다.^^
WS2812B의 핀 구성과 기능 설명입니다.




WS2812B는 기존의 WS2812에서 핀 구성도 바뀌었고 데이터 시트에서 가장 큰 차이점은 아래 두 가지 정도인 것 같습니다.
- Intelligent reverse connect protection, the power supply reverse connection does not damage the IC.
- The control circuit and the LED share the only power source.

최종 사용할 모듈은 WS2812B이고 스트립 타입이 아니라 직접 모듈만 이용하는 경우도 있으니...
지금은 이해를 못 해도 향후를 대비해서 주의 사항 및 동작 방식을 참고하기 위해 데이터 시트를 최대한 옮겨 봅니다.

Absolute Maximum Ratings는 다음과 같습니다.

입력 전원 전압은 3.5~5.3v가 최대군요.

RGB IC characteristic parameter는 다음과 같습니다.


Data transfer time( TH+TL=1.25μs±600ns)입니다.


Sequence chart입니다.


Cascade method입니다.


픽셀과 픽셀(WS2812B)은 서로 Din과 Dout으로 데이터가 전달된다고 했었죠?
위 그림은 대충 아래와 같이 3개의 WS2812B가 연결되었다고 보면 됩니다.

처음 들어온 D1 신호가 Dout을 통해서 D2로~ 같은 원리로 D3로 계속 전달됩니다.^^

Data transmission method입니다.

D1은 최초 입력되는 곳이니 아두이노 등의 MCU에서 전송한 값이고 D2, D3, D4는 Cascade에 의해 내부적으로 값이 전달됩니다.

전달되는 RGB 색상의 24비트 데이터 구성입니다.


색상 값은 좌측부터 1바이트(8비트)씩 Green/Red/Blue 순서군요.
Adafruit의 NeoPixel 라이브러리를 보면 setPixelColor()함수를 이용해서 특정 위치의 LED 색상을 지정하도록 되어있습니다.
첫 번째 인자는 2바이트 정수로서 설정하고 싶은 LED의 번호입니다.
즉, WS2812가 3개 있다면 3개 중 어떤 녀석인지 지정하는 것입니다. 

그리고, unit8_t 타입이니 1바이트 타입으로 Red/Green/Blue값을 차례대로 입력받습니다.


하지만, WS2812B는 Green/Red/Blue 순서로 전송해야 하기 때문에 Red/Green/Blue값을 Green/Red/Blue 순서로 저장합니다.
색상 지정이 끝났으면 show() 함수를 이용해서 네오픽셀(WS2812B)로 전달하면 네오픽셀에 반영됩니다.

잠깐, Adafruit_NeoPixel 라이브러리에서 제공되는 simple 예제를 살펴보면 대략 다음과 같습니다.
Adafruit_NeoPixel 라이브러리를 사용하기 전에 네오픽셀의 특성을 지정합니다.

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

NUMPIXELS은 사용할 LED 수로서 1미터에 60개짜리 스트립 제품이라면 NUMPIXELS은 60이 되겠죠^^
PIN은 네오픽셀의 Data 핀이 연결된 아두이노의 핀 빈호입니다.
WS2812B는 위처럼 색상이 RGB가 아닌 Green/Red/Blue순이므로 NEO_GRB를 사용하면 됩니다.
그리고 마지막의 값은 WS2811은 400KHZ, WS2812B는 800KHZ입니다.
3번째 인자는 특별한 경우를 제외하고는 WS2812B 제품은 "NEO_GRB + NEO_KHZ800" 고정입니다.

그리고 위에서 살펴본 것처럼 특정 LED의 색상을 지정합니다.
제일 첫 번째 LED의 색상을 Green의 150 정도로 설정하고 싶다면 아래처럼 합니다.
pixels.setPixelColor(i, pixels.Color(0,150,0));  // 함수는 Red/Green/Blue 순서로 지정

다섯 번째 LED의 색상을 지정하려면 이렇게 되겠죠?
pixels.setPixelColor(i, pixels.Color(4,150,0));  // 함수는 Red/Green/Blue 순서로 지정

하지만, 네오픽셀 가이드 문서와 위의 분석한 소스를 보면 색상은 아래처럼 RGB 값을 곧바로 지정해도 됩니다.
pixels.setPixelColor(4, 0, 150, 0);

색상 값은 처음처럼 32비트 형태로 지정하거나 RGB 값을 개별로 지정할 수 있으니 편한 방식을 이용하면 됩니다.
그리고 반대로 getPixelColor()을 이용해서 특정 LED의 색상 값을 조회할 수 도 있습니다.
uint32_t color = pixels.getPixelColor(4);

색상 지정이 끝났으면 show()를 호출해서 해당 WS2812B에 전송해야 LED에 색상이 반영됩니다.
pixels.show();

당연히, show()를 호출하지 않으면 메모리에만 반영되겠죠^^;;

그리고, for() 문에서 지금까지의 코드를 활용하면 차례대로 LED에 색상이 반영될 것입니다.^^

  for(int i=0;i<NUMPIXELS;i++)

{
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.
    pixels.show(); // This sends the updated pixel color to the hardware.
    delay(500); // Delay for a period of time (in milliseconds).
}
세부적인 내용은 참고 자료나 온라인 강좌를 참고하세요.

대충 훑어보니 FAQ가 있어서 Adafruit의 강좌를 먼저 살펴보시면 좋을 것 같네요.
https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library

 

 

메모리 문제

이건 일반적인(?) 경우에는 해당되지 않겠지만...
WS2812B가 Cascade 형식으로 수천 개를 붙일 수 있어도 위에서 살펴본 소스를 보면 알 수 있듯이...
네오픽셀 LED(WS2812B)의 색상 하나를 표현하기 위해서는 3바이트(G/R/B)의 RAM이 필요합니다.

하지만, 아두이노 제품에 따라서는 가용한 메모리 공간이 다릅니다.
예를 들어, 아두이노 우노의 경우 RAM이 2K뿐이 안되기 때문에 사용 가능한 LED의 수가 제한적입니다.^^;;

많은 수의 LED를 사용해야 하면 메모리가 많은 MCU를 사용하거나 아래 글을 참고해서 해결하라고 하는군요.^^;;
아두이노를 여러 개 사용해서 해결하는 게 가장 빠르리라 봅니다.^^;;;

네오픽셀의 경우 필요한 최소 전류 때문에 아두이노에서 직접 연결하기보다는 별도의 전원을 많이 이용합니다.
그래서 네오픽셀(WS2812B)을 보호하기 위해 전원과 관련된 고려해야 할 문제들이 있습니다.^^


전원 연결 순서
사용하는 전원에 따라서는 전압이 안정되기까지 순간 전력에 의해 WS2812B의 첫 번째 LED가 파손될 수 있다고 하네요.
그래서 전원 연결은 무조건 GND(-)부터 연결하고 전원을 뽑을 때에는 GND(-)를 가장 마지막에 뽑아야 합니다.

전원 부족 현상
LED 수가 많아지면 많아질수록 전력 소모가 심해지니 WS2812B에 공급할 전원 문제도 함께 고려해야 합니다.^^;;
pololu.com의 제품 소개 글을 보면 WS2812B는 최대 밝기에서 LED 하나당 50mA를 소모한다고 합니다.

Adafruit나 sparkfun의 글에는 R/G/B 하나 당 각각 20mA를 소비하기 때문에 20mA*3=60mA를 소모한다고 적혀있습니다.
이상적으로는 가장 많이 소비되는 60mA로 생각하면 되겠지요.

일반적으로 애니 메이션이나 특정 색상을 사용하므로 모든 LED의 R/G/B를 항상 최대 밝기로 사용할 일은 극히 드물기 때문에...
항상 60mA를 소비하지 않으며 Adafruit에서는 이 경우를 감안해서 LED 하나당 20mA 정도를 보고 있습니다.

따라서, 각자 필요한 전력을 구할 때 20mA로 할 것인지 60mA로 할 것인지 적당히 감안하시기 바랍니다.
만약, 최대 밝기에서도 아무런 문제가 없게 하려면 60mA로 가정하고 필요한 전력을 계산해야겠죠.^^

대략 1미터 당 60개의 네오픽셀 제품을 이용할 경우 20mA와 60mA를 사용할 경우에 필요한 전류입니다.
화이트 표현 = 60 NeoPixels × 20 mA ÷ 1,000 = 1.2 Amps minimum
여러가지사황평균 = 60 NeoPixels × 60 mA ÷ 1,000 = 3.6 Amps minimum

즉, 60mA로 계산하면 최소 3.6암페어 이상의 전원이 네오픽셀(WS2812B)에 공급되어야 합니다.

물론 각자의 프로젝트에 사용하는 방식과 전압 강하 현상에 의해 좀 더 복잡하겠지만...
네오픽셀의 길이가 너무 길면 와이어도 저항으로 작용하므로 전압강하 현상이 발생합니다.
이 경우 사진처럼 양끝단에 공급되는 전력이 달라서 색상이 이상해집니다.
데이터 시트를 보면 RED 보다 BLUE와 GREEN의 전압이 더 많이 먹습니다.^^
Consider a full 4 meter reel of NeoPixels. With 5V applied at one end of the strip, for those pixels closest to this end, power traverses only a few inches of copper. But at the far end of the strip, power traverses 8 meters of copper — 4 meters out on the +5V line, 4 meters back on the ground line. Those furthest pixels will be tinted brown due to the voltage drop (blue and green LEDs require higher voltage than red).

팁으로는... 네오픽셀은 어디서 전원을 공급 받든 중요하지 않습니다.
데이터는 무조건 한 방향으로 흐르지만 전기는 어느 쪽이든 갈 수 있습니다. 
전원을 네오픽셀의 가장 앞쪽이나 뒤쪽 또는 중간이나 이상적인 여러 곳에 분산해서 연결할 수 있습니다.
최고의 색상 일관성을 위해서는, 전원 연결부로부터 어떤 픽셀이든 1미터나 그 이하를 목표로 하라고 하네요.
대량의 네오픽셀을 사용하려면 전원 하나로 계속 공급하기보다는 나무의 가지처럼 전원을 분산 시키라고 합니다.
Pro Tip: NeoPixels don’t care what end they receive power from. Though data moves in only one direction, electricity can go either way. You can connect power at the head, the tail, in the middle, or ideally distribute it to several points. For best color consistency, aim for 1 meter or less distance from any pixel to a power connection. With larger NeoPixel setups, think of power distribution as branches of a tree rather than one continuous line.


참고로, pololu.com에서 최대 밝기 상태로 전압 드롭을 테스트 했다고합니다.
We tested the current draw and voltage drop of some LED strips by setting all the LEDs to full brightness, and these were the results:

The 30 LED 1 m strip drew 1.5 A and had a voltage drop of 0.2 V.
The 60 LED 2 m strip drew 2.9 A and had a voltage drop of 0.8 V.
The 150 LED 5 m strip drew 4.1 A and had a voltage drop of 2.0 V.
The 60 LED 1 m strip drew 3.0 A and had a voltage drop of 0.6 V.
The 120 LED 2 m strip drew 4.7 A and had a voltage drop of 1.4 V.

보호 저항
pololu.com은 노이즈 제거를 위해 아두이노(MCU)와 연결되는 데이터 핀에는 100Ω 에서 500Ω 사이의 저항을 달아 주라고 하는군요.
Consider adding a 100Ω to 500Ω resistor between your microcontroller’s data output and the LED strip to reduce the noise on that line.

Adafruit에서는 300Ω 에서 500Ω 사이의 저항을 달아 주라고 하는군요.
네오픽셀의 첫 번째 Din에 300~500 옴의 저항을 달아줘야 불의의 스파크로부터 네오픽셀을 보호할 수 있다고 합니다.^^
Adding a 300 to 500 Ohm resistor between your microcontroller's data pin and the data input on the first NeoPixel can help prevent voltage spikes that might otherwise damage your first pixel. Please add one between your micro and NeoPixels!

Sparkfun에서는 아두이노 데이터 핀을 보호하기 위해 220Ω에서 470Ω 사이의 저항을 달아 주라고 하는군요.
Placing a small-ish resistor between your Arduino’s data output and the WS2812’s data input will help protect the data pin. A resistor between 220 and 470 Ω should do nicely.


전원 콘데서
pololu.com은 WS2812에 연결되는 전원 입력의 접지 및 전원 선 사이에 적어도 100 μF의 커패시터를 연결하라고 하네요.
Connect a capacitor of at least 100 μF between the ground and power lines on the power input.

sparkfun에서는 WS2812에 전원을 공급하기 전에 전원과 접지에 100µF~1000µF 사이의 대형 콘덴서를 연결하라고 하네요.
Before connecting the WS2812 to a power source, connect a big capacitor from power to ground.
A cap between 100µF and 1000µF should be good.


WS2812의 전원 사용량이 들쭉날쭉하기 때문에 이 콘덴서는 안정적으로 전원을 공급하는데 도움이 된다고 합니다.
This cap will help to smooth out your power supply. The current draw of a WS2812 can vary wildly, and as current draw grows and shrinks it’ll be up to your power source to compensate. The cap will act as a “power reservoir” to store energy in case the supply dips. 라고 하는군요.

Adafruit에서는 네오픽셀에 어떤 형태의 전원을 공급하든 전원 터미널의 +와 -에 1000 µF의 대형 콘덴서를 추가하라고 강력하게 권장하고 있습니다.
Before connecting a NeoPixel strip to ANY source of power, we very strongly recommend adding a large capacitor (1000 µF, 6.3V or higher) across the + and – terminals. This prevents the initial onrush of current from damaging the pixels.

이런 식으로 달아주면 되겠습니다.


요즘 감기 때문인지 눈도 안 보이고 귀찮아서 대충 훑어봤으니 원문을 살펴보시기 바랍니다.^^;;;
영어는 내 맘대로라 틀린 부위가 많으니 알려주세요~*^^*


[출처] [버섯][부품] RGB BAR ( WS2812 , WS2812B , WS2813 ) 정리 - Adafruit Neopixel RGB 스트립 & 최저가 정보 - Ver 1.4|작성자 버섯돌이 


 

 

 

댓글목록

개발자팁 목록

Total 10건 1 페이지
게시물 검색

IOTsw_u2 정보

회사 . U2
주소 . 어느별 하늘 아래에 있것지요
사업자 등록번호 . 백수임 대표 . 김씨 전화 . 02-123-4567 팩스 . 팩스없음
통신판매업신고번호 . 낼할께 개인정보관리책임자 . 김씨가 알아서 함 부가통신사업신고번호 신고안함
Copyright © 2001-2013 U2. All Rights Reserved.
닫기