PWM 방식 LED 밝기 조절 > 스마트기기시스템

본문 바로가기

[실습] PWM 방식 LED 밝기 조절

필기자
2025-04-09 09:50 420 0

본문

PWM 방식 LED 밝기 조절  

목 적
  • PWM output 방식을 이해한다.
  • DutyCycle에 대해 이해한다.
목 차
1. PWM DutyCycle 
2. DutyCycle을 활용한 LED 발기 조절 프로그램

1. PWM DutyCycle 
  • PWM에서 LED 밝기 조절 공식
    • 공급 전압 Vsupply = 5V, LED 순방향 전압 VLED = 3V, 저항 R = 220Ω, 듀티사이클 80%
  1. 순간 전류 (옴의 법칙):
    I = (Vsupply − VLED) / R = (5 − 3) / 220 = 9.09mA
  2. 평균 전류 (옴의 법칙 × 듀티사이클):
    Iavg = 9.09mA × 0.8 = 7.27mA
  3. 평균 전력 (전압 × 평균 전류):
    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

등록된 댓글이 없습니다.
게시판 전체검색