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

이 튜토리얼은 아두이노 나노를 사용하여 리미트 스위치 및 L298N 드라이버를 통해 스테퍼 모터를 제어하는 방법을 지시합니다. 구체적으로, 다음을 다룰 것입니다:

준비물

1×아두이노 나노 쿠팡 | 아마존
1×USB A to Mini-B USB 케이블 쿠팡 | 아마존
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×(추천) 아두이노 나노용 브레이크아웃 확장 보드 쿠팡 | 아마존
1×(추천) 아두이노 나노용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

스테퍼 모터와 리미트 스위치에 대해

스테퍼 모터 및 리미트 스위치(핀 배치, 기능 및 프로그래밍 포함)에 익숙하지 않다면, 다음 튜토리얼이 학습에 도움이 될 수 있습니다:

선연결

이 튜토리얼은 두 가지 경우에 대한 배선도를 제공합니다: 하나의 스테퍼 모터 + 하나의 리미트 스위치, 하나의 스테퍼 모터 + 두 개의 리미트 스위치.

ESP8266, 스테퍼 모터 및 리미트 스위치 간의 배선도.

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

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

ESP8266, 스테퍼 모터 및 두 개의 리미트 스위치 간의 배선도.

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

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

Arduino Nano와 기타 부품에 전원을 공급하는 가장 효과적인 방법은 다음 링크를 참조하세요: 아두이노 나노 전원 공급 방법.

※ 주의:

스테퍼 모터와 L298N 사이의 배선 연결은 스테퍼 모터의 유형에 따라 다를 수 있습니다. 성공적인 연결을 보장하기 위해, 스테퍼 모터를 L298N 모터 드라이버에 연결하는 방법에 대한 지침은 아두이노 나노 - 스텝 모터 튜토리얼을 참조하십시오.

아두이노 나노 코드 - 리미트 스위치로 스테퍼 모터 정지

스테퍼 모터를 여러 가지 방법으로 정지시킬 수 있습니다:

  • stepper.stop() 함수를 호출하세요: 이것은 모터를 즉시 정지시키지 않고, 점차적으로 감속하게 할 것입니다.
  • stepper.run() 함수를 호출하지 마세요: 이것은 스테퍼 모터가 즉시 정지하게 할 것입니다.

아래 코드는 리미트 스위치가 접촉될 때까지 스테퍼 모터를 계속 회전시킵니다.

/* * 이 아두이노 나노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-stepper-motor-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // 최대 위치 설정 가능(long type) ezButton limit_switch(5); // D5 핀을 위한 ezButton 객체 생성 AccelStepper stepper(AccelStepper::FULL4WIRE, A3, A2, A1, A0); bool is_stopped = false; void setup() { Serial.begin(9600); limit_switch.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정 stepper.setMaxSpeed(500.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(100); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(MAX_POSITION); } void loop() { limit_switch.loop(); // loop() 함수를 먼저 호출해야 함 if (limit_switch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); is_stopped = true; } if (is_stopped == 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")); } }

사용 방법

  • Arduino Nano를 USB 케이블을 사용하여 컴퓨터에 연결하세요.
  • Arduino IDE를 열고, 올바른 보드와 포트를 선택하세요.
  • Arduino IDE의 왼쪽 바에 있는 Libraries 아이콘을 클릭하세요.
  • “ezButton”을 검색하고 ArduinoGetStarted.com에서 버튼 라이브러리를 찾으세요.
  • Install 버튼을 눌러 ezButton 라이브러리를 설치하세요.
아두이노 나노 버튼 라이브러리
  • "AccelStepper"을 검색하고 Mike McCauley가 만든 AccelStepper 라이브러리를 찾으세요.
  • 그런 다음, Install 버튼을 눌러 추가하세요.
아두이노 나노 accelstepper 라이브러리
  • 위의 코드를 복사하고 Arduino IDE에서 열어주세요.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 Arduino Nano에 업로드하세요.
  • 배선이 정확하면 모터가 시계 방향으로 회전해야 합니다.
  • 리미트 스위치를 누르면 모터는 즉시 멈춰야 합니다.
  • 시리얼 모니터에 표시된 결과는 다음과 같아야 합니다.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

코드 설명

소스 코드의 주석에 포함된 줄별 설명을 확인하세요!

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

스테퍼 모터는 연속적으로 회전하도록 만들어지며, 리미트 스위치에 닿으면 그 방향이 변경됩니다. 이는 다음 코드로 이루어집니다:

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

사용 방법

  • 아두이노 IDE로 코드를 복사하여 열어보세요.
  • IDE에서 Upload 버튼을 클릭하여 아두이노 나노에 코드를 업로드하세요.
  • 배선이 올바르면 모터가 시계 방향으로 회전할 것입니다.
  • 리미트 스위치를 누르면 스테퍼 모터의 방향이 반시계 방향으로 바뀝니다.
  • 리미트 스위치를 다시 누르면 스테퍼 모터가 시계 방향으로 회전합니다.
  • 시리얼 모니터의 결과는 이렇게 보일 것입니다.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

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

스테퍼 모터를 연속적으로 회전시키고, 두 개의 리미트 스위치 중 하나가 닿으면 방향을 전환하세요.

/* * 이 아두이노 나노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-stepper-motor-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 // 최대 위치 설정 가능(long 타입) ezButton limit_switch_1(5); // D5핀을 위한 ezButton 객체 생성 ezButton limit_switch_2(12); // D12핀을 위한 ezButton 객체 생성 AccelStepper stepper(AccelStepper::FULL4WIRE, A3, A2, A1, A0); int stepper_state = STATE_MOVE; int direction = DIRECTION_CW; long target_pos = 0; void setup() { Serial.begin(9600); limit_switch_1.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 limit_switch_2.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 stepper.setMaxSpeed(500.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(100); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 } void loop() { limit_switch_1.loop(); // loop() 함수를 먼저 호출해야 함 limit_switch_2.loop(); // loop() 함수를 먼저 호출해야 함 if (limit_switch_1.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limit_switch_2.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepper_state) { 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")); stepper_state = STATE_MOVE; // 방향 변경 후, 모터를 이동시키기 위해 다음 상태로 이동 break; case STATE_MOVE: target_pos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(target_pos); stepper_state = STATE_MOVING; // 이동 후에, 모터를 무한히 움직이기 위해 다음 상태로 이동 break; case STATE_MOVING: // 이 상태가 없으면, 최대 위치에 도달한 후에 이동이 멈춤 if (stepper.distanceToGo() == 0) { // 모터가 최대 위치까지 이동했다면 stepper.setCurrentPosition(0); // 위치를 0으로 재설정 stepper.moveTo(target_pos); // 다시 최대 위치까지 모터를 이동 } break; } stepper.run(); // loop() 함수 안에서 반드시 호출해야 함 }

사용 방법

  • 위의 코드를 복사해서 아두이노 IDE에서 열어보세요.
  • Upload 버튼을 클릭하여 코드를 아두이노 나노로 보내세요.
  • 배선이 올바르게 연결되어 있다면, 모터는 시계 방향으로 회전해야 합니다.
  • 리미트 스위치 1을 누르면, 스테퍼 모터의 방향이 반시계 방향으로 바뀌어야 합니다.
  • 리미트 스위치 2를 누르면, 스테퍼 모터의 방향이 다시 시계 방향으로 바뀌어야 합니다.
  • 시리얼 모니터에 나타나는 결과는 이렇게 보여야 합니다.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

동영상

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