ChatGPT

image.png

from machine import Pin, PWM
import sys
import uselect
from time import sleep

# 서보모터를 GP3 (수평)와 GP5 (수직)에 초기화
servo_horiz = PWM(Pin(3))  # 수평 방향 서보모터
servo_vert = PWM(Pin(5))   # 수직 방향 서보모터

# 서보모터의 주파수를 50Hz로 설정 (표준 서보모터 주파수)
servo_horiz.freq(50)
servo_vert.freq(50)

# 최소 및 최대 듀티 사이클 값 정의 (0도와 180도에 해당)
min_duty = 1638   # 0도에 해당하는 듀티 사이클 (약 1ms 펄스 폭)
max_duty = 8192   # 180도에 해당하는 듀티 사이클 (약 2ms 펄스 폭)

def angle_to_duty(angle):
    # 주어진 각도(0~180도)를 듀티 사이클 값으로 변환하는 함수
    return int(min_duty + (max_duty - min_duty) * angle / 180)

# 초기 각도를 90도로 설정 (중앙 위치)
angle_horiz = 90  # 수평 방향 초기 각도
angle_vert = 90   # 수직 방향 초기 각도

# 서보모터를 초기 위치로 설정
servo_horiz.duty_u16(angle_to_duty(angle_horiz))
servo_vert.duty_u16(angle_to_duty(angle_vert))

# 비차단(non-blocking) 입력을 위한 폴링 객체 설정
poll = uselect.poll()
poll.register(sys.stdin, uselect.POLLIN)

print("서보모터 제어: 'w'(위), 'a'(왼쪽), 's'(아래), 'd'(오른쪽), 'q'(초기화). 종료하려면 Ctrl+C를 누르세요.")

try:
    while True:
        # 입력 이벤트가 있는지 확인
        events = poll.poll(0)
        if events:
            cmd = sys.stdin.read(1)
            # 엔터(개행) 및 캐리지 리턴 문자는 무시
            if cmd in ('\\n', '\\r'):
                continue
            if cmd == 'w':
                # 위로 이동: 수직 각도를 증가
                angle_vert += 10
                if angle_vert > 180:
                    angle_vert = 180  # 각도 제한
                servo_vert.duty_u16(angle_to_duty(angle_vert))
                print(f"위로 이동: 수직 각도 = {angle_vert}")
            elif cmd == 's':
                # 아래로 이동: 수직 각도를 감소
                angle_vert -= 10
                if angle_vert < 0:
                    angle_vert = 0  # 각도 제한
                servo_vert.duty_u16(angle_to_duty(angle_vert))
                print(f"아래로 이동: 수직 각도 = {angle_vert}")
            elif cmd == 'a':
                # 왼쪽으로 이동: 수평 각도를 감소
                angle_horiz -= 10
                if angle_horiz < 0:
                    angle_horiz = 0  # 각도 제한
                servo_horiz.duty_u16(angle_to_duty(angle_horiz))
                print(f"왼쪽으로 이동: 수평 각도 = {angle_horiz}")
            elif cmd == 'd':
                # 오른쪽으로 이동: 수평 각도를 증가
                angle_horiz += 10
                if angle_horiz > 180:
                    angle_horiz = 180  # 각도 제한
                servo_horiz.duty_u16(angle_to_duty(angle_horiz))
                print(f"오른쪽으로 이동: 수평 각도 = {angle_horiz}")
            elif cmd == 'q':
                # 'q'를 누르면 각도를 90도로 초기화
                angle_horiz = 90
                angle_vert = 90
                servo_horiz.duty_u16(angle_to_duty(angle_horiz))
                servo_vert.duty_u16(angle_to_duty(angle_vert))
                print("각도를 초기화합니다: 수평 각도 = 90, 수직 각도 = 90")
            else:
                # 유효하지 않은 명령 처리
                print("잘못된 명령입니다. 'w', 'a', 's', 'd', 'q' 키를 사용하세요.")
        sleep(0.1)  # CPU 사용량을 줄이기 위한 짧은 지연
except KeyboardInterrupt:
    # 프로그램 종료 시 서보모터 비활성화
    servo_horiz.deinit()
    servo_vert.deinit()
    print("\\n서보모터를 비활성화하고 프로그램을 종료합니다.")