여기는 연수생의 작업물을 기록하고 공유하는 공간입니다.
프로젝트 사진 모음
프로젝트 기록
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
# 각도를 듀티 사이클로 변환 (65535는 16비트 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
# 각도를 듀티 사이클로 변환 (65535는 16비트 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
복사