아두이노 나노 ESP32 28BYJ-48 스테퍼 모터 ULN2003 드라이버

이 튜토리얼에서는 다음 주제를 다룰 것입니다:

아두이노 나노 ESP32 uln2003 28byj-48 스테퍼 모터

스테퍼 모터는 완전한 회전을 이산적인 "단계"로 나눔으로써 정밀한 위치 제어에서 뛰어납니다. 이 모터들은 프린터, 3D 프린터, CNC 기계 및 산업 자동화 시스템을 포함한 다양한 장치에 응용됩니다.

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

준비물

1×아두이노 나노 ESP32 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×28BYJ-48 stepper motor + ULN2003 Driver Module 쿠팡 | 아마존
1×5V 전원 어댑터 아마존
1×DC 커넥터 전원 연결 잭 플러그 소켓 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 나노용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) 아두이노 나노용 브레이크아웃 확장 보드 쿠팡 | 아마존
1×(추천) 아두이노 나노 ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

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 스테퍼 모터

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

ULN2003은 스테퍼 모터용으로 널리 사용되는 모터 드라이버 모듈로서 두드러집니다. 이 모듈의 주요 기능은 다음과 같습니다:

모터의 현재 스테핑 상태를 효과적으로 반영하는 네 개의 제어 입력 라인의 활동을 나타내기 위해 밝혀지는 4개의 LED. 이러한 LED는 실용적인 목적을 제공할 뿐만 아니라 스테핑 과정에 시각적 요소도 추가합니다.

모듈에는 ON/OFF 점퍼가 통합되어 있어 연결된 스테퍼 모터의 전력을 분리할 수 있게 합니다. 이 기능은 모터의 전원 공급을 효율적으로 관리할 수 있는 편리한 수단을 제공합니다.

ULN2003 핀배열

uln2003 스테퍼 모터 드라이버 사용법 핀아웃

ULN2003 모듈에는 6개의 핀과 하나의 암 커넥터가 포함되어 있습니다:

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

※ 주의:

스테퍼 모터를 구동할 때는 다음 지침을 따라야 합니다:

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

선연결

아두이노 나노 ESP32 스테퍼 모터 uln2003 드라이버 연결 배선도

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

이 회로를 계속 사용할 계획이라면 나사 단자를 고려해 보세요. Arduino Nano ESP32를 아두이노 나노용 스크루 터미널 확장 보드 위에 올린 다음, 각 전선을 나사로 조이세요. 아래는 나사 단자 보드를 사용한 배선도입니다.

아두이노 나노 ESP32 스테퍼 모터 uln2003 드라이버 연결 배선도 (screw terminal)

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

주의해야 할 점은, 스테퍼 모터의 전선 색깔을 신경 쓸 필요가 없습니다. 우리가 해야 할 것은 단지 남성 커넥터(28BYJ-48 스테퍼 모터에 있는)를 여성 커넥터(ULN2003 드라이버 위에 있는)에 연결하는 것뿐입니다.

스텝 모터 제어 프로그램 방법

스테퍼 모터를 제어하는 데에는 세 가지 주요 방법이 있습니다:

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

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

Arduino IDE는 내장된 스텝 모터 라이브러리를 포함하고 있지만, 다음과 같은 이유로 사용하지 않는 것이 좋습니다:

차단하는 성격: 이 라이브러리는 차단 방식으로 실행되어, 스테퍼 모터를 제어하는 동안 ESP32의 리소스를 독점하므로 다른 작업을 수행할 수 없습니다.

제한된 기능성: 내장된 스테퍼 라이브러리는 프로젝트에 필요한 모든 기능과 특징을 제공하지 않을 수 있습니다.

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

  • 가속 및 감속: 이는 부드러운 가속과 감속을 지원하여 보다 정밀한 제어를 가능하게 합니다.
  • 풀스텝 및 하프스텝 구동: 스테퍼 모터에 대해 풀스텝과 하프스텝 구동 모드 중에서 선택할 수 있습니다.
  • 여러 대의 스테퍼 동시 제어: AccelStepper는 동시에 여러 대의 스테퍼를 제어할 수 있게 해주며, 각 스테퍼는 독립적으로 동시에 움직입니다.

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

아두이노 나노 ESP32 코드

/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 esp32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-28byj-48-stepper-motor-uln2003-driver */ // AccelStepper 라이브러리를 포함합니다 #include <AccelStepper.h> #define STEP_PER_REVOLUTION 2048 // 이 값은 데이터시트에서 가져왔습니다 // 아두이노 나노 ESP32 핀이 IN1-IN3-IN2-IN4 순으로 입력되어 있어야 올바른 스텝 순서로 작동합니다 AccelStepper stepper(AccelStepper::FULL4WIRE, D11, D9, D10, D8); 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에 익숙하지 않다면, 아두이노 나노 ESP32 - 소프트웨어 설치에 대한 튜토리얼을 참조하세요.
  • 제공된 다이어그램에 따라 구성요소를 연결하세요.
  • USB 케이블을 사용하여 아두이노 나노 ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 아두이노 IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당 COM 포트를 선택하세요.
  • 아두이노 IDE의 왼쪽 네비게이션 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • “AccelStepper”를 검색한 다음, Mike McCauley가 제작한 AccelStepper 라이브러리를 찾으세요.
  • Install 버튼을 클릭하여 AccelStepper 라이브러리를 설치하세요.
아두이노 나노 ESP32 accelstepper 라이브러리
  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino Nano ESP32에 코드를 업로드하기 위해 Arduino IDE에서 Upload 버튼 클릭
  • 모터가 회전하는 것을 확인하세요. 다음과 같아야 합니다:
    • 시계 방향으로 한 바퀴 회전한 다음,
    • 반시계 방향으로 두 바퀴 회전한 다음,
    • 시계 방향으로 두 바퀴 회전합니다.

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

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

여러 개의 28BYJ-48 스테퍼 모터 제어하는 방법

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

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

아두이노 나노 ESP32 two 스테퍼 모터 uln2003 드라이버 연결 배선도

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

나사 단자는 보드가 흔들려도 각 전선을 단단히 잡아 줍니다. 이를 위해 Arduino Nano ESP32를 아두이노 나노용 스크루 터미널 확장 보드에 장착하세요. 나사 단자 버전은 아래 다이어그램을 참고하세요.

아두이노 나노 ESP32 two 스테퍼 모터 uln2003 드라이버 연결 배선도 (screw terminal)

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

아두이노 나노 ESP32 코드: 두 개의 28BYJ-48 스테퍼 모터용

/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 esp32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-28byj-48-stepper-motor-uln2003-driver */ // AccelStepper 라이브러리 포함 #include <AccelStepper.h> // step 상수 정의 #define FULLSTEP 4 #define STEP_PER_REVOLUTION 2048 // 이 값은 데이터시트에서 가져옴 // 아두이노 나노 ESP32 핀을 IN1-IN3-IN2-IN4 순으로 입력하여 올바른 스텝 시퀀스 실행 AccelStepper stepper_1(FULLSTEP, D11, D9, D10, D8); AccelStepper stepper_2(FULLSTEP, D7, D5, D6, D4); 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()); }