ESP32 - 스텝 모터 | ESP32 - Stepper Motor

이 튜토리얼에서는 ESP32를 사용하여 스테퍼 모터를 제어하는 방법을 배워볼 것입니다.

이 튜토리얼은 어떤 종류의 양극성 스테퍼 모터(4개의 전선)에도 적용할 수 있습니다. 이 튜토리얼에서는 NEMA 17 스테퍼 모터를 예로 들 것입니다.

ESP32 Stepper motor

준비물

1×ESP-WROOM-32 Dev Module 쿠팡 | 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 ESP32 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

스테퍼 모터에 대하여

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

  • **양극성**: 이 모터는 4개의 전선이 있습니다.
  • **단극성**: 단극성 모터는 5개나 6개의 전선을 가질 수 있습니다. 6개 전선의 단극성 스테퍼 모터의 경우, 마치 양극성 스테퍼 모터처럼 제어하기 위해 여섯 개 중 네 개의 전선을 효과적으로 사용할 수 있습니다.

특히 5선식 단극형 스테퍼 모터에 관심이 있다면, [ESP32 - ULN2003 드라이버를 사용한 28BYJ-48 스테퍼 모터 제어]라는 제목의 튜토리얼을 참조하실 수 있습니다(BASE_URL/tutorials/esp32/esp32-28byj-48-stepper-motor-uln2003-driver).

그러나 이 튜토리얼은 오직 양극성 스텝 모터에만 전념되어 있습니다.

양극성 스테퍼 모터 핀배열

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

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 보호: 동시에, 스텝 모터를 구동하는데 사용되는 높은 전류와 전압 수준으로부터 ESP32를 보호하여 잠재적인 손상을 방지합니다.

다양한 하드웨어 드라이버가 스테퍼 모터를 제어하기 위해 사용 가능하며, 흔히 사용되는 옵션 중 하나는 L298N 드라이버입니다.

L298N 드라이버에 관하여

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

L298N 드라이버 핀배열

L298N Driver Pinout

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

VCC 핀: 모터에 전력을 공급합니다. 5V에서 35V 사이 어디든 될 수 있습니다.

GND 핀: 공통 접지 핀이며, GND(0V)에 연결해야 합니다.

5V 핀: L298N 모듈에 전력을 공급합니다. 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 점퍼를 그대로 두면 이 핀을 다른 것에 연결할 필요가 없습니다.

선연결

ESP32 Stepper Motor L298N Driver Wiring Diagram

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

ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.

※ NOTE THAT:

  • 모터의 전원 공급이 12V 이하인 경우 L298N 모듈에 있는 세 개의 점퍼를 그대로 두세요.
  • 스테퍼 모터의 핀 순서는 제조사마다 다를 수 있습니다. 올바른 배선을 위해 아래 표를 확인하세요.

ESP32와 L298N 드라이버 간의 연결 테이블

ESP32 pins L298N pins
7 IN1
6 IN2
5 IN3
4 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 드라이버를 사용하여 스테퍼 모터를 제어하는 방법

스테퍼 모터를 제어하는 것은 간단하지 않은 작업입니다. 특히, 논블로킹 방식으로 제어하고자 할 때는 더욱 그렇습니다. 다행히 AccelStepper 라이브러리 덕분에, 스테퍼 모터를 제어하는 것이 아주 쉬워집니다.

Arduino IDE는 또한 내장된 스텝 모터 라이브러리를 가지고 있습니다. 하지만, 다음의 이유로 이 라이브러리 사용을 추천하지 않습니다:

  • 이 라이브러리는 차단 기능을 제공합니다. 즉, 스텝 모터를 제어하는 동안에는 ESP32가 다른 작업을 수행하지 못하도록 차단합니다.
  • 충분한 기능이 없습니다.

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

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

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

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

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

※ NOTE THAT:

stepper.moveTo() 함수는 블로킹되지 않습니다. 이는 라이브러리의 큰 장점 중 하나입니다. 그러나 이 기능을 사용할 때 주의해야 할 점이 있습니다:

  • 가능한 자주 'stepper.run()'을 호출하십시오. 이것은 void loop() 함수에서 호출되어야 합니다.
  • 모터가 움직이는 동안 delay() 함수를 사용하지 마십시오.
  • 모터가 움직이는 동안 Serial.print()Serial.println() 함수를 사용해서는 안 됩니다. 이 함수들은 스텝 모터의 움직임을 느리게 만듭니다.

스텝 모터 속도를 L298N 드라이버로 제어하는 방법

우리는 몇 가지 간단한 함수를 사용하여 속도뿐만 아니라 가속과 감속도 제어할 수 있습니다.

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초 동안 멈추세요
  • 그 과정을 계속 반복하세요
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-stepper-motor */ #include <AccelStepper.h> #define DEG_PER_STEP 1.8 #define STEP_PER_REVOLUTION (360 / DEG_PER_STEP) AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 핀: GPIO19, GPIO18, GPIO17, GPIO16 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(); // 가능한 자주 호출되어야 함 }

사용 방법

  • ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정하는 방법을 참조하세요.
  • 위 이미지와 같이 배선하세요.
  • 마이크로 USB 케이블을 이용해 ESP32 보드를 PC에 연결하세요.
  • PC에서 Arduino IDE를 엽니다.
  • 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
  • Arduino IDE의 왼쪽 바에 있는 Libraries 아이콘을 클릭하세요.
  • “AccelStepper”을 검색한 다음, Mike McCauley의 AccelStepper 라이브러리를 찾으세요.
  • AccelStepper 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
ESP32 AccelStepper library
  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP32에 업로드
  • 다음과 같은 결과가 나타납니다:
    • 스테퍼 모터가 시계 방향으로 한 바퀴 회전합니다
    • 스테퍼 모터가 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!