본문 바로가기

라즈베리파이 5

라즈베리파이 Python 5 - LED Fade 구현

반응형

 

라즈베리파이 Python 5 - LED Fade 구현

 

 

강의 순서

 

라즈베리파이 Python 9 - 버튼 채터링 방지

라즈베리파이 Python 8 - 버튼

라즈베리파이 python 7 - 교통 신호등

라즈베리파이 python 6 - RGB LED

라즈베리파이 Python 5 - LED Fade 구현

라즈베리파이 Python 4 - Delay 없는 LED Blink

라즈베리파이 Python 3 - LED Blink

라즈베리파이 Python 2 - 파이선 코드 템플릿

라즈베리파이 Python 1 - python 실행

 

 

이 튜토리얼에서는 Raspberry Pi를 프로그래밍하여 LED를 페이드 하는 방법을 설명합니다. 세 가지 예를 살펴보고 이들 간의 차이점을 비교해 보겠습니다.

  • time.sleep() 함수를 사용하여 LED가 어두워지도록 Raspberry Pi를 프로그래밍하는 방법(파이가 죽는 시간이 생김)
  • millis() 함수를 사용하여 Raspberry Pi의 LED가 희미해지도록 프로그래밍하는 방법 

LED 살펴보기 - LED 핀아웃

 

LED에는 두 개의 핀이 있습니다.

  • 음극(-) 핀은 GND(OV)에 연결되어야 합니다.
  • 양극(+) 핀은 LED의 상태를 제어하는 ​​데 사용됩니다.

 

https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-fade

 

 

작동 방식

일단 Cathod(-)를 GND에 연결합니다.

  • Anode(+)에 0V를 인가하면 LED OFF
  • Anode(+)에 VCC를 인가하면 LED ON
  • 양극(+)에 PWM 신호를 생성하면 PWM 값에 따라 LED의 밝기가 조정됩니다. 이 값의 범위는 0부터 255까지이며 값이 높을수록 LED는 더 밝아지고 값이 낮을수록 어두워집니다.
  • PWM 값이 0이면 GND와 동일하며 LED가 꺼집니다.
  • PWM 값이 255이면 VCC와 동일하며 LED가 완전히 켜집니다. 

 

https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-fade

 

 

라즈베리 파이 LED Fade

 

LED Raspberry Pi의 일부 핀은 PWM 신호를 생성하도록 프로그래밍할 수 있습니다. LED를 페이드 하려면 LED의 양극(+) 핀을 Raspberry Pi의 핀에 연결하고 음극(-)을 접지에 연결한 후 Raspberry Pi를 프로그래밍하여 핀에서 PWM을 생성할 수 있습니다. 아래 연결도를 참고하세요.

 

 

https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-fade

 

 

프로그래밍

 

GPIO.setup() 함수를 사용하여 Raspberry Pi의 핀에 디지털 출력을 설정합니다. 예를 들어 GPIO18을 핀으로 지정하세요.

 

GPIO.setup(18, GPIO.OUT)

 

pwm.ChangeDutyCycle() 함수를 사용하여 PWM 신호를 생성하여 LED 밝기를 조정합니다. 밝기 범위는 0에서 100까지입니다.  

 

pwm = GPIO.PWM(LED_PIN, 1000)
pwm.start(0)

pwm.ChangeDutyCycle(brightness)

 

RASPBERRY PI LED Fade Code 동작 설명

  • Pi에 Raspbian 또는 기타 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하십시오.
  • Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 일부 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요. Raspberry Pi를 처음 사용하는 경우 Raspberry Pi 설정 방법을 확인하세요.
  • Linux 및 macOS의 내장 SSH 클라이언트 또는 Windows의 PuTTY를 사용하여 SSH를 통해 PC를 Raspberry Pi에 연결합니다. SSH를 통해 PC를 Raspberry Pi에 연결하는 방법을 알아보세요.
  • RP1.GPIO 라이브러리가 설치되어 있는지 확인하십시오. 그렇지 않은 경우 다음 명령을 사용하여 설치하십시오.

 

설치 제거 
sudo apt remove python3-rpi.gpio

새로운 라이브러리를 설치합니다.

sudo apt-get update
sudo apt install python3-rpi-lgpio

 

  • ledfade.py라는 Python 스크립트 파일을 만들고 다음 코드를 추가합니다. 

$nano ledfade.py 로 작업하세요.

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-fade
"""


import RPi.GPIO as GPIO
from time import sleep
LED_PIN = 18
fadePercent = 5
brightness = 0

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN,GPIO.OUT)
pwm = GPIO.PWM(LED_PIN, 1000)
pwm.start(0)
try:
    while True:
        pwm.ChangeDutyCycle(brightness)
        # change the brightness for next time through the loop:
        brightness = brightness + fadePercent;

        # reverse the direction of the fading at the ends of the fade:
        if brightness <= 0 or brightness >= 100:
            fadePercent = -fadePercent;
        
        # wait for 30 milliseconds to see the dimming effect
        sleep(0.03);
finally:
    GPIO.cleanup()

 

 

실행은

$python3 ledfade.py

LED의 밝기를 확인하세요. 점점 밝아졌다 꺼지는 과정을 반복합니다. 스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다. 

 

* 중요 사항:

 

위의 예에서는 time.sleep() 함수를 사용하여 페이드 인 및 페이드 아웃 효과를 만듭니다. 그러나 time.sleep() 함수는 LED가 부드럽지 않게 희미해지고 다른 코드 실행을 차단합니다. 다음 섹션에서는 millis() 함수를 사용하여 다른 코드를 막지 않고 원활하게 페이드인 및 페이드아웃하는 방법을 알아보겠습니다.

 

TIME.SLEEP()을 사용하지 않고 특정 기간에 LED를 FADE IN/OUT 하는 방법 

 

아래 코드를 ledfade_withoutsleep.py 로 입력하여 스크립트를 작성하세요.

 

$nano ledfade_withoutsleep.py

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-fade
"""


import RPi.GPIO as GPIO
import time
LED_PIN = 18
FADE_PERIOD = 3000
FADE_IN_MODE = True
FADE_OUT_MODE = False

fadeMode = FADE_IN_MODE
start_time = 0
brightness = 0

def _map(x, in_min, in_max, out_min, out_max):
    return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN,GPIO.OUT)
pwm = GPIO.PWM(LED_PIN, 1000)
pwm.start(0)
start_time = time.time()*1000
try:
    while True:
        progress = time.time()*1000 - start_time
        if fadeMode == FADE_IN_MODE:
            if progress <= FADE_PERIOD:
                brightness = _map(progress, 0, FADE_PERIOD, 0, 100)
                
                print(brightness)
                pwm.ChangeDutyCycle(brightness)
            else:
                start_time = time.time()*1000
                fadeMode = FADE_OUT_MODE
                progress = 0
        if fadeMode == FADE_OUT_MODE:
            if progress <= FADE_PERIOD:
                brightness = 100 - _map(progress, 0, FADE_PERIOD, 0, 100)
                
                print(brightness)
                pwm.ChangeDutyCycle(brightness)
            else:
                start_time = time.time()*1000
                fadeMode = FADE_IN_MODE
                progress = 0
finally:
    pwm.stop()
    GPIO.cleanup()

 

 

실행하면 밝기 숫자를 모니터에 출력하며 밝기가 밝아졌다 우두워지는 동작을 반복함을 확인합니다.

 

다른 처리(버튼 입력 등)를 놓치지 않고 실행하는 코드를 작성했습니다. 고생하셨습니다.

 

 

참고 링크와 자료 많은 곳

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^