[실습] PWM 방식 LED 밝기 조절
필기자
2025-04-09 09:50
420
0
본문
PWM 방식 LED 밝기 조절
목 적
1. PWM DutyCycle
2. DutyCycle을 활용한 LED 발기 조절 프로그램
[문제: RGB LED 색상 조합 제어 실습]
목 적
- PWM output 방식을 이해한다.
- DutyCycle에 대해 이해한다.
1. PWM DutyCycle
2. DutyCycle을 활용한 LED 발기 조절 프로그램
2. DutyCycle을 활용한 LED 발기 조절 프로그램
1. PWM DutyCycle
- PWM에서 LED 밝기 조절 공식
- 공급 전압 Vsupply = 5V, LED 순방향 전압 VLED = 3V, 저항 R = 220Ω, 듀티사이클 80%
- 순간 전류 (옴의 법칙):
I = (Vsupply − VLED) / R = (5 − 3) / 220 = 9.09mA - 평균 전류 (옴의 법칙 × 듀티사이클):
Iavg = 9.09mA × 0.8 = 7.27mA - 평균 전력 (전압 × 평균 전류):
P = 2V × 7.27mA = 14.54mW
듀티사이클 (%) | 순간 전류 (mA) I = (5−3)/220 |
평균 전류 (mA) Iavg = I × 듀티 |
평균 전력 (mW) P = 2V × Iavg |
---|---|---|---|
10% | 9.09 | 9.09 × 0.1 = 0.91 | 2 × 0.91 = 1.82 |
20% | 9.09 | 9.09 × 0.2 = 1.82 | 2 × 1.82 = 3.64 |
30% | 9.09 | 9.09 × 0.3 = 2.73 | 2 × 2.73 = 5.45 |
40% | 9.09 | 9.09 × 0.4 = 3.64 | 2 × 3.64 = 7.27 |
50% | 9.09 | 9.09 × 0.5 = 4.55 | 2 × 4.55 = 9.09 |
60% | 9.09 | 9.09 × 0.6 = 5.45 | 2 × 5.45 = 10.91 |
70% | 9.09 | 9.09 × 0.7 = 6.36 | 2 × 6.36 = 12.73 |
80% | 9.09 | 9.09 × 0.8 = 7.27 | 2 × 7.27 = 14.54 |
90% | 9.09 | 9.09 × 0.9 = 8.18 | 2 × 8.18 = 16.36 |
100% | 9.09 | 9.09 × 1.0 = 9.09 | 2 × 9.09 = 18.18 |
2. DutyCycle을 활용한 LED 발기 조절 프로그램
- 기본 구동 프로그램 : 라즈베리파이 가상환경에서 파이썬 코딩
- VSCode에서 led_pwm_duty.py 파일 생성
- GPIO 18핀(핀 12)을 출력 모드로 설정
- GPIO 18핀의 DutyCycle을 조절
import RPi.GPIO as GPIO
import time
# GPIO 모드 설정
GPIO.setmode(GPIO.BCM)
# LED 핀 설정
LED_PIN = 18
GPIO.setup(LED_PIN, GPIO.OUT)
# PWM 인스턴스 생성 (주파수 1kHz)
pwm = None
pwm = GPIO.PWM(LED_PIN, 10000)
pwm.start(0) # DutyCycle 0으로 시작 (꺼진 상태)
try:
while True:
# 점점 밝아짐
for dc in range(0, 101, 2):
pwm.ChangeDutyCycle(dc)
print("밝아 짐", dc)
time.sleep(0.1)
time.sleep(2)
# 점점 어두워짐
for dc in range(100, -1, -2):
print("어두워 짐", dc)
pwm.ChangeDutyCycle(dc)
time.sleep(0.1)
time.sleep(1)
except KeyboardInterrupt:
# Ctrl+C 눌렀을 때 실행 종료
pass
finally:
if pwm is not None:
try:
pwm.stop()
except:
pass
del pwm # __del__ 호출 시 오류 방지
GPIO.cleanup()
[문제: RGB LED 색상 조합 제어 실습]
- 3컬러 RGB LED는 아래와 같이 연결되어 있다.
- 빨강: GPIO 18
- 초록: GPIO 23
- 파랑: GPIO 24 (미사용)
- PWM을 사용하여 빨강(R)과 초록(G) 색상의 듀티사이클을 조절한다.
- 색상은 주황 → 노랑 → 연두 → 갈색 순으로 서서히 변화한다.
- R 100 고정 후 G 50→100 (주황→노랑)
- G 100 고정 후 R 100→50 (노랑→연두)
- R 50 고정 후 G 100→30 (연두→갈색)
- G 30 고정 후 R 50→100 (갈색→주황)
- 각 색상은 0.1초 간격으로 부드럽게 전환되도록 한다.
- 색상 전환은 무한 반복되도록 한다.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
R_PIN = 18
G_PIN = 23
GPIO.setup(R_PIN, GPIO.OUT)
GPIO.setup(G_PIN, GPIO.OUT)
pwm_r = None
pwm_g = None
pwm_r = GPIO.PWM(R_PIN, 1000)
pwm_g = GPIO.PWM(G_PIN, 1000)
pwm_r.start(0)
pwm_g.start(0)
try:
while True:
for g in range(50, 101, 5): # 주황 → 노랑
pwm_r.ChangeDutyCycle(100)
pwm_g.ChangeDutyCycle(g)
time.sleep(0.5)
print("주황 -> 노랑")
time.sleep(3)
for r in range(100, 49, -5): # 노랑 → 연두
pwm_r.ChangeDutyCycle(r)
pwm_g.ChangeDutyCycle(100)
time.sleep(0.5)
print("노랑 -> 연두")
time.sleep(3)
for g in range(100, 29, -5): # 연두 → 갈색
pwm_r.ChangeDutyCycle(50)
pwm_g.ChangeDutyCycle(g)
time.sleep(0.5)
print("연두 -> 갈색")
time.sleep(3)
for r in range(50, 101, 5): # 갈색 → 주황
pwm_r.ChangeDutyCycle(r)
pwm_g.ChangeDutyCycle(30)
time.sleep(0.5)
print("갈색 -> 주황")
time.sleep(3)
except KeyboardInterrupt:
# Ctrl+C 눌렀을 때 실행 종료
pass
finally:
if pwm_r is not None:
try:
pwm_r.stop()
except:
pass
del pwm_r # __del__ 호출 시 오류 방지
if pwm_g is not None:
try:
pwm_g.stop()
except:
pass
del pwm_g # __del__ 호출 시 오류 방지
GPIO.cleanup()
댓글목록0