행복한 하루

라즈베리파이 제로 프로젝트(4) – LED 제어 – 4 (밝기 조절) 본문

RaspberryPi/Raspberry Pi Zero

라즈베리파이 제로 프로젝트(4) – LED 제어 – 4 (밝기 조절)

변화의 물결 2020. 9. 26. 00:05

 

 

안녕하세요

 이번에는 LED의 밝기를 조정해보도록 하겠습니다.

 GPIO는 HIGH(3.3V), LOW(0V)이라고 해놓고 어떻게 밝기를 조절할 수 있냐고 하겠지만, 방법이 있었습니다.

 

 첫 번째는 물리적인 저항값을 변경하는 것이 있습니다. 이건 좀, 그 다음 방법으로는 PWM(Pulse width modulation)이라는 기술인데 말 그대로 펄스(신호) 간격을 잘 조절해주는 기술을 말합니다.

 

 그럼 어떻게 하면 될까요? 만약 0과1을 엄청나게 빠르게 전환시켜준다면, 그리고 그 간격 시간을 조금씩 늘려 주거나 켜져 있는 시간을 조금 더 오래 두고 꺼지는 시간을 조금 짧게 한다면 사람 눈에는 보이지 않게 밝기가 조절되는 것처럼 보일 것입니다. 그러다가 조절 잘못하면 깜박임 현상으로 보일 수도 있습니다.

 

 그런데 라즈베리 파이에서는 다행히도 GPIO를 프로그래밍하지 않고 PWM처럼 사용할 수 있는 PWMLED 클래스를 만들어 놓았습니다. 위에서 이야기한 2가지는 현재 사용하지 않고 라이브러리를 사용해서 프로그래밍해보도록 하겠습니다.

 

1. gpiozero 라이브러리 사용

  - 기본 On/Off 소스와 다르게 PWMLED를 불러온 것을 알 수 있습니다. 

from gpiozero import PWMLED
from time import sleep

led = PWMLED(14)

value = 0
increment = .02
sleeptime = .03

try:
 while True:
  value += increment
  if value > 1:
   value = 0
  led.value = value
  sleep(sleeptime)

except KeyboardInterrupt:
 print("Bye!")

- 들여 쓰기 주의하셔야 합니다. 안 그러면 소스 코드 에러가 발생합니다.

 

gpiozero 이용

 

  - 소스를 간단히 설명해 드리자면, 14번 핀을 PWMLED 클래스를 사용해서 PWM 효과를 주겠다고 선언합니다.

30ms 간격으로 밝깃값 변화를 주는데 값이 0.02 값만큼 변화를 주고 1이 되면 꺼지는 로직으로 되어 있습니다.

 

  마지막 부분에 except 문은 키보드 인터럽트가 들어왔을 때인데 Ctrl +C를 누르면 종료되면서 bye라는 문자를 출력하게 되어 있습니다.

 

  - gpiozero 라이브러리에 대해 좀 더 상세한 글을 보려면 링크를 참조하시면 됩니다.

https://gpiozero.readthedocs.io/en/stable/

   

2. RPi-gpio 라즈베리 파이 라이브러리 사용

 - 위의 내용이 gpiozero라고 한다면 또 한 가지 더 제공해주는 라이브러리가 있습니다. RPi-gpio.

- RPi-gpio는 라즈베리 파이가 초기 나올 때 지원했다고 합니다. 단순하면서도 강력하다고 합니다.

 

  사용 방법은 특별한 것은 없고 모드를 BCM으로 하고 어떤 핀을 입력, 출력으로 할지 세팅해주고 사용하면 됩니다. 소스 상에서 setmode를 GPIO.BCM으로 했는데, BCM 이 무엇에 약자인지 몰랐습니다.

  그냥 그런 거지 했는데, 찾아보니 BoardCoM에서 나왔다고 합니다. 라즈베리파이가 브로드컴의 칩을 이용하기 때문입니다.  만약 setmode를 GPIO.BOARD라고 하면 물리적인 핀 번호로 지정을 할 수 있습니다.

 

 그럼 RPi-gpio 라이브러리 사용해서 코딩해보겠습니다.

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
pwm = GPIO.PWM(14, 100) # pin 14 at 100 Hz
value = 0
pwm.start(value) # Start at 0

increment = 2 #smooth is the fade
sleeptime = .03 # fast is the fade

try:
 while True: 
  value += increment
 
  if value > 100:
   value = 0
  pwm.ChangeDutyCycle(value)
  sleep(sleeptime)

except KeyboardInterrupt:
 pwm.stop()
 GPIO.cleanup()

- BCM 모드를 이용해서 핀 번호 설정

 

RPi-gpio 사용

 

  라이브러리만 바뀌었고, 기본 프로그래밍 방식은 동일합니다.  그런데, gpiozero 라이브러리 같은 경우는 메모리 해제 같은 개념의 GPIO 해제가 없지만(자동으로 실행), RPi-gpio는 마지막에 종료하면서 cleanup()을 해주어야 다시 실행될 때 에러 없이 핀을 재사용할 수가 있습니다.

 

  값이 증가하는 범위도 실수(float)가 아니라 정수로 되어 있습니다.

 실행을 시켜보면 gpiozero와 큰 차이가 없이 점점 밝아졌다가 꺼졌다가를 반복하는 것을 알 수 있습니다.

  

다음 회에서는 LED 작업은 끝내고 입력 신호를 받아오는 버튼에 관한 내용으로 돌아오겠습니다.

감사합니다.

 

 

Comments