Servomoteur SG90

Raspberry Pi로 서보 모터를 제어하는 방법

업데이트 됨 29 10월 2019 - 0 코멘트 - , , , ,

ⓘ 이 기사는 자동 도구를 사용하여 부분적으로 또는 전체적으로 번역되었을 수 있습니다. 이로 인해 발생할 수있는 오류에 대해 사과드립니다.

이 자습서는 Raspberry Pi로 전자 장치를 발견하는 데 전념하는 파일의 세 번째 부분입니다. 아직 읽지 않았다면 Raspberry Pi로 LED를 제어하는 첫 번째 자습서와 Raspberry Pi에서 RFID 리더를 사용하는 두 번째 자습서를 참조하는 것이 좋습니다.

홈 오토메이션을 시작할 때 고전적인 요구 사항은 프로그램에서 실제로 물리적 움직임을 제어하는 것입니다.

이 튜토리얼에서는 Raspberry Pi를 사용하여 서보 모터를 제어하는 방법을 알아 봅니다.

서보 모터 제어용 액세서리

이 튜토리얼을 따라 서보 모터를 제어하려면 다음 자료가 필요합니다.

모터, 서보 모터 및 스테퍼 모터의 차이점은 무엇입니까?

서보 모터를 Raspberry Pi에 연결하기 전에 전자 제품에 일반적으로 사용되는 다양한 유형의 모터를 살펴 보겠습니다.

세부 사항을 다루지 않고 전자 제품에 사용되는 모터를 대략 세 가지 범주로 나눌 수 있습니다.

  • 모터 : 전원이 공급되는 동안 작동합니다. 높은 정밀도를 요구하지 않는 연속 동작을하고 싶을 때 적합합니다.
  • 스테퍼 모터 : 일종의 작은 연속 도약으로 회전합니다. 즉, 특정 동작 (예 : 1/4 턴)에 해당하는 50 점프 또는 112 점프와 같이 그에게 요청할 수 있습니다. 고정밀 도로 연속적인 움직임을 원할 때 적합합니다 (예를 들어 3D 프린터에 사용됨).
  • 서보 모터 : PWM (Pulse Width Modulation) 유형 신호에 따라 정의 된 특정 각도로 회전합니다. 종종 소형 모터는 제한적이며 한 번 이상 회전 할 수 없습니다. 따라서 매우 정밀한 짧은 움직임에 사용됩니다.
다양한 유형의 엔진
왼쪽에서 오른쪽으로 모터, 스테퍼 모터 및 서보 모터.

이 다른 엔진에 대해 여전히 많은 다른 말이 있지만, 우리는 튜토리얼의 범위를 훨씬 넘어서는 기계적인 질문을 할 것입니다.

우리의 경우에는 Raspberry Pi에서 제어하는 가장 쉬운 정밀 모터이기 때문에 서보 모터를 사용할 것입니다.

Raspberry Pi에 서보 모터 연결

서보 모터를 사용하기 위해 가장 먼저해야 할 일은 라즈베리 파이에 연결하는 것입니다.

액추에이터에는 3 개의 전기 커넥터가 있습니다. 색상은 제조업체에 따라 변경 될 수 있지만 일반적으로 다음과 같은 것을 찾을 수 있습니다.

  • 전원 공급 장치 역할을하는 빨간색 와이어.
  • GDN 역할을하는 검은 색 또는 갈색 와이어입니다.
  • 모터의 위치를 제어하는 PWM 신호를 전송하는 데 사용되는 또 다른 와이어입니다.

따라서 이러한 다른 케이블을 Raspberry Pi에 연결하고 빨간색 와이어를 5V GPIO 포트에 연결하고 검정색을 GND 포트에 연결합니다.

반면에 PWM 포트의 경우 반드시 Raspberry Pi의 12 번째 GPIO 핀에 연결해야합니다. 실제로 기본적으로 PWM 신호를 지원하는 유일한 GPIO 핀입니다.

따라서 이와 같은 몽타주가 있어야합니다.

Raspberry Pi의 서보 모터 어셈블리 다이어그램
적색선-> GPIO 2, 흑색 선-> GPIO 6, 황색 선-> GPIO 12

여기서는 Raspberry Pi에서 직접 서보 모터에 전원을 공급하고 있습니다. 이것은 매우 작은 서보 모터를 사용하기 때문에 작동하지만 더 큰 모델에서는 전용 전원 공급 장치가 필요합니다.

명령 줄에서 서보 모터 제어

서보 모터를 연결 했으므로 이제 Raspberry Pi 명령 줄에서 직접 구동 할 수 있습니다.

이를 위해 프로세서 번호 지정에 따라 포트 12, 즉 GPIO 18에서 PWM 모드를 활성화하는 것으로 시작합니다.

gpio -o mode 18 pwm

그리고 PWM의 Mark / Space 모드를 활성화하여 사용에 더 적합한 신호를 가질 수 있습니다.

gpio pwm-ms

마지막으로주기의 지속 시간, 사용할 주파수 등을 구성합니다.

서보 모터는 50Hz, 즉 20ms의 주파수에서 작동하도록 설정되어 있습니다. Raspberry Pi 신호는 다른 주파수 인 19.2MHz에서 작동합니다. 이 두 수치를 사용하여 기간과 범위를 계산할 수 있습니다 (공식에 대한 ramboise314.fr 덕분에).

50 = 19.2 * 10^6 / 192 / 2000
SG90 문서에서 발췌합니다.
엔진 문서는 SG90의주기 및 듀티 사이클 다이어그램을 보여줍니다.

따라서 다음 값을 사용하도록 Raspberry Pi를 설정합니다.

gpio pwmc 192
gpio pwmr 2000

마지막으로 엔진을 움직일 수 있습니다! 서보 모터에 각도를 전달하지 않고 각도로 변환 할 숫자를 전달합니다. 당사의 서보 모터는 0 °에서 180 °로 이동합니다. 몇 가지 테스트 후 0 °는 230, 90 ° ~ 150 및 180 ° ~ 70에 해당하는 것처럼 보입니다.

따라서 모터를 90 °로 보내기 위해 다음 명령을 사용합니다.

gpio -g pwm 18 150

그리고 150을 230으로 바꾸면 0도, 70은 180도 또는 그 사이의 값이 필요합니다.

이 작은 모터는 정확한 방식으로 180 °의 각도를 지원하지만 약간의 여유가있어 190 ° 또는 200 °를 만들 수 있으며 충분히 낮은 값을 입력하면 완전히 회전 할 수도 있습니다. 각 엔진 모델에 따라 다릅니다.

Python으로 서보 모터 구동

이 시리즈의 이전 자습서와 마찬가지로 목표는 명령 줄에서 직접 수행하는 것이 아니라 Python으로 엔진을 제어하는 것입니다. 나는 이제 당신이 파이썬의 기초를 가지고 있다고 생각한다. 이전 튜토리얼을 읽어 보지 않는다면이 기사의 시작 부분에 링크가있다.

Python 스크립트에서 엔진을 제어하기 위해 다시 한 번 lib를 사용합니다. Rpi.GPIO.

Python과 Pi에서 모터 각도는 사이클의 백분율로 계산됩니다. 이 비율을 "Duty Cycle"이라고합니다.

0.5ms 신호는 0 °에 해당하고 2.5ms 신호는 180 °에 해당합니다. 사이클이 50Hz, 즉 20ms임을 알면 다음과 같이 0 ° 및 180 °에 대한 듀티 사이클을 계산할 수 있습니다.

x = 0.5 / 20
y = 2.5 / 20

그런 다음 0 °에 해당하는 듀티 사이클이 0.025 또는 2.5 %이고 180 °에 해당하는 듀티 사이클이 0.125 또는 12.5 %임을 알 수 있습니다.

그러나이 값이 이론적으로 좋으면 실제로 0 ° 동안 모터의 전체 회전을 트리거하는 경향이 있습니다. 따라서 0 °에 4 %를 사용하는 것이 좋습니다. 180의 경우 12.5 % 값이 좋습니다.

모터를 제어하려면 핀 12를 PWM 신호로 설정하고 기능을 사용하기 만하면됩니다. startChangeDutyCycle.

따라서 파일을 만들 수 있습니다. servo.py 거기에 다음 코드를 넣으십시오.

#!/usr/bin/env python3
#-- coding: utf-8 --
import RPi.GPIO as GPIO
import time


#Set function to calculate percent from angle
def angle_to_percent (angle) :
    if angle > 180 or angle < 0 :
        return False

    start = 4
    end = 12.5
    ratio = (end - start)/180 #Calcul ratio from angle to percent

    angle_as_percent = angle * ratio

    return start + angle_as_percent


GPIO.setmode(GPIO.BOARD) #Use Board numerotation mode
GPIO.setwarnings(False) #Disable warnings

#Use pin 12 for PWM signal
pwm_gpio = 12
frequence = 50
GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)

#Init at 0°
pwm.start(angle_to_percent(0))
time.sleep(1)

#Go at 90°
pwm.ChangeDutyCycle(angle_to_percent(90))
time.sleep(1)

#Finish at 180°
pwm.ChangeDutyCycle(angle_to_percent(180))
time.sleep(1)

#Close GPIO & cleanup
pwm.stop()
GPIO.cleanup()

다음을 수행하여 스크립트를 실행하기 만하면됩니다.

python3 ./servo.py

그러면 엔진이 0 °에서 시작된 다음 90 °로 변속하고 마지막으로 180 °에서 멈 춥니 다.

이 스크립트를 자신의 필요에 맞게 조정하기 만하면됩니다!

공유
뉴스 레터
저자 :
Raspberry Pi FR
Raspberry Pi 커뮤니티에 가입
35 달러짜리 컴퓨터는 이미 천만 부 판매
새로운 RASPBERRY PI 4 구입
관련 튜토리얼
Raspberry Pi 4는 8GB RAM 버전으로 출시됩니다! eZ 서버 모니터로 라즈베리 파이 모니터링 Raspberry Pi를 시작할 때 프로그램을 실행하는 방법은 무엇입니까? Raspberry Pi 및 Octopi를 사용하여 원격으로 3D 프린터를 제어합니다. Raspberry Pi Imager, 재단이 Raspberry에 OS를 설치하는 공식 도구를 출시합니다!
댓글이 없습니다
공유
뉴스 레터 가입
뉴스 레터를 구독하십시오.
이 기사가 마음에 드 셨나요?
구독하고 최신 정보를 받아보세요!