Search
Duplicate

[pyphy]2.네오픽셀

목차(클릭하세요)
반복문, 조건문, 클래스 등 기초적인 파이썬 문법을 이해했다는 가정하에

1. 네오픽셀

"개별 제어 가능한 RGB LED 다수가 원형으로 배열된 모듈 - 단 1개 핀으로 수십 개 LED 제어"
핵심:
일반 RGB LED = 신호등 1개 (빨강/초록/파랑만 선택)
네오픽셀링 = 크리스마스 트리 전구 (각각 다른 색으로 반짝)
→ 각 LED마다 다른 색/밝기를 독립적으로 설정 가능
참고 네오픽셀링은 8개부터 60개까지 다양함

네오픽셀링 제품 종류

제품
LED 개수
직경
용도
Ring 8
8개
32mm
시계, 나침반 표시
Ring 12
12개
44mm
시간 표시, 게임
Ring 16
16개
44mm
아날로그 시계
Ring 24
24개
66mm
대형 디스플레이
Ring 60
60개
158mm
조명 효과

1-1. pypy키트 기준 네오픽셀

총 12개의 LED가 연결된 네오픽셀링
GPIO 14번 핀에 연결되어 있음
from machine import Pin from neopixel import NeoPixel from time import sleep # GPIO 14번 핀을 출력으로 설정 pin = Pin(14, Pin.OUT) # 14번 핀에 연결된 12개의 네오픽셀 초기화 np = NeoPixel(pin, 12) # 0번부터 11번 LED까지 순차적으로 켜기 for i in range(0, 12): np[i] = (255, 255, 255) # i번 LED를 흰색으로 설정 np.write() # 실제로 LED에 반영 sleep(0.5) # 0.5초 대기
Python
복사

1-2.네이픽셀링 켜기(기본)

홀수 led는 빨강, 짝수 LED는 노랑색으로 변경
from machine import Pin from neopixel import NeoPixel from time import sleep # GPIO 14번 핀을 출력으로 설정 pin = Pin(14, Pin.OUT) # 14번 핀에 연결된 12개의 네오픽셀 초기화 np = NeoPixel(pin, 12) # 0번부터 11번 LED까지 순차적으로 켜기 for i in range(0, 12): if i % 2 == 0: # 짝수 번호 LED (0, 2, 4, 6, 8, 10) np[i] = (255, 255, 0) # 노랑색 else: # 홀수 번호 LED (1, 3, 5, 7, 9, 11) np[i] = (255, 0, 0) # 빨강색 np.write() # 실제로 LED에 반영 sleep(0.5) # 0.5초 대기
Python
복사

2. 네오픽셀링 그라디에이션

2-1. 무지개 색 변환을 위한 코드 아이디어

핵심 아이디어
LED들이 빨→주→노→초→파→남→보 순서로 회전
각 LED는 다음 LED와 다른 색

2-2. 코드 구현

from machine import Pin from neopixel import NeoPixel from time import sleep pin = Pin(14, Pin.OUT) np = NeoPixel(pin, 12) def rainbow_wheel(pos): """ pos: 0~6 (7가지 색) 빨주노초파남보 순서로 반환 """ colors = [ (255, 0, 0), # 0: 빨강 (255, 127, 0), # 1: 주황 (255, 255, 0), # 2: 노랑 (0, 255, 0), # 3: 초록 (0, 0, 255), # 4: 파랑 (0, 0, 128), # 5: 남색 (148, 0, 211), # 6: 보라 ] return colors[pos % 7] # 7로 나눈 나머지 while True: for j in range(7): # 7단계 순환 for i in range(12): np[i] = rainbow_wheel(i + j) np.write() sleep(0.3)
Python
복사

2-3. 보다 부드러운 전환(색사이 그라디에이션)

핵심 아이디어: "0~255 숫자 하나로 빨→노→초→청→보→빨 순환하는 색상 만들기"
보다 부드러운 전환을 위해 각도를 기준으로 바늘이 한바퀴 돌면서 모든 무지개 색을 지나가는 과정 이해하기
0° (빨강) ↑ | 270° ← → 90° (초록) | ↓ 180° (파랑)
RGB 3색의 "역할 교대”
구역 1 (0~84): R: 2550 (감소하며 퇴장) G: 0255 (증가하며 등장) ✅ B: 0 (대기) 구역 2 (85~169): R: 0 (대기) G: 2550 (감소하며 퇴장) B: 0255 (증가하며 등장) ✅ 구역 3 (170~255): R: 0255 (증가하며 등장) ✅ G: 0 (대기) B: 2550 (감소하며 퇴장)
Python
복사
색상표 만들기: 0~255 숫자 하나 → RGB 색상으로 변환
wheel(0)(255, 0, 0) # 빨강 wheel(85)(0, 255, 0) # 초록 wheel(170)(0, 0, 255) # 파랑 wheel(255)(255, 0, 0) # 다시 빨강
Python
복사
pos * 3로 0→255 빠르게 변화, 곱하는 숫자에 따라 변화속도가 달리지는 것을 확인 가능
LED 간격 배치
0(빨강) ↑
234 ← LED링 → 21(주황) ↓ 128(청록)
LED 0: 0 × 256 ÷ 12 = 0 → wheel(0) → 빨강 LED 1: 1 × 256 ÷ 12 = 21 → wheel(21) → 주황 LED 2: 2 × 256 ÷ 12 = 42 → wheel(42) → 노랑 LED 3: 3 × 256 ÷ 12 = 64 → wheel(64) → 초록 ... LED 11: 11 × 256 ÷ 12 = 234 → wheel(234) → 보라
Python
복사
핵심 아이디어는 결국 LED 간격배치를 결정하는 색상 인덱스 계산 후 무지패 패턴
from machine import Pin from neopixel import NeoPixel pin = Pin(14, Pin.OUT) np = NeoPixel(pin, 12) # 0~255 값에 따라 무지개색 반환 def wheel(pos): if pos < 85: return (255 - pos * 3, pos * 3, 0) elif pos < 170: pos -= 85 return (0, 255 - pos * 3, pos * 3) else: pos -= 170 return (pos * 3, 0, 255 - pos * 3) while True: for j in range(255): # 색상 변화 단계 for i in range(12): # 12개 LED # 각 LED의 색상 인덱스 계산 rc_index = (i * 256 // 12) + j # 나머지 연산 사용 (0~255 범위로 제한) np[i] = wheel(rc_index % 256) np.write() # LED에 반영
Python
복사

3. 업그레이드

3-1. 사용자 입력을 통한 간격조절

핵심 아이디어: 사용자 입력을 step변수로 받아 회전속도 조정
from machine import Pin from neopixel import NeoPixel pin = Pin(14, Pin.OUT) np = NeoPixel(pin, 12) def wheel(pos): if pos < 85: return (255 - pos * 3, pos * 3, 0) elif pos < 170: pos -= 85 return (0, 255 - pos * 3, pos * 3) else: pos -= 170 return (pos * 3, 0, 255 - pos * 3) # 사용자 입력받기 step = int(input("회전 속도 입력 (1~20, 클수록 빠름): ")) j = 0 # 초기 색상 위치 while True: for i in range(12): rc_index = (i * 256 // 12) + j np[i] = wheel(rc_index % 256) np.write() j = (j + step) % 256 # step만큼 증가, 256 넘으면 0으로
Python
복사

3-2.위 코드의 문제점?

한번 사용자가 속도를 입력하면 스크립트 중지전까지는 속도조절이 되지 않음.
이 문제를 어떻게 해결할 수 있을까?