라즈베리 파이 스테퍼 모터 리미트 스위치
이 튜토리얼은 Raspberry Pi를 사용하여 제한 스위치와 L298N 드라이버를 통해 스테퍼 모터를 제어하는 방법을 안내합니다. 구체적으로, 우리는 다음을 다룹니다:
리미트 스위치에 접촉했을 때 스테퍼 모터를 정지시키도록 라즈베리 파이를 프로그래밍하는 방법.
리미트 스위치에 접촉했을 때 스테퍼 모터의 방향을 바꾸도록 라즈베리 파이를 프로그래밍하는 방법.
반대 위치에 설치된 두 개의 리미트 스위치로 스테퍼 모터의 방향을 바꾸도록 라즈베리 파이를 프로그래밍하는 방법.
1 | × | 라즈베리 파이 5 | 아마존 | |
1 | × | 리미트 스위치 Limit Switch (KW12-3) | 쿠팡 | 아마존 | |
1 | × | 리미트 스위치 Limit Switch (V-156-1C25) | 쿠팡 | 아마존 | |
1 | × | Stepper Motor Nema 17 | 아마존 | |
1 | × | L298N 모터 드라이버 모듈 | 쿠팡 | 아마존 | |
1 | × | 12V 전원 어댑터 | 아마존 | |
1 | × | DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
1 | × | (추천) 라즈베리 파이용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
1 | × | (추천) 라즈베리 파이 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 | |
1 | × | (추천) 라즈베리 파이용 HDMI 터치 스크린 모니터 | 아마존 | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
스테퍼 모터 및 리미트 스위치(핀 배치, 기능, 프로그래밍 등)에 익숙하지 않다면, 다음 튜토리얼이 도움이 될 수 있습니다:
이 튜토리얼은 두 가지 경우에 대한 배선 다이어그램을 제공합니다: 하나의 스테퍼 모터 + 하나의 리미트 스위치, 하나의 스테퍼 모터 + 두 개의 리미트 스위치.
![라즈베리 파이 스테퍼 모터 및 리미트 스위치 배선도](https://newbiely.kr/images/tutorial/raspberry-pi-stepper-motor-limit-switch-wiring-diagram.jpg)
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
![라즈베리 파이 스테퍼 모터 및 두 개의 리미트 스위치 배선도](https://newbiely.kr/images/tutorial/raspberry-pi-stepper-motor-two-limit-switch-wiring-diagram.jpg)
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:
※ 주의:
스테퍼 모터와 L298N 간의 배선 연결은 스테퍼 모터의 종류에 따라 달라질 수 있습니다. 스테퍼 모터를 L298N 모터 드라이버에 올바르게 연결하는 방법을 배우기 위해 라즈베리 파이 - 스테퍼 모터 튜토리얼을 주의 깊게 살펴보세요.
스테퍼 모터는 다음 코드를 사용하여 계속 회전하도록 프로그래밍되어 있으며, 리미트 스위치에 닿으면 즉시 멈추고 리미트 스위치가 해제되면 다시 움직입니다.
Raspberry Pi에 Raspbian 또는 다른 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하세요.
Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
일부 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되지 않은 경우 다음 명령어를 사용하여 설치하세요:
sudo apt-get update
sudo apt-get install python3-rpi.gpio
/*
* 이 라즈베리 파이 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch
*/
import RPi.GPIO as GPIO
import time
IN1 = 12
IN2 = 16
IN3 = 20
IN4 = 21
LIMIT_SWITCH_PIN = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(LIMIT_SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
DEG_PER_STEP = 1.8
STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP)
def step_forward(delay):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
def is_limit_switch_pressed():
return GPIO.input(LIMIT_SWITCH_PIN) == GPIO.LOW
try:
delay = 0.001
while not is_limit_switch_pressed():
step_forward(delay)
except KeyboardInterrupt:
print("\nExiting the script.")
finally:
GPIO.cleanup()
python3 stepper_limit_switch.py
배선이 올바르면 모터는 시계 방향으로 회전해야 합니다.
리미트 스위치가 접촉되면 모터는 즉시 멈춰야 합니다.
그런 다음 리미트 스위치가 해제되면 모터가 다시 회전합니다.
스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다.
코드에서 delay 변수의 값을 변경하여 스테퍼 모터의 속도를 변경할 수 있습니다.
소스 코드 주석에 포함된 줄별 설명을 확인하세요!
스테퍼 모터는 계속해서 작동되며, 리미트 스위치가 작동될 때 방향이 변경됩니다.
/*
* 이 라즈베리 파이 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch
*/
import RPi.GPIO as GPIO
import time
IN1 = 12
IN2 = 16
IN3 = 20
IN4 = 21
LIMIT_SWITCH_PIN = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(LIMIT_SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
DEG_PER_STEP = 1.8
STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP)
prev_limit_switch_state = GPIO.HIGH
def step_forward(delay):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
def step_backward(delay):
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.HIGH)
time.sleep(delay)
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
time.sleep(delay)
try:
delay = 0.001
direction = 'forward'
while True:
limit_switch_state = GPIO.input(LIMIT_SWITCH_PIN)
if limit_switch_state == GPIO.LOW and prev_limit_switch_state == GPIO.HIGH:
direction = 'backward' if direction == 'forward' else 'forward'
if direction == 'forward':
step_forward(delay)
elif direction == 'backward':
step_backward(delay)
prev_limit_switch_state = limit_switch_state
except KeyboardInterrupt:
print("\nExiting the script.")
finally:
GPIO.cleanup()
python3 stepper_direction.py
배선이 올바르면 모터는 시계 방향으로 회전해야 합니다.
리미트 스위치를 터치하면 스테퍼 모터의 방향이 반시계 방향으로 바뀝니다.
리미트 스위치를 다시 터치하면 스테퍼 모터의 방향이 시계 방향으로 돌아갑니다.
스테퍼 모터가 계속 회전하고 두 개의 제한 스위치 중 하나가 눌렸을 때 모터의 방향을 전환하는 코드를 살펴봅시다.
/*
* 이 라즈베리 파이 코드는 newbiely.kr 에서 개발되었습니다
* 이 라즈베리 파이 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch
*/
import RPi.GPIO as GPIO
import time
IN1 = 12
IN2 = 16
IN3 = 20
IN4 = 21
LIMIT_SWITCH1_PIN = 27
LIMIT_SWITCH2_PIN = 19
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(LIMIT_SWITCH1_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LIMIT_SWITCH2_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
DEG_PER_STEP = 1.8
STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP)
prev_limit_switch_1 = GPIO.HIGH
prev_limit_switch_2 = GPIO.HIGH
def step_forward(delay):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
time.sleep(delay)
def step_backward(delay):
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.HIGH)
time.sleep(delay)
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
time.sleep(delay)
try:
delay = 0.001
direction = 'forward'
while True:
limit_switch_1 = GPIO.input(LIMIT_SWITCH1_PIN)
if limit_switch_1 == GPIO.LOW and prev_limit_switch_1 == GPIO.HIGH:
direction = 'backward'
limit_switch_2 = GPIO.input(LIMIT_SWITCH2_PIN)
if limit_switch_2 == GPIO.LOW and prev_limit_switch_2 == GPIO.HIGH:
direction = 'forward'
if direction == 'forward':
step_forward(delay)
elif direction == 'backward':
step_backward(delay)
prev_limit_switch_1 = limit_switch_1
prev_limit_switch_2 = limit_switch_2
except KeyboardInterrupt:
print("\nExiting the script.")
finally:
GPIO.cleanup()
python3 stepper_two_limit_switches.py
이 스크립트는 터미널에서 Ctrl + C를 누를 때까지 계속해서 무한 루프로 실행됩니다.
배선이 올바르면 모터는 시계 방향으로 회전해야 합니다.
리미트 스위치 1을 건드리면 스테퍼 모터의 방향이 반시계 방향으로 반전됩니다.
리미트 스위치 2를 건드리면 스테퍼 모터는 다시 시계 방향으로 회전하게 됩니다.