Chapter 13. Neopixel(WS2812B) 화려한 조명 제어
단 한 가닥의 데이터 선으로 수많은 RGB LED를 개별 제어하는 기술을 배웁니다. Pico 2의 고속 PIO 기능을 활용해 부드러운 무지개 효과를 구현합니다.
Neopixel: VCC→5V(VSYS), DIN→GP22, GND→GND. LED 개수가 많으면 별도 5V 전원을 사용하고 GND는 Pico와 공통으로 묶습니다.
13.1 준비물과 연결 핀
Neopixel은 데이터 선 하나로 여러 LED를 순서대로 제어합니다. 첫 번째 LED의 DIN 방향을 꼭 확인하고, 전류가 커지는 프로젝트에서는 밝기를 제한해서 시작하세요.
| Neopixel 핀 | Pico 2 W 핀 | 설명 |
|---|---|---|
| DIN | GP22 | 색상 데이터 입력 |
| 5V / VCC | VSYS 또는 외부 5V | LED 전원 |
| GND | GND | 공통 기준 전압 |
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 외부 전원 어댑터를 사용해야 보드가 손상되지 않습니다.