[Raspberry PI] PWM

정재훈·2022년 4월 19일
0

RaspberryPi

목록 보기
6/12

PWM

PWM : 아날로그 신호로, 펄스 폭 변조를 뜻한다. 0~1 사이 숫자를 사용할 수 있다.

원리

GPIO는 3.3V0V만 출력할 수 있습니다. 하지만 조절이 가능하였다. 이는 1(3.3V)와 0(0V)를 빠르게 반복하게 되는 것입니다.
듀티비 : 출력되는 값이 1에 대한 0의 비 ex) 20%는 10개 신호 중 1이 2개만 출력

from gpiozero import LED
from time import sleep

led = LED(2)

while True:
    led.on()
    sleep(0.008)
    led.off()
    sleep(0.002)

주파수 계산하기

주파수 : 1초에 몇 번 진동하는 지를 의미하며, 1/T로 계산한다. 단위는 Hz이다.
ex) T : 1ms => f : 1kHz

단위

PWM 직접 구현

500Hz로 구현하고 최대 듀티비 90% 최소 듀티비 10%로 스위치 1 누르면 듀티비 상승, 스위치2 누르면 듀티비 감소

from gpiozero import LED, Button
from time import sleep

def dutyUp():
    global value
    value += 1
    if value > 9:
        value = 9
    
def dutyDn():
    global value
    value -= 1
    if value < 1:
        value = 1

led = LED(2)
btnUp = Button(14)
btnDn = Button(15)

value = 5

btnUp.when_pressed = dutyUp
btnDn.when_pressed = dutyDn

while True:
    led.on()
    sleep(0.0002*value) # 90%, value 9 = 0.0018
    led.off() 
    sleep(0.0002*(10-value)) # 10%, value 1 = 0.0002

LED PWM 제어 1

from gpiozero import PWMLED # PWMLED LIB
from time import sleep

led = PWMLED(2)

while True:
	led.value = 0   # 밝기 0
    sleep(1)
    led.value = 0.5 # 밝기 0.5
    sleep(1)
    led.value = 1 # 밝기 1
    sleep(1)

LED PWM 제어 2

from gpiozero import PWMLED # PWMLED LIB

led = PWMLED(2)

value = 0

while True:
	print("1 or 2 >> ")
    n = int(input())
    if n == 1: 
    	value += 0.1   # 1을 입력받으면 10% 밝아짐
    if n == 2:
    	value -= 0.1  # 2를 입력받으면 10% 어두워짐
    if value > 1:
    	value = 1
    if value < 0:
    	value = 0
    
    led.value = value	

RGB LED

RGB : 빛의 3원색으로, 모든 색상 표현 가능

from gpiozero import PWMLED
from time import sleep

R = PWMLED(14)
G = PWMLED(15)
B = PWMLED(18)

while True:
    for i in range(10):
        R.value = i/10
        G.value = (1-i/10) # G는 0.1~0으로 감소
        B.value = i/10 # R과 B는 0~0.1까지 증가
        sleep(0.1)

무드등 만들기

from gpiozero import PWMLED, Button
from time import sleep

def RLIGHT():
	global valueR
    valueR += 0.1
    if valueR > 1:
    	valueR = 0
    R.value = valueR
    
def GLIGHT():
	global valueG
    valueG += 0.1
    if valueG > 1:
    	valueG = 0
    G.value = valueG

def BLIGHT():
	global valueB
    valueB += 0.1
    if valueB > 1:
    	valueB = 0
    B.value = valueB

R = PWMLED(2)
G = PWMLED(3)
B = PWMLED(4)

btnR = Button(14)
btnG = Button(15)
btnB = Button(18)

valueR = 1;
valueG = 1;
valueB = 1;

R.value = valueR
G.value = valueG
B.value = valueB

btnR.when_pressed = RLIGHT
btnG.when_pressed = GLIGHT
btnB.when_pressed = BLIGHT
        

조이스틱

라즈베리파이에서는 조이스틱을 사용하지 못합니다!

GND
5V
VRX : 가로 좌표 값 아날로그
VRY : 세로 좌표 값 아날로그
SW : 스위치 클릭용

아날로그입력을 받으려면 ADC (Analog -> Digital 컨버터 ) 필요하지만, 라즈베리파이에는 ADC가 없다

profile
여러 방향으로 접근하는 개발자

0개의 댓글