폐 프린터에서 추출한 모터는 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)



답글 남기기