폐프린터 버리지 마세요! 스텝모터 재활용하기 (L298N)

폐 프린터에서 추출한 모터는 Japan Servo KP39EM2-011 스텝 모터였습니다.

**일본 서보(JAPAN SERVO CO., LTD.)**에서 제조한 바이폴라(Bipolar) 타입의 스텝 모터입니다. 정확한 모델명은 KP39EM2-011 (EM-240 시리즈)입니다.


1. 주요 스펙 (Label 정보 분석)

  • Step Angle (보폭): 1.8 DEG/STEP입니다. 즉, 한 바퀴(360도)를 도는 데 200스텝이 필요합니다.
  • 타입: 일반적으로 4개의 선이 나오는 바이폴라 방식입니다.
  • 크기: NEMA 14 또는 17 사이즈보다 약간 작거나 슬림한 타입일 가능성이 높으며, 주로 정밀한 위치 제어가 필요한 프린터, 스캐너, 소형 자동화 기기에 사용됩니다.

2. L298N 연결

이 모터는 17HS4011과 제어 방식이 동일합니다.

3. 배선 찾기 (가장 중요!)

이 모터는 보통 4가닥의 전선이 연결됩니다. 색상만으로 판별하기 어려울 때는 멀티미터(테스터기)로 통전 테스트를 해서 짝을 찾아야 합니다.

  • A상 짝: 선 두 개를 찍었을 때 저항값이 측정되는 한 쌍 (예: 검정-초록) -> L298N의 IN1, IN2 쪽 연결.
  • B상 짝: 나머지 저항값이 측정되는 한 쌍 (예: 빨강-파랑) -> L298N의 IN3, IN4 쪽 연결.

⚠️ 사용 시 주의사항

  • 전압/전류: 이 모델(EM-240 계열)은 정격 전압이 낮고 전류 소모가 작을 수 있습니다. L298N으로 구동할 때 모터가 너무 뜨거워진다면 전압을 낮추거나 코드의 delay를 조절해야 합니다.
  • 정밀도: 1.8도 스텝 각도를 가지고 있어 위치 제어가 매우 정확합니다. 과학상자 로봇의 팔을 움직이거나 정밀하게 전진/후진할 때 아주 좋습니다.

Python step.py

import machine
import time

# ---------------------------------------------------------
# 설정 변수
# ---------------------------------------------------------
MAX_SPEED = 90  # 1~100 사이의 값 (값이 클수록 빠름)
STOP_MIN = 1700 # 정지 시작 지점
STOP_MAX = 2300 # 정지 끝 지점
# ---------------------------------------------------------

# 1. 핀 설정 (IN1~IN4)
pins = [
    machine.Pin(0, machine.Pin.OUT), # IN1 (빨강)
    machine.Pin(1, machine.Pin.OUT), # IN2 (파랑)
    machine.Pin(2, machine.Pin.OUT), # IN3 (흰색)
    machine.Pin(3, machine.Pin.OUT)  # IN4 (노랑)
]

# 2. 포텐셜미터 설정 (GPIO 5)
pot = machine.ADC(machine.Pin(5))
pot.atten(machine.ADC.ATTN_11DB)

# 3. 1-2상 여자 방식 시퀀스 (Half-step)
step_sequence = [
    (1, 0, 0, 0), (1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 1, 0),
    (0, 1, 0, 0), (0, 1, 0, 1), (0, 0, 0, 1), (1, 0, 0, 1)
]

# 3. 1상 여자 방식 (One-phase ON) - 고속 주행에 가장 유리함
# step_sequence = [
#     (1, 0, 0, 0),
#     (0, 0, 1, 0),
#     (0, 1, 0, 0),
#     (0, 0, 0, 1)
# ]

# MAX_SPEED 기반 최소 딜레이 계산
min_delay = 0.051 - (MAX_SPEED / 100 * 0.05)
if min_delay < 0.001: min_delay = 0.001

def drive_step(step):
    for i in range(4):
        pins[i].value(step[i])

print("--- 스텝 모터 제어 시스템 (정지구간: {}~{}) ---".format(STOP_MIN, STOP_MAX))

while True:
    pot_val = pot.read()
    
    # 4. 방향 및 속도 결정 로직 (요청하신 1700~2300 구간 적용)
    if STOP_MIN <= pot_val <= STOP_MAX:
        # [정지 구간]
        drive_step((0, 0, 0, 0)) 
        print("상태: 정지(STOP) | Pot: {:4d}             ".format(pot_val), end='\r')
        time.sleep(0.1)
        continue

    elif pot_val < STOP_MIN:
        # [역회전 구간] 0에 가까울수록 빠름
        # 0일 때 min_delay, STOP_MIN일 때 0.05s
        delay = min_delay + (pot_val / STOP_MIN * (0.05 - min_delay))
        current_seq = reversed(step_sequence)
        state_msg = "역회전(REV)"

    else:
        # [정회전 구간] 4095에 가까울수록 빠름
        # STOP_MAX일 때 0.05s, 4095일 때 min_delay
        delay = 0.05 - ((pot_val - STOP_MAX) / (4095 - STOP_MAX) * (0.05 - min_delay))
        current_seq = step_sequence
        state_msg = "정회전(FWD)"

    # 모니터 출력 (현재 속도 % 계산)
    speed_pct = (0.05 - delay) / (0.05 - min_delay) * MAX_SPEED if delay < 0.05 else 0
    print("상태: {} | Pot: {:4d} | Speed: {:2.0f}/{} ".format(state_msg, pot_val, speed_pct, MAX_SPEED), end='\r')

    # 5. 스텝 구동
    for step in current_seq:
        drive_step(step)
        time.sleep(delay)

** 저소음을 기대하고 pwm 를 사용한 코드. 그다지 효과는 없습니다.

Python step_pwm.py

import machine
import time

# ---------------------------------------------------------
# 설정 변수
# ---------------------------------------------------------
MAX_SPEED = 80
STOP_MIN = 1700
STOP_MAX = 2300
PWM_FREQ = 20000  # PWM 주파수 (1kHz)
MAX_DUTY = 900   # 최대 듀티 사이클 (0~1023 중 800 설정, 발열 방지)
# ---------------------------------------------------------

# 1. PWM 핀 설정 (IN1, IN2, IN3, IN4)
pwm_pins = [
    machine.PWM(machine.Pin(0), freq=PWM_FREQ, duty=0), # IN1
    machine.PWM(machine.Pin(1), freq=PWM_FREQ, duty=0), # IN2
    machine.PWM(machine.Pin(2), freq=PWM_FREQ, duty=0), # IN3
    machine.PWM(machine.Pin(3), freq=PWM_FREQ, duty=0)  # IN4
]

# 2. 포텐셜미터 설정
pot = machine.ADC(machine.Pin(5))
pot.atten(machine.ADC.ATTN_11DB)

# 3. 1-2상 여자 시퀀스
step_sequence = [
    (1, 0, 0, 0), (1, 0, 1, 0), (0, 0, 1, 0), (0, 1, 1, 0),
    (0, 1, 0, 0), (0, 1, 0, 1), (0, 0, 0, 1), (1, 0, 0, 1)
]

def drive_step_pwm(step):
    for i in range(4):
        # 1인 핀에만 MAX_DUTY만큼 전압을 줌 (0이면 0)
        pwm_pins[i].duty(step[i] * MAX_DUTY)

# 속도 계산용 변수
min_delay = 0.051 - (MAX_SPEED / 100 * 0.05)
if min_delay < 0.001: min_delay = 0.001

print("--- PWM 모드 스텝 제어 시작 (소음 완화 테스트) ---")

while True:
    pot_val = pot.read()
    
    if STOP_MIN <= pot_val <= STOP_MAX:
        drive_step_pwm((0, 0, 0, 0))
        time.sleep(0.1)
        continue

    elif pot_val < STOP_MIN:
        delay = min_delay + (pot_val / STOP_MIN * (0.05 - min_delay))
        current_seq = reversed(step_sequence)
        state_msg = "REV"
    else:
        delay = 0.05 - ((pot_val - STOP_MAX) / (4095 - STOP_MAX) * (0.05 - min_delay))
        current_seq = step_sequence
        state_msg = "FWD"

    # 4. 저속 구간에서 PWM 듀티 조절 (선택 사항)
    # 속도가 느릴수록(delay가 클수록) 힘을 살짝 줄여서 소음을 감소시킴
    current_duty = int(MAX_DUTY * (1.2 - (delay * 10))) # 실험적인 수식
    if current_duty > MAX_DUTY: current_duty = MAX_DUTY
    if current_duty < 300: current_duty = 300 # 최소 토크 유지

    for step in current_seq:
        # 각 스텝 출력
        for i in range(4):
            pwm_pins[i].duty(step[i] * current_duty)
        time.sleep(delay)

코멘트

“폐프린터 버리지 마세요! 스텝모터 재활용하기 (L298N)” 에 하나의 답글

  1. micro2iot 아바타

    [구매정보] 블로그에서 사용한 부품 구매정보입니다.
    아래 링크를 통해 구매 시 소정의 수수료를 제공받으며, 채널 운영에 큰 도움이 됩니다.

micro2iot에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다