연동사이트

Ai Training

image.png

image.png

ChatGPT

티처블 머신 연동 코드

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