PWM으로 LED를 쉽게 제어해보자!

띵킹하는 개발자·2023년 9월 11일
0

임베디드

목록 보기
1/3
post-thumbnail

목차

  • PWM연결 회로도 및 핀 맵
  • LED밝기 조절
  • 버튼 클릭 시 LED ON/OFF

PWM연결 회로도

라즈베리파이의 핀 맵은 이러하다.

이렇게 회로도를 구성하면 된다.

LED밝기 조절 코드

회로도를 구성하였으면 이제 Visual Studio Code에 ssh연결을 하여 코드를 작성해줄것이다.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

p = GPIO.PWM(18, 50)
p.start(0)

try:
        while 1:
                for dc in range(0, 101, 5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.1)
                for dc in range(100, -1, -5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.1)

except KeyboardInterrupt:
        pass
p.stop()
GPIO.cleanup()

Duty Cycle을 이용하여 Led의 밝기를 서서히 켜지고 서서히 꺼지는 코드를 작성하였다.

p = GPIO.PWM(20, 50)에서 두번째 인자는 Frequance를 뜻한다.
1초에 50번 반복한다는 소리이다. 이 값이 커질수록 더 많이 깜빡임이 생겨
더 자연스럽게 LED가 켜진다.

버튼 클릭 시 LED ON/OFF

digital input이 올 경우 LED를 키는 코드로 응용을 해보자.
BTN을 사용하기 위해선 풀업다운 저항에 대해서 알아야 한다.

import RPi.GPIO as GPIO

def button_callback(channel):
    global led_state
    
    if led_state == False:
        print("LED ON")
        led_state = True
        pwm_led.ChangeDutyCycle(100)
    else:
        print("LED OFF")
        led_state = False
        pwm_led.ChangeDutyCycle(0)

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)

led_pin = 6
led_state = False

GPIO.setup(led_pin, GPIO.OUT)
pwm_led = GPIO.PWM(led_pin, 50)
pwm_led.start(0)

GPIO.add_event_detect(21, GPIO.FALLING, callback=button_callback, bouncetime=200)

try:
    while True:
        pass

except KeyboardInterrupt:
    # 프로그램 종료 시 GPIO 리소스 정리
    pwm_led.stop()
    GPIO.cleanup()

BTN에 풀업저항을 준다. 나는 이런식으로 현재 LED의 상태를 변수로 저장시켜서 조건문을 추가하여 코드를 작성을 하였다.

profile
모든것은 띵킹으로 이루어지는 것

0개의 댓글