Hardware | WS2812 RGB LED Breakout 보드를 Arduino 로 컨트롤 해보자

저번에 단순한 5050 LED 를 가지고 놀아봤습니다.

* Hardware | RGB LED 5050 SMD module 사용해 보기
  - https://e-chocoball.blogspot.com/2021/05/hardware-rgb-led-5050-smd-module.html


1. WS2812

이번에는 각 cell 을 컨트롤 할 수 있는 LED 칩이 달린 WS2812 를 사용해 봤습니다. 연속적으로 연결된 LED 라고 하더라도 Control signal 을 이용하여 각각의 LED 를 단독으로 컨트롤이 가능합니다.

이는, 발광부 외에 컨트롤 하는 chip 이 LED 안에 내장되어 있기 때문입니다.

* WS2801 VS WS2811 VS WS2812 digital pixel LED strip
  - https://www.suntechleds.com/info/ws2801-vs-ws2811-vs-ws2812-digital-pixel-led-s-36671801.html

각 특징은 위의 사이트에서 자세하게 비교한 내용이 있어, 여기에 발췌해 놓습니다.


+----------------------------------------------------+
|               | WS2801     | WS2811    | WS2812B   |
+----------------------------------------------------+
| IC            | External   | External  | Built-in  |
+----------------------------------------------------+
| Voltage       | DC 5V      | DC 12V    | DC 5V     |
+----------------------------------------------------+
| LED per Meter | 32 leds/m  | 60 leds/m | 60 leds/m |
+----------------------------------------------------+
| Power         | 9.6 W/m    | 14 W/m    | 18 W/m    |
| Consumption   |            |           |           |
+----------------------------------------------------+
| Wires         | +, -, Data | +, -,     | +, -,     |
|               | Clock      | Single    | Single    |
+----------------------------------------------------+

WS2801 은 controller 가 LED 외부체 부착되어 있으며, data line 과 별개로 clock 라인까지 필요한 예전 버전이군요.

거기에 비해 WS2812 는, LED 내부에 chip 이 내장되어 공간 확보로 인한 집적률이 높아진 것을 알 수 있습니다.

발전은 WS2801 > WS2811 (no clock signal)  > WS2812 (built-in) > WS2812B (less pin, brighter) > WS2813 (dual data line, high frequency) 순서네요.

아래 사진을 통해, built-in 된 WS2812 에 와서 단위 길이 당, 집적률이 높아진 것을 알 수 있습니다.

WS2813 도 있는데, WS2812B 보다 refresh rate 개선과 data line 을 이중화 하여, 중간 chip 고장으로 인한 단선을 해결 했다고 합니다. 가장 비싼 chip 이지만, 실 구현한다면 WS2813 이어야 할 것 같습니다.


2. 구입

알리에 가서 적당한 것을 하나 골라 줍니다. 

* diymore WS2812 RGB LED Board Breakout Module for Arduino
    - https://www.aliexpress.com/item/32857652820.html

제품 설명은 다음과 같습니다. 설명과 breakout 보드를 보면, chain 연결을 해도 개별로 컨트롤 할 수 있다고 되어 있네요. W2812는 사실, W2811 이 외부에 컨트롤러를 가지고 있던 것을 LED 안에 built-in 되어있는 버전이라고 되어 있습니다.

Description:
This is a breakout board for the built in WS2812 RGB LED. The WS2812 is actually an RGB LED with a WS2811 built right into the LED! All the necessary pins are broken out to 0.1" spaced headers for easy bread-boarding. Several of these breakouts can be chained together to form a display or an addressable string.

Package Included:
1 x WS2812 RGB LED Breakout Module for Arduino

예상보다 빨리 도착.


3. 외형

Pin 개수가 6개인 걸 보니, 확실히 WS2812 입니다. WS2812B 는 안정성과 잘못된 설치 예방을 위해 Pin 개수가 4개로 줄었습니다.

Clock Signal 을 이용한 control 이라, real-time processing 이 가능한 Arduino 등이 필수로 필요합니다.

일렬로 연결할 수 있도록 되어 있으며, 도착한 breakout board 는 한쪽 pin 들만 납땜할 수 있게 되어 있습니다.

Voltage 외에 Data In / Out 이 존재합니다.

스마트폰으로 줌을 땡겨 보니, controller chip 이 LED 안에 들어가 있는 모양이 살짝 보이는 군요.

Dino 라는 줌을 땡겨주는 장비가 있어, 찍어 봤습니다. 꽤 열도 발생할 터인데, 잘도 LED 안에 chip 을 built-in 했네요.


4. 연결

저번 5050 LED 일 때에는 RGB 에 연결을 모두 해줘야 하지만, WS2812 는 data line 하나만 연결하고, 나머지는 Voltage / Ground 입니다.


+-----------------------+
| WS2812 | Arduino Nano |
+-----------------------+
|   DI   |      D3      |
|   5V   |      5V      |
|   GND  |      GND     |
+-----------------------+


연결 다이어그램은 다음과 같습니다. 너무 간단하쥬.


5. Library

Control 시그널을 스펙대로 만들어야 하나, 이쪽 계열에 대한 라이브러리들이 이미 많이 만들어져 있습니다. Library 검색에서 "fastled" 라고 치면 나오는 구동 라이브러리를 설치합니다.

Arduino IDE > Tools > Manage Libraries > fastled


6. Source & Run

라이브러리가 설치 되었으니, Examples 에 가서 적당한 예제를 하나 골라 봅니다. 처음이니까 "FirstLight" 골라 봤습니다.

Arduino IDE > File > Examples > FastLED > FirstLight

소스가 복잡해 보이는데, 주석 설명과 여러가지 LED 에 대응하기 위한 코드가 준비되어 있기 때문입니다.

소스코드를 직접 올리고 싶으나 Syntax Highligher 나 HTML 적으로 "<" 때문에 코드가 뭉게지는 군요. 스샷으로 대신 합니다.

직렬로 연결 된 LED 들을 키는 것이라, 몇 개의 LED 가 달려 있으며, 어느 Digital Pin 에 연결되어 있는지만 정의하면 됩니다. 구동 시켰더니 바로 켜집니다.

소스가 조금 아쉽네요. 색을 완전히 처리하지 않은 듯 한 느낌을 받습니다.

뭔가 아쉬우니 Cylon 이라는 예제를 동작시켜 봅니다.

Arduino IDE > File > Examples > FastLED > Cylon



#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 64 

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806, define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 3
#define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
	Serial.begin(57600);
	Serial.println("resetting");
	LEDS.addLeds(leds,NUM_LEDS);
	LEDS.setBrightness(84);
}

void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

void loop() { 
	static uint8_t hue = 0;
	Serial.print("x");
	// First slide the led in one direction
	for(int i = 0; i < NUM_LEDS; i++) {
		// Set the i'th led to red 
		leds[i] = CHSV(hue++, 255, 255);
		// Show the leds
		FastLED.show(); 
		// now that we've shown the leds, reset the i'th led to black
		// leds[i] = CRGB::Black;
		fadeall();
		// Wait a little bit before we loop around and do it again
		delay(10);
	}
	Serial.print("x");

	// Now go in the other direction.  
	for(int i = (NUM_LEDS)-1; i >= 0; i--) {
		// Set the i'th led to red 
		leds[i] = CHSV(hue++, 255, 255);
		// Show the leds
		FastLED.show();
		// now that we've shown the leds, reset the i'th led to black
		// leds[i] = CRGB::Black;
		fadeall();
		// Wait a little bit before we loop around and do it again
		delay(10);
	}
}


이쪽 소스가 좀 더 낫네요.

참고로 FastLED 의 Rainbow 를 구현할 때, RGB 가 어떤 식으로 배합되는지 보여주는 사진이 있어 올려 봅니다.

언젠가 집에 LED bar 를 사용하게 되면, 이번에 했던 내용이 요긴하게 쓰이겠네요.

FIN


댓글