ESP32 - 28BYJ-48 스테퍼 모터 ULN2003 드라이버 | ESP32 - 28BYJ-48 Stepper Motor ULN2003 Driver

이 튜토리얼에서는 다음 주제들을 다룰 예정입니다:

ESP32 ULN2003 28BYJ-48 stepper motor

스테퍼 모터는 전체 회전을 별개의 "단계"로 나누어 정밀 위치 제어에서 뛰어납니다. 이러한 모터는 프린터, 3D 프린터, CNC 기계, 산업 자동화 시스템을 포함한 다양한 장치에 사용됩니다.

스테퍼 모터에 대한 통찰을 얻는 저렴한 방법은 28BYJ-48 스테퍼 모터를 실험해 보는 것입니다. 일반적으로 이러한 모터들은 ULN2003을 기반으로 한 드라이버 보드와 함께 제공되어, 그 사용을 크게 단순화합니다.

준비물

1×ESP-WROOM-32 Dev Module 쿠팡 | Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×28BYJ-48 stepper motor + ULN2003 Driver Module Amazon
1×5V Power Adapter Amazon
1×DC Power Jack 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Recommended) ESP32 Screw Terminal Adapter 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

28BYJ-48 스테퍼 모터에 대하여

데이터 시트에 따르면 28BYJ-48 모터는 풀 스텝 모드에서 작동할 때 11.25도씩 이동하여 완전 회전당 32단계를 완성합니다(계산된 바에 따르면: 360°/11.25° = 32).

게다가, 이 모터는 1/64 감속 기어 세트를 통합하여 그 스텝 수를 32 x 64로 증가시켜, 한 회전당 2048 스텝을 결과적으로 만듭니다. 이 2048 스텝 각각은 360°/2048에 해당하는 회전인데, 이는 스텝 당 대략 0.1758도입니다.

결론: 모터가 풀스텝 모드로 2048 스텝을 할 경우, 모터는 한 바퀴를 회전합니다.

핀아웃

28BYJ-48 스테퍼 모터는 5개의 핀을 포함하고 있습니다. 이 핀들에 대한 세부 사항을 신경 쓸 필요가 없습니다. 우리는 단지 ULN2003 모터 드라이버의 커넥터에 꽂기만 하면 됩니다.

28BYJ-48 stepper motor

ULN2003 스테퍼 모터 드라이버 모듈에 대하여

ULN2003은 스테퍼 모터용으로 널리 사용되는 모터 드라이버 모듈로 두드러집니다. 모듈의 주요 특징으로는:

  • 모터의 현재 스테핑 상태를 효과적으로 반영하는 네 개의 제어 입력 라인의 활동을 나타내기 위해 빛나는 네 개의 LED. 이러한 LED는 실용적인 목적을 제공할 뿐만 아니라 스테핑 과정에 시각적 요소를 추가합니다.
  • 모듈에 통합된 ON/OFF 점퍼는 연결된 스테퍼 모터에 대한 전원을 분리할 수 있게 해주며, 이 기능은 모터의 전원 공급을 편리하게 제어할 수 있는 수단을 제공하여 효율적인 전원 관리를 가능하게 합니다.

ULN2003 핀배열

ULN2003 Stepper Motor Driver Pinout

ULN2003 모듈은 6개의 핀과 한 개의 암커넥터를 포함합니다:

  • IN1 핀: 모터를 구동하는 데 사용됩니다. ESP32의 출력 핀에 연결하세요.
  • IN2 핀: 모터를 구동하는 데 사용됩니다. ESP32의 출력 핀에 연결하세요.
  • IN3 핀: 모터를 구동하는 데 사용됩니다. ESP32의 출력 핀에 연결하세요.
  • IN4 핀: 모터를 구동하는 데 사용됩니다. ESP32의 출력 핀에 연결하세요.
  • GND 핀: 공통 접지 핀입니다. ESP32의 GND와 외부 전원 공급장치의 GND 모두에 연결해야 합니다.
  • VDD 핀: 모터에 전원을 공급합니다. 외부 전원 공급장치에 연결하세요.
  • 모터 커넥터: 모터가 꽂히는 곳입니다.

※ NOTE THAT:

스테퍼 모터를 구동하는 데 있어 다음의 가이드라인을 따르는 것이 중요합니다:

  • 외부 전원 공급장치의 전압이 스테퍼 모터의 전압 요구 사항과 일치하는지 확인합니다. 예를 들어, 스테퍼 모터가 12V DC에서 작동하는 경우, 12V 전원 공급장치를 사용하는 것이 중요합니다. 5V DC에서 작동하는 28BYJ-48 스테퍼 모터의 경우, 5V 전원 공급장치를 사용하는 것이 필수적입니다.
  • 스테퍼 모터가 5V 전원 공급장치로 작동하도록 설계되었다 하더라도, ESP32의 5V 핀에 VDD 핀을 연결해서는 안 됩니다. 대신 VDD 핀을 외부 5V 전원원에 연결하세요. 이러한 예방 조치는 스테퍼 모터가 상당한 양의 전력을 소모할 수 있으며, 이는 ESP32의 전원 공급 능력을 초과하여 문제나 손상을 일으킬 수 있기 때문에 필수적입니다.

선연결

ESP32 stepper motor ULN2003 driver Wiring Diagram

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

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

주의해 주십시오. 스테퍼 모터의 전선 색깔에 대해 신경 쓸 필요가 없습니다. 우리는 단지 남성 커넥터(28BYJ-48 스테퍼 모터에 있는)를 여성 커넥터(ULN2003 드라이버에 있는)에 연결하기만 하면 됩니다.

스테퍼 모터 제어를 위한 프로그래밍 방법

스테퍼 모터를 제어하는 것과 관련해서, 세 가지 주요 방법이 있습니다:

  • Full-Step: 풀 스텝
  • Half-Step: 하프 스텝
  • Micro-Step: 마이크로 스텝

기본 애플리케이션의 경우, 풀 스텝 방식이 종종 충분합니다. 그러나 이 세 가지 방법에 대한 자세한 설명은 이 튜토리얼의 마지막 부분에서 제공될 것입니다. 이러한 방법에 대한 프로그래밍은 복잡할 수 있다는 점을 알아두는 것이 중요합니다. 좋은 소식은 이러한 복잡성을 대신 처리해주는 많은 라이브러리가 있다는 것입니다. 우리가 해야 할 일은 적절한 라이브러리를 사용하여 프로젝트에서 스테퍼 모터의 제어를 단순화하는 것입니다.

아두이노 IDE에는 내장된 스테퍼 라이브러리가 포함되어 있지만, 다음과 같은 이유로 사용하지 않는 것이 좋습니다:

  • Blocking Nature: 이 라이브러리는 차단 방식으로 운영되며, 이는 스테퍼 모터를 제어하는 동안 ESP32의 자원을 독점하여 다른 작업을 수행하지 못하게 합니다.
  • Limited Functionality: 내장된 스테퍼 라이브러리는 프로젝트에 필요한 모든 기능과 특성을 제공하지 않을 수 있습니다.

대신, AccelStepper 라이브러리를 사용하는 것이 좋습니다. 이 라이브러리는 다음과 같은 여러 가지 장점을 제공합니다:

  • 가속 및 감속: 이는 부드러운 가속 및 감속을 지원하여 더 정확한 제어를 가능하게 합니다.
  • 전단계 및 반단계 구동: 스테퍼 모터를 위해 전단계와 반단계 구동 모드를 선택할 수 있습니다.
  • 다수의 동시 스테퍼: AccelStepper는 여러 스테퍼를 동시에 제어할 수 있게 해주며, 각 스테퍼는 독립적이고 동시에 움직일 수 있습니다.

그러나 도서관에는 한 가지 단점이 있습니다: 마이크로 스텝 구동을 지원하지 않는다는 점입니다.

ESP32 코드

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-28byj-48-stepper-motor-uln2003-driver */ // AccelStepper 라이브러리를 포함함 #include <AccelStepper.h> // step 상수 정의 #define FULLSTEP 4 #define STEP_PER_REVOLUTION 2048 // 이 값은 데이터시트에서 가져옴 // 올바른 스텝 시퀀스를 위해 IN1-IN3-IN2-IN4 순으로 핀 입력 AccelStepper stepper(FULLSTEP, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 void setup() { Serial.begin(9600); stepper.setMaxSpeed(1000.0); // 최대 속도 설정 stepper.setAcceleration(50.0); // 가속도 설정 stepper.setSpeed(200); // 초기 속도 설정 stepper.setCurrentPosition(0); // 위치 설정 stepper.moveTo(STEP_PER_REVOLUTION); // 목표 위치 설정: 64 스텝 <=> 한 바퀴 } void loop() { // 모터가 목표 위치에 도달하면 방향 변경 if (stepper.distanceToGo() == 0) stepper.moveTo(-stepper.currentPosition()); stepper.run(); // loop() 함수에서 반드시 호출해야 함 Serial.print(F("Current Position: ")); Serial.println(stepper.currentPosition()); }

사용 방법

  • 만약 이게 ESP32를 처음 사용하는 경우라면, Arduino IDE에서 ESP32 환경 설정하는 방법을 참조하세요.
  • 위 이미지대로 전선 연결을 하세요.
  • ESP32 보드를 PC에 마이크로 USB 케이블로 연결하세요.
  • PC에서 Arduino IDE를 열어주세요.
  • 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
  • Arduino IDE의 왼쪽 바에 있는 Libraries 아이콘을 클릭하세요.
  • “AccelStepper”를 검색한 다음, Mike McCauley의 AccelStepper 라이브러리를 찾으세요.
  • Install 버튼을 클릭하여 AccelStepper 라이브러리를 설치하세요.
ESP32 AccelStepper library
  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP32에 업로드합니다.
  • 모터가 회전하는 것을 확인하세요. 다음과 같아야 합니다:
    • 시계 방향으로 한 바퀴 회전한 다음,
    • 반시계 방향으로 두 바퀴 회전한 다음,
    • 시계 방향으로 두 바퀴 회전합니다.

    그 과정은 무한히 반복됩니다.

    시리얼 모니터에서 결과를 확인하세요.

여러 28BYJ-48 스텝 모터를 제어하는 방법

두 개의 스테퍼 모터를 동시에 독립적으로 제어하는 방법을 배워봅시다.

두 개의 28BYJ-48 스테퍼 모터를 위한 배선도

ESP32 two stepper motor ULN2003 driver Wiring Diagram

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

ESP32를 위한 두 개의 28BYJ-48 스테퍼 모터 코드

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-28byj-48-stepper-motor-uln2003-driver */ // AccelStepper 라이브러리를 포함합니다. #include <AccelStepper.h> // 스텝 상수를 정의합니다. #define FULLSTEP 4 #define STEP_PER_REVOLUTION 2048 // 이 값은 데이터시트에서 가져온 것입니다. // 올바른 스텝 시퀀스를 위해 IN1-IN3-IN2-IN4 순서대로 핀을 입력합니다. AccelStepper stepper_1(FULLSTEP, 23, 22, 21, 19); AccelStepper stepper_2(FULLSTEP, 18, 5, 17, 16); void setup() { Serial.begin(9600); stepper_1.setMaxSpeed(1000.0); // 최대 속도 설정 stepper_1.setAcceleration(50.0); // 가속도 설정 stepper_1.setSpeed(200); // 초기 속도 설정 stepper_1.setCurrentPosition(0); // 위치 설정 stepper_1.moveTo(STEP_PER_REVOLUTION); // 목표 위치 설정: 64 단계 <=> 한 바퀴 stepper_2.setMaxSpeed(1000.0); // 최대 속도 설정 stepper_2.setAcceleration(50.0); // 가속도 설정 stepper_2.setSpeed(200); // 초기 속도 설정 stepper_2.setCurrentPosition(0); // 위치 설정 stepper_2.moveTo(STEP_PER_REVOLUTION); // 목표 위치 설정: 64 단계 <=> 한 바퀴 } void loop() { // 모터가 목표 위치에 도달하면 방향 변경 if (stepper_1.distanceToGo() == 0) stepper_1.moveTo(-stepper_1.currentPosition()); if (stepper_2.distanceToGo() == 0) stepper_2.moveTo(-stepper_2.currentPosition()); stepper_1.run(); // loop() 함수에서 반드시 호출해야 합니다. stepper_2.run(); // loop() 함수에서 반드시 호출해야 합니다. Serial.print(F("stepper_1# current position: ")); Serial.println(stepper_1.currentPosition()); Serial.print(F("stepper_2# current position: ")); Serial.println(stepper_2.currentPosition()); }

※ 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!