아두이노 나노 ESP32 - 스테퍼 모터 | Arduino Nano ESP32 - Stepper Motor

이 튜토리얼에서는 Arduino Nano ESP32를 사용하여 스테퍼 모터를 제어하는 방법을 배우게 됩니다:

이 튜토리얼은 어떤 종류의 4선식 바이폴라 스테퍼 모터에도 적용될 수 있습니다. 이 튜토리얼에서는 예시로 NEMA 17 스테퍼 모터를 사용할 것입니다.

Arduino Nano ESP32 Stepper motor

준비물

1×Arduino Nano ESP32 Amazon
1×USB Cable Type-C 쿠팡 | 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×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

스테퍼 모터에 관하여

스테퍼 모터에는 두 가지 일반적인 유형이 있습니다:

  • **양극성**: 이 모터들은 4개의 전선이 있습니다.
  • **단극성**: 단극성 모터는 5개 또는 6개의 전선을 가질 수 있습니다. 6개 전선의 단극성 스테퍼 모터의 경우, 6개 중 4개의 전선을 사용하여 양극성 스테퍼 모터처럼 제어할 수 있습니다.

5-와이어 유니폴라 스테퍼 모터에 특별히 관심이 있다면, [Arduino Nano ESP32 - ULN2003 드라이버를 사용한 28BYJ-48 스테퍼 모터 제어]라는 제목의 튜토리얼을 참조하세요(BASE_URL/tutorials/arduino-nano-esp32/arduino-nano-esp32-28byj-48-stepper-motor-uln2003-driver).

그러나 이 튜토리얼은 양극성 스테퍼 모터에만 전적으로 전념합니다.

양극성 스테퍼 모터 핀배열

양극성 스테퍼 모터는 네 개의 핀을 가지고 있으며, 이 핀들은 제조사에 따라 다르게 명명될 수 있습니다. 아래에서는 몇 가지 일반적인 핀 이름이 있는 표를 찾을 수 있습니다:

PIN NO Naming 1 Naming 2 Naming 3
1 A+ A A
2 A- A C
3 B+ B B
4 B- B D
Bipolar Stepper Motor pinout

핀의 배치, 전선의 이름, 전선의 색상은 제조업체마다 다를 수 있습니다. 전선 색상이 핀 이름에 어떻게 해당하는지 이해하려면 제조업체가 제공하는 데이터시트 또는 사용자 매뉴얼을 참조하는 것이 필수적입니다. 위의 이미지는 각기 독특한 전선 명명 및 전선 색상 규칙을 특징으로 하는 두 개의 다른 모터의 사양을 보여줍니다.

혁명 당 단계

모터의 사양은 스텝당 각도(DEG_PER_STEP이라고 합시다)를 명시합니다. 제어 방식에 따라, 회전 당 스텝 수(STEP_PER_REVOLUTION이라고 합시다)는 다음 표와 같이 계산됩니다:

Control method Steps per Revolution Real degree per step
Full-step STEP_PER_REVOLUTION = 360 / DEG_PER_STEP DEG_PER_STEP
Half-step STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * 2 DEG_PER_STEP / 2
Micro-step (1/n) STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * n DEG_PER_STEP / n

예를 들어, 모터의 데이터시트에 1.8도/스텝이라고 명시되어 있다면:

Control method Steps per Revolution Real degree per step
Full-step 200 steps/revolution 1.8°
Half-step 400 steps/revolution 0.9°
Micro-step (1/n) (200 * n) steps/revolution (1.8 / n)°

아두이노 나노 ESP32를 사용하여 스테퍼 모터를 제어하는 방법

아두이노 나노 ESP32는 스테퍼 모터를 제어하는 신호를 생성할 수 있지만, 이러한 신호는 스테퍼 모터가 요구하는 필요한 전압과 전류 수준에 미치지 못할 수 있습니다. 따라서 아두이노 나노 ESP32와 스테퍼 모터 사이의 격차를 메우기 위해 중간 하드웨어 드라이버가 필요합니다. 이 드라이버는 두 가지 주요 기능을 제공합니다:

  • 제어 신호 증폭: ESP32에서 오는 제어 신호의 전류와 전압을 증폭시켜 스테퍼 모터의 요구 사항을 충족시킵니다.
  • ESP32 보호: 동시에, 높은 전류와 전압 수준이 스테퍼 모터를 구동하는 데 사용되는 것으로부터 Arduino Nano ESP32를 보호하여 잠재적인 손상을 방지합니다.

여러 하드웨어 드라이버가 스테퍼 모터 제어에 사용될 수 있으며, 일반적으로 사용되는 옵션 중 하나는 L298N 드라이버입니다.

L298N 드라이버 정보

단일 L298N 드라이버를 사용하여 두 개의 DC 모터 또는 스테퍼 모터를 제어할 수 있습니다. 이 튜토리얼에서는 스테퍼 모터 제어 방법을 배웁니다.

L298N 드라이버 핀배열

L298N Driver Pinout

L298N 드라이버는 11개의 핀과 3개의 점퍼를 가지고 있습니다.

  • VCC 핀: 모터에 전력을 공급합니다. 5V에서 35V 사이일 수 있습니다.
  • GND 핀: 공통 접지 핀으로, GND(0V)에 연결해야 합니다.
  • 5V 핀: L298N 모듈에 전력을 공급합니다. Arduino Nano ESP32에서 5V로 공급될 수 있습니다.
  • IN1, IN2, IN3, IN4 핀들: 스테퍼 모터를 제어하기 위한 제어 신호를 받기 위해 ESP32의 핀에 연결됩니다.
  • OUT1, OUT2, OUT3, OUT4 핀들: 스테퍼 모터에 연결됩니다.
  • ENA, ENB 점퍼들: 스테퍼 모터를 활성화하기 위해 사용됩니다. ENA 및 ENB 점퍼를 모두 제자리에 두어야 합니다.
  • 5V-EN 점퍼: 5V-EN 점퍼를 제자리에 두면, L298N 모듈의 전력이 VCC에서 가져오며, 5V 핀에 아무것도 연결할 필요가 없습니다. 만약 5V-EN 점퍼를 제거한다면, 5V 핀을 통해 L298N 모듈에 전력을 공급해야 합니다.

위에서 설명한 바와 같이, L298N 드라이버에는 두 가지 입력 전력이 있습니다:

  • 스테퍼 모터용(VCCGND 핀): 5V에서 35V까지.
  • L298N 모듈의 내부 작동용(5V 및 GND 핀): 5V에서 7V까지. 5V-EN 점퍼를 그대로 유지하면 이 핀을 다른 것에 연결할 필요가 없습니다.

선연결

Arduino Nano ESP32 Stepper Motor L298N Driver Wiring Diagram

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

※ NOTE THAT:

  • 모터의 전원 공급이 12V 이하인 경우, L298N 모듈에 있는 세 개의 점퍼를 제자리에 두어 주세요.
  • 스테퍼 모터의 핀 순서는 제조사에 따라 다를 수 있습니다. 아래 표를 확인하여 올바른 배선을 확인해 주세요.

아두이노 나노 ESP32와 L298N 드라이버 사이의 연결 테이블

Arduino Nano ESP32 pins L298N pins
D5 IN1
D4 IN2
D3 IN3
D2 IN4

L298N 드라이버와 스텝 모터 간의 배선 표

중요! 위의 배선 다이어그램 이미지에서 스테퍼 모터의 전선 순서에 신경 쓰지 마십시오. 그것은 단지 예시일 뿐입니다. 스테퍼 모터의 핀 순서는 제조사마다 다를 수 있습니다. 아래 표에 따라 배선이 이루어졌는지 확인하십시오.

L298N pins Stepper motor pins Or Or
OUT1 A+ A A
OUT2 A- A C
OUT3 B+ B B
OUT4 B- B D

스테퍼 모터를 구입하기 전에 스테퍼 모터의 데이터시트, 사양 또는 매뉴얼을 확인하는 것이 좋습니다. 핀의 색상과 이름 간의 매핑을 제공하는지 확인하세요. 예를 들어, 이 스테퍼 모터는 아래 이미지와 같이 매핑을 제공합니다:

Stepper Motor coil color mapping

해당 매핑을 기반으로, 배선 테이블은 다음과 같습니다:

L298N pins stepper motor pins wire color
OUT1 A black wire
OUT2 C green wire
OUT3 B red wire
OUT4 D blue wire

※ NOTE THAT:

위의 스테퍼 모터와 L298N 드라이버 간의 연결 테이블에서, OUT1과 OUT2, OUT3과 OUT4를 서로 바꿀 수 있습니다. 따라서, 더 많은 연결 방법이 있습니다. 그러나, 바꾸게 되면 모터의 회전 방향이 바뀔 수 있습니다(시계 방향에서 반시계 방향으로, 그 반대의 경우도 마찬가지입니다).

L298N 드라이버를 사용하여 스테퍼 모터를 제어하는 방법

스텝 모터를 제어하는 것은 간단한 작업이 아니며, 특히 non-blocking 방식으로 제어하고 싶을 때는 더욱 그렇습니다. 다행히도 AccelStepper 라이브러리 덕분에 스텝 모터를 제어하는 것이 식은 죽 먹기가 됩니다.

Arduino IDE에는 또한 내장된 스텝 모터 라이브러리가 있습니다. 그러나, 다음의 이유로 이 라이브러리 사용을 권장하지 않습니다:

  • 이 라이브러리는 blocking 기능을 제공합니다. 이는 스테퍼 모터를 제어하는 동안 Arduino Nano ESP32가 다른 작업을 수행하지 못하게 한다는 의미입니다.
  • 충분한 기능이 없습니다.

대신 AccelStepper 라이브러리를 사용하는 것이 좋습니다. 이 라이브러리는 다음을 지원합니다:

  • 가속
  • 감속
  • 전단계 및 반단계 구동
  • 독립적으로 동시에 구동되는 여러 동시 스테퍼
  • 단점: 마이크로 스텝 구동을 지원하지 않음

스테퍼 모터의 위치를 L298N 드라이버를 통해 제어하는 방법

우리는 다음을 사용하여 스테퍼 모터를 원하는 위치로 이동시킬 수 있습니다:

stepper.moveTo(desiredPosition); // 모터를 한 바퀴 돌립니다

※ NOTE THAT:

stepper.moveTo() 함수는 논블로킹(non-blocking)입니다. 이 점은 라이브러리의 큰 장점입니다. 하지만, 이 함수를 사용할 때 주의해야 할 점이 있습니다:

  • 가능한 한 자주 'stepper.run()'을 호출하세요. 이는 void loop() 함수에서 호출되어야 합니다.
  • 모터가 움직이는 동안 delay() 함수를 사용하지 마세요.
  • 모터가 움직이는 동안 Serial.print() 함수와 Serial.println() 함수를 사용하지 않아야 합니다. 이 함수들은 스테퍼 모터의 움직임을 느리게 합니다.

L298N 드라이버를 통한 스텝 모터 속도 제어 방법

우리는 몇 가지 간단한 기능들을 사용함으로써 속도뿐만 아니라 가속과 감속도 제어할 수 있습니다.

cpp stepper.setAcceleration(50.0); // 가속도/감속도 설정 stepper.setSpeed(200); // 원하는 속도 설정

L298N 드라이버를 통한 스테퍼 모터 방향 제어 방법

위와 같이 배선을 하면, 모터가 회전할 것입니다:

  • 시계 방향: 우리가 모터를 한 위치에서 더 높은 위치로 조정하는 경우 (위치 증가)
  • 반시계 방향: 우리가 모터를 한 위치에서 더 낮은 위치로 조정하는 경우 (위치 감소)

예를 들면:

  • 현재 위치가 100이고 모터를 200으로 제어하면 모터는 시계 방향으로 회전합니다.
  • 현재 위치가 -200이고 모터를 -100으로 제어하면 모터는 시계 방향으로 회전합니다.
  • 현재 위치가 200이고 모터를 100으로 제어하면 모터는 반시계 방향으로 회전합니다.
  • 현재 위치가 -100이고 모터를 -200으로 제어하면 모터는 반시계 방향으로 회전합니다.

※ NOTE THAT:

앞서 언급했듯이, OUT1을 OUT2와 바꾸거나 OUT3을 OUT4와 바꾸면, 위치의 증가는 반시계 방향일 수 있고 위치의 감소는 시계 방향일 수 있습니다.

스테퍼 모터를 멈추는 방법

  • 스테퍼 모터는 원하는 위치에 도달한 후 자동으로 정지합니다.
  • stepper.stop() 함수를 사용하여 언제든지 스테퍼 모터를 즉시 정지시킬 수 있습니다.

아두이노 나노 ESP32 코드 - 스테퍼 모터 코드

아래 코드는 다음과 같은 작업을 수행합니다:

  • 시계 방향으로 모터를 한 바퀴 돌립니다
  • 모터를 5초 동안 멈춥니다
  • 반시계 방향으로 모터를 한 바퀴 되돌립니다
  • 모터를 5초 동안 멈춥니다
  • 그 과정을 반복합니다
/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-stepper-motor */ #include <AccelStepper.h> #define DEG_PER_STEP 1.8 #define STEP_PER_REVOLUTION (360 / DEG_PER_STEP) // 아두이노 나노 ESP32 핀은 적절한 단계 순서를 위해 순서대로 IN1-IN3-IN2-IN4로 입력됩니다. AccelStepper stepper(AccelStepper::FULL4WIRE, D5, D3, D4, D2); long moveToPosition = STEP_PER_REVOLUTION; void setup() { Serial.begin(9600); stepper.setAcceleration(200.0); // 가속도 설정 stepper.setSpeed(200); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치를 0으로 설정 stepper.moveTo(STEP_PER_REVOLUTION); // 시계 방향으로 모터 한 바퀴 회전 Serial.println("Motor moving in clockwise direction"); } void loop() { if (stepper.distanceToGo() == 0) { Serial.println("Motor is stopped"); delay(5000); // 5초 동안 정지 stepper.setCurrentPosition(0); // 위치를 0으로 재설정 moveToPosition = -1 * moveToPosition; // 방향 전환 stepper.moveTo(moveToPosition); // 모터 한 바퀴 회전 if (stepper.distanceToGo() > 0) Serial.println("Motor moving in clockwise direction"); else if (stepper.distanceToGo() < 0) Serial.println("Motor moving in anticlockwise direction"); } // Serial.print(F("position: ")); // Serial.println(stepper.currentPosition()); stepper.run(); // 가능한 자주 호출되어야 함 }

사용 방법

Arduino Nano ESP32를 시작하려면 다음 단계를 따르세요:

  • 아두이노 나노 ESP32에 익숙하지 않은 경우, 아두이노 나노 ESP32 환경 설정 방법에 대한 튜토리얼을 참고하세요.
  • 제공된 다이어그램에 따라 구성 요소를 연결하세요.
  • USB 케이블을 사용하여 아두이노 나노 ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 아두이노 IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당 COM 포트를 선택하세요.
  • 아두이노 IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • “AccelStepper”를 검색한 다음 Mike McCauley의 AccelStepper 라이브러리를 찾으세요.
  • Install 버튼을 클릭하여 AccelStepper 라이브러리를 설치하세요.
Arduino Nano ESP32 AccelStepper library
  • 위의 코드를 복사하고 아두이노 IDE로 열기
  • 아두이노 나노 ESP32에 코드를 업로드하려면 아두이노 IDE에서 Upload 버튼을 클릭하세요.
  • 다음을 볼 수 있습니다:
    • 스테퍼 모터가 시계 방향으로 한 바퀴 회전합니다
    • 스테퍼 모터가 5초 동안 정지합니다
    • 스테퍼 모터가 반시계 방향으로 한 바퀴 다시 회전합니다
    • 스테퍼 모터가 5초 동안 정지합니다
    • 위의 과정이 반복적으로 실행됩니다.
  • 시리얼 모니터에서 결과를 확인하세요
COM6
Send
Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

코드 설명

소스 코드의 주석 라인에서 라인별 설명을 읽으세요!

동영상

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

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!