AI 탐구노트

서보모터 (SG90 스탠다드) 테스트 본문

DIY 테스트

서보모터 (SG90 스탠다드) 테스트

42morrow 2024. 10. 14. 11:57

 

예전 글에서 Head Tracking 하는 테스트를 하던 중 가지고 있던 서보모터가 연속형(360도)이라 각도 조절이 어려웠다는 얘기를 한 적이 있습니다.

 

 

Headshot Tracking 따라해 보기 - 1편

재미난 것 발견! 작년 쯤에 유튜브를 보다가 재미난 장난감을 만든 분의 영상을 발견했습니다.    서보모터를 이용해 Pan-Tilt를 할 수 있는 장비를 만들고 (실제 알리에서 판매하고 있음),카메

42morrow.tistory.com

 

 

최고 속도로 회전을 하는데 움직인 시간을 조절해서 각도를 조절해야 하다보니 원하는 각도를 정확히 맞추는 것이 어려웠습니다. 할 때마다 미묘하게 차이가 발생했었는데 이게 계속 누적이 되다보면 원치않은 위치에 가 있는 것을 확인할 수 있거든요. 연속형(360도)에서는 전문적으로 파고들면 모르겠지만 초보자가 다루는 건 여기까지인가보다 하면서 접어 두고는 당시 중국에 스탠다드형(180도)를 주문해 놓고 글을 마무리 했었습니다. 이후에 제품을 받긴 했는데 다른 것을 하고 있던터라 테스트를 해 보지 못하고 있었다가, 기기 자체가 크게 다르지 않은데 뭐 많이 차이가 나겠어 하면서도 혹시 잘 되는거 아냐 하며 정말 약간만 기대하며 테스트를 진행했습니다. 

 

서보모터 (스탠다드 형 180도) 테스트 

 

기본 동작 테스트

 

테스트 한 코드는 다음과 같습니다. 문서 상으로는 각도만 지정하면 된다고 했지만 사실 반신반의했던터라 기본적인 사항만 먼저 해 봅니다. 누를 때마다 조금씩 시계방향, 반시계 방향, 그리고 지정한 각도(90도, 120도) 이렇게만 말이죠.

 

import pyfirmata
import time
from pynput import keyboard

# Arduino 보드 설정 (포트는 사용자의 환경에 맞게 수정)
board = pyfirmata.Arduino('/dev/ttyUSB0')

# 서보모터를 연결한 핀 설정 (핀 번호는 사용자의 연결에 맞게 수정)
servo_pin = board.get_pin('d:10:s')

# 시작 시 서보를 중간 위치로 이동
current_angle = 90
servo_pin.write(current_angle)
print(f"Servo moved to middle position: {current_angle} degrees")

# 회전 속도 변수 (작을수록 느림)
rotation_speed = 0.001  # 기본 속도

# 서보 모터 회전 함수
def rotate_servo(angle):
    global current_angle
    if 0 <= angle <= 180:  # 서보모터가 0도에서 180도 사이만 움직이도록 제한
        current_angle = angle
        servo_pin.write(current_angle)
        print(f"Servo moved to {current_angle} degrees")

# 키보드 이벤트 처리 함수
def on_press(key):
    global rotation_speed
    try:
        if key.char == '1':
            if current_angle > 0:
                rotate_servo(current_angle - 1)
                time.sleep(rotation_speed)
        elif key.char == '3':
            if current_angle < 180:
                rotate_servo(current_angle + 1)
                time.sleep(rotation_speed)
        elif key.char == '2': # 중간 위치로 되돌아감
            rotate_servo(90)  
        elif key.char == '4': # 지정한 120도 각도로 위치토록 하기
            rotate_servo(120)
            time.sleep(rotation_speed)
        elif key.char == 'u': # 회전 속도 올리기
            rotation_speed = max(0.01, rotation_speed - 0.01)  # 최소 속도 제한
            print(f"Rotation speed increased: {rotation_speed}")
        elif key.char == 'j': # 회전 속도 낮추기
            rotation_speed = min(0.1, rotation_speed + 0.01)  # 최대 속도 제한
            print(f"Rotation speed decreased: {rotation_speed}")
        elif key.char == 'q':
            print("Exiting program...")
            return False  # 리스너 종료
    except AttributeError:
        # 특수 키 처리 (필요 시 추가 가능)
        pass

# 리스너 설정 및 시작
listener = keyboard.Listener(on_press=on_press)
listener.start()

# 프로그램이 종료될 때까지 대기
listener.join()

# 프로그램 종료 후 Arduino 보드 닫기
board.exit()

 

 

동작 확인

오호... 정말 설명대로 연속형과는 달리 지정한 각도만큼 동작하고 멈춥니다. 정말 되는구나.. 이렇게 쉽게 해결되는 것을 이전에 그렇게 시행착오를 했단 말인가... 허무했습니다.

영상 : SG90 표준형 (180도) 서보모터 동작 테스트

 

 

일단 모터가 제대로 동작하는 것을 봤으니 이젠 기존 Turret에 들어간 모터들을 다 교체하고 다시 진행해야겠습니다. 이런 시행착오를 겪다보니 너무 대충 알면 이런 문제가 생기는구나 싶어 아무리 테스트만 할 요량이라도 조금은 공부를 더 해야겠다는 생각이 들었습니다. 반성...-_-;

 

다음 번 글에서는 완성된 결과물이 나올 수 있도록 해 보겠습니다. 

 

 

참고자료

 

사실 서보모터를 다루기 위해서는 기본적인 기술 이해가 필요한 것 같습니다. 저야 단순히 최종 목적을 위해서 '원하는 각도만큼 회전하면 돼' 하는 생각이긴 한 단계 더 깊이 들어가 보고 싶으신 분들은 아래 소개한 자료들을 참고하시면 좋을 것 같습니다. 저도 현재 개발은 PC를 이용하고 있지만 나중에는 라즈베리파이 정도에서 감지모델을 이용해서 컨트롤 하는 것을 생각하고 있기 때문에 라즈베리파이 쪽 자료를 인용해 봅니다. 

 

 

1.라즈베리파이(RaspberryPi) 서보모터(MG90, SG90, MG995) 사용하기 - 파이썬(Python) + PWM

 

아두이노 대신 라즈베리파이를 이용하고 계신데 (결과적으로 비슷), 훨씬 전문적이신 듯 합니다. 원래대로라면 이 분이 설명하고 계신 위치제어신호나 펄스 파형에 대한 이해도 필요한 사항인 것 같네요.

 

2.Using a servo motor with a Pi Pico board in MicroPython

 

이곳도 비슷합니다. 라즈베리파이 피코라는 것이 다를 뿐... 아무래도 두 장비가 가격대가 차이가 많이 나므로 용도에 따라 선택하면 될 듯 합니다. 

 

 

 

Pi Pico Servo Motor in MicroPython: SG90 Guide

Découvrez comment utiliser un servomoteur SG90 avec une Pi Pico avec MicroPython pour votre prochain projet DIY. Notre tutoriel détaillé vous explique tout ce que vous devez savoir pour éviter les erreurs courantes et alimenter correctement le servomot

www.upesy.com

 

 

3.Using a servo motor with an ESP32 board in MicroPython

 

ESP32와 MycroPython을 이용하는 방식을 설명하고 있습니다. 전체적으로 사이즈를 줄일 수 있다는 장점이 있겠네요.

 

 

ESP32 Servo Motor in MicroPython: SG90 Guide

Contrôler un servomoteur en MicroPython - apprenez comment programmer un servomoteur en MicroPython avec un ESP32 pour lui faire effectuer des mouvements précis.

www.upesy.com