메인
home
소프트웨어
home

[초당고][조연영]

여기는 연수생의 작업물을 기록하고 공유하는 공간입니다.

 프로젝트 사진 모음

 프로젝트 기록

1.
서브모터 4개테스트
라즈베리파이 피코에 파이썬으로 서보모터 4개 스위핑 테스트 코드 작성해. 2번, 4번, 6번, 8번에 연결했어.
from machine import Pin, PWM import time # 서보모터 클래스 정의 class Servo: def __init__(self, pin_number): self.pwm = PWM(Pin(pin_number)) self.pwm.freq(50) # 서보모터 표준 주파수 50Hz self.min_duty = 1000 # 0위치 (마이크로초) self.max_duty = 9000 # 180위치 (마이크로초) self.position = 90 # 초기 위치를 90도로 설정 self.set_angle(self.position) # 초기 위치로 이동 def set_angle(self, angle): # 각도를 0-180 범위로 제한 if angle < 0: angle = 0 elif angle > 180: angle = 180 # 각도를 듀티 사이클로 변환 (6553516비트 PWM의 최대값) duty = int(self.min_duty + (self.max_duty - self.min_duty) * angle / 180) duty_cycle = int((duty * 65535) / 20000) # 20ms(20000us) 주기에 대한 비율 self.pwm.duty_u16(duty_cycle) self.position = angle def sweep(self, start_angle, end_angle, step=1, delay_ms=20): # 스위핑 동작 current_direction = 1 if start_angle < end_angle else -1 step = abs(step) * current_direction angle = start_angle while (current_direction > 0 and angle <= end_angle) or (current_direction < 0 and angle >= end_angle): self.set_angle(angle) time.sleep_ms(delay_ms) angle += step # 서보모터 핀 설정 (2, 4, 6, 8번 핀) servo_pins = [2, 4, 6, 8] servos = [Servo(pin) for pin in servo_pins] # 테스트 시작 print("서보모터 스위핑 테스트 시작...") try: while True: # 순차적 스위핑 테스트 print("순차적 스위핑 테스트") for i, servo in enumerate(servos): print(f"서보 {i+1} (핀 {servo_pins[i]}) 스위핑...") servo.sweep(0, 180, 2) servo.sweep(180, 0, 2) time.sleep(0.5) time.sleep(1) # 동시 스위핑 테스트 print("동시 스위핑 테스트") # 모든 서보 0도로 이동 for servo in servos: servo.set_angle(0) time.sleep(1) # 0도에서 180도까지 동시에 이동 for angle in range(0, 181, 2): for servo in servos: servo.set_angle(angle) time.sleep_ms(20) # 180도에서 0도까지 동시에 이동 for angle in range(180, -1, -2): for servo in servos: servo.set_angle(angle) time.sleep_ms(20) time.sleep(1) # 웨이브 패턴 테스트 print("웨이브 패턴 테스트") # 모든 서보 90도로 초기화 for servo in servos: servo.set_angle(90) time.sleep(1) # 웨이브 패턴 (순차적으로 이동하고 돌아옴) for _ in range(3): # 웨이브 3회 반복 for i in range(len(servos)): servos[i].set_angle(45) time.sleep(0.2) servos[i].set_angle(135) time.sleep(0.2) servos[i].set_angle(90) time.sleep(1) except KeyboardInterrupt: # 모든 서보 중간 위치(90)로 이동 for servo in servos: servo.set_angle(90) print("테스트 종료") # 프로그램 종료 시 모든 PWM 해제 for servo in servos: servo.pwm.deinit()
JavaScript
복사
서브모터 2개 시리얼통신으로 테스트 코드 작성해. 2번과 4번 모터만. w, s는 위아래, a,d는 좌우제어, 초기각도는 모두 90도.
from machine import Pin, PWM, UART import time # 서보모터 클래스 정의 class Servo: def __init__(self, pin_number, initial_angle=90): self.pwm = PWM(Pin(pin_number)) self.pwm.freq(50) # 서보모터 표준 주파수 50Hz self.min_duty = 1000 # 0위치 (마이크로초) self.max_duty = 9000 # 180위치 (마이크로초) self.angle = initial_angle self.set_angle(self.angle) # 초기 위치로 이동 def set_angle(self, angle): # 각도를 0-180 범위로 제한 if angle < 0: angle = 0 elif angle > 180: angle = 180 # 각도를 듀티 사이클로 변환 (6553516비트 PWM의 최대값) duty = int(self.min_duty + (self.max_duty - self.min_duty) * angle / 180) duty_cycle = int((duty * 65535) / 20000) # 20ms(20000us) 주기에 대한 비율 self.pwm.duty_u16(duty_cycle) self.angle = angle return self.angle # UART 설정 (기본 UART0, TX=0, RX=1) uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1)) # 서보모터 객체 생성 (2, 4번 핀) servo_vertical = Servo(2, 90) # 수직 제어 (w, s키) servo_horizontal = Servo(4, 90) # 수평 제어 (a, d키) # 이동 스텝 각도 (한 번에 이동할 각도) STEP_ANGLE = 5 print("서보모터 시리얼 제어 시작") print("컨트롤 방법:") print("w: 위로 이동") print("s: 아래로 이동") print("a: 왼쪽으로 이동") print("d: 오른쪽으로 이동") print("r: 초기 위치로 리셋 (90도)") print("q: 종료") try: while True: if uart.any(): command = uart.read(1).decode('utf-8').lower() if command == 'w': # 위로 이동 (수직 서보 각도 증가) new_angle = servo_vertical.set_angle(servo_vertical.angle + STEP_ANGLE) print(f"위로 이동: 수직 서보 = {new_angle}도") elif command == 's': # 아래로 이동 (수직 서보 각도 감소) new_angle = servo_vertical.set_angle(servo_vertical.angle - STEP_ANGLE) print(f"아래로 이동: 수직 서보 = {new_angle}도") elif command == 'a': # a: 왼쪽으로 이동 (수평 서보 각도 증가) new_angle = servo_horizontal.set_angle(servo_horizontal.angle + STEP_ANGLE) print(f"왼쪽으로 이동: 수평 서보 = {new_angle}도") elif command == 'd': # d: 오른쪽으로 이동 (수평 서보 각도 감소) new_angle = servo_horizontal.set_angle(servo_horizontal.angle - STEP_ANGLE) print(f"오른쪽으로 이동: 수평 서보 = {new_angle}도") elif command == 'r': # r: 초기 위치로 리셋 (두 서보모터 모두 90) servo_vertical.set_angle(90) servo_horizontal.set_angle(90) print("모든 서보모터 초기 위치(90도)로 리셋") elif command == 'q': # q: 종료 print("프로그램 종료") break time.sleep(0.01) # CPU 부하 감소 except Exception as e: print(f"오류 발생: {e}") finally: # 종료 시 모든 서보모터 초기 위치로 servo_vertical.set_angle(90) servo_horizontal.set_angle(90) # PWM 해제 servo_vertical.pwm.deinit() servo_horizontal.pwm.deinit() print("프로그램 종료, 서보모터 해제")
JavaScript
복사