PWM은 우리가 알지 못하더라도 매일 사용하는 기술입니다. 간단하고 다양한 응용 분야에서 매우 유용한 기술입니다. 무엇보다도 라즈베리 파이로 땀 한 방울 흘리지 않고도 할 수 있는 일입니다. 어떻게 가능할까요? 한번 살펴보겠습니다.

PWM이란 무엇인가요?

명명법 측면에서 “펄스 폭 변조”는 다소 세련된 의미를 담고 있습니다. 그러나 그 핵심은 전기 신호를 매우 빠른 속도로 간헐적으로 켜고 끄는 것입니다. 이러한 기술이 왜 바람직한지 궁금할 수 있습니다. 그 답은 라즈베리 파이 HAT, 주변 장치 또는 보조 회로와 같은 추가 하드웨어 구성 요소 없이도 다양한 아날로그 신호를 에뮬레이션할 수 있는 간단한 수단을 제공한다는 사실에 있습니다. 온도 제어, 동작 추진 또는 광도 조절과 관련된 상황에서 PWM 신호는 기능적으로 정품 아날로그 전압과 동등합니다.

듀티 사이클

이 프로세스에는 지정된 물체 또는 시스템(부하라고 함)에 일련의 펄스를 적용하고 이러한 펄스에 의해 구동되는 프로세스가 포함됩니다. 펄스의 단순한 적용 자체는 그 자체로는 특별히 통찰력이 없을 수 있지만, 시퀀스 내에서 각 펄스의 지속 시간이 변조되는 방식은 매우 유익한 것으로 입증되었습니다. 특히 신호가 최대 진폭으로 설정되는 시간(“온” 위상)은 전체 사이클 기간의 0퍼센트에서 100퍼센트까지 다양할 수 있습니다. 이 가변적인 “온” 위상 지속 시간을 듀티 사이클이라고 합니다.

듀티 사이클이 50%인 3V 펄스 폭 변조(PWM) 신호가 있다고 가정해 보겠습니다. 이러한 시나리오에서 평균값으로 계산된 LED가 소비하는 총 전력은 일정한 1.5V(1.5V) 신호와 동일한 조명 레벨에 해당합니다. 듀티 사이클을 높이면 LED의 밝기가 강해지고, 낮추면 LED가 점차 어두워집니다. 이 기법을 사용하여 가청 신호를 생성할 수도 있다는 점에 주목할 필요가 있습니다. PWM을 다른 용도로 사용할 때 라즈베리 파이에서 오디오 출력이 중단될 수 있습니다.

라즈베리 파이의 PWM

라즈베리 파이의 각 개별 범용 입력/출력(GPIO) 핀에서 소프트웨어 펄스 폭 변조(PWM)를 사용할 수 있습니다. 그러나 하드웨어 PWM 기능은 특정 핀, 즉 GPIO12, GPIO13, GPIO18 및 GPIO19로 제한됩니다.

이 글도 확인해 보세요:  Changedetection.i로 웹 페이지 업데이트를 주시하세요.

신호 생성을 위한 계산 리소스의 활용에 차이가 있습니다. 소프트웨어가 신호를 생성하는 데 사용되는 경우 CPU 사이클을 소비합니다.그러나 컴퓨터의 중앙 처리 장치(CPU)는 고주파에서 LED의 켜기 및 끄기를 제어하는 데 충분한 주의를 기울이는 데 방해가 될 수 있는 더 중요한 책임을 가지고 있을 수 있습니다. 이러한 집중력 부족은 펄스 폭 변조(PWM) 타이밍을 방해하여 잠재적인 성능 문제를 일으킬 수 있습니다.

따라서 전문 회로에 작업을 위임하는 것이 더 나은 경우가 많습니다. 라즈베리파이의 경우, 이 회로는 CPU가 들어 있는 시스템 온 칩 내부에 있습니다. 하드웨어 PWM이 훨씬 더 정확하고 편리한 경우가 많으므로 대부분의 경우 선호되는 옵션입니다. 라즈베리파이 4의 브로드컴 BCM2711 칩 내부에서 어떤 일이 벌어지는지 알고 싶다면, BCM2711 문서 을 참조하세요. 8장에서는 PWM에 대해 다룹니다!

LED 디밍하기

LED가 라즈베리 파이에서 제대로 작동하려면 브레드보드에서 몇 가지 기본 회로 작업을 수행해야 합니다. 이 과정에는 LED와 전류 제한 저항을 직렬로 연결하는 작업이 포함됩니다. 이 저항은 LED를 통한 전기의 흐름을 조절하여 과도한 전류로 인해 LED가 손상되거나 파괴되는 것을 방지하는 데 도움이 되므로 반드시 포함되어야 합니다. 저항을 사용하지 않으면 전력 과부하로 인해 LED가 오작동하거나 심지어 화재가 발생할 수 있습니다.

저항 값 계산하기

저항을 LED의 어느 단자에 연결해야 하는지 여부는 LED의 기능에 영향을 미치지 않습니다. 대신, 저항 값은 라즈베리파이 4 GPIO 핀에서 공급되는 전류를 조절하는 데 중요한 역할을 합니다. 이 장치의 각 핀은 약 16mA의 전류를 공급할 수 있습니다. 옴의 법칙을 적용하여 올바른 작동에 필요한 적절한 저항을 계산할 수 있습니다.

앞서 언급한 법률에 따르면 반대가 전류에 대한 기전력과 일치해야 한다고 명시되어 있습니다. 라즈베리 파이의 GPIO 핀에서 공급되는 전압은 3.3V로 설정되어 있으며 규정된 전류는 16 밀리암페어 또는 이에 상응하는 0.016 암페어입니다. 앞서 언급한 전압을 지정된 전류로 나누면 결과값은 206으로 구할 수 있습니다. 그러나 이러한 사양의 저항을 찾는 것은 어려운 작업입니다. 따라서 원래의 206옴 저항 대신 220옴 저항을 대안으로 고려할 수 있습니다.

이 글도 확인해 보세요:  새로운 아두이노 우노 R4가 메이커의 판도를 바꾸는 이유

LED 조명의 양극 단자(양극)를 라즈베리파이의 물리적 핀 12에 해당하는 GPIO 18에 연결하세요. 또한 LED 조명의 음극 단자(음극)를 라즈베리파이의 사용 가능한 접지 핀에 연결합니다.회로에 저항을 포함시켜 전원과 접지 사이의 경로를 따라 아무 곳에나 배치하는 것을 간과해서는 안 됩니다. 이러한 연결이 완료되었으므로 이제 작동 준비가 완료되었습니다.

라즈베리파이에서 PWM 구현하기

라즈베리파이에서 하드웨어 PWM을 작동시키기 위해 카메론 데이비슨 필론 rpi-hardware-pwm 라이브러리를 사용하고, 제레미 임슨 코드를 각색합니다. 이것은 Pioreactor (파이 기반 바이오리액터)에서 사용되었지만, 우리의 목적에 충분히 간단합니다.

부팅 디렉토리에 있는 구성 파일에 액세스하는 것부터 시작하겠습니다. 이를 위해서는 ‘dtoverlay=pwm-2chan’이라는 한 줄의 코드를 추가해야 합니다. 18번과 19번 대신 다른 GPIO 핀을 사용하려면 이 시점에 추가 파라미터를 포함할 수 있습니다. 그러나 당분간은 단순성을 유지하겠습니다.

시스템 설정에서 “재시작”을 클릭하여 라즈베리파이 장치를 재시작한 다음 “sudo service qt5ag5 running-config” 명령을 실행하세요.

 lsmod | grep pwm 

앞서 언급한 명령은 커널로 알려진 운영 체제의 기본 부분과 통합된 모든 소프트웨어 구성 요소의 인벤토리를 검색합니다. 펄스 폭 변조와 관련된 요소만 포함하도록 검색 결과의 범위를 좁히기 위해 ‘전역 정규식 인쇄’와 동의어인 grep 유틸리티를 활용합니다.

사용 가능한 모듈 목록에 “pwm\_bcm2835″가 있는 것은 지금까지 구성 단계가 성공적이었다는 것을 나타냅니다. 설정 프로세스를 완료하려면 몇 단계만 더 진행하면 됩니다. 구체적으로 다음과 같이 명령 프롬프트를 사용하여 해당 라이브러리를 설치해야 합니다:

 sudo pip3 install rpi-hardware-pwm 

이제 모든 준비가 완료되었으므로 작업을 시작할 준비가 되었습니다.

PWM LED 회로 코딩하기

이제 Python을 사용하여, 특히 Thonny 환경에서 프로그래밍을 시작할 차례입니다. 애플리케이션을 열고 제공된 코드를 붙여넣으세요. 완료되면 “실행”을 클릭하여 프로그램을 실행하세요.

 from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
    pwm.change_duty_cycle(i)
    time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()

상황이 진행됨에 따라 “i” 변수 값이 총 백(100)에 도달할 때까지 LED가 점점 더 밝아지는 것을 관찰하는 것이 이상적입니다. 이 시점에서는 빛을 잃게 됩니다. 이 상황에서 정확히 어떤 일이 일어나는지 이해하는 것이 중요합니다. 각 단계를 주의 깊게 살펴보고 해부해 보겠습니다.

이 글도 확인해 보세요:  영감을 주는 13가지 DIY 주방 프로젝트

하드웨어 PWM 라이브러리의 관련 부분을 시간 모듈과 함께 통합하고 새로운 엔티티를 정의하고 있습니다.pwm\_채널은 0 또는 1로 할당할 수 있으며, 둘 다 라즈베리 파이의 각 GPIO 핀 18 및 19에 해당합니다.

라즈베리 파이의 클럭 속도에 따른 제약이 있기는 하지만, 헤르츠(hz) 파라미터를 원하는 주파수로 설정할 수 있습니다. 60Hz의 hz 값은 감지할 수 있는 펄스 폭 변조(PWM) 깜박임을 생성하지 않아야 합니다. 그러나 10과 같이 매우 낮은 수치로 시작하여 펄스를 식별할 수 있을 때까지 값을 점진적으로 높이는 것이 좋습니다. 이 절차를 수행하면 눈에 보이는 펄스에 대한 hz 설정 조정의 효과를 직접 관찰할 수 있습니다. 추측이나 소문에만 의존하지 말고 이러한 관찰을 검증하는 것이 좋습니다.

파이썬 포 루프를 활용하여 ‘time.sleep’으로 관련 값을 조작하여 듀티 사이클을 0에서 100까지 증가시킵니다. 후자는 펄스 폭 변조가 하드웨어 수준에서 작동하므로 소프트웨어 개입과 독립적으로 작동하므로 지정된 기간에 관계없이 기능을 수행 할 수 있습니다.

PWM으로 배울 것이 더 있습니다

실제로 라즈베리 파이에서 첫 번째 PWM 프로그램을 작성하는 것은 인상적인 성과입니다. 그러나 이것은 시작에 불과하다는 것을 기억하는 것이 중요합니다. 적절한 PWM HAT를 사용하면 펄스 폭 변조를 활용할 수 있는 가능성이 크게 확장됩니다. 모터 제어부터 메시지 인코딩, 음악 톤 생성에 이르기까지 잠재적인 활용 분야는 사실상 무한합니다. 변조의 흥미진진한 영역을 포용하고 PWM이 제공하는 모든 것을 살펴보세요!

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.