ChatGPT
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서보모터를 비활성화하고 프로그램을 종료합니다.")