YOGYUI

(CJMCU-2812-16) WS2812 RGB LED Array (x16 Ring) 본문

Hardware/Arduino

(CJMCU-2812-16) WS2812 RGB LED Array (x16 Ring)

요겨 2021. 3. 1. 18:11
반응형

CJMCU-2812-16 LED Ring Array

1. Introduction

WS2812 RGB LED Chip이 링 형태로 16개 직렬 연결되어 있는 디스플레이 모듈

WS2812는 5050 (가로 5mm, 세로 5mm) SMD 패키지 내부에 적(Red), 녹(Green), 청(Blue) LED 3개와 이들 LED의 밝기를 제어하는 회로가 내장되어 있다

칩 한개가 색상별로 256단계, 총 16777216 색상을 나타낼 수 있으며 최대 초당 400Hz로 스캔 

WS2812 데이터시트

WS2812 Pin-Map

 

1-wire 디지털 통신 (NZR, Non-return-to-zero 방식)을 통해 제어가 가능하며, DI 핀을 통해 다음 그림과 같이 WS2812 하나당 24비트 (RGB 각각 8비트) 데이터를 연속으로 전송하면 된다 (통신 속도는 800Kbps)

※ 직렬로 여러개 연결된 경우 WS2812가 알아서 데이터를 끊어서 다음 칩으로 넘기게 된다 

WS2812 디지털 통신 방식, 출처: 데이터시트
WS2812 Cascase 구성

 

본 포스팅에서 다루는 CJMCU-2812-16 처럼 고리 형태로 구성하거나, LED Strip으로 구성해 실내/외 인테리어 조명으로 사용할 수도 있고, 초대형 디스플레이의 하나의 픽셀로 구성할 수도 있다

(개당 가격이 M.O.Q 5천 이상일 땐 70~80원 수준으로 꽤나 저렴하고, 디지털 통신 구현도 쉬워 여기저기 많이 쓰인다)

2. Prepare

제품 구매 시 PCB에 별도로 Wiring이 안되어 있기 때문에 직접 납땜해줘야된다

(VCC, GND, DIN 3개 선만 납땜해주면 된다)

솔더링 준비
솔더링 완료

3. Prototyping

프로토타이핑은 아두이노로 진행

라이브러리는 "WS2812" 키워드로 검색하면 결과가 많이 나오는데, 이 중 NeoPixelBus by Makuna 라이브러리를 설치했다 (NeoPixel은 Adafruit사에서 판매중인 LED 모듈을 일컫는 단어)

NeoPixelBus by Makuna 라이브러리 설치

아두이노로 WriteDigital 이 가능한 GPIO 중 아무거나 하나 골라서 WS2812 모듈의 DIN에 연결해주면 된다

(안정적인 전류 인가를 위해 VCC는 YwRobot사의 외부 전원 +5V 레귤레이터 사용)

 

프로토타이핑을 위해 Arduino Micro를 사용, 다음과 같이 라우팅했다

프로토타이핑 라우팅

 

16개 LED 전체 색깔을 한꺼번에 바꾸는 코드를 짜보자

#include <NeoPixelBus.h>

const uint16_t PixelCount = 16;
const uint8_t PixelPin = 2;
int count = 0;
uint8_t value_r = 0;
uint8_t value_g = 0;
uint8_t value_b = 0;

NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);

void setup() {
  Serial.begin(115200);

  strip.Begin();
  strip.Show();
}

void loop() {
  count += 1;
  if (count < 256) {
    value_r = count;
    value_g = 0;
    value_b = 0;
  } else if (count < 256 * 2) {
    value_r = 0;
    value_g = count - 256;
    value_b = 0;
  } else if (count < 256 * 3) {
    value_r = 0;
    value_g = 0;
    value_b = count - 256 * 2;
  } else {
    count = 0;
  }
  
  for (int i=0; i<PixelCount; i++)
  {
    strip.SetPixelColor(i, RgbColor(value_r, value_g, value_b));
  }
  strip.Show();
  delay(1);
}

[결과]

 

이번엔 16개의 LED를 순차적으로 색을 변경시키는 코드를 구동해보자

#include <NeoPixelBus.h>

const uint16_t PixelCount = 16;
const uint8_t PixelPin = 2;
int count1 = 0;
int count2 = 0;

NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);

void setup() {
  Serial.begin(115200);

  strip.Begin();
  strip.Show();
}

void loop() {
  int r, g, b;
  switch (count1) {
    case 0:
      r = 255; g = 0; b = 0;
    break;
    case 1:
      r = 0; g = 255; b = 0;
    break;
    case 2:
      r = 0; g = 0; b = 255;
    break;
  }
  
  for (int i=0; i<PixelCount; i++)
  {
    strip.SetPixelColor(i, RgbColor(0, 0, 0));
  }
  strip.SetPixelColor(count2, RgbColor(r, g, b));
  strip.Show();

  count1 += 1;
  count2 += 1;

  if (count1 >= 3)
    count1 = 0;
  if (count2 >= 16)
    count2 = 0;
  
  delay(500);
}

[결과]

 

다음에 기회가 되면 ESP8266에 물려서 MQTT로 애플 홈킷이랑 연동해봐야겠다

(필립스 휴 스트립은 FPCB라서 유연해서 좋긴 한데 너무 비싸다...)

 

끝~!

반응형