라즈베리 파이 스테퍼 모터 리미트 스위치
이 튜토리얼은 Raspberry Pi를 사용하여 제한 스위치와 L298N 드라이버를 통해 스테퍼 모터를 제어하는 방법을 안내합니다. 구체적으로, 우리는 다음을 다룹니다:
리미트 스위치에 접촉했을 때 스테퍼 모터를 정지시키도록 라즈베리 파이를 프로그래밍하는 방법.
리미트 스위치에 접촉했을 때 스테퍼 모터의 방향을 바꾸도록 라즈베리 파이를 프로그래밍하는 방법.
반대 위치에 설치된 두 개의 리미트 스위치로 스테퍼 모터의 방향을 바꾸도록 라즈베리 파이를 프로그래밍하는 방법.
1 | × | Raspberry Pi 4 Model B | Amazon | |
1 | × | Limit Switch (KW12-3) | 쿠팡 | Amazon | |
1 | × | Limit Switch (V-156-1C25) | 쿠팡 | Amazon | |
1 | × | Stepper Motor Nema 17 | Amazon | |
1 | × | L298N Motor Driver Module | 쿠팡 | Amazon | |
1 | × | 12V Power Adapter | Amazon | |
1 | × | DC Power Jack | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (추천) Screw Terminal Block Shield for Raspberry Pi | 쿠팡 | Amazon | |
1 | × | (추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B | Amazon | |
1 | × | (추천) Plastic Case and Cooling Fan for Raspberry Pi 4B | Amazon | |
1 | × | (추천) HDMI Touch Screen Monitor for Raspberry Pi | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
스테퍼 모터 및 리미트 스위치(핀 배치, 기능, 프로그래밍 등)에 익숙하지 않다면, 다음 튜토리얼이 도움이 될 수 있습니다:
이 튜토리얼은 두 가지 경우에 대한 배선 다이어그램을 제공합니다: 하나의 스테퍼 모터 + 하나의 리미트 스위치, 하나의 스테퍼 모터 + 두 개의 리미트 스위치.
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:
※ NOTE THAT:
스테퍼 모터와 L298N 간의 배선 연결은 스테퍼 모터의 종류에 따라 달라질 수 있습니다. 스테퍼 모터를 L298N 모터 드라이버에 올바르게 연결하는 방법을 배우기 위해 Raspberry Pi - Stepper Motor 튜토리얼을 주의 깊게 살펴보세요.
스테퍼 모터는 다음 코드를 사용하여 계속 회전하도록 프로그래밍되어 있으며, 리미트 스위치에 닿으면 즉시 멈추고 리미트 스위치가 해제되면 다시 움직입니다.
Raspberry Pi에 Raspbian 또는 다른 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하세요.
Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
일부 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되지 않은 경우 다음 명령어를 사용하여 설치하세요:
sudo apt-get update
sudo apt-get install python3-rpi.gpio
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 변수의 값을 변경하여 스테퍼 모터의 속도를 변경할 수 있습니다.
소스 코드 주석에 포함된 줄별 설명을 확인하세요!
스테퍼 모터는 계속해서 작동되며, 리미트 스위치가 작동될 때 방향이 변경됩니다.
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
배선이 올바르면 모터는 시계 방향으로 회전해야 합니다.
리미트 스위치를 터치하면 스테퍼 모터의 방향이 반시계 방향으로 바뀝니다.
리미트 스위치를 다시 터치하면 스테퍼 모터의 방향이 시계 방향으로 돌아갑니다.
스테퍼 모터가 계속 회전하고 두 개의 제한 스위치 중 하나가 눌렸을 때 모터의 방향을 전환하는 코드를 살펴봅시다.
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를 건드리면 스테퍼 모터는 다시 시계 방향으로 회전하게 됩니다.