일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LORA
- ChatGPT
- 생성형 AI
- tts
- TRANSFORMER
- 우분투
- 오블완
- 아두이노
- 일론 머스크
- AI 기술
- ControlNet
- 뉴럴링크
- AI
- 멀티모달
- OpenAI
- 서보모터
- 시간적 일관성
- 딥마인드
- 오픈AI
- javascript
- PYTHON
- 가상환경
- 메타
- LLM
- ubuntu
- 인공지능
- 트랜스포머
- 이미지 편집
- 확산 모델
- 티스토리챌린지
- Today
- Total
AI 탐구노트
서보모터 (SG90 스탠다드) 테스트 본문
예전 글에서 Head Tracking 하는 테스트를 하던 중 가지고 있던 서보모터가 연속형(360도)이라 각도 조절이 어려웠다는 얘기를 한 적이 있습니다.
최고 속도로 회전을 하는데 움직인 시간을 조절해서 각도를 조절해야 하다보니 원하는 각도를 정확히 맞추는 것이 어려웠습니다. 할 때마다 미묘하게 차이가 발생했었는데 이게 계속 누적이 되다보면 원치않은 위치에 가 있는 것을 확인할 수 있거든요. 연속형(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()
동작 확인
오호... 정말 설명대로 연속형과는 달리 지정한 각도만큼 동작하고 멈춥니다. 정말 되는구나.. 이렇게 쉽게 해결되는 것을 이전에 그렇게 시행착오를 했단 말인가... 허무했습니다.
일단 모터가 제대로 동작하는 것을 봤으니 이젠 기존 Turret에 들어간 모터들을 다 교체하고 다시 진행해야겠습니다. 이런 시행착오를 겪다보니 너무 대충 알면 이런 문제가 생기는구나 싶어 아무리 테스트만 할 요량이라도 조금은 공부를 더 해야겠다는 생각이 들었습니다. 반성...-_-;
다음 번 글에서는 완성된 결과물이 나올 수 있도록 해 보겠습니다.
참고자료
사실 서보모터를 다루기 위해서는 기본적인 기술 이해가 필요한 것 같습니다. 저야 단순히 최종 목적을 위해서 '원하는 각도만큼 회전하면 돼' 하는 생각이긴 한 단계 더 깊이 들어가 보고 싶으신 분들은 아래 소개한 자료들을 참고하시면 좋을 것 같습니다. 저도 현재 개발은 PC를 이용하고 있지만 나중에는 라즈베리파이 정도에서 감지모델을 이용해서 컨트롤 하는 것을 생각하고 있기 때문에 라즈베리파이 쪽 자료를 인용해 봅니다.
1.라즈베리파이(RaspberryPi) 서보모터(MG90, SG90, MG995) 사용하기 - 파이썬(Python) + PWM
아두이노 대신 라즈베리파이를 이용하고 계신데 (결과적으로 비슷), 훨씬 전문적이신 듯 합니다. 원래대로라면 이 분이 설명하고 계신 위치제어신호나 펄스 파형에 대한 이해도 필요한 사항인 것 같네요.
2.Using a servo motor with a Pi Pico board in MicroPython
이곳도 비슷합니다. 라즈베리파이 피코라는 것이 다를 뿐... 아무래도 두 장비가 가격대가 차이가 많이 나므로 용도에 따라 선택하면 될 듯 합니다.
3.Using a servo motor with an ESP32 board in MicroPython
ESP32와 MycroPython을 이용하는 방식을 설명하고 있습니다. 전체적으로 사이즈를 줄일 수 있다는 장점이 있겠네요.
'DIY 테스트' 카테고리의 다른 글
ComfyUI에서 CivitAI LoRA 사용해 보기 (6) | 2024.10.16 |
---|---|
Headshot Tracking 따라하기 - 2편 (8) | 2024.10.14 |
나만의 썸네일 메이커 만들기 - 2편 (1) | 2024.10.11 |
썸네일 메이커 Electron 어플리케이션으로 전환하기 (1) | 2024.10.09 |
AudioCraft를 이용한 효과음 만들어 보기 (5) | 2024.10.09 |