연동사이트
티처블 머신 연동 코드
main.py
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("서보모터 제어: 시리얼 통신으로 'class a' 또는 'class b'를 포함한 메시지를 보내세요. 종료하려면 Ctrl+C를 누르세요.")
try:
while True:
# 입력 이벤트가 있는지 확인
events = poll.poll(0)
if events:
cmd = sys.stdin.readline().strip()
# 빈 명령은 무시
if not cmd:
continue
if '1' in cmd:
# 수평 서보모터를 10도로 이동했다가 90도로 복귀
angle_horiz = 10
servo_horiz.duty_u16(angle_to_duty(angle_horiz))
print(f"수평 서보모터를 {angle_horiz}도로 이동합니다")
sleep(1) # 1초 대기
angle_horiz = 90
servo_horiz.duty_u16(angle_to_duty(angle_horiz))
print(f"수평 서보모터를 {angle_horiz}도로 복귀합니다")
elif '2' in cmd:
# 수직 서보모터를 10도로 이동했다가 90도로 복귀
angle_vert = 10
servo_vert.duty_u16(angle_to_duty(angle_vert))
print(f"수직 서보모터를 {angle_vert}도로 이동합니다")
sleep(1) # 1초 대기
angle_vert = 90
servo_vert.duty_u16(angle_to_duty(angle_vert))
print(f"수직 서보모터를 {angle_vert}도로 복귀합니다")
else:
# 유효하지 않은 명령 처리
print("잘못된 명령입니다. 'class a' 또는 'class b'를 포함한 메시지를 보내세요.")
sleep(0.1) # CPU 사용량을 줄이기 위한 짧은 지연
except KeyboardInterrupt:
# 프로그램 종료 시 서보모터 비활성화
servo_horiz.deinit()
servo_vert.deinit()
print("\n서보모터를 비활성화하고 프로그램을 종료합니다.")
C
복사