일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 애플
- 티스토리챌린지
- 파이썬
- Espressif
- Home Assistant
- homebridge
- 힐스테이트 광교산
- MQTT
- 배당
- 나스닥
- RS-485
- 홈네트워크
- 코스피
- 해외주식
- Bestin
- raspberry pi
- cluster
- 미국주식
- ConnectedHomeIP
- SK텔레콤
- Python
- 매터
- 현대통신
- 오블완
- 월패드
- Apple
- 국내주식
- 공모주
- matter
- esp32
- Today
- Total
YOGYUI
(CJMCU-2812-16) WS2812 RGB LED Array (x16 Ring) 본문
1. Introduction
WS2812 RGB LED Chip이 링 형태로 16개 직렬 연결되어 있는 디스플레이 모듈
WS2812는 5050 (가로 5mm, 세로 5mm) SMD 패키지 내부에 적(Red), 녹(Green), 청(Blue) LED 3개와 이들 LED의 밝기를 제어하는 회로가 내장되어 있다
칩 한개가 색상별로 256단계, 총 16777216 색상을 나타낼 수 있으며 최대 초당 400Hz로 스캔
1-wire 디지털 통신 (NZR, Non-return-to-zero 방식)을 통해 제어가 가능하며, DI 핀을 통해 다음 그림과 같이 WS2812 하나당 24비트 (RGB 각각 8비트) 데이터를 연속으로 전송하면 된다 (통신 속도는 800Kbps)
※ 직렬로 여러개 연결된 경우 WS2812가 알아서 데이터를 끊어서 다음 칩으로 넘기게 된다
본 포스팅에서 다루는 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 모듈을 일컫는 단어)
아두이노로 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라서 유연해서 좋긴 한데 너무 비싸다...)
끝~!
'Hardware > Arduino' 카테고리의 다른 글
ArduinoJson Document - Key 존재 여부 확인 (0) | 2021.02.15 |
---|---|
ESP8266에서 MQTT 구동하기 (0) | 2021.02.01 |
Keyes ESP8266 WiFi Module (0) | 2021.01.31 |
Adafruit HT16K33 Backpack + LED Display (14-segment) (0) | 2021.01.28 |