목차(클릭하세요)
반복문, 조건문, 클래스 등 기초적인 파이썬 문법을 이해했다는 가정하에
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: 255→0 (감소하며 퇴장)
G: 0→255 (증가하며 등장) ✅
B: 0 (대기)
구역 2 (85~169):
R: 0 (대기)
G: 255→0 (감소하며 퇴장)
B: 0→255 (증가하며 등장) ✅
구역 3 (170~255):
R: 0→255 (증가하며 등장) ✅
G: 0 (대기)
B: 255→0 (감소하며 퇴장)
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.위 코드의 문제점?
•
한번 사용자가 속도를 입력하면 스크립트 중지전까지는 속도조절이 되지 않음.
•
이 문제를 어떻게 해결할 수 있을까?
