아두이노 스테퍼 모터 및 리미트 스위치

이 Arduino 튜토리얼에서, 우리는 Arduino, 리미트 스위치, L298N 드라이버 및 스테퍼 모터의 사용 방법을 배우려고 합니다. 자세히 말하면, 우리는 다음을 배울 것입니다:

준비물

1×아두이노 우노 R3 쿠팡 | 아마존
1×USB 2.0 타입 A-to-B 케이블 (USB-A PC용) 쿠팡 | 아마존
1×USB 2.0 타입 C-to-B 케이블 (USB-C PC용) 아마존
1×리미트 스위치 Limit Switch (KW12-3) 쿠팡 | 아마존
1×리미트 스위치 Limit Switch (V-153-1C25) 아마존
1×리미트 스위치 Limit Switch (V-155-1C25) 아마존
1×리미트 스위치 Limit Switch (V-156-1C25) 쿠팡 | 아마존
1×Stepper Motor Nema 17 아마존
1×L298N 모터 드라이버 모듈 쿠팡 | 아마존
1×12V 전원 어댑터 아마존
1×DC 커넥터 전원 연결 잭 플러그 소켓 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

스테퍼 모터와 리미트 스위치에 관하여

스테퍼 모터와 리미트 스위치(핀아웃, 작동 방식, 프로그래밍 방법 등)에 대해 잘 모른다면, 다음 튜토리얼에서 배우십시오:

선연결

이 튜토리얼은 두 가지 경우를 위한 아두이노 코드를 제공합니다: 하나의 스테퍼 모터 + 하나의 리미트 스위치, 하나의 스테퍼 모터 + 두 개의 리미트 스위치.

스테퍼 모터와 리미트 스위치 간의 배선도

아두이노 스테퍼 모터 and limit switch 연결 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

스테퍼 모터와 두 개의 리미트 스위치 사이의 배선도

아두이노 스테퍼 모터 and two limit switches 연결 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

※ 주의:

스텝 모터에 따라 스텝 모터와 L298N 사이의 배선 연결이 다를 수 있습니다. 스텝 모터를 L298N 모터 드라이버에 어떻게 연결하는지 알아보려면 이 아두이노 - L298N 드라이버를 이용한 스테퍼 모터 제어 튜토리얼을 자세히 살펴보시기 바랍니다.

아두이노 코드 - 리미트 스위치로 스테퍼 모터 멈추기

스텝 모터를 정지시키는 몇 가지 방법이 있습니다:

  • stepper.stop() 함수를 호출하십시오: 이 방법은 스테퍼 모터를 즉각적으로 멈추지 않고 점차적으로 멈춥니다
  • stepper.run() 함수를 호출하지 마십시오: 이 방법은 스테퍼 모터를 즉각 멈춥니다

아래 코드는 스테퍼 모터가 무한히 회전하게 하고 리미트 스위치에 닿는 즉시 정지하게 합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // 최대로 설정할 수 있는 위치 (long 타입) ezButton limitSwitch(A0); // A0 핀에 연결된 ezButton 객체 생성; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); bool isStopped = false; void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 stepper.setMaxSpeed(500.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(100); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(MAX_POSITION); } void loop() { limitSwitch.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); isStopped = true; } if (isStopped == false) { // 이 부분이 없으면, 최대 위치에 도달한 후 움직임이 멈춤 if (stepper.distanceToGo() == 0) { // 모터가 최대 위치로 이동했으면 stepper.setCurrentPosition(0); // 위치를 0으로 재설정 stepper.moveTo(MAX_POSITION); // 모터를 다시 최대 위치로 이동 } stepper.run(); // 반드시 loop() 함수 안에서 호출되어야 함 } else { // stepper.run() 함수를 호출하지 않으면, 모터가 즉시 멈춤 // 참고: stepper.stop() 함수는 모터를 즉시 멈추지 않음 Serial.println(F("The stepper motor is STOPPED")); } }

사용 방법

  • 아두이노를 USB 케이블을 통해 PC에 연결하세요.
  • 아두이노 IDE를 열고, 올바른 보드와 포트를 선택하세요.
  • 아두이노 IDE의 왼쪽 바에 있는 Libraries 아이콘으로 이동하세요.
  • “ezButton”을 검색하고, ArduinoGetStarted.com에서 만든 버튼 라이브러리를 찾으세요.
  • EzButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
아두이노 버튼 라이브러리

“AccelStepper”을 검색한 다음, Mike McCauley가 만든 AccelStepper 라이브러리를 찾으세요.

AccelStepper 라이브러리를 설치하려면 Install 버튼을 클릭하세요.

아두이노 accelstepper 라이브러리
  • 위의 코드를 복사하고 Arduino IDE로 엽니다
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드합니다
  • 배선이 올바른 경우, 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
  • 리미트 스위치를 만지십시오
  • 모터가 즉시 멈추는 것을 볼 수 있습니다
  • 시리얼 모니터의 결과는 아래와 같습니다
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED
Ln 11, Col 1
Arduino Uno on COM15
2

코드 설명

위의 아두이노 코드의 주석 라인에서 설명을 찾을 수 있습니다.

아두이노 코드 - 리미트 스위치로 스테퍼 모터의 방향 변경

아래 코드는 스텝 모터가 무한히 회전하게 만들고, 리미트 스위치가 닿았을 때 방향을 변경합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define MAX_POSITION 0x7FFFFFFF // 최대 설정 가능 위치 (long 타입) ezButton limitSwitch(A0); // A0 핀에 연결된 ezButton 객체 생성; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 stepper.setMaxSpeed(500.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(100); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 targetPos = direction * MAX_POSITION; stepper.moveTo(targetPos); } void loop() { limitSwitch.loop(); // loop() 함수는 반드시 호출되어야 함 if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); direction *= -1; // 방향 변경 Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(targetPos); } // 이 부분 없이는 최대 위치에 도달한 후 움직임이 멈춤 if (stepper.distanceToGo() == 0) { // 모터가 최대 위치까지 움직였으면 stepper.setCurrentPosition(0); // 위치를 0으로 재설정 stepper.moveTo(targetPos); // 모터를 다시 최대 위치까지 움직임 } stepper.run(); // loop() 함수 안에서 반드시 호출되어야 함 }

사용 방법

  • 위의 코드를 복사하고 아두이노 IDE로 열기
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드합니다.
  • 배선이 올바르면 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
  • 리미트 스위치를 누름
  • 스테퍼 모터의 방향이 반시계 방향으로 바뀐 것을 볼 수 있습니다.
  • 리미트 스위치를 다시 누름
  • 스테퍼 모터의 방향이 시계 방향으로 바뀐 것을 볼 수 있습니다.
  • 시리얼 모니터의 결과는 아래와 같습니다.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch: TOUCHED The direction -> CLOCKWISE
Ln 11, Col 1
Arduino Uno on COM15
2

아두이노 코드 - 두 개의 리미트 스위치로 스테퍼 모터의 방향 변경

아래 코드는 스테퍼 모터가 무한히 회전하게 하며, 두 개의 한계 스위치 중 하나가 접촉되면 그 방향을 바꾸게 합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define STATE_CHANGE_DIR 1 #define STATE_MOVE 2 #define STATE_MOVING 3 #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limitSwitch_1(A0); // 핀 A0에 연결된 ezButton 객체를 생성합니다; ezButton limitSwitch_2(A1); // 핀 A1에 연결된 ezButton 객체를 생성합니다; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int stepperState = STATE_MOVE; int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch_1.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 limitSwitch_2.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 stepper.setMaxSpeed(500.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(100); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 } void loop() { limitSwitch_1.loop(); // loop() 함수를 먼저 호출해야 함 limitSwitch_2.loop(); // loop() 함수를 먼저 호출해야 함 if (limitSwitch_1.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limitSwitch_2.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepperState) { case STATE_CHANGE_DIR: direction *= -1; // 방향 변경 Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); stepperState = STATE_MOVE; // 방향을 변경한 후, 모터를 이동시키기 위해 다음 상태로 전환 break; case STATE_MOVE: targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(targetPos); stepperState = STATE_MOVING; // 이동한 후, 모터를 무한히 계속 움직이기 위해 다음 상태로 전환 break; case STATE_MOVING: // 이 상태가 없으면, 최대 위치에 도달한 후 이동이 멈춤 if (stepper.distanceToGo() == 0) { // 모터가 최대 위치로 이동했으면 stepper.setCurrentPosition(0); // 위치를 0으로 다시 설정 stepper.moveTo(targetPos); // 모터를 다시 최대 위치로 이동 } break; } stepper.run(); // loop() 함수에서 반드시 호출해야 함 }

사용 방법

  • 위의 코드를 복사하고 Arduino IDE를 열어주세요
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드하세요
  • 배선이 올바르면 모터가 시계 방향으로 회전하는 것을 볼 수 있습니다.
  • 리미트 스위치 1을 터치하세요
  • 스테퍼 모터의 방향이 반시계 방향으로 변경된 것을 볼 수 있습니다
  • 리미트 스위치 2를 터치하세요
  • 스테퍼 모터의 방향이 시계 방향으로 변경된 것을 볼 수 있습니다
  • 시리얼 모니터의 결과는 아래와 같습니다
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The limit switch 1: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch 2: TOUCHED The direction -> CLOCKWISE
Ln 11, Col 1
Arduino Uno on COM15
2

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.