Chapter 13. Neopixel(WS2812B) 화려한 조명 제어

단 한 가닥의 데이터 선으로 수많은 RGB LED를 개별 제어하는 기술을 배웁니다. Pico 2의 고속 PIO 기능을 활용해 부드러운 무지개 효과를 구현합니다.

Pico 2 W와 Neopixel LED 스트립 연결도 Pico의 GP22 데이터 핀을 Neopixel DIN에 연결하고, VSYS와 GND로 전원을 공급합니다. 제어 보드 주소 지정 RGB LED Pico 2 W Neopixel Controller 색상 데이터 1선 제어 GP22 DATA VSYS 5V GND WS2812B / Neopixel Strip DIN 5V GND 데이터 방향은 Pico GP22 -> LED DIN입니다. LED가 많아질수록 외부 5V 전원과 공통 GND가 중요합니다.

Neopixel: VCC→5V(VSYS), DIN→GP22, GND→GND. LED 개수가 많으면 별도 5V 전원을 사용하고 GND는 Pico와 공통으로 묶습니다.

13.1 준비물과 연결 핀

Neopixel은 데이터 선 하나로 여러 LED를 순서대로 제어합니다. 첫 번째 LED의 DIN 방향을 꼭 확인하고, 전류가 커지는 프로젝트에서는 밝기를 제한해서 시작하세요.

Neopixel 핀 Pico 2 W 핀 설명
DINGP22색상 데이터 입력
5V / VCCVSYS 또는 외부 5VLED 전원
GNDGND공통 기준 전압

13.2 밝기 제한 무지개 효과 코드

import machine
import neopixel
import time

NUM_LEDS = 8
DATA_PIN = 22
BRIGHTNESS = 0.25

np = neopixel.NeoPixel(machine.Pin(DATA_PIN), NUM_LEDS)

def wheel(pos):
    if pos < 85:
        return (pos * 3, 255 - pos * 3, 0)
    elif pos < 170:
        pos -= 85
        return (255 - pos * 3, 0, pos * 3)
    else:
        pos -= 170
        return (0, pos * 3, 255 - pos * 3)

def dim(color, brightness=BRIGHTNESS):
    r, g, b = color
    return (int(r * brightness), int(g * brightness), int(b * brightness))

def clear():
    for i in range(NUM_LEDS):
        np[i] = (0, 0, 0)
    np.write()

def rainbow_cycle(delay=0.02):
    for offset in range(256):
        for i in range(NUM_LEDS):
            color_index = (i * 256 // NUM_LEDS + offset) & 255
            np[i] = dim(wheel(color_index))
        np.write()
        time.sleep(delay)

print("Neopixel 효과 시작...")
clear()

while True:
    rainbow_cycle()

13.3 동작 흐름

wheel() 함수는 0~255 값을 빨강, 초록, 파랑이 이어지는 색상으로 바꿉니다. 각 LED에 서로 다른 색상 인덱스를 주고, 반복할 때마다 인덱스를 조금씩 밀어주면 무지개가 흐르는 것처럼 보입니다. BRIGHTNESS 값은 전류를 줄이기 위한 안전 장치입니다.

⚠️ 전원 주의사항

Neopixel은 밝기가 밝을수록 많은 전류를 소비합니다. Pico의 3V3 핀 대신 VSYS(5V) 핀을 사용하세요. LED가 30개 이상이라면 5V 외부 전원 어댑터를 사용해야 보드가 손상되지 않습니다.