메인
home
소프트웨어
home
🌔

피코 서보모터 시리얼 통신

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서보모터를 비활성화하고 프로그램을 종료합니다.")
C
복사
3축.
from machine import Pin, PWM import sys import uselect from time import sleep # 서보모터 초기화 servo_horiz = PWM(Pin(3)) # 수평 방향 서보모터 servo_vert = PWM(Pin(5)) # 수직 방향 서보모터 servo_toggle = PWM(Pin(7)) # 토글 동작 서보모터 # 서보모터 주파수를 50Hz로 설정 servo_horiz.freq(50) servo_vert.freq(50) servo_toggle.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) # 초기 각도 설정 angle_horiz = 90 # 수평 방향 angle_vert = 90 # 수직 방향 angle_toggle = 90 # 토글 서보 (7) # 서보모터를 초기 위치로 설정 servo_horiz.duty_u16(angle_to_duty(angle_horiz)) servo_vert.duty_u16(angle_to_duty(angle_vert)) servo_toggle.duty_u16(angle_to_duty(angle_toggle)) # 토글 상태를 추적하기 위한 변수 (False면 90, True면 120도로 설정) toggle_state = False # 비차단(non-blocking) 입력을 위한 폴링 객체 설정 poll = uselect.poll() poll.register(sys.stdin, uselect.POLLIN) print("서보모터 제어: 'w'(위), 'a'(왼쪽), 's'(아래), 'd'(오른쪽), 'q'(초기화), 'e'(토글). 종료하려면 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 angle_toggle = 90 toggle_state = False # 토글 상태도 초기화 servo_horiz.duty_u16(angle_to_duty(angle_horiz)) servo_vert.duty_u16(angle_to_duty(angle_vert)) servo_toggle.duty_u16(angle_to_duty(angle_toggle)) print("각도를 초기화합니다: 수평=90, 수직=90, 토글=90") elif cmd == 'e': # 'e'를 누르면 120도 ↔ 90도 토글 if toggle_state: angle_toggle = 90 else: angle_toggle = 120 servo_toggle.duty_u16(angle_to_duty(angle_toggle)) toggle_state = not toggle_state print(f"토글 동작: 각도 = {angle_toggle}") else: # 유효하지 않은 명령 처리 print("잘못된 명령입니다. 'w', 'a', 's', 'd', 'q', 'e' 키를 사용하세요.") sleep(0.1) # CPU 사용량을 줄이기 위한 짧은 지연 except KeyboardInterrupt: # 프로그램 종료 시 서보모터 비활성화 servo_horiz.deinit() servo_vert.deinit() servo_toggle.deinit() print("\n서보모터를 비활성화하고 프로그램을 종료합니다.")
JavaScript
복사