본문 바로가기
로보틱스/라즈베리파이

PS3 컨트롤러로 서보모터 제어하기 [라즈베리파이(Raspberry Pi)]

by J-Build 2020. 9. 4.

이번 포스팅에서는 파이썬 코드를 통해서 PS3 컨트롤러로 서보모터를 움직일 수 있는 프로그램을 만들어 볼께요.

 

서보모터를 조이스틱으로 제어

시작하기 전에

먼저 PS3 컨트롤러와 서보모터를 제어하는 포스팅을 읽어주세요. 본 포스팅은 아래 두 포스팅의 내용이 라즈베리파이에 적용되었다는 전제로 작성되었습니다. 

2020/09/02 - [라즈베리파이] - 라즈베리파이(Raspberry Pi) 서보 모터 제어하기

2020/09/03 - [라즈베리파이] - 라즈베리파이(Raspberry Pi) PS3 컨트롤러 조작하기 

 

Github에서 코드 받기

PS3 컨트롤러 조작하기 포스팅을 완료하셨다면 라즈베리파이에 ps3-controller 폴더가 존재할것입니다. 아직 읽어보지 않으셨다면 아래와 같이 코드를 받고 라이브러리를 설정해 주세요. 


그리고 github에서 제가 만든 PS3 컨트롤러 제어 코드를(https://github.com/jlim262/ps3-controller) Projects 폴더에 클론해주세요.

pi@raspberrypi:~ $ mkdir ~/Projects && cd ~/Projects
pi@raspberrypi:~/Projects $ git clone https://github.com/jlim262/ps3-controller.git

 

이제 파이썬3 개발환경을 virtualenv를 사용해서 생성 후 로드할께요. 

pi@raspberrypi:~/Projects $ virtualenv venv-py3 -p python3
pi@raspberrypi:~/Projects $ source venv-py3/bin/activate
(venv-py3) pi@raspberrypi:~/Projects $ 

 

그리고 ps3-controller 폴더로 이동 후, pip로 필요한 라이브러리를 설치해주세요. 

(venv-py3) pi@raspberrypi:~/Projects $ cd ps3-controller
(venv-py3) pi@raspberrypi:Projects/ps3-controller ‹master›$ pip install -r requirements.txt

 


라즈베리파이에서 서보모터를 제어하기 위해서는 아래와 같이 추가 라이브러리를 설치해주세요. 

(venv-py3) pi@raspberrypi:Projects/ps3-controller ‹master›$ pip install RPi.GPIO 
(venv-py3) pi@raspberrypi:Projects/ps3-controller ‹master›$ pip install gpiozero

 

이제 servo_control.py 라는 이름의 파일을 ps3-controller 폴더 안에 만들어주세요. 그리고 텍스트 에디터를 열어서 servo_control.py의 내용을 아래와 같이 편집해주세요. 

from gpiozero import Servo
from ps3_controller import PS3Controller
from event_handler import EventHandler


class ServoHandler(EventHandler):
    def __init__(self, gpio_pin):
        super().__init__()
        self.servo = Servo(gpio_pin)

    def handle_x(self):
        return {'stop': True}

    def handle_stick(self, axies):
        if sum(axies) > 0 or sum(axies) < 0:
            self.servo.value = axies[0]
        else:
            self.servo.value = 0


if __name__ == "__main__":
    handler = ServoHandler(17)
    controller = PS3Controller(handler)
    controller.run()
    print('Program is stopped')

 

만약 다른 버튼을 눌렀을때 원하는 코드를 실행하기 위해서는 ServoHandler의 부모 클래스인 EventHandler의 메소드를 오버라이드 해주시면 됩니다. 현재 지원되는 함수는 아래와 같습니다.

handle_stick(axies)
handle_x()
handle_circle()
handle_triangle()
handle_square()
handle_l1()
handle_l2()
handle_l3()
handle_r1()
handle_r2()
handle_r3()
handle_up()
handle_down()
handle_left()
handle_right()
handle_select()
handle_start()
handle_ps()

 

각각의 버튼들의 이름은 아래 사진과 같습니다. 즉, R1 버튼을 눌렀을때 특정 코드를 실행시키고 싶다면 handle_r1() 함수를 오버라이드 해서 특정코드를 추가시키면 됩니다.

이미지 출처 (https://www.gran-turismo.com/gb/gt6/manual/#!/controller/race)

 

이제 파이썬 코드를 실행해 보겠습니다. 

(venv-py3) pi@raspberrypi:Projects/ps3-controller ‹master*›$ python servo_control.py

 

PS3 컨트롤러의 왼쪽 스틱을 움직이면 서보모터 역시 따라서 움직이는 것을 확인 할 수 있습니다. 그리고 X 버튼을 누르면 프로그램이 종료됩니다. 오늘 포스팅은 여기서 마치도록 하겠습니다. 혹시 파이썬 코드 실행중에 문제가 생긴다면 답글로 알려주세요.

 

그럼 즐파이 하세요~!! 

댓글