라즈베리파이에 GPIO Python PWM Servo Motor 4개 제어하기

안녕하세요.

이번에 소개할 내용은 라즈베리파이에서 GPIO Python PWM컨트롤러(PCA9685)로 Servo Motor 4개 제어하기 입니다.

기존의 라즈베리파이에 GPIO Python PWM Servo Motor 제어하기에 이어서 한번에 4개를 움직이는것을 해보도록 하겠습니다.

점퍼케이블 설정에 관해서는 라즈베리파이에 GPIO Python PWM Servo Motor 제어하기를 참고해 주시기 바랍니다.

이번에 사용한 서보모터는 Miuzei サーボモーター マイクロサーボ 9g 5個セット デジタル・サーボ라는 서보모터를 사용했습니다.

그럼 바로 코딩으로 들어가 보도록 하겠습니다.

Visual Studio Code(비주얼 스튜디오 코드)를 실행을 하신후 기존에 만들어둔 gpio_pwm_servo_motor.py에 추가로 코드를 작성해 보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import time
import RPi.GPIO as GPIO
import Adafruit_PCA9685

# SG92R를 컨트롤하기 위한 클래스
class SG90_92R_Class:
# mPin : GPIO Number (PWM)
# mPwm : PWM컨트롤러용 인스턴스
# m_Zero_offset_duty

def __init__(self, Channel, ZeroOffset):
self.mChannel = Channel
self.m_ZeroOffset = ZeroOffset

# Adafruit_PCA9685 초기화
# address : PCA9685의 I2C Channel 0x40
self.mPwm = Adafruit_PCA9685.PCA9685(address = 0x40)
# 50Hz로 설정하셔야 하지만 60Hz로 하시는게 좀더 좋습니다.
self.mPwm.set_pwm_freq(60)

# 서보모터 위치 설정
def SetPos(self, pos):
pulse = (650 - 150) * pos / 180 + 150 + self.m_ZeroOffset
self.mPwm.set_pwm(self.mChannel, 0, int(pulse))

# 종료처리
def Cleanup(self):
# 서보모터를 90도로 재설정
self.SetPos(90)
time.sleep(1)

# 여기가 시작하는 메인 입니다.
if __name__ == '__main__':
Servo0 = SG90_92R_Class(Channel = 0, ZeroOffset = -10)
Servo4 = SG90_92R_Class(Channel = 4, ZeroOffset = -10)
Servo8 = SG90_92R_Class(Channel = 8, ZeroOffset = -10)
Servo12 = SG90_92R_Class(Channel = 12, ZeroOffset = -10)

try:
while True:
Servo0.SetPos(0)
Servo4.SetPos(0)
Servo8.SetPos(0)
Servo12.SetPos(0)
time.sleep(1)
Servo0.SetPos(90)
Servo4.SetPos(90)
Servo8.SetPos(90)
Servo12.SetPos(90)
time.sleep(1)
Servo0.SetPos(180)
Servo4.SetPos(180)
Servo8.SetPos(180)
Servo12.SetPos(180)
time.sleep(1)
Servo0.SetPos(90)
Servo4.SetPos(90)
Servo8.SetPos(90)
Servo12.SetPos(90)
time.sleep(1)

# Ctrl + C키를 누르면 종료 됩니다.
except KeyboardInterrupt:
print("Ctrl + C")

except Exception as e:
print(str(e))

finally:
Servo0.SetPos(0)
Servo4.SetPos(0)
Servo8.SetPos(0)
Servo12.SetPos(0)

Servo0.Cleanup()
Servo4.Cleanup()
Servo8.Cleanup()
Servo12.Cleanup()

print("exit program")

image

image

코드 작성이 끝나셨으면 라즈베리파이의 적당한 위치에 올려주시기 바랍니다.

그리고 VNC로 라즈베리파이에 접속후 터미널을 실행해 주세요.

image

아래의 명령으로 gpio_pwm_servo_motor.py를 실행하도록 하겠습니다.

1
2
3
4
5
# 파이썬을 2.x버전대이신 분은 아래의 명령어를 입력해 주세요.
$ sudo python gpio_pwm_servo_motor.py

# 파이썬을 3.x버전대이신 분은 아래의 명령어를 입력해 주세요.
$ sudo python3 gpio_pwm_servo_motor.py

image

실행을 하시면 서보모터가 움직이는것을 확인 하실수 있습니다.

프로그램을 종료를 하실려면 Ctrl + C키를 누르면 종료 됩니다.

image

AkibaTV