[RaspberryPi] PWM 서보모터 제어

Sireal·2021년 11월 16일
0

Raspberry Pi

목록 보기
11/14
post-thumbnail

PWM 주기와 서보모터

  • PWM 주기 20ms ( 0.02 초 )
    • 20ms 간 움직이게끔 잘 계산에서 속도를 제어하면 된다.
  • 서보모터는 약 0~180도 까지 움직임 (3.0~12.5)

서보모터 예제코드

기본 예제

import RPi.GPIO as GPIO
import time

# GPIO Servo모터 제어

servo_pin = 25
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50) # 50Hz( 서보모터 PWM 동작을 위한 주파수 )
pwm.start(3.0) # 서보모터의 0도 위치( 0.6ms ) 이동: 값 3.0은 pwm 주기인 20ms 의 3% 를 의미

for cnt in range(0,3):
    pwm.ChangeDutyCycle(3.0) # 0도
    time.sleep(1.0)
    pwm.ChangeDutyCycle(7.5) # 90도
    time.sleep(1.0)
    pwm.ChangeDutyCycle(12.5) # 180도
    time.sleep(1.0)

try except를 이용한 인터럽트 작성

import RPi.GPIO as GPIO
import time

# GPIO Servo모터 제어

servo_pin = 25
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50) # 50Hz( 서보모터 PWM 동작을 위한 주파수 )
pwm.start(3.0) # 서보모터의 0도 위치( 0.6ms ) 이동: 값 3.0은 pwm 주기인 20ms 의 3% 를 의미


try : 
    for cnt in range(0,3):
        pwm.ChangeDutyCycle(3.0) # 0도
        time.sleep(1.0)
        pwm.ChangeDutyCycle(7.5) # 90도
        time.sleep(1.0)
        pwm.ChangeDutyCycle(12.5) # 180도
        time.sleep(1.0)

# KeyboadInterrupt = Ctrl + C : 종료 및 GPIO 초기화
except KeyboardInterrupt:
    GPIO.cleanup() 

scale 값에 맞는 속도로 0~180도 움직이는 코드

import RPi.GPIO as GPIO
import time

# GPIO Servo모터 제어

servo_pin = 25
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50) # 50Hz( 서보모터 PWM 동작을 위한 주파수 )
pwm.start(3.0) # 서보모터의 0도 위치( 0.6ms ) 이동: 값 3.0은 pwm 주기인 20ms 의 3% 를 의미

scale = int(input("스케일 값을 입력하시오(1~10) : ")) # min = 1, max = 10
if 1 <= scale <= 10 :
    pass
else :
    scale = 1

try : 
    while True:
        for i in range(int(30*scale), int(125*scale),2) :
            # 0.02초간 0.019도 움직일 수 있음
            pwm.ChangeDutyCycle(i/int(10*scale))
            time.sleep(0.02)
        for i in range( int(125*scale), int(30*scale),-2) :
            pwm.ChangeDutyCycle(i/int(10*scale))
            time.sleep(0.02)

# Ctrl + C : 종료 및 GPIO 초기화
except KeyboardInterrupt:
    GPIO.cleanup() 
profile
🚄계속 앞으로🚄

0개의 댓글