소스 뷰어
# servo_pwm.py
# GPIO 핀 17을 사용하여 PWM 신호로 서보 모터를 제어하는 프로그램

import RPi.GPIO as GPIO  # Raspberry Pi GPIO 제어를 위한 표준 라이브러리 임포트
from time import sleep   # 프로그램에 대기(일시 정지) 기능을 추가하기 위한 sleep 함수 임포트

# GPIO 경고 메시지를 비활성화하고 BCM 핀 번호 모드를 설정
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)   # GPIO 핀 번호 체계를 BCM 모드로 설정

GPIO.setup(17, GPIO.OUT)  # GPIO 핀 17을 출력 모드로 설정

duration = 0.5  # 각 PWM 신호에서 대기할 시간 (0.5초)

frq = 50  # 서보 모터에 사용할 PWM 신호의 주파수 (50Hz)
p = GPIO.PWM(17, frq)  # GPIO 핀 17에 PWM 신호를 설정하고 주파수를 50Hz로 설정
p.start(0)  # PWM을 시작하고 듀티 사이클을 0으로 설정 (서보 모터가 움직이지 않음)
sleep(duration)  # 듀티 사이클이 0인 상태에서 대기
p.ChangeDutyCycle(0)  # 듀티 사이클을 0으로 설정 (안정화)
sleep(duration)  # 다시 대기

count = 0 # 실행 횟수
# 서보를 -90도에서 90도까지 증가시킨 후 다시 -90도로 감소시키는 동작을 2회 반복
for i in (list(range(0, 126, 5)) + list(range(125, -1, -5)))*2:
    count += 1 # 실행 횟수 증가
    dc = i / 10  # 듀티 사이클을 0에서 12.5까지 0.5씩 증가 또는 감소
    print(f"[{count:3d}] Pwm: freq: {frq} hz, duty cycle = {dc:4.1f} %")  # 현재 듀티 사이클 출력
    p.ChangeDutyCycle(dc)  # 듀티 사이클을 변경하여 서보 모터의 각도 제어
    sleep(duration)  # 각도 변경 후 대기
pass

# PWM 신호를 중지하고, GPIO 핀을 기본값으로 재설정
p.stop()  # PWM을 중지
GPIO.cleanup()  # 사용한 GPIO 핀을 초기 상태로 복구